summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRalph Giles <ralph.giles@artifex.com>2008-07-14 22:08:12 +0000
committerRalph Giles <ralph.giles@artifex.com>2008-07-14 22:08:12 +0000
commitda8b7d890f7853425c6603aec2788a74ac320170 (patch)
treef2c985ebfe6c4108ba812aa62fad339ec5171bb9
parent859b90f4df3afce7a364df24879043733bab96b7 (diff)
parent181e9350dc7c4992ed35efddd209690e0d62abb2 (diff)
downloadghostpdl-da8b7d890f7853425c6603aec2788a74ac320170.tar.gz
Import the ghostpdl code from the private trunk r3107.
git-svn-id: http://svn.ghostscript.com/ghostscript/trunk@8841 a1074d23-0009-0410-80fe-cf8c14f379e6
-rw-r--r--CMYK.iccbin0 -> 1528264 bytes
-rw-r--r--COPYING340
-rw-r--r--LICENSE59
-rw-r--r--Makefile145
-rw-r--r--README.txt79
-rwxr-xr-xcommon/cp.bat11
-rw-r--r--common/gccdefs.mak8
-rw-r--r--common/generic.mak77
-rw-r--r--common/msvc_top.mak216
-rw-r--r--common/msvcdefs.mak170
-rwxr-xr-xcommon/mv.bat2
-rw-r--r--common/pcdefs.mak20
-rwxr-xr-xcommon/rm.bat10
-rw-r--r--common/sgidefs.mak8
-rw-r--r--common/ugcc_top.mak114
-rw-r--r--common/unixdefs.mak20
-rw-r--r--doc/Makefile18
-rw-r--r--doc/ghostpdl.pdfbin0 -> 119687 bytes
-rw-r--r--doc/ghostpdl.tex433
-rw-r--r--doc/ghostpdl.txt103
-rw-r--r--doc/who_owns_what.txt336
-rw-r--r--ghostpdl.sln20
-rw-r--r--language_switch/pspcl6_gcc.mak80
-rw-r--r--language_switch/pspcl6_msvc.mak212
-rw-r--r--link.iccbin0 -> 43784 bytes
-rw-r--r--main/pcl6_gcc.mak269
-rw-r--r--main/pcl6_msvc.mak392
-rw-r--r--pcl/Anomalies.txt937
-rw-r--r--pcl/pcbiptrn.c366
-rw-r--r--pcl/pcbiptrn.h60
-rw-r--r--pcl/pccid.c587
-rw-r--r--pcl/pccid.h168
-rw-r--r--pcl/pccolor.c181
-rw-r--r--pcl/pccoord.h37
-rw-r--r--pcl/pccprint.c116
-rw-r--r--pcl/pccrd.c352
-rw-r--r--pcl/pccrd.h137
-rw-r--r--pcl/pccsbase.c1191
-rw-r--r--pcl/pccsbase.h173
-rw-r--r--pcl/pcdict.h39
-rw-r--r--pcl/pcdither.c158
-rw-r--r--pcl/pcdither.h107
-rw-r--r--pcl/pcdraw.c184
-rw-r--r--pcl/pcdraw.h35
-rw-r--r--pcl/pcfont.c661
-rw-r--r--pcl/pcfont.h118
-rw-r--r--pcl/pcfontpg.c115
-rw-r--r--pcl/pcfontst.h39
-rw-r--r--pcl/pcfrgrnd.c268
-rw-r--r--pcl/pcfrgrnd.h138
-rw-r--r--pcl/pcfsel.c487
-rw-r--r--pcl/pcfsel.h41
-rw-r--r--pcl/pcht.c1995
-rw-r--r--pcl/pcht.h363
-rw-r--r--pcl/pcident.c41
-rw-r--r--pcl/pcident.h55
-rw-r--r--pcl/pcimpl.c28
-rw-r--r--pcl/pcindxed.c1176
-rw-r--r--pcl/pcindxed.h374
-rw-r--r--pcl/pcjob.c259
-rw-r--r--pcl/pcl.mak1233
-rw-r--r--pcl/pcl_top.mak29
-rw-r--r--pcl/pclookup.c158
-rw-r--r--pcl/pclookup.h216
-rw-r--r--pcl/pcmacros.c267
-rw-r--r--pcl/pcmisc.c67
-rw-r--r--pcl/pcmtx3.c264
-rw-r--r--pcl/pcmtx3.h158
-rw-r--r--pcl/pcommand.c254
-rw-r--r--pcl/pcommand.h285
-rw-r--r--pcl/pcpage.c1152
-rw-r--r--pcl/pcpage.h68
-rw-r--r--pcl/pcpalet.c1144
-rw-r--r--pcl/pcpalet.h319
-rw-r--r--pcl/pcparam.h34
-rw-r--r--pcl/pcparse.c647
-rw-r--r--pcl/pcparse.h110
-rw-r--r--pcl/pcpatrn.c1464
-rw-r--r--pcl/pcpatrn.h561
-rw-r--r--pcl/pcpattyp.h112
-rw-r--r--pcl/pcpatxfm.c354
-rw-r--r--pcl/pcpatxfm.h83
-rw-r--r--pcl/pcrect.c286
-rw-r--r--pcl/pcsfont.c898
-rw-r--r--pcl/pcstate.h373
-rw-r--r--pcl/pcstatus.c736
-rw-r--r--pcl/pcsymbol.c330
-rw-r--r--pcl/pcsymbol.h44
-rw-r--r--pcl/pctext.c987
-rw-r--r--pcl/pctop.c637
-rw-r--r--pcl/pctop.h23
-rw-r--r--pcl/pctpm.h45
-rw-r--r--pcl/pcuptrn.c589
-rw-r--r--pcl/pcuptrn.h65
-rw-r--r--pcl/pcursor.c892
-rw-r--r--pcl/pcursor.h67
-rw-r--r--pcl/pcwhtidx.c387
-rw-r--r--pcl/pcwhtidx.h126
-rw-r--r--pcl/pcxfmst.h155
-rw-r--r--pcl/pgchar.c562
-rw-r--r--pcl/pgcolor.c116
-rw-r--r--pcl/pgconfig.c726
-rw-r--r--pcl/pgdraw.c1642
-rw-r--r--pcl/pgdraw.h117
-rw-r--r--pcl/pgfdata.c5166
-rw-r--r--pcl/pgfdata.h28
-rw-r--r--pcl/pgfont.c231
-rw-r--r--pcl/pgfont.h27
-rw-r--r--pcl/pgframe.c224
-rw-r--r--pcl/pggeom.c110
-rw-r--r--pcl/pggeom.h89
-rw-r--r--pcl/pginit.c207
-rw-r--r--pcl/pginit.h33
-rw-r--r--pcl/pglabel.c1476
-rw-r--r--pcl/pglfill.c913
-rw-r--r--pcl/pgmand.h336
-rw-r--r--pcl/pgmisc.c75
-rw-r--r--pcl/pgmisc.h88
-rw-r--r--pcl/pgparse.c404
-rw-r--r--pcl/pgpoly.c392
-rw-r--r--pcl/pgstate.h347
-rw-r--r--pcl/pgvector.c629
-rw-r--r--pcl/rtgmode.c736
-rw-r--r--pcl/rtgmode.h48
-rw-r--r--pcl/rtmisc.c254
-rw-r--r--pcl/rtraster.c1431
-rw-r--r--pcl/rtraster.h38
-rw-r--r--pcl/rtrstcmp.c262
-rw-r--r--pcl/rtrstcmp.h89
-rw-r--r--pcl/rtrstst.h147
-rw-r--r--pl/pjparse.c1241
-rw-r--r--pl/pjparse.h122
-rw-r--r--pl/pjparsei.c413
-rw-r--r--pl/pjtop.c130
-rw-r--r--pl/pjtop.h130
-rw-r--r--pl/pl.mak303
-rw-r--r--pl/plalloc.c549
-rw-r--r--pl/plalloc.h31
-rwxr-xr-xpl/plapi.h80
-rw-r--r--pl/plchar.c1747
-rw-r--r--pl/pldebug.h23
-rw-r--r--pl/pldict.c311
-rw-r--r--pl/pldict.h164
-rw-r--r--pl/pldraw.c35
-rw-r--r--pl/pldraw.h24
-rw-r--r--pl/plfont.c1054
-rw-r--r--pl/plfont.h326
-rw-r--r--pl/plftable.c630
-rw-r--r--pl/plftable.h23
-rw-r--r--pl/plht.c54
-rw-r--r--pl/plht.h25
-rw-r--r--pl/plimpl.c48
-rw-r--r--pl/pllfont.c389
-rw-r--r--pl/pllfont.h26
-rw-r--r--pl/pllrfont.c268
-rw-r--r--pl/plmain.c1274
-rw-r--r--pl/plmain.h83
-rw-r--r--pl/plparse.h62
-rw-r--r--pl/plplatf.c71
-rw-r--r--pl/plplatf.h32
-rw-r--r--pl/plplatfps.c68
-rw-r--r--pl/plsrgb.c402
-rw-r--r--pl/plsrgb.h32
-rw-r--r--pl/plsymbol.c2271
-rw-r--r--pl/plsymbol.h88
-rw-r--r--pl/pltop.c225
-rw-r--r--pl/pltop.h189
-rw-r--r--pl/pltoputl.c99
-rw-r--r--pl/pltoputl.h49
-rw-r--r--pl/pluchar.c718
-rw-r--r--pl/plufont.c113
-rw-r--r--pl/plulfont.c502
-rw-r--r--pl/plvalue.c43
-rw-r--r--pl/plvalue.h25
-rw-r--r--pl/plvocab.c798
-rw-r--r--pl/plvocab.h23
-rw-r--r--psi/psi.mak53
-rwxr-xr-xpsi/psitop.c619
-rw-r--r--pxl/pxasm.bat1
-rw-r--r--pxl/pxasm.ps192
-rw-r--r--pxl/pxattr.h19
-rw-r--r--pxl/pxbfont.c2057
-rw-r--r--pxl/pxbfont.h26
-rw-r--r--pxl/pxbfont.ps124
-rw-r--r--pxl/pxcet.txt235
-rw-r--r--pxl/pxdict.h75
-rw-r--r--pxl/pxdiff.txt315
-rw-r--r--pxl/pxenum.h19
-rw-r--r--pxl/pxerrors.c311
-rw-r--r--pxl/pxerrors.h170
-rw-r--r--pxl/pxffont.c185
-rw-r--r--pxl/pxfont.c733
-rw-r--r--pxl/pxfont.h89
-rw-r--r--pxl/pxfts.txt177
-rw-r--r--pxl/pxgstate.c1112
-rw-r--r--pxl/pxgstate.h208
-rw-r--r--pxl/pximage.c962
-rw-r--r--pxl/pximpl.c30
-rw-r--r--pxl/pxink.c854
-rw-r--r--pxl/pxl.mak206
-rw-r--r--pxl/pxlib.txt222
-rw-r--r--pxl/pxoper.h113
-rw-r--r--pxl/pxpaint.c855
-rw-r--r--pxl/pxparse.c917
-rw-r--r--pxl/pxparse.h106
-rw-r--r--pxl/pxprint.bat17
-rwxr-xr-xpxl/pxprint.tcl16
-rw-r--r--pxl/pxptable.c742
-rw-r--r--pxl/pxptable.h63
-rw-r--r--pxl/pxpthr.c330
-rw-r--r--pxl/pxpthr.h32
-rw-r--r--pxl/pxsessio.c816
-rw-r--r--pxl/pxspec.txt563
-rw-r--r--pxl/pxstate.c97
-rw-r--r--pxl/pxstate.h189
-rw-r--r--pxl/pxstream.c193
-rw-r--r--pxl/pxsymbol.ps111
-rw-r--r--pxl/pxsymbol.psc1267
-rw-r--r--pxl/pxsymbol.psh15
-rw-r--r--pxl/pxtag.h19
-rw-r--r--pxl/pxtop.c687
-rw-r--r--pxl/pxvalue.c80
-rw-r--r--pxl/pxvalue.h103
-rw-r--r--sRGB.iccbin0 -> 3024 bytes
-rw-r--r--svg/ghostsvg.h143
-rw-r--r--svg/svg.mak58
-rw-r--r--svg/svg_gcc.mak69
-rw-r--r--svg/svg_msvc.mak132
-rw-r--r--svg/svgdoc.c10
-rw-r--r--svg/svgtop.c486
-rw-r--r--svg/svgxml.c284
-rw-r--r--tools/GOT/README35
-rw-r--r--tools/GOT/detag.c18
-rwxr-xr-xtools/GOT/dotags.sh24
-rw-r--r--tools/GOT/tagimage.c48
-rw-r--r--tools/bitfont.pclbin0 -> 46227 bytes
-rw-r--r--tools/bitfonts.pxlbin0 -> 19148 bytes
-rw-r--r--tools/bug-list.txt103
-rwxr-xr-xtools/cat_url.py41
-rwxr-xr-xtools/check_deps.py134
-rwxr-xr-xtools/clusterpush.sh77
-rw-r--r--tools/cmpi/Makefile187
-rw-r--r--tools/cmpi/Makefile.in187
-rw-r--r--tools/cmpi/README41
-rwxr-xr-xtools/cmpi/cmpi.bkl21
-rwxr-xr-xtools/cmpi/cmpi.cpp1034
-rwxr-xr-xtools/cmpi/cmpi.dsp480
-rwxr-xr-xtools/cmpi/cmpi.dsw46
-rwxr-xr-xtools/cmpi/cmpi.pro17
-rwxr-xr-xtools/cmpi/cmpi.rc3
-rwxr-xr-xtools/cmpi/cmpi.sln134
-rwxr-xr-xtools/cmpi/cmpi.suobin0 -> 77824 bytes
-rwxr-xr-xtools/cmpi/cmpi.vcp1826
-rwxr-xr-xtools/cmpi/cmpi.vcproj1907
-rwxr-xr-xtools/cmpi/cmpi.vcw17
-rwxr-xr-xtools/cmpi/descrip.mms47
-rwxr-xr-xtools/cmpi/makefile.bcc229
-rwxr-xr-xtools/cmpi/makefile.dmc49
-rwxr-xr-xtools/cmpi/makefile.dms201
-rwxr-xr-xtools/cmpi/makefile.dos17
-rwxr-xr-xtools/cmpi/makefile.gcc227
-rwxr-xr-xtools/cmpi/makefile.sc6
-rwxr-xr-xtools/cmpi/makefile.unx35
-rwxr-xr-xtools/cmpi/makefile.va45
-rwxr-xr-xtools/cmpi/makefile.vc304
-rwxr-xr-xtools/cmpi/makefile.wat257
-rw-r--r--tools/colorcirc.xpsbin0 -> 50588 bytes
-rwxr-xr-xtools/docov.pl129
-rw-r--r--tools/fills.pcl1
-rw-r--r--tools/fontpage.pcl1
-rw-r--r--tools/fonts.pclbin0 -> 7731 bytes
-rw-r--r--tools/fonts.pxlbin0 -> 6009 bytes
-rw-r--r--tools/frs96.pxlbin0 -> 166056 bytes
-rw-r--r--tools/gl-chars.pclbin0 -> 685 bytes
-rw-r--r--tools/gl2_chars.pl63
-rw-r--r--tools/grashopp.pcl8
-rw-r--r--tools/grid.pcl1
-rw-r--r--tools/gslite/README124
-rw-r--r--tools/gslite/gslite-api.rtf349
-rw-r--r--tools/gslite/gslt.def31
-rw-r--r--tools/gslite/gslt.h64
-rw-r--r--tools/gslite/gslt.mak56
-rw-r--r--tools/gslite/gslt_alloc.c408
-rw-r--r--tools/gslite/gslt_alloc.h5
-rw-r--r--tools/gslite/gslt_font.h138
-rw-r--r--tools/gslite/gslt_font_api.c777
-rw-r--r--tools/gslite/gslt_font_api.h130
-rw-r--r--tools/gslite/gslt_font_api_test.c268
-rw-r--r--tools/gslite/gslt_font_cache.c174
-rw-r--r--tools/gslite/gslt_font_cff.c971
-rw-r--r--tools/gslite/gslt_font_encoding.c215
-rw-r--r--tools/gslite/gslt_font_glyph.c334
-rw-r--r--tools/gslite/gslt_font_int.h107
-rw-r--r--tools/gslite/gslt_font_test.c319
-rw-r--r--tools/gslite/gslt_font_ttf.c196
-rw-r--r--tools/gslite/gslt_image.c117
-rw-r--r--tools/gslite/gslt_image.h59
-rw-r--r--tools/gslite/gslt_image_jpeg.c144
-rw-r--r--tools/gslite/gslt_image_png.c226
-rw-r--r--tools/gslite/gslt_image_test.c181
-rw-r--r--tools/gslite/gslt_image_threads_test.c219
-rw-r--r--tools/gslite/gslt_image_tiff.c1069
-rw-r--r--tools/gslite/gslt_init.c215
-rw-r--r--tools/gslite/gslt_lib_gcc.mak147
-rw-r--r--tools/gslite/gslt_lib_msvc.mak147
-rw-r--r--tools/gslite/gslt_stubs.c44
-rw-r--r--tools/gslite/gslt_test.c1272
-rw-r--r--tools/gslite/tiger.jpgbin0 -> 177310 bytes
-rw-r--r--tools/label.tst185
-rw-r--r--tools/lineprinter.pclbin0 -> 637 bytes
-rwxr-xr-xtools/make_snapshot.sh84
-rwxr-xr-xtools/makeromttf.py145
-rw-r--r--tools/null.pxlbin0 -> 106 bytes
-rw-r--r--tools/opaque.pcl5
-rw-r--r--tools/origins.pcl78
-rw-r--r--tools/owl.pclbin0 -> 80680 bytes
-rw-r--r--tools/owl2.pclbin0 -> 80397 bytes
-rw-r--r--tools/pattern.pclbin0 -> 9864 bytes
-rw-r--r--tools/pattern.pxlbin0 -> 3108 bytes
-rwxr-xr-xtools/pcl2pdf7
-rw-r--r--tools/pcl2pdf.bat16
-rwxr-xr-xtools/pcl2pdfwr36
-rw-r--r--tools/pcl2pdfwr.bat57
-rwxr-xr-xtools/pxlasm.py796
-rwxr-xr-xtools/pxldis.py899
-rwxr-xr-xtools/regress.sh70
-rwxr-xr-xtools/revlist.py75
-rw-r--r--tools/smoke_baseline.txt181
-rwxr-xr-xtools/smoke_check.sh51
-rwxr-xr-xtools/smoke_update.sh38
-rwxr-xr-xtools/suite.tcl191
-rw-r--r--tools/tiger.px3bin0 -> 143535 bytes
-rw-r--r--tools/tiger.xpsbin0 -> 62775 bytes
-rw-r--r--tools/tt2pcl.c629
-rw-r--r--tools/viewer/Gpickle.java426
-rw-r--r--tools/viewer/GpickleObserver.java14
-rw-r--r--tools/viewer/GpickleThread.java227
-rw-r--r--tools/viewer/Gview.java988
-rw-r--r--tools/viewer/JavaDoc/allclasses-frame.html33
-rw-r--r--tools/viewer/JavaDoc/deprecated-list.html89
-rw-r--r--tools/viewer/JavaDoc/gpickle.html447
-rw-r--r--tools/viewer/JavaDoc/gpickleobserver.html169
-rw-r--r--tools/viewer/JavaDoc/gpicklethread.html242
-rw-r--r--tools/viewer/JavaDoc/gview.html1212
-rw-r--r--tools/viewer/JavaDoc/help-doc.html138
-rw-r--r--tools/viewer/JavaDoc/index-all.html426
-rw-r--r--tools/viewer/JavaDoc/index.html22
-rw-r--r--tools/viewer/JavaDoc/nav.html584
-rw-r--r--tools/viewer/JavaDoc/overview-tree.html124
-rw-r--r--tools/viewer/JavaDoc/package-frame.html43
-rw-r--r--tools/viewer/JavaDoc/package-list1
-rw-r--r--tools/viewer/JavaDoc/package-summary.html131
-rw-r--r--tools/viewer/JavaDoc/package-tree.html122
-rw-r--r--tools/viewer/JavaDoc/packages.html26
-rw-r--r--tools/viewer/JavaDoc/serialized-form.html451
-rw-r--r--tools/viewer/JavaDoc/stylesheet.css29
-rw-r--r--tools/viewer/Nav.java180
-rw-r--r--tools/viewer/README13
-rwxr-xr-xtools/xps2tiff/README10
-rwxr-xr-xtools/xps2tiff/xps2tiff.sln19
-rwxr-xr-xtools/xps2tiff/xps2tiff/AssemblyInfo.cpp60
-rwxr-xr-xtools/xps2tiff/xps2tiff/stdafx.cpp7
-rwxr-xr-xtools/xps2tiff/xps2tiff/stdafx.h9
-rwxr-xr-xtools/xps2tiff/xps2tiff/xps2tiff.cpp61
-rwxr-xr-xtools/xps2tiff/xps2tiff/xps2tiff.vcproj258
-rw-r--r--urwfonts/A028-Ext.ttfbin0 -> 165676 bytes
-rw-r--r--urwfonts/A028-Med.ttfbin0 -> 161440 bytes
-rw-r--r--urwfonts/A030-Bol.ttfbin0 -> 153536 bytes
-rw-r--r--urwfonts/A030-BolIta.ttfbin0 -> 148068 bytes
-rw-r--r--urwfonts/A030-Ita.ttfbin0 -> 148740 bytes
-rw-r--r--urwfonts/A030-Reg.ttfbin0 -> 150424 bytes
-rw-r--r--urwfonts/AntiqueOlive-Bol.ttfbin0 -> 154400 bytes
-rw-r--r--urwfonts/AntiqueOlive-Ita.ttfbin0 -> 143616 bytes
-rw-r--r--urwfonts/AntiqueOlive-Reg.ttfbin0 -> 148140 bytes
-rw-r--r--urwfonts/ArtLinePrinter.ttfbin0 -> 91640 bytes
-rw-r--r--urwfonts/CenturySchL-Bold.ttfbin0 -> 110688 bytes
-rw-r--r--urwfonts/CenturySchL-BoldItal.ttfbin0 -> 105784 bytes
-rw-r--r--urwfonts/CenturySchL-Ital.ttfbin0 -> 106968 bytes
-rw-r--r--urwfonts/CenturySchL-Roma.ttfbin0 -> 111880 bytes
-rw-r--r--urwfonts/ClarendonURW-BolCon.ttfbin0 -> 180176 bytes
-rw-r--r--urwfonts/Coronet.ttfbin0 -> 180012 bytes
-rw-r--r--urwfonts/Dingbats.ttfbin0 -> 58056 bytes
-rw-r--r--urwfonts/GaramondNo8-Ita.ttfbin0 -> 175508 bytes
-rw-r--r--urwfonts/GaramondNo8-Med.ttfbin0 -> 204256 bytes
-rw-r--r--urwfonts/GaramondNo8-MedIta.ttfbin0 -> 193632 bytes
-rw-r--r--urwfonts/GaramondNo8-Reg.ttfbin0 -> 204204 bytes
-rw-r--r--urwfonts/LetterGothic-Bol.ttfbin0 -> 137000 bytes
-rw-r--r--urwfonts/LetterGothic-BolIta.ttfbin0 -> 133204 bytes
-rw-r--r--urwfonts/LetterGothic-Ita.ttfbin0 -> 129924 bytes
-rw-r--r--urwfonts/LetterGothic-Reg.ttfbin0 -> 129580 bytes
-rw-r--r--urwfonts/Mauritius-Reg.ttfbin0 -> 138392 bytes
-rw-r--r--urwfonts/NimbusMonL-Bold.ttfbin0 -> 93968 bytes
-rw-r--r--urwfonts/NimbusMonL-BoldObli.ttfbin0 -> 94184 bytes
-rw-r--r--urwfonts/NimbusMonL-Regu.ttfbin0 -> 87236 bytes
-rw-r--r--urwfonts/NimbusMonL-ReguObli.ttfbin0 -> 89352 bytes
-rw-r--r--urwfonts/NimbusMono-Bol.ttfbin0 -> 161896 bytes
-rw-r--r--urwfonts/NimbusMono-BolIta.ttfbin0 -> 161500 bytes
-rw-r--r--urwfonts/NimbusMono-Ita.ttfbin0 -> 152976 bytes
-rw-r--r--urwfonts/NimbusMono-Reg.ttfbin0 -> 150584 bytes
-rw-r--r--urwfonts/NimbusRomNo9L-Medi.ttfbin0 -> 108956 bytes
-rw-r--r--urwfonts/NimbusRomNo9L-MediItal.ttfbin0 -> 106092 bytes
-rw-r--r--urwfonts/NimbusRomNo9L-Regu.ttfbin0 -> 109204 bytes
-rw-r--r--urwfonts/NimbusRomNo9L-ReguItal.ttfbin0 -> 107272 bytes
-rw-r--r--urwfonts/NimbusRomanNo4-Bol.ttfbin0 -> 179924 bytes
-rw-r--r--urwfonts/NimbusRomanNo4-BolIta.ttfbin0 -> 174080 bytes
-rw-r--r--urwfonts/NimbusRomanNo4-Lig.ttfbin0 -> 178364 bytes
-rw-r--r--urwfonts/NimbusRomanNo4-LigIta.ttfbin0 -> 177448 bytes
-rw-r--r--urwfonts/NimbusRomanNo9-Ita.ttfbin0 -> 173552 bytes
-rw-r--r--urwfonts/NimbusRomanNo9-Med.ttfbin0 -> 177924 bytes
-rw-r--r--urwfonts/NimbusRomanNo9-MedIta.ttfbin0 -> 167464 bytes
-rw-r--r--urwfonts/NimbusRomanNo9-Reg.ttfbin0 -> 177052 bytes
-rw-r--r--urwfonts/NimbusSanL-Bold.ttfbin0 -> 131760 bytes
-rw-r--r--urwfonts/NimbusSanL-BoldCond.ttfbin0 -> 90728 bytes
-rw-r--r--urwfonts/NimbusSanL-BoldCondItal.ttfbin0 -> 91284 bytes
-rw-r--r--urwfonts/NimbusSanL-BoldItal.ttfbin0 -> 128168 bytes
-rw-r--r--urwfonts/NimbusSanL-Regu.ttfbin0 -> 125556 bytes
-rw-r--r--urwfonts/NimbusSanL-ReguCond.ttfbin0 -> 91864 bytes
-rw-r--r--urwfonts/NimbusSanL-ReguCondItal.ttfbin0 -> 89780 bytes
-rw-r--r--urwfonts/NimbusSanL-ReguItal.ttfbin0 -> 123976 bytes
-rw-r--r--urwfonts/StandardSymL.ttfbin0 -> 40528 bytes
-rw-r--r--urwfonts/U001-Bol.ttfbin0 -> 150084 bytes
-rw-r--r--urwfonts/U001-BolIta.ttfbin0 -> 143768 bytes
-rw-r--r--urwfonts/U001-Ita.ttfbin0 -> 143428 bytes
-rw-r--r--urwfonts/U001-Reg.ttfbin0 -> 145604 bytes
-rw-r--r--urwfonts/U001Con-Bol.ttfbin0 -> 150252 bytes
-rw-r--r--urwfonts/U001Con-BolIta.ttfbin0 -> 142296 bytes
-rw-r--r--urwfonts/U001Con-Ita.ttfbin0 -> 142916 bytes
-rw-r--r--urwfonts/U001Con-Reg.ttfbin0 -> 146160 bytes
-rw-r--r--urwfonts/URWBookmanL-DemiBold.ttfbin0 -> 106544 bytes
-rw-r--r--urwfonts/URWBookmanL-DemiBoldItal.ttfbin0 -> 103688 bytes
-rw-r--r--urwfonts/URWBookmanL-Ligh.ttfbin0 -> 106380 bytes
-rw-r--r--urwfonts/URWBookmanL-LighItal.ttfbin0 -> 103780 bytes
-rw-r--r--urwfonts/URWChanceryL-MediItal.ttfbin0 -> 109772 bytes
-rw-r--r--urwfonts/URWClassico-Bol.ttfbin0 -> 162080 bytes
-rw-r--r--urwfonts/URWClassico-BolIta.ttfbin0 -> 160196 bytes
-rw-r--r--urwfonts/URWClassico-Ita.ttfbin0 -> 161360 bytes
-rw-r--r--urwfonts/URWClassico-Reg.ttfbin0 -> 162888 bytes
-rw-r--r--urwfonts/URWGothicL-Book.ttfbin0 -> 88800 bytes
-rw-r--r--urwfonts/URWGothicL-BookObli.ttfbin0 -> 87808 bytes
-rw-r--r--urwfonts/URWGothicL-Demi.ttfbin0 -> 92484 bytes
-rw-r--r--urwfonts/URWGothicL-DemiObli.ttfbin0 -> 90092 bytes
-rw-r--r--urwfonts/URWPalladioL-Bold.ttfbin0 -> 106708 bytes
-rw-r--r--urwfonts/URWPalladioL-BoldItal.ttfbin0 -> 104216 bytes
-rw-r--r--urwfonts/URWPalladioL-Ital.ttfbin0 -> 105224 bytes
-rw-r--r--urwfonts/URWPalladioL-Roma.ttfbin0 -> 108008 bytes
-rw-r--r--urwfonts/WingSub.ttfbin0 -> 65132 bytes
-rw-r--r--wts_dump_0bin0 -> 13518 bytes
-rw-r--r--wts_plane_0bin0 -> 13518 bytes
-rw-r--r--wts_plane_1bin0 -> 15954 bytes
-rw-r--r--wts_plane_2bin0 -> 12118 bytes
-rw-r--r--wts_plane_3bin0 -> 35780 bytes
-rw-r--r--xps/TODO19
-rw-r--r--xps/ghostxps.h392
-rw-r--r--xps/xps.mak136
-rw-r--r--xps/xps.vcproj266
-rw-r--r--xps/xps_gcc.mak69
-rw-r--r--xps/xps_msvc.mak132
-rw-r--r--xps/xpscff.c934
-rw-r--r--xps/xpscolor.c250
-rw-r--r--xps/xpscommon.c96
-rw-r--r--xps/xpscrc.c85
-rw-r--r--xps/xpsdoc.c953
-rw-r--r--xps/xpsfont.c542
-rw-r--r--xps/xpsglyphs.c683
-rw-r--r--xps/xpsgradient.c778
-rw-r--r--xps/xpshdp.c10
-rw-r--r--xps/xpsimage.c340
-rw-r--r--xps/xpsjpeg.c101
-rw-r--r--xps/xpsmem.c106
-rw-r--r--xps/xpsopacity.c70
-rw-r--r--xps/xpspage.c225
-rw-r--r--xps/xpspath.c1136
-rw-r--r--xps/xpspng.c189
-rw-r--r--xps/xpsresource.c130
-rw-r--r--xps/xpstiff.c1065
-rw-r--r--xps/xpstile.c267
-rw-r--r--xps/xpstop.c534
-rw-r--r--xps/xpsttf.c384
-rw-r--r--xps/xpsutf.c54
-rw-r--r--xps/xpsvisual.c43
-rw-r--r--xps/xpsxml.c312
-rw-r--r--xps/xpszip.c518
482 files changed, 116939 insertions, 0 deletions
diff --git a/CMYK.icc b/CMYK.icc
new file mode 100644
index 000000000..f199807df
--- /dev/null
+++ b/CMYK.icc
Binary files differ
diff --git a/COPYING b/COPYING
new file mode 100644
index 000000000..7a8e8abfd
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..942529370
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,59 @@
+
+ The files in the common, doc, main, pcl, pl, psi, pxl, tools
+ and xps directories (folders) and any subdirectories (sub-folders)
+ thereof are part of GhostPCL and GhostXPS.
+
+ The files in the gs directory (folder) and the subdirectories
+ (sub-folders) thereof are part of GPL Ghostscript, along with
+ copies of its dependent third-party libraries. See the file
+ gs/LICENSE for information about this directory,
+
+ GhostPCL, GhostXPS, and GPL Ghostscript are free software; you can
+ redistribute and/or modify them under the terms of version 2 of the
+ GNU General Public License as published by the Free Software Foundation.
+
+ GhostPCL, GhostXPS, and GPL Ghostscript are distributed in the hope
+ that they 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 so you can know your rights and responsibilities.
+ It should be in a file named COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place Suite 330, Boston, MA
+ 02111-1307, USA.
+
+ ---
+
+ The set of truetype fonts in the urwfonts directory are necessary for
+ the PCL/XL interpreter to function propery but they are NOT FREE
+ SOFTWARE and are NOT distributed under the GNU GPL. They can instead
+ be redistributed under the AFPL licence which bars commercial use.
+
+ ---
+ This software (GhostPCL, GhostXPS and GPL Ghostscript) contains
+ an implementation of techniques covered by US Patents 5,055,942
+ and 5,917,614, and corresponding international patents. These
+ patents are licensed for use with this software under the following
+ grant:
+
+ Whereas, Raph Levien (hereinafter "Inventor") has obtained patent
+ protection for related technology (hereinafter "Patented
+ Technology"), Inventor wishes to aid the the GNU Free Software
+ project in achieving its goals, and Inventor also wishes to
+ increase public awareness of Patented Technology, Inventor hereby
+ grants a fully paid up, nonexclusive, royalty free license to
+ practice the patents listed below ("the Patents") if and only if
+ practiced in conjunction with software distributed under the
+ terms of any version of the GNU General Public License as
+ published by the Free Software Foundation, 59 Temple Place, Suite
+ 330, Boston, MA 02111. Inventor reserves all other rights,
+ including without limitation, licensing for software not
+ distributed under the GNU General Public License.
+
+ 5055942 Photographic image reproduction device using digital
+ halftoning to screen images allowing adjustable coarseness
+
+ 5917614 Method and apparatus for error diffusion screening of
+ images with improved smoothness in highlight and shadow
+ regions
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..3dc3369ef
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,145 @@
+all: pcl xps svg ls-product
+
+debug: pcl-debug xps-debug svg-debug ls-debug
+
+clean: pcl-clean xps-clean svg-clean ls-clean
+
+test: pcl-test ls-test
+
+# only pcl has an install target at this point
+install: pcl-install
+
+uninstall: pcl-uninstall
+
+product: pcl
+
+# specific front-end targets
+
+pcl:
+ $(MAKE) -C main -f pcl6_gcc.mak pdl-product # build PCL and PCLXL.
+
+pcl-debug:
+ $(MAKE) -C main -f pcl6_gcc.mak pdl-debug
+
+fonts:
+ mkdir -p /windows/fonts/ # make a font directory. 2
+ cp urwfonts/*.ttf /windows/fonts/ # copy the fonts.
+ touch fonts
+
+pcl-profile:
+ $(MAKE) -C main -f pcl6_gcc.mak pdl-pg
+
+pcl-install:
+ install main/obj/pcl6 /usr/local/bin
+
+pcl-uninstall:
+ rm -f /usr/local/bin/pcl6
+
+pcl-test:
+ ./main/obj/pcl6 -dTextAlphaBits=4 \
+ tools/owl.pcl tools/tiger.px3 # test with PCL and PXL test files
+
+# NB - this does not remove the fonts. blowing away /windows/fonts
+# might be unexpected on some systems and we don't enumerate the font
+# names here so they could be removed individually.
+
+pcl-clean:
+ $(MAKE) -C main -f pcl6_gcc.mak pdl-clean
+ rm -f fonts
+
+xps-debug:
+ $(MAKE) -C xps -f xps_gcc.mak pdl-debug
+
+xps:
+ $(MAKE) -C xps -f xps_gcc.mak pdl-product # build XPS
+
+xps-clean:
+ $(MAKE) -C xps -f xps_gcc.mak pdl-clean
+
+svg-debug:
+ $(MAKE) -C svg -f svg_gcc.mak pdl-debug
+
+svg:
+ $(MAKE) -C svg -f svg_gcc.mak pdl-product # build SVG
+
+svg-clean:
+ $(MAKE) -C svg -f svg_gcc.mak pdl-clean
+
+#### UFST LIBRARY DEPENDENCY RULES ####
+
+ufst:
+ $(MAKE) -C ufst/rts/lib -f makefile.artifex
+
+#### LANGUAGE SWITCHING PRODUCT RULES ####
+
+ls-profile:
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak pdl-pg
+
+ls-product:
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak pdl-product # build PS/PCL/XL.
+
+ls-debug:
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak pdl-debug
+
+ls-fonts:
+ mkdir -p /windows/fonts/ # make a font directory. 2
+ cp urwfonts/*.ttf /windows/fonts/ # copy the fonts.
+ touch fonts
+
+ls-install:
+ install language_switch/obj/pspcl6 /usr/local/bin
+
+# test with PCL, PXL and PS file
+ls-test:
+ (cd ./gs/lib/; \
+ ../../language_switch/obj/pspcl6 -dTextAlphaBits=4 \
+ ../../tools/owl.pcl ../../tools/tiger.px3 ../examples/tiger.eps)
+
+check:
+ tools/smoke_check.sh
+
+
+# NB - this does not remove the fonts. blowing away /windows/fonts
+# might be unexpected on some systems and we don't enumerate the font
+# names here so they could be removed individually.
+
+ls-clean:
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak pdl-clean
+ rm -f fonts /usr/local/bin/pspcl6
+
+# shortcuts for common build types.
+
+ls-uproduct: ufst
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak PL_SCALER=ufst GENDIR="./ufst-obj" pdl-product
+ cp *.icc ./language_switch/ufst-obj
+ cp wts_* ./language_switch/ufst-obj
+
+ls-udebug: ufst
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak PL_SCALER=ufst GENDIR="./ufst-obj" pdl-debug
+ cp *.icc ./language_switch/ufst-obj
+ cp wts_* ./language_switch/ufst-obj
+
+ls-uclean:
+ $(MAKE) -C language_switch -f pspcl6_gcc.mak PL_SCALER=ufst GENDIR="./ufst-obj" pdl-clean
+ $(MAKE) -C ufst/rts/lib -f makefile.artifex clean
+
+uproduct: ufst
+ $(MAKE) -C main -f pcl6_gcc.mak PL_SCALER=ufst GENDIR="./ufst-obj" pdl-product
+ cp *.icc ./main/ufst-obj
+ cp wts_* ./main/ufst-obj
+
+udebug: ufst
+ $(MAKE) -C main -f pcl6_gcc.mak PL_SCALER=ufst GENDIR="./ufst-debugobj" pdl-debug
+ cp *.icc ./main/ufst-debugobj
+ cp wts_* ./main/ufst-debugobj
+
+uclean:
+ $(MAKE) -C main -f pcl6_gcc.mak PL_SCALER=ufst GENDIR="./ufst-obj" pdl-clean
+ $(MAKE) -C ufst/rts/lib -f makefile.artifex clean
+
+all-debug: pcl-debug udebug ls-debug ls-udebug xps-debug
+
+all-clean: clean uclean ls-uclean ls-clean
+ $(MAKE) -C ufst/rts/lib -f makefile.artifex clean
+
+.PHONY: all clean test check install uninstall product profile pcl pcl-debug pcl-test pcl-install pcl-uninstall pcl-clean xps xps-debug svg svg-debug ls-clean ls-test ls-install ls-product ls-profile ls-udebug udebug ufst
diff --git a/README.txt b/README.txt
new file mode 100644
index 000000000..3eecbc6d6
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,79 @@
+== GhostPDL ==
+
+This is an implemenation of several page description languages on
+top of the Ghostscript graphics library.
+
+Ghostscript PCL5e, PCL5c and PXL documentation is in doc/ghostpcl.*
+License is in LICENSE and COPYING. For information on support and
+commercial distribution please contact http://artifex.com/
+
+=== BUILD INSTRUCTIONS ===
+
+If you are using GNU Make, a complete build can be generated by just
+typing:
+
+make
+
+in the top level source directory. This will create three different
+builds. In main/obj/pcl6 a build of GhostPCL with support for PCL5e,
+PCL5c, and PXL. In language_switch/obj/pspcl6 a build of GhostPCL with
+additional support for PostScript and PDF. In xps/obj/gxps a build
+with support for XPS.
+
+===
+
+The same executables can be built with Microsoft Visual C by running
+the appropriate *_mvsc.mak file through nmake. For example:
+
+cd xps
+nmake -f xps_msvc.mak
+
+or
+
+cd main
+nmake -f pcl6_msvc.mak
+
+There is also an experimental solution file which builds GhostXPS
+as xps\obj\gxps.exe.
+
+The makefiles default to supporting MSVC 8 (2005) To use another
+version, append it to the nmake command line, for example:
+
+cd main
+nmake -f pcl6_msvc.mak MSVC_VERSION=6
+
+===
+
+To build just the xps interpreter with GNU make and gcc, type:
+
+make xps
+
+The executable will be xps/obj/gxps.
+
+To build a shared language build with PCL/PXL and PostScript/PDF
+
+make ls-product
+
+The executable with be in language_switch/obj/pspcl6
+
+===
+
+Note for cygwin users
+
+make CYGWIN=TRUE
+make install
+
+The CYGWIN variable will not include devices that depend on threads or
+X11, neither are supported by the default cygwin system.
+
+To build with a different font scaler use:
+
+make PL_SCALER=afs ... # build using the Artifex Font scaler also the default.
+make PL_SCALER=ufst ...# build with the AGFA Font Scaler.
+
+We recommend doing a clean make prior to the changing the font scaler.
+
+The default location for the fonts is /windows/fonts, but the current
+working directory is also searched. If the fonts are placed in another
+location the environment variable PCLFONTSOURCE must be set accordingly.
+See the documentation for more details.
diff --git a/common/cp.bat b/common/cp.bat
new file mode 100755
index 000000000..f40abfdff
--- /dev/null
+++ b/common/cp.bat
@@ -0,0 +1,11 @@
+@rem $Id$
+@echo off
+if "%2"=="." goto ne
+ if exist _.tmp erase _.tmp
+ rem >_.tmp
+ copy /B %1+_.tmp %2
+ erase _.tmp
+goto x
+:ne
+ copy /B %1 %2
+:x
diff --git a/common/gccdefs.mak b/common/gccdefs.mak
new file mode 100644
index 000000000..2ed231a68
--- /dev/null
+++ b/common/gccdefs.mak
@@ -0,0 +1,8 @@
+# Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# gccdefs.mak
+# Definitions for compilation with gcc.
+
+CC_=gcc $(GENOPT) $(CFLAGS) $(XCFLAGS) -c
+CCAUX=gcc $(CFLAGS)
diff --git a/common/generic.mak b/common/generic.mak
new file mode 100644
index 000000000..7abdcd3a6
--- /dev/null
+++ b/common/generic.mak
@@ -0,0 +1,77 @@
+# Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# generic.mak
+# Definitions common to all subsystem makefiles.
+
+# All of Aladdin's products use a common scheme for their makefiles.
+# Products are built out of one or more subsystems.
+# Each subsystem has its own source directory, which includes a makefile
+# for that subsystem.
+# All makefiles have a common structure, shown here in the form of a tree
+# in which the edges are created by 'include' statements:
+#
+# 1. Top-level makefile:
+# << Parameter and directory definitions >>
+# 2. Definitions for top-level products built using a
+# particular OS/compiler combinations:
+# 3. Definitions for a particular compiler;
+# 4. Definitions for a particular OS;
+# 5. Generic definitions (this file);
+# << rules >>
+# 6. Makefiles for each subsystem;
+# 7. Definitions and rules for the product.
+#
+# The following table shows the dependencies of each makefile on the
+# different configuration variables, and also indicates in which directory
+# the makefile is normally located:
+#
+# Prod. Subsys. OS Compiler directory
+# 1 X X X X product source
+# 2 X X common
+# 3 X common
+# 4 X common
+# 5 common
+# 6 X subsystem source
+# 7 X product source
+#
+# Currently, the product and subsystem source directories are the same,
+# but there is no logical requirement for this and it may change in
+# the future.
+#
+# Each makefile in the tree must provide certain definitions for makefiles
+# that follow it in the traversal (execution) order, since some versions
+# of 'make' expand macros eagerly rather than lazily. Here are the
+# definitions that each makefile must provide. See the individual
+# makefiles for more detailed descriptions.
+#
+# 1 MAKEFILE, <subsys>DIR for each subsystem, TARGET_XE
+# 2 (rule for building executable)
+# 3 CC_
+# 4 D, OBJ, C_, I_, II, _I, O_, XE, CP_, RM_, RMN_
+# 5 GS_XE, ECHOGS_XE, SETMOD, ADDMOD
+# 6 <subsys>_MAK
+# 7 (default rule)
+#
+# Here are some examples of the 7 different makefile types that may be
+# helpful in understanding the structure:
+#
+# 1 pcl/pcl_ugcc.mak
+# 2 common/ugcc_top.mak
+# 3 common/gccdefs.mak
+# 4 common/unixdefs.mak
+# 5 common/generic.mak
+# 6 pcl/pcl.mak
+# 7 pcl/pcl_top.mak
+
+# Define the Ghostscript executable.
+# Currently it always lives in the GLOBJ directory.
+GS_XE=$(GLOBJDIR)$(D)gs$(XE)
+
+# Define the echogs executable.
+# Currently it always lives in the GLOBJ directory.
+ECHOGS_XE=$(GLOBJDIR)$(D)echogs$(XE)
+
+# Define the commands for building module descriptions.
+SETMOD=$(ECHOGS_XE) -e .dev -w- -Q-obj
+ADDMOD=$(ECHOGS_XE) -e .dev -a-
diff --git a/common/msvc_top.mak b/common/msvc_top.mak
new file mode 100644
index 000000000..183ac2a26
--- /dev/null
+++ b/common/msvc_top.mak
@@ -0,0 +1,216 @@
+# Copyright (C) 1997-2007 Artifex Software, Inc.
+# All Rights Reserved.
+#
+# This software is provided AS-IS with no warranty, either express or
+# implied.
+#
+# This software is distributed under license and may not be copied, modified
+# or distributed except as expressly authorized under the terms of that
+# license. Refer to licensing information at http://www.artifex.com/
+# or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+# San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+#
+# msvc_top.mak
+# Generic top-level makefile for Win32 Microsoft Visual C (ver >= 4.1)
+
+# The product-specific top-level makefile defines the following:
+# MAKEFILE, COMMONDIR, CONFIG, DEBUG, DEVICE_DEVS, GSDIR, MAIN_OBJ,
+# NOPRIVATE, TDEBUG, TARGET_DEVS, TARGET_XE, MSVC_VERSION
+# It also must include the product-specific *.mak.
+
+# XE isn't defined yet.
+default: $(TARGET_XE).exe
+
+# Define the ANSI-to-K&R dependency. Borland C, Microsoft C and
+# Watcom C all accept ANSI syntax, but we need to preconstruct ccf32.tr
+# to get around the limit on the maximum length of a command line.
+
+AK=$(GLGENDIR)\ccf32.tr
+
+# clean gs files using the, we also clean up the platform files here
+# this should be separate. TODO remove genarch.ilk and genarch.pdb as
+# well.
+
+clean_gs:
+ nmake /f $(GLSRCDIR)\msvclib.mak \
+ GLSRCDIR=$(GLSRCDIR) GLGENDIR=$(GLGENDIR) \
+ GLOBJDIR=$(GLOBJDIR) clean
+ erase $(TARGET_XE).ilk
+ erase $(TARGET_XE).pdb
+ erase $(TARGET_XE).exp
+ erase $(TARGET_XE).lib
+
+# Define names of utility programs
+AUXGENDIR=$(GLGENDIR)
+AUXGEN=$(AUXGENDIR)$(D)
+ANSI2KNR_XE=$(AUXGEN)ansi2knr.exe
+ECHOGS_XE=$(AUXGEN)echogs.exe
+GENARCH_XE=$(AUXGEN)genarch.exe
+GENCONF_XE=$(AUXGEN)genconf.exe
+GENDEV_XE=$(AUXGEN)gendev.exe
+GENINIT_XE=$(AUXGEN)geninit.exe
+GENHT_XE=$(AUXGEN)genht.exe
+MKROMFS_XE=$(AUXGEN)mkromfs$(XEAUX)
+
+
+# Platform specification
+#**************** PATCHES expected by some of the GS files
+JGENDIR=$(GLGENDIR)
+JOBJDIR=$(GLOBJDIR)
+PNGGENDIR=$(GLGENDIR)
+PNGOBJDIR=$(GLOBJDIR)
+ZGENDIR=$(GLGENDIR)
+ZOBJDIR=$(GLOBJDIR)
+GLSRC=$(GLSRCDIR)$(D)
+GLGEN=$(GLGENDIR)$(D)
+GLOBJ=$(GLOBJDIR)$(D)
+#**************** END PATCHES
+
+
+!if "$(PSICFLAGS)" == "/DPSI_INCLUDED"
+# 1 --> Use 64 bits for gx_color_index. This is required only for
+# non standard devices or DeviceN process color model devices.
+USE_LARGE_COLOR_INDEX=1
+
+!if $(USE_LARGE_COLOR_INDEX) == 1
+# Definitions to force gx_color_index to 64 bits
+LARGEST_UINTEGER_TYPE=unsigned __int64
+GX_COLOR_INDEX_TYPE=$(LARGEST_UINTEGER_TYPE)
+
+CFLAGS=$(CFLAGS) /DGX_COLOR_INDEX_TYPE="$(GX_COLOR_INDEX_TYPE)"
+!endif
+!endif # psi included.
+
+!include $(COMMONDIR)\msvcdefs.mak
+!include $(COMMONDIR)\pcdefs.mak
+!include $(COMMONDIR)\generic.mak
+!include $(GLSRCDIR)\msvccmd.mak
+!include $(GLSRCDIR)\lib.mak
+!include $(GLSRCDIR)\msvctail.mak
+
+!IF "$(PSICFLAGS)" == "/DPSI_INCLUDED"
+
+# Build the required GS library files. It's simplest always to build
+# the floating point emulator, even though we don't always link it in.
+# HACK * HACK * HACK - we force this make to occur since we have no
+# way to determine if gs .c files are out of date.
+
+FORCE:
+
+$(GENDIR)/ldgs.tr: FORCE
+ -mkdir $(GLGENDIR)
+ -mkdir $(GLOBJDIR)
+ $(MAKE) /F $(GLSRCDIR)\msvc32.mak MSVC_VERSION="$(MSVC_VERSION)" \
+ GLSRCDIR="$(GLSRCDIR)" DEBUG=$(DEBUG) NOPRIVATE=$(NOPRIVATE) \
+ GLGENDIR="$(GLGENDIR)" GLOBJDIR="$(GLOBJDIR)" \
+ EXPATSRCDIR="$(EXPATSRCDIR)" SHARE_EXPAT="$(SHARE_EXPAT)" \
+ EXPAT_CFLAGS="$(EXPAT_CFLAGS)" \
+ ICCSRCDIR="$(ICCSRCDIR)" IMDISRCDIR="$(IMDISRCDIR)" \
+ PNGSRCDIR="$(PNGSRCDIR)" \
+ SHARE_LIBPNG="$(SHARE_LIBPNG)" \
+ JSRCDIR="$(JSRCDIR)" \
+ ZSRCDIR="$(ZSRCDIR)" ZGENDIR="$(ZGENDIR)" ZOBJDIR="$(ZOBJDIR)" ZLIB_NAME="$(ZLIB_NAME)" SHARE_ZLIB="$(SHARE_ZLIB)" \
+ PSSRCDIR=$(PSSRCDIR) PSGENDIR=$(GENDIR) \
+ PSLIBDIR=$(PSLIBDIR) PSRESDIR=$(PSRESDIR)\
+ DEVSTUDIO="$(DEVSTUDIO)" \
+ XCFLAGS="$(XCFLAGS)" \
+ COMPILE_INITS=$(COMPILE_INITS) PCLXL_ROMFS_ARGS="$(PCLXL_ROMFS_ARGS)" PJL_ROMFS_ARGS="$(PJL_ROMFS_ARGS)" \
+ UFST_ROOT=$(UFST_ROOT) UFST_BRIDGE=$(UFST_BRIDGE) UFST_LIB_EXT=$(UFST_LIB_EXT) \
+ UFST_ROMFS_ARGS="$(UFST_ROMFS_ARGS)" \
+ UFST_CFLAGS="$(UFST_CFLAGS)" \
+ FEATURE_DEVS="$(FEATURE_DEVS)" DEVICE_DEVS="$(DEVICE_DEVS)" \
+ BAND_LIST_STORAGE=$(BAND_LIST_STORAGE) BAND_LIST_COMPRESSOR=$(BAND_LIST_COMPRESSOR) \
+ CPU_TYPE="$(CPU_TYPE)" CONFIG="$(CONFIG)" \
+ $(GLOBJDIR)\gsargs.$(OBJ) $(GLOBJDIR)\echogs.exe \
+ $(GLOBJDIR)\ld.tr $(GLOBJDIR)\gconfig.$(OBJ) \
+ $(GLOBJDIR)\gscdefs.$(OBJ) $(GLOBJDIR)\iconfig.$(OBJ) \
+ $(GLOBJDIR)\iccinit$(COMPILE_INITS).$(OBJ) $(GLOBJDIR)\gsromfs$(COMPILE_INITS).$(OBJ)
+ $(CP_) $(GENDIR)\ld.tr $(GENDIR)\ldgs.tr
+
+!ELSE
+
+FORCE:
+# Build the required GS library files. It's simplest always to build
+# the floating point emulator, even though we don't always link it in.
+# HACK * HACK * HACK - we force this make to occur since we have no
+# way to determine if gs .c files are out of date.
+# We make a dummy gs_init.ps since this is hard coded as a dependency of gsromfs.c
+# to avoid having to define everything in the top level makefiles (also of a hack)
+$(GENDIR)/ldgs.tr: FORCE
+ -echo $(PSICFLAGS)
+ -mkdir $(GLGENDIR)
+ -mkdir $(GLOBJDIR)
+ echo > $(GLOBJDIR)/gs_init.ps
+ $(MAKE) /F $(GLSRCDIR)\msvclib.mak MSVC_VERSION="$(MSVC_VERSION)" \
+ GLSRCDIR="$(GLSRCDIR)" DEBUG=$(DEBUG) NOPRIVATE=$(NOPRIVATE) \
+ GLGENDIR="$(GLGENDIR)" GLOBJDIR="$(GLOBJDIR)" \
+ EXPATSRCDIR="$(EXPATSRCDIR)" SHARE_EXPAT="$(SHARE_EXPAT)" \
+ EXPAT_CFLAGS="$(EXPAT_CFLAGS)" \
+ ICCSRCDIR="$(ICCSRCDIR)" IMDISRCDIR="$(IMDISRCDIR)" \
+ PNGSRCDIR="$(PNGSRCDIR)" \
+ SHARE_LIBPNG="$(SHARE_LIBPNG)" \
+ JSRCDIR="$(JSRCDIR)" \
+ ZSRCDIR="$(ZSRCDIR)" ZGENDIR="$(ZGENDIR)" ZOBJDIR="$(ZOBJDIR)" ZLIB_NAME="$(ZLIB_NAME)" SHARE_ZLIB="$(SHARE_ZLIB)" \
+ PSSRCDIR=$(PSSRCDIR) PSGENDIR=$(GENDIR) \
+ PSLIBDIR=$(PSLIBDIR) PSRESDIR=$(PSRESDIR)\
+ DEVSTUDIO="$(DEVSTUDIO)" \
+ XCFLAGS="$(XCFLAGS)" \
+ COMPILE_INITS=$(COMPILE_INITS) PCLXL_ROMFS_ARGS="$(PCLXL_ROMFS_ARGS)" PJL_ROMFS_ARGS="$(PJL_ROMFS_ARGS)" \
+ UFST_ROOT=$(UFST_ROOT) UFST_BRIDGE=$(UFST_BRIDGE) UFST_LIB_EXT=$(UFST_LIB_EXT) \
+ UFST_ROMFS_ARGS="$(UFST_ROMFS_ARGS)" \
+ UFST_CFLAGS="$(UFST_CFLAGS)" \
+ PSD="$(GENDIR)/" \
+ FEATURE_DEVS="$(FEATURE_DEVS)" DEVICE_DEVS="$(DEVICE_DEVS)" \
+ BAND_LIST_STORAGE=$(BAND_LIST_STORAGE) BAND_LIST_COMPRESSOR=$(BAND_LIST_COMPRESSOR) \
+ GLOBJ=$(GLOBJ) GLGEN=$(GLGEN) \
+ CPU_TYPE="$(CPU_TYPE)" CONFIG="$(CONFIG)" \
+ $(GLOBJDIR)\gsargs.$(OBJ) $(GLOBJDIR)\echogs.exe \
+ $(GLOBJDIR)\ld.tr $(GLOBJDIR)\gconfig.$(OBJ) \
+ $(GLOBJDIR)\gscdefs.$(OBJ) $(GLOBJDIR)\gsromfs$(COMPILE_INITS).$(OBJ)
+ $(CP_) $(GENDIR)\ld.tr $(GENDIR)\ldgs.tr
+
+!ENDIF
+
+# Build the configuration file.
+$(GENDIR)\pconf.h $(GENDIR)\ldconf.tr: $(TARGET_DEVS) $(GLOBJDIR)\genconf$(XE)
+ $(GLOBJDIR)\genconf -n - $(TARGET_DEVS) -h $(GENDIR)\pconf.h -ol $(GENDIR)\ldconf.tr
+
+!if "$(TDEBUG)" == "1"
+$(GENDIR)\lib32.rsp: $(MAKEFILE)
+ echo /NODEFAULTLIB:LIBC.lib > $(GENDIR)\lib32.rsp
+ echo /NODEFAULTLIB:LIBCMT.lib >> $(GENDIR)\lib32.rsp
+ echo LIBCMTD.lib >> $(GENDIR)\lib32.rsp
+!else
+$(GENDIR)\lib32.rsp: $(MAKEFILE)
+ echo /NODEFAULTLIB:LIBC.lib > $(GENDIR)\lib32.rsp
+ echo /NODEFAULTLIB:LIBCMTD.lib >> $(GENDIR)\lib32.rsp
+ echo LIBCMT.lib >> $(GENDIR)\lib32.rsp
+!endif
+
+# Link an MS executable.
+$(GENDIR)\ldall.tr: $(MAKEFILE) $(GENDIR)\ldgs.tr $(GENDIR)\ldconf.tr $(GENDIR)\lib32.rsp
+ echo /SUBSYSTEM:CONSOLE >$(GENDIR)\ldall.tr
+ $(CP_) $(GENDIR)\ldall.tr+$(GENDIR)\ldgs.tr $(GENDIR)\ldall.tr
+ echo $(GLOBJDIR)\gsargs.$(OBJ) >>$(GENDIR)\ldall.tr
+ echo $(GLOBJDIR)\gconfig.$(OBJ) >>$(GENDIR)\ldall.tr
+ echo $(GLOBJDIR)\gscdefs.$(OBJ) >>$(GENDIR)\ldall.tr
+ echo $(GLOBJDIR)\gsromfs$(COMPILE_INITS).$(OBJ) >>$(GENDIR)\ldall.tr
+ $(CP_) $(GENDIR)\ldall.tr+$(GENDIR)\ldconf.tr $(GENDIR)\ldall.tr
+
+# AGFA Workaround to add needed ufst font libraries.
+!IF "$(PL_SCALER)" == "ufst"
+FONTLIB=$(GENDIR)\fontlib.tr
+$(FONTLIB): $(MAKEFILE)
+ echo $(UFST_LIB)\fco_lib.lib >>$(FONTLIB)
+ echo $(UFST_LIB)\if_lib.lib >>$(FONTLIB)
+ echo $(UFST_LIB)\tt_lib.lib >>$(FONTLIB)
+
+$(TARGET_XE)$(XE): $(GENDIR)\ldall.tr $(MAIN_OBJ) $(TOP_OBJ) $(LIBCTR) $(FONTLIB)
+ $(LINK_SETUP)
+ $(LINK) $(LCT) /OUT:$(TARGET_XE)$(XE) $(MAIN_OBJ) $(TOP_OBJ) @$(GENDIR)\ldall.tr @$(GENDIR)\lib32.rsp @$(LIBCTR) $(FONTLIB)
+
+!ELSE
+$(TARGET_XE)$(XE): $(GENDIR)\ldall.tr $(MAIN_OBJ) $(TOP_OBJ) $(LIBCTR)
+ $(LINK_SETUP)
+ $(LINK) $(LCT) /OUT:$(TARGET_XE)$(XE) $(MAIN_OBJ) $(TOP_OBJ) @$(GENDIR)\ldall.tr @$(GENDIR)\lib32.rsp @$(LIBCTR)
+!ENDIF
diff --git a/common/msvcdefs.mak b/common/msvcdefs.mak
new file mode 100644
index 000000000..ec96bb197
--- /dev/null
+++ b/common/msvcdefs.mak
@@ -0,0 +1,170 @@
+# Copyright (C) 1997, 1998 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# msvcdefs.mak
+# Definitions for compilation with 32-bit Microsoft Visual C 4.1 or better.
+
+C_=
+O_=/Fo
+
+# Define the drive, directory, and compiler name for the Microsoft C files.
+# COMPDIR contains the compiler and linker (normally \msdev\bin).
+# INCDIR contains the include files (normally \msdev\include).
+# LIBDIR contains the library files (normally \msdev\lib).
+# COMP is the full C compiler path name (normally \msdev\bin\cl).
+# COMPCPP is the full C++ compiler path name (normally \msdev\bin\cl).
+# COMPAUX is the compiler name for DOS utilities (normally \msdev\bin\cl).
+# RCOMP is the resource compiler name (normallly \msdev\bin\rc).
+# LINK is the full linker path name (normally \msdev\bin\link).
+# Note that when INCDIR and LIBDIR are used, they always get a '\' appended,
+# so if you want to use the current directory, use an explicit '.'.
+
+!if $(MSVC_VERSION) == 4
+! ifndef DEVSTUDIO
+DEVSTUDIO=c:\msdev
+! endif
+COMPBASE=$(DEVSTUDIO)
+SHAREDBASE=$(DEVSTUDIO)
+!endif
+
+!if $(MSVC_VERSION) == 5
+! ifndef DEVSTUDIO
+DEVSTUDIO=C:\Program Files\Devstudio
+! endif
+!if "$(DEVSTUDIO)"==""
+COMPBASE=
+SHAREDBASE=
+!else
+COMPBASE=$(DEVSTUDIO)\VC
+SHAREDBASE=$(DEVSTUDIO)\SharedIDE
+!endif
+!endif
+
+!if $(MSVC_VERSION) == 6
+! ifndef DEVSTUDIO
+DEVSTUDIO=C:\Program Files\Microsoft Visual Studio
+! endif
+!if "$(DEVSTUDIO)"==""
+COMPBASE=
+SHAREDBASE=
+!else
+COMPBASE=$(DEVSTUDIO)\VC98
+SHAREDBASE=$(DEVSTUDIO)\Common\MSDev98
+!endif
+!endif
+
+!if $(MSVC_VERSION) == 7
+! ifndef DEVSTUDIO
+DEVSTUDIO=C:\Program Files\Microsoft Visual Studio .NET
+! endif
+!if "$(DEVSTUDIO)"==""
+COMPBASE=
+SHAREDBASE=
+!else
+COMPBASE=$(DEVSTUDIO)\Vc7
+SHAREDBASE=$(DEVSTUDIO)\Vc7\
+!endif
+!endif
+
+!if $(MSVC_VERSION) == 8
+! ifndef DEVSTUDIO
+!ifdef WIN64
+DEVSTUDIO=C:\Program Files (x86)\Microsoft Visual Studio 8
+!else
+DEVSTUDIO=C:\Program Files\Microsoft Visual Studio 8
+!endif
+! endif
+!if "$(DEVSTUDIO)"==""
+COMPBASE=
+SHAREDBASE=
+!else
+COMPBASE=$(DEVSTUDIO)\VC
+SHAREDBASE=$(DEVSTUDIO)\VC
+!ifdef WIN64
+COMPDIR64=$(COMPBASE)\bin\x86_amd64
+LINKLIBPATH=/LIBPATH:"$(COMPBASE)\lib\amd64" /LIBPATH:"$(COMPBASE)\PlatformSDK\Lib\AMD64"
+!endif
+!endif
+!endif
+
+# Some environments don't want to specify the path names for the tools at all.
+# Typical definitions for such an environment would be:
+# MSINCDIR= LIBDIR= COMP=cl COMPAUX=cl RCOMP=rc LINK=link
+# COMPDIR, LINKDIR, and RCDIR are irrelevant, since they are only used to
+# define COMP, LINK, and RCOMP respectively, but we allow them to be
+# overridden anyway for completeness.
+!ifndef COMPDIR
+!if "$(COMPBASE)"==""
+COMPDIR=
+!else
+COMPDIR=$(COMPBASE)\bin
+!endif
+!endif
+
+!ifndef LINKDIR
+!if "$(COMPBASE)"==""
+LINKDIR=
+!else
+LINKDIR=$(COMPBASE)\bin
+!endif
+!endif
+
+!ifndef RCDIR
+!if "$(SHAREDBASE)"==""
+RCDIR=
+!else
+RCDIR=$(SHAREDBASE)\bin
+!endif
+!endif
+
+!ifndef MSINCDIR
+!if "$(COMPBASE)"==""
+MSINCDIR=
+!else
+MSINCDIR=$(COMPBASE)\include
+!endif
+!endif
+
+!ifndef LIBDIR
+!if "$(COMPBASE)"==""
+LIBDIR=
+!else
+LIBDIR=$(COMPBASE)\lib
+!endif
+!endif
+
+!ifndef COMP
+!if "$(COMPDIR)"==""
+COMP=cl
+!else
+COMP="$(COMPDIR)\cl"
+!endif
+!endif
+!ifndef COMPCPP
+COMPCPP=$(COMP)
+!endif
+!ifndef COMPAUX
+COMPAUX=$(COMP)
+!endif
+
+!ifndef RCOMP
+!if "$(RCDIR)"==""
+RCOMP=rc
+!else
+RCOMP="$(RCDIR)\rc"
+!endif
+!endif
+
+!ifndef LINK
+!if "$(LINKDIR)"==""
+LINK=link
+!else
+LINK="$(LINKDIR)\link"
+!endif
+!endif
+
+#CC_ is defined ..\gs\msvccom.mak
+#CCAUX is defined in ..\gs\msvc*.mak
+
+#Always set this to 0; This make file system not yet capable of DLLs
+MAKEDLL=0
diff --git a/common/mv.bat b/common/mv.bat
new file mode 100755
index 000000000..c63313a13
--- /dev/null
+++ b/common/mv.bat
@@ -0,0 +1,2 @@
+@rem $Id$
+@rename %1 %2
diff --git a/common/pcdefs.mak b/common/pcdefs.mak
new file mode 100644
index 000000000..0f82b7539
--- /dev/null
+++ b/common/pcdefs.mak
@@ -0,0 +1,20 @@
+# Copyright (C) 1997, 1998 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# pcdefs.mak
+# Definitions for compilation on MS-DOS and MS Windows systems.
+
+# The line following the next one must be blank.
+#C_ is defined per-compiler.
+D=\\
+
+OBJ=obj
+I_=-I
+II=-I
+_I=
+#O_ is defined per-compiler.
+XE=.exe
+
+CP_=copy /B
+RM_=erase
+RMN_=call $(COMMONDIR)\rm.bat
diff --git a/common/rm.bat b/common/rm.bat
new file mode 100755
index 000000000..e6c40f673
--- /dev/null
+++ b/common/rm.bat
@@ -0,0 +1,10 @@
+@rem $Id$
+@echo off
+:next
+if '%1'=='' goto exit
+if '%1'=='-f' goto sh
+erase %1
+:sh
+shift
+goto next
+:exit
diff --git a/common/sgidefs.mak b/common/sgidefs.mak
new file mode 100644
index 000000000..435c28971
--- /dev/null
+++ b/common/sgidefs.mak
@@ -0,0 +1,8 @@
+# Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# sgidefs.mak
+# Definitions for compilation with the Silicon Graphics C compiler
+
+CC_ = $(CCLD) $(GENOPT) $(CFLAGS) $(XCFLAGS) -c
+CCAUX = $(CCLD)
diff --git a/common/ugcc_top.mak b/common/ugcc_top.mak
new file mode 100644
index 000000000..5aaafd3bb
--- /dev/null
+++ b/common/ugcc_top.mak
@@ -0,0 +1,114 @@
+# Copyright (C) 1997-2007 Artifex Software, Inc.
+# All Rights Reserved.
+#
+# This software is provided AS-IS with no warranty, either express or
+# implied.
+#
+# This software is distributed under license and may not be copied, modified
+# or distributed except as expressly authorized under the terms of that
+# license. Refer to licensing information at http://www.artifex.com/
+# or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+# San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+#
+# ugcc_top.mak
+# Generic top-level makefile for Unix/gcc platforms.
+#
+# The product-specific top-level makefile defines the following:
+# MAKEFILE, CCLD, COMMONDIR, CONFIG, DEVICE_DEVS,
+# GCFLAGS, GENDIR, GLSRCDIR, GLGENDIR, GLOBJDIR, PSD
+# TOP_OBJ, MAIN_OBJ, TARGET_DEVS, TARGET_XE
+# It also must include the product-specific *.mak.
+
+# Platform specification
+include $(COMMONDIR)/gccdefs.mak
+include $(COMMONDIR)/unixdefs.mak
+include $(COMMONDIR)/generic.mak
+
+# these gems were plucked from the old ugcclib.mak. The CC options
+# seem to be out of sync.
+
+BINDIR=./libobj
+GLD=$(GLGENDIR)/
+CCFLAGS=$(GENOPT) $(CFLAGS)
+CC_=$(CC) $(CCFLAGS)
+CCAUX=$(CC)
+CC_NO_WARN=$(CC_) -Wno-cast-qual -Wno-traditional
+CC_SHARED=$(CC_)
+
+include $(GLSRCDIR)/unixhead.mak
+include $(GLSRCDIR)/gs.mak
+include $(GLSRCDIR)/lib.mak
+include $(GLSRCDIR)/int.mak
+include $(GLSRCDIR)/jpeg.mak
+# zlib.mak must precede libpng.mak
+include $(GLSRCDIR)/zlib.mak
+include $(GLSRCDIR)/libpng.mak
+include $(GLSRCDIR)/jbig2.mak
+include $(GLSRCDIR)/icclib.mak
+include $(GLSRCDIR)/ijs.mak
+include $(GLSRCDIR)/devs.mak
+include $(GLSRCDIR)/contrib.mak
+include $(GLSRCDIR)/unix-aux.mak
+include $(GLSRCDIR)/unix-end.mak
+include $(GLSRCDIR)/version.mak
+
+
+UGCC_TOP_DIR:
+ @if test ! -d $(GLGENDIR); then mkdir $(GLGENDIR); fi
+
+# Configure for debugging
+pdl-debug: UGCC_TOP_DIR
+ $(MAKE) -f $(firstword $(MAKEFILE)) GENOPT='-DDEBUG' CFLAGS='-ggdb -g3 -O0 $(GCFLAGS) $(XCFLAGS)' LDFLAGS='$(XLDFLAGS)' pdl-default
+
+pdl-pg-with-cov: UGCC_TOP_DIR
+ $(MAKE) -f $(firstword $(MAKEFILE)) GENDIR=$(PGGENDIR) GENOPT='' CFLAGS='-g -pg -O2 -fprofile-arcs -ftest-coverage $(GCFLAGS) $(XCFLAGS)' LDFLAGS='$(XLDFLAGS) -pg -fprofile-arcs -ftest-coverage' pdl-default
+
+# Configure for profiling
+pdl-pg: UGCC_TOP_DIR
+ $(MAKE) -f $(firstword $(MAKEFILE)) GENDIR=$(PGGENDIR) GENOPT='' CFLAGS='-g -pg -O2 $(GCFLAGS) $(XCFLAGS)' LDFLAGS='$(XLDFLAGS) -pg' pdl-default
+
+# Configure for optimization.
+pdl-product: UGCC_TOP_DIR
+ $(MAKE) -f $(firstword $(MAKEFILE)) GENOPT='' GCFLAGS='$(GCFLAGS)' CFLAGS='-O2 $(GCFLAGS) $(XCFLAGS)' LDFLAGS='$(XLDFLAGS)' pdl-default
+
+# NB not complete, remove genarch and other miscellany.
+pdl-clean:
+ $(RMN_) $(GENDIR)/*.dev $(GENDIR)/devs*.tr $(GENDIR)/gconfig*.h
+ $(RMN_) $(GENDIR)/gconfx*.h $(GENDIR)/j*.h
+ $(RMN_) $(GENDIR)/c*.tr $(GENDIR)/o*.tr $(GENDIR)/l*.tr
+ $(RMN_) $(GENDIR)/*.$(OBJ)
+ $(RMN_) $(GENDIR)/*.h
+ $(RMN_) $(GENDIR)/*.c
+ $(RMN_) $(TARGET_XE)$(XE)
+
+# Build the configuration file.
+$(GENDIR)/pconf.h $(GENDIR)/ldconf.tr: $(TARGET_DEVS) $(GLOBJDIR)/genconf$(XE)
+ $(GLOBJDIR)/genconf -n - $(TARGET_DEVS) -h $(GENDIR)/pconf.h -p "%s&s&&" -o $(GENDIR)/ldconf.tr
+
+# Create a library
+$(TARGET_LIB): $(ld_tr) $(GENDIR)/ldconf.tr $(MAIN_OBJ) $(TOP_OBJ) $(XOBJS) $(GLOBJDIR)/gsromfs$(COMPILE_INITS).$(OBJ)
+ $(ECHOGS_XE) -w $(GENDIR)/ldall.tr -n - $(AR) $(ARFLAGS) $@
+ $(ECHOGS_XE) -a $(GENDIR)/ldall.tr -n -s $(TOP_OBJ) $(XOBJS) -s
+ cat $(GENDIR)/ldt.tr $(GENDIR)/ldconf.tr | grep ".o" >>$(GENDIR)/ldall.tr
+ $(ECHOGS_XE) -a $(GENDIR)/ldall.tr -s - $(GLOBJDIR)/gsromfs$(COMPILE_INITS).$(OBJ) $(MAIN_OBJ)
+ LD_RUN_PATH=$(XLIBDIR); export LD_RUN_PATH; sh <$(GENDIR)/ldall.tr
+
+ifeq ($(PSICFLAGS), -DPSI_INCLUDED)
+# Link a Unix executable. NB - XOBS is not concatenated to the link
+# list here. It seems to have been done earlier on unlike the
+# standalone pcl build below.
+$(TARGET_XE): $(ld_tr) $(GENDIR)/ldconf.tr $(MAIN_OBJ) $(TOP_OBJ) $(XOBJS) $(GLOBJDIR)/gsromfs$(COMPILE_INITS).$(OBJ)
+ $(ECHOGS_XE) -w $(GENDIR)/ldall.tr -n - $(CCLD) $(LDFLAGS) $(XLIBDIRS) -o $(TARGET_XE)
+ $(ECHOGS_XE) -a $(GENDIR)/ldall.tr -n -s $(TOP_OBJ) -s
+ cat $(ld_tr) $(GENDIR)/ldconf.tr >>$(GENDIR)/ldall.tr
+ $(ECHOGS_XE) -a $(GENDIR)/ldall.tr -s - $(GLOBJDIR)/gsromfs$(COMPILE_INITS).$(OBJ) $(MAIN_OBJ) $(EXTRALIBS) $(STDLIBS)
+ sh <$(GENDIR)/ldall.tr
+else
+# Link a Unix executable.
+$(TARGET_XE): $(ld_tr) $(GENDIR)/ldconf.tr $(MAIN_OBJ) $(TOP_OBJ) $(XOBJS) $(GLOBJDIR)/gsromfs$(COMPILE_INITS).$(OBJ)
+ $(ECHOGS_XE) -w $(GENDIR)/ldall.tr -n - $(CCLD) $(LDFLAGS) $(XLIBDIRS) -o $(TARGET_XE)
+ $(ECHOGS_XE) -a $(GENDIR)/ldall.tr -n -s $(TOP_OBJ) $(XOBJS) -s
+ cat $(ld_tr) $(GENDIR)/ldconf.tr >>$(GENDIR)/ldall.tr
+ $(ECHOGS_XE) -a $(GENDIR)/ldall.tr -s - $(GLOBJDIR)/gsromfs$(COMPILE_INITS).$(OBJ) $(MAIN_OBJ) $(EXTRALIBS) $(STDLIBS)
+ sh <$(GENDIR)/ldall.tr
+endif
diff --git a/common/unixdefs.mak b/common/unixdefs.mak
new file mode 100644
index 000000000..294ef0e55
--- /dev/null
+++ b/common/unixdefs.mak
@@ -0,0 +1,20 @@
+# Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# unixdefs.mak
+# Definitions for compilation on Unix systems.
+
+D=/
+OBJ=o
+C_=-c
+I_=-I
+II=-I
+_I=
+# The NULL macro after the space forces make to add a space after the -o
+NULL=
+O_=-o $(NULL)
+XE=
+
+CP_=cp -p
+RM_=rm -f
+RMN_=rm -f
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 000000000..fc2598886
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,18 @@
+DOCS=ghostpdl.dvi ghostpdl.pdf ghostpdl.txt
+
+# latex 2 dvi
+%.dvi : %.tex
+ latex $<
+
+# latex 2 pdf
+%.pdf : %.tex
+ pdflatex $<
+
+# pdf 2 text
+%.txt : %.pdf
+ pdftotext $<
+
+all: $(DOCS)
+
+clean:
+ rm -f $(DOCS)
diff --git a/doc/ghostpdl.pdf b/doc/ghostpdl.pdf
new file mode 100644
index 000000000..0298fdc9d
--- /dev/null
+++ b/doc/ghostpdl.pdf
Binary files differ
diff --git a/doc/ghostpdl.tex b/doc/ghostpdl.tex
new file mode 100644
index 000000000..63e033f77
--- /dev/null
+++ b/doc/ghostpdl.tex
@@ -0,0 +1,433 @@
+\documentclass[10pt]{article}
+\usepackage{fullpage, graphicx, url, textcomp, hyperref}
+\setlength{\parskip}{1ex}
+\setlength{\parindent}{0ex}
+\begin{document}
+\section*{GhostPDL}
+
+This document discusses configuration, compilation and running of the
+GhostPDL \footnote{PDL stands for Page Description Language} family of products:\emph {XPS}~\cite{XPSMAN}, \emph {PCL5E}~\cite{PCLTRM},
+\emph{PCL5C}~\cite{PCL5CTRM}, \emph{PCLXL}~\cite{PCLXLTRM}, and
+\emph{HPGL/2} with \emph{RTL}~\cite{RTLTRM}, additionally a scaled
+down \emph{PJL}~\cite{PJLTRM} interpreter is provided. The PDL
+products use the Ghostscript Graphic Library for graphics, imaging and
+driver support. GhostPDL may be configured with PostScript and PDF support but these PDL's are not documented here, for these see the Ghostscript documentation at
+\url{www.ghostscript.com/doc/} for information about these languages.
+The relevant ghostscript version used by the PDL's can be found
+in gs/src/version.mak. The GhostPDL product may be configured with PostScript and PDF support but that is not documented here.
+
+
+GhostPDL is not intended to be a finished
+software application but a collection of software components that will
+ultimately be included in a software application or a real time
+embedded system. Generally the GhostPDL languages are compliant with
+the Genoa (now QualityLogic) Functional Test Suite and the Genoa
+Application Test suite. Also each language should run the
+corresponding Genoa Comprehensive Evaluation Test (CET) without
+egregious errors.
+
+For printer customers we have GhostSwitch. GhostSwitch integrates
+Ghostscript's Postscript and PDF interpreter with GhostPCL and optionally GhostXPS in a
+language switching environment with auto language sensing and PJL job
+control as found on many modern printers.
+
+In this document and the software, PCL6 refers to technology that
+supports both PCL5 and PCLXL languages.
+
+\subsection*{Quick Start For Unix environment with GCC.}
+\begin{verbatim}
+# unpack the release and go to the release directory.
+tar zxvf ghostpcl-xxx.tar.gz; cd ghostpcl-xxx
+make pcl # build pcl
+make xps # build xps
+
+NB - needs more examples - install, urwfonts, debug builds...
+\end{verbatim}
+
+\subsection*{Supported development environments}
+\begin{itemize}
+\item Windows Vista, NT and '95 with Microsoft Visual C/C++
+\item Linux with gcc
+\item Unix environments without GCC
+\end{itemize}
+
+\subsection*{Unpacking the source}
+
+The source code will either be on CD-ROM (without any archiving or
+compression) or in a archived compressed format. Zip is used for
+Windows environments and compressed tar format for Unix environments.
+If you have a CD-ROM release you will want to replicate the directory
+structure from the CD-ROM to a development directory on a hard drive.
+The compile process does not require a special directory name. If you
+have obtained the archived compressed version use:
+
+ For Windows:
+
+ pkunzip -d $<$archive\_name$>$\\
+
+ For Unix::
+
+ gunzip $<$archive\_name.gz$>$\\
+ tar xvf $<$archive\_name$>$
+
+ After unpacking the result should be a directory hierarchy which is
+ briefly described next.
+
+\subsection*{Brief Overview of Directory Hierarchy}
+\begin{description}
+
+\item[xps] Source code for the XPS interpreter.
+
+\item[pcl] Source code for the PCL interpreter. Files beginning with
+ ``pc'' handle pcl state, text and rules. ``rt'' files implement pcl's
+ raster language RTL and the ``pg'' source code files are for HPGL/2.
+
+\item[pxl] Source code for the PCL-XL interpreter. This is an
+ entirely different language than PCL; all files in this subdirectory
+ are prefixed with ``px''
+
+\item[pl] This subdirectory contains code that can be shared by PCL
+ and PXL\@. In particular font scaling code, the printer job language
+ (PJL) and the language switching machinery are in this subdirectory.
+ All files in this directory are prefixed with pl.
+
+\item[common] PCL and PXL shared makefiles. The subdirectory is an
+ historical artifact from when PCL and PXL had separate makefiles.
+ It does contain the makefile to build the ghostscript graphics
+ library.
+
+\item[tools] miscellaneous tools and test files.
+
+\item[tools/GOT] GOT means graphical object tagging. The system is
+ able to classify high level graphical objects (text, images and
+ vectors) and store this information in the framebuffer along with
+ the output data. The tools in these directories are used to unpack
+ a framebuffer that has been tagged for display in a viewable format.
+
+\item[tools/viewer] The Java pcl viewer is a sample graphical user
+ interface for the GhostPCL system.
+
+\item[language\_switch] top level makefiles for building a share
+ language environment. This is where the shared language environment
+ which includes \emph{PostScript} and PDF can be built.
+
+\item[gs] Ghostscript branch, refer to the documentation at
+ \url{www.ghostscript.com/doc/} for more information about
+ ghostscript.
+
+\item[main] The ``workhorse'' makefiles of the system. These are also
+ most likely to need modification to add/remove devices, choose a
+ font scaler, and set directory locations.
+
+\item[urwfonts] 80 URW TrueType fonts.
+
+\end{description}
+
+This directory structure is the default, but the directories can be
+rearranged with minor modifications to the makefiles.
+
+\subsection*{Building with Microsoft Visual C/C++}
+The GhostPDL tools are known to build with Visual C/C++ 4.0, 5.0 and 6.0, Visual Studio 2005 and 2008. \footnote{A subset of the components have been known to build with these tools}
+
+NB "makefile wrapping" no longer works in Visual Studio.
+
+There are 2 ways of building the PCL components with Microsoft Visual
+C/C++: Convert the current makefile environment to a Visual C/C++
+project; or compile the source directly using nmake. The following
+steps take you through converting the supplied makefile environment to
+a Visual C++ project:
+
+\begin{itemize}
+\item Unpack the source code, see Unpacking the source.
+
+\item Start MSVC++.
+
+\item Open main/pcl6\_msvc.mak and MSVC++ should wrap the makefile
+ automatically and create an MSVC project.
+
+\item Set the project setting (Alt F7). To create a debug:
+
+ \textbf{NMAKE /f pcl6\_msvc.mak DEBUG=1
+ DEVSTUDIO=c:$\backslash$progra~1$\backslash$micros~3}\footnote{DEBUG=1/0
+ on/off will require you manually clean;  del
+ main$\backslash$obj$\backslash$*.*}
+
+ Now set the name of the executable for debuggging to
+ $.$$\backslash$obj$\backslash$pcl6.exe, and set the program argument
+ to be any pcl6 options wanted and the name of the pcl file.
+
+\item Now PCL6 is set to be compiled, debugged and use other features
+ of the MSVC++ IDE.\footnote{Dos hackers can start up a dos window,
+ set the DEVSTUDIO environment variable, and use the same make
+ commands as above (the DEVSTUDIO variable should be set to the top
+ level of the Microsoft Developer Studio, e\.g\. set
+ DEVSTUDIO=c:$\backslash$progra~1$\backslash$devstu~1'' or NMAKE /f
+ pcl6\_msvc.mak DEBUG=1
+ DEVSTUDIO=c:$\backslash$progra~1$\backslash$micros~3)}
+
+\end{itemize}
+
+This will build both the PCL and XL language and supporting language
+switching code.
+
+\subsection*{Building with Linux and GCC}
+
+The pcl tools have been compiled on Linux using GCC. It is easiest to
+simply use the instructions provided in the section Quick Start For
+Unix environment with GCC.
+
+\subsection*{Building on a generic UNIX platform}
+
+The PCL tools have been compiled on Solaris with the Sun Development
+Tools and SGI with the native SGI C compiler. We only provide
+makefiles for the gcc tools and assume users can customize the gcc
+makefiles such that they work with vendor's compilers.  For the Sun
+Development tools the following workaround is sufficient to build the
+software:
+
+\begin{itemize}
+\item change to the main subdirectory.
+\item make CC\_=cc CCLD=cc $\backslash$ CCAUX=cc CFLAGS=-g CC\_NO\_WARN=cc GCFLAGS=
+\end{itemize}
+
+If you intend to do development using the software a dedicated
+makefile should be constructed.
+
+\subsection*{Customizing the build process}
+
+The build process is completely configurable.  Here is a list of
+things that are user will most like be interested in customizing. To
+change any of these see the appropriate makefile for your platform in
+the ``main'' subdirectory
+
+\begin{itemize}
+\item Directory location of source directories.
+\item Directory location of objects, executables, and other compile time generated files.
+\item Selection of devices.
+\item Directory location of PJL filesystem volume 0 and 1
+\item The font scaling technology.
+\begin{itemize}
+\item Defaults to /tmp/pjl0 and /tmp/pjl1
+\item Edit pl/pl.mak  PJL\_VOLUME\_0 and PJL\_VOLUME\_1 to match desired root
+\end{itemize}
+
+\end{itemize}
+
+All of these can be configured in the top level makefile or can be
+specified on the make command line.
+
+The following make targets are available:
+\begin{description}
+\item[debug] build tools with symbols and debugging information
+\item[product] builds optimized code.
+\item[pg-fp] builds profiling code for hardware with floating point.
+\item[pg-nofp] builds profiling code for hardware with no floating point (i\.e\. with floating point emulation software).
+\end{description}
+
+\subsection*{Building only one Language}
+PCL or PCL-XL can be built together in a language switching
+environment or each can be built alone with the supporting PJL
+interpreter. The simplest way to implement one language is simply to
+remove the unwanted implementation from the pdl implementation table
+located in pl/plimpl.c:
+
+
+NB - there are now makefile variables that can be used to select languages.
+
+For example, this is the default table with two implementations: PCL and XL.
+
+\begin{tabbing}
+\hspace{.5in}\=\hspace{.5in}\=\\
+\> /* Zero-terminated list of pointers to implementations */\\
+\> pl\_interp\_implementation\_t const * const pdl\_implementation[] = \{ \\
+\> \> \&pcl\_implementation, \\
+\> \> \&pxl\_implementation, \\
+\> \> 0 \\
+\> \};
+\end{tabbing}
+
+If you only wish to use one interpreter remove the unwanted one and
+recompile the code.
+
+\subsection*{Running the products.}
+\begin{quote}
+Few things are harder to put up with than a good example.
+\emph{Mark Twain}
+\end{quote}
+
+
+Most ghostscript options, as described in the  Ghostscript
+documentation \url{www.ghostscript.com/doc/}, have similar effect in
+the GhostPCL system. Of course, options specific to the PostScript or
+PDF language are not relevant and are ignored.
+
+
+\textbf{pcl6 mypcl.pcl}
+
+
+
+Interpret a pcl file called mypcl.pcl and render it to the default
+device.  For now the default device on systems with x11 is a full
+color x11 display, other system default to laserjet 4 output suitable
+for a monochrome laser printer.
+
+
+\textbf{pcl6 -dTextAlphaBits=4 mypcltext.pcl}
+
+When rendering pcl text onn a low (screen) resolution display device,
+use the TextAlphaBits option to enable anti-aliasing.
+
+\textbf{pcl6 -sDEVICE=x11 mypcl.pcl}
+
+Interpret a pcl file called mypcl.pcl and render to the x11 device.
+
+\textbf{pcl6 -sDEVICE=ljet4 -sOutputFile=''$|$ lpr'' -dNOPAUSE mypcl.pcl}
+
+Interpret mypcl.pcl and send the Laserjet 4 formatted output to the
+command lpr.
+
+\textbf{pcl6 -sDEVICE=pcxcmyk -sOutputFile=''pcxpage.\%d'' -dNOPAUSE mypcl.pcl}
+
+Interpret mypcl.pcl and generate CMYK output. Pages are to be put in
+files named pcxpage.1, pcxpage.2, pcxpage.3, etc.
+
+\textbf{pcl6 -r72 -sDEVICE=x11mono mypcl.pcl -r100 -sDEVICE=x11 mypcl.pcl}
+
+Render a pcl file at 72dpi on the monochrome X11 device, then render
+the same file at 100 dpi  on color X11 device.  This demonstrates
+on-the-fly device switching.
+
+\textbf{pcl6 -sDEVICE=bmpamono -sOutputFile=foo.bmp mypcl.pcl}
+
+The bmpamono (1 bit)  and bmpa16m (full color) run asynchronously.  In
+short, the language and graphics library produce bands in one thread
+while the device renders the bands in a second thread.
+
+\textbf{pcl6 -sDEVICE=pdfwrite -sOutputFile=mypcl.pdf mypcl.pcl}
+
+Convert the pcl file mypcl.pcl to PDF with output written to
+mypcl.pdf.
+
+\textbf{pcl6}
+
+Simply running the interpreter should generate some useful information
+about the available options and devices.  
+
+\subsection*{PCL Personality}
+
+The PCL emulation comes in three flavors: PCL5E, PCL5C, and RTL.  The
+PCL5E personality thresholds colors to black and white irrespective of
+the color parameters of the output device.  PCL5C is the color
+personality, used with a monochrome device it will grayscale colors. 
+The RTL personality can be used to print HPGL/2 RTL plot files.
+
+\textbf{pcl6 -PRTL myrtl.rtl}
+
+run the interpreter with the rtl personality.
+
+\textbf{pcl6 -PPCL5E -sDEVICE=ljet4 mypcl.pcl}
+
+run the interpreter with the pcl5e personality.  This will threshold
+colors to black and white (ljet4 is a 1 bit device).
+
+\textbf{pcl6 -PPCL5C -sDEVICE=ljet4 mypcl.pcl}
+
+run the interpreter with the pcl5c personality.  This will grayscale
+colors on the 1 bit output device. If not set on the command line the
+pcl interpreter personality will be set to PCL5E if the output device
+is 1 bit per pixel otherwise it is set to PCL5C.  RTL must be
+explicitly set on the command line.  RTL always grayscales and never
+thresholds colors to black and white.
+
+\subsection*{Fonts}
+
+The release is packaged with 80 high quality URW TrueType fonts.  For
+commercial use of the GhostPCL technology these fonts can be licensed
+from Artifex.  The fonts are searched for in either the fonts,
+/windows/fonts, or a directory specified with the PCLFONTSOURCE
+environment variable.
+
+Fonts and a font scaler from a third-party vendor such as  Agfa  or 
+Bitstream  may also be used.  There is an existing interface for
+integrating the AGFA Universal Font Scaler Technology, several Artifex
+customers currently use this solution.  The software can use Hewlett
+Packard FONTSMART version 1.5 or Windows TrueType fonts, using either
+of these font solutions require minor PCL code modifications.
+
+\subsection*{PCL Code changes required to use other TrueType fonts.}
+
+To use a new set of TrueType fonts requires modifying the C code in
+the file pl/plftable.c.  The C structure resident\_table contains a
+list of Windows TrueType font names.  In the released package these
+names will correspond with the Windows True Type font names in the URW
+font set.  To use a different font set these names must be replaced
+with the new font names and the code (at least the plftable.c module)
+should be recompiled and linked. The file tools/fontpage.pcl can be
+run to display font samples and the pcl escape sequences required to
+select the fonts in a pcl stream. This option is only recommended for
+advanced developers. It is easiest to simply create a downloaded font
+and embed it in the PCL stream, see the PCL Technical Reference
+Manual~\cite{PCLTRM} for details.
+
+\subsection*{Using the language switching build}
+
+For printer and embedded device users we provide a complete language
+switching solution consisting of PCL/HPGL2, PCLXL, PS, PDF, with Job
+Control. For host based user we strongly recommend that you use
+GhostPCL and Ghostscript separately as the shared language has
+particular feature well suited to printer environment but the same
+feature may produce unexpected results on host based environments.
+
+\subsection*{Building the Language Switch Environment}
+
+At this time, we have makefile support for Microsoft Visual C and
+Linux with gcc. For the Microsoft Visual C the use the instructions
+in the section Building with Microsoft Visual C, but this time you
+will wrap the makefile pspcl6\_gcc.mak which is located in the
+directory language\_switch. For Linux the makefile targets for the
+language switch build are exactly the same except each target is
+prefixed with ``ls\_''. So using the pattern from the ``Quick Start''
+section we have:
+
+\begin{verbatim}
+tar zxvf ghostpcl-xxx.tar.gz; cd ghostpcl-xxx # unpack the release and go to the release directory.
+make ls_fonts # install the fonts.
+make ls_product #compile and link pspcl6.
+make ls_test # test pspcl6 (optional).
+make ls_install # install it.
+\end{verbatim}
+
+\subsection*{Reporting bugs}
+
+If you find a bug or have comments about this documentation, please
+send mail to bug-pcl@ghostscript.com.
+
+\subsection*{Trademark Credits}
+
+\emph{PostScript} is a registered trademark of Adobe Systems Inc.
+\emph{PCL} is a registered trademark of Hewlett-Packard Company.
+
+\begin{thebibliography}{99}
+
+\bibitem{XPSMAN}\emph{XML Paper Specification v.1.0}
+
+\bibitem{PCLTRM} \emph{PCL 5 Printer Language Technical Reference
+ Manual}, HP Part No. 5961-0509, First Edition - October 1992
+
+\bibitem{PCL5CTRM} \emph{PCL 5 Color Technical Reference Manual}
+ Copyright 1999, Hewlett-Packard Company.
+
+\bibitem{PCLXLTRM} \emph{PCL XL Feature Reference}.
+
+\bibitem{PJLTRM} \emph{Printer Job Language Technical Reference
+ Manual} Edition 10, HP Part No. 5021-0380, October 1997.
+
+\bibitem{RTLTRM} \emph{The HP-GL/2 and HP RTL Reference Guide A
+ Handbook for Program Developers}, Addison Wesley Publishing
+ Company, 1993.
+
+\url{http://www.microsoft.com/whdc/xps/xpsspec.mspx}
+
+\end{thebibliography}
+
+\end{document}
diff --git a/doc/ghostpdl.txt b/doc/ghostpdl.txt
new file mode 100644
index 000000000..01909bd73
--- /dev/null
+++ b/doc/ghostpdl.txt
@@ -0,0 +1,103 @@
+GhostPDL
+This document discusses configuration, compilation and running of the GhostPDL 1 family of products:XPS [1], PCL5E [2], PCL5C [3], PCLXL [4], and HPGL/2 with RTL [6], additionally a scaled down PJL [5] interpreter is provided. The PDL products use the Ghostscript Graphic Library for graphics, imaging and driver support. GhostPDL may be configured with PostScript and PDF support but these PDL's are not documented here, for these see the Ghostscript documentation at www.ghostscript.com/doc/ for information about these languages. The relevant ghostscript version used by the PDL's can be found in gs/src/version.mak. The GhostPDL product may be configured with PostScript and PDF support but that is not documented here. GhostPDL is not intended to be a finished software application but a collection of software components that will ultimately be included in a software application or a real time embedded system. Generally the GhostPDL languages are compliant with the Genoa (now QualityLogic) Functional Test Suite and the Genoa Application Test suite. Also each language should run the corresponding Genoa Comprehensive Evaluation Test (CET) without egregious errors. For printer customers we have GhostSwitch. GhostSwitch integrates Ghostscript's Postscript and PDF interpreter with GhostPCL and optionally GhostXPS in a language switching environment with auto language sensing and PJL job control as found on many modern printers. In this document and the software, PCL6 refers to technology that supports both PCL5 and PCLXL languages.
+
+Quick Start For Unix environment with GCC.
+# unpack the release and go to the release directory. tar zxvf ghostpcl-xxx.tar.gz; cd ghostpcl-xxx make pcl make xps NB - needs more examples - install, urwfonts, debug builds...
+
+# build pcl # build xps
+
+Supported development environments
+ Windows Vista, NT and '95 with Microsoft Visual C/C++ Linux with gcc Unix environments without GCC
+
+Unpacking the source
+The source code will either be on CD-ROM (without any archiving or compression) or in a archived compressed format. Zip is used for Windows environments and compressed tar format for Unix environments. If you have a CD-ROM release you will want to replicate the directory structure from the CD-ROM to a development directory on a hard drive. The compile process does not require a special directory name. If you have obtained the archived compressed version use: For Windows:
+1 PDL
+
+stands for Page Description Language
+
+1
+
+ pkunzip -d <archive name> For Unix:: gunzip <archive name.gz> tar xvf <archive name> After unpacking the result should be a directory hierarchy which is briefly described next.
+
+Brief Overview of Directory Hierarchy
+xps Source code for the XPS interpreter. pcl Source code for the PCL interpreter. Files beginning with "pc" handle pcl state, text and rules. "rt" files implement pcl's raster language RTL and the "pg" source code files are for HPGL/2. pxl Source code for the PCL-XL interpreter. This is an entirely different language than PCL; all files in this subdirectory are prefixed with "px" pl This subdirectory contains code that can be shared by PCL and PXL. In particular font scaling code, the printer job language (PJL) and the language switching machinery are in this subdirectory. All files in this directory are prefixed with pl. common PCL and PXL shared makefiles. The subdirectory is an historical artifact from when PCL and PXL had separate makefiles. It does contain the makefile to build the ghostscript graphics library. tools miscellaneous tools and test files. tools/GOT GOT means graphical object tagging. The system is able to classify high level graphical objects (text, images and vectors) and store this information in the framebuffer along with the output data. The tools in these directories are used to unpack a framebuffer that has been tagged for display in a viewable format. tools/viewer The Java pcl viewer is a sample graphical user interface for the GhostPCL system. language switch top level makefiles for building a share language environment. This is where the shared language environment which includes PostScript and PDF can be built. gs Ghostscript branch, refer to the documentation at www.ghostscript.com/doc/ for more information about ghostscript. main The "workhorse" makefiles of the system. These are also most likely to need modification to add/remove devices, choose a font scaler, and set directory locations. urwfonts 80 URW TrueType fonts. This directory structure is the default, but the directories can be rearranged with minor modifications to the makefiles.
+
+Building with Microsoft Visual C/C++
+The GhostPDL tools are known to build with Visual C/C++ 4.0, 5.0 and 6.0, Visual Studio 2005 and 2008.
+2
+2A
+
+subset of the components have been known to build with these tools
+
+2
+
+ NB "makefile wrapping" no longer works in Visual Studio. There are 2 ways of building the PCL components with Microsoft Visual C/C++: Convert the current makefile environment to a Visual C/C++ project; or compile the source directly using nmake. The following steps take you through converting the supplied makefile environment to a Visual C++ project:
+ Unpack the source code, see Unpacking the source. Start MSVC++. Open main/pcl6 msvc.mak and MSVC++ should wrap the makefile automatically and create an MSVC project. Set the project setting (Alt F7). To create a debug:
+
+NMAKE /f pcl6 msvc.mak DEBUG=1 DEVSTUDIO=c:\progra 1\micros 33 Now set the name of the executable for debuggging to .\obj\pcl6.exe, and set the program argument to be any pcl6 options wanted and the name of the pcl file.
+ Now PCL6 is set to be compiled, debugged and use other features of the MSVC++ IDE.4
+
+This will build both the PCL and XL language and supporting language switching code.
+
+Building with Linux and GCC
+The pcl tools have been compiled on Linux using GCC. It is easiest to simply use the instructions provided in the section Quick Start For Unix environment with GCC.
+
+Building on a generic UNIX platform
+The PCL tools have been compiled on Solaris with the Sun Development Tools and SGI with the native SGI C compiler. We only provide makefiles for the gcc tools and assume users can customize the gcc makefiles such that they work with vendor's compilers. For the Sun Development tools the following workaround is sufficient to build the software:
+ change to the main subdirectory. make CC =cc CCLD=cc \ CCAUX=cc CFLAGS=-g CC NO WARN=cc GCFLAGS=
+
+If you intend to do development using the software a dedicated makefile should be constructed.
+
+Customizing the build process
+The build process is completely configurable. Here is a list of things that are user will most like be interested in customizing. To change any of these see the appropriate makefile for your platform in the "main" subdirectory
+ Directory location of source directories.
+on/off will require you manually clean; del main\obj\*.* hackers can start up a dos window, set the DEVSTUDIO environment variable, and use the same make commands as above (the DEVSTUDIO variable should be set to the top level of the Microsoft Developer Studio, eg et s DEVSTUDIO=c:\progra 1\devstu 1" or NMAKE /f pcl6 msvc.mak DEBUG=1 DEVSTUDIO=c:\progra 1\micros 3)
+4 Dos 3 DEBUG=1/0
+
+3
+
+ Directory location of objects, executables, and other compile time generated files. Selection of devices. Directory location of PJL filesystem volume 0 and 1 The font scaling technology.
+
+­ Defaults to /tmp/pjl0 and /tmp/pjl1 ­ Edit pl/pl.mak PJL VOLUME 0 and PJL VOLUME 1 to match desired root All of these can be configured in the top level makefile or can be specified on the make command line. The following make targets are available: debug build tools with symbols and debugging information product builds optimized code. pg-fp builds profiling code for hardware with floating point. pg-nofp builds profiling code for hardware with no floating point (i with floating point emulation software). e
+
+Building only one Language
+PCL or PCL-XL can be built together in a language switching environment or each can be built alone with the supporting PJL interpreter. The simplest way to implement one language is simply to remove the unwanted implementation from the pdl implementation table located in pl/plimpl.c: NB - there are now makefile variables that can be used to select languages. For example, this is the default table with two implementations: PCL and XL.
+
+/* Zero-terminated list of pointers to implementations */ pl interp implementation t const * const pdl implementation[] = { &pcl implementation, &pxl implementation, 0 }; If you only wish to use one interpreter remove the unwanted one and recompile the code.
+
+Running the products.
+Few things are harder to put up with than a good example. Mark Twain Most ghostscript options, as described in the Ghostscript documentation www.ghostscript.com/doc/, have similar effect in the GhostPCL system. Of course, options specific to the PostScript or PDF language are not relevant and are ignored. pcl6 mypcl.pcl Interpret a pcl file called mypcl.pcl and render it to the default device. For now the default device on systems with x11 is a full color x11 display, other system default to laserjet 4 output suitable for a monochrome laser printer. 4
+
+ pcl6 -dTextAlphaBits=4 mypcltext.pcl When rendering pcl text onn a low (screen) resolution display device, use the TextAlphaBits option to enable anti-aliasing. pcl6 -sDEVICE=x11 mypcl.pcl Interpret a pcl file called mypcl.pcl and render to the x11 device. pcl6 -sDEVICE=ljet4 -sOutputFile="| lpr" -dNOPAUSE mypcl.pcl Interpret mypcl.pcl and send the Laserjet 4 formatted output to the command lpr. pcl6 -sDEVICE=pcxcmyk -sOutputFile="pcxpage.%d" -dNOPAUSE mypcl.pcl Interpret mypcl.pcl and generate CMYK output. Pages are to be put in files named pcxpage.1, pcxpage.2, pcxpage.3, etc. pcl6 -r72 -sDEVICE=x11mono mypcl.pcl -r100 -sDEVICE=x11 mypcl.pcl Render a pcl file at 72dpi on the monochrome X11 device, then render the same file at 100 dpi on color X11 device. This demonstrates on-the-fly device switching. pcl6 -sDEVICE=bmpamono -sOutputFile=foo.bmp mypcl.pcl The bmpamono (1 bit) and bmpa16m (full color) run asynchronously. In short, the language and graphics library produce bands in one thread while the device renders the bands in a second thread. pcl6 -sDEVICE=pdfwrite -sOutputFile=mypcl.pdf mypcl.pcl Convert the pcl file mypcl.pcl to PDF with output written to mypcl.pdf. pcl6 Simply running the interpreter should generate some useful information about the available options and devices.
+
+PCL Personality
+The PCL emulation comes in three flavors: PCL5E, PCL5C, and RTL. The PCL5E personality thresholds colors to black and white irrespective of the color parameters of the output device. PCL5C is the color personality, used with a monochrome device it will grayscale colors. The RTL personality can be used to print HPGL/2 RTL plot files. pcl6 -PRTL myrtl.rtl run the interpreter with the rtl personality. pcl6 -PPCL5E -sDEVICE=ljet4 mypcl.pcl run the interpreter with the pcl5e personality. This will threshold colors to black and white (ljet4 is a 1 bit device). pcl6 -PPCL5C -sDEVICE=ljet4 mypcl.pcl run the interpreter with the pcl5c personality. This will grayscale colors on the 1 bit output device. If not set on the command line the pcl interpreter personality will be set to PCL5E if the output device is 1 bit per pixel otherwise it is set to PCL5C. RTL must be explicitly set on the command line. RTL always grayscales and never thresholds colors to black and white.
+
+Fonts
+The release is packaged with 80 high quality URW TrueType fonts. For commercial use of the GhostPCL technology these fonts can be licensed from Artifex. The fonts are searched for in either the fonts, /win5
+
+ dows/fonts, or a directory specified with the PCLFONTSOURCE environment variable. Fonts and a font scaler from a third-party vendor such as Agfa or Bitstream may also be used. There is an existing interface for integrating the AGFA Universal Font Scaler Technology, several Artifex customers currently use this solution. The software can use Hewlett Packard FONTSMART version 1.5 or Windows TrueType fonts, using either of these font solutions require minor PCL code modifications.
+
+PCL Code changes required to use other TrueType fonts.
+To use a new set of TrueType fonts requires modifying the C code in the file pl/plftable.c. The C structure resident table contains a list of Windows TrueType font names. In the released package these names will correspond with the Windows True Type font names in the URW font set. To use a different font set these names must be replaced with the new font names and the code (at least the plftable.c module) should be recompiled and linked. The file tools/fontpage.pcl can be run to display font samples and the pcl escape sequences required to select the fonts in a pcl stream. This option is only recommended for advanced developers. It is easiest to simply create a downloaded font and embed it in the PCL stream, see the PCL Technical Reference Manual [2] for details.
+
+Using the language switching build
+For printer and embedded device users we provide a complete language switching solution consisting of PCL/HPGL2, PCLXL, PS, PDF, with Job Control. For host based user we strongly recommend that you use GhostPCL and Ghostscript separately as the shared language has particular feature well suited to printer environment but the same feature may produce unexpected results on host based environments.
+
+Building the Language Switch Environment
+At this time, we have makefile support for Microsoft Visual C and Linux with gcc. For the Microsoft Visual C the use the instructions in the section Building with Microsoft Visual C, but this time you will wrap the makefile pspcl6 gcc.mak which is located in the directory language switch. For Linux the makefile targets for the language switch build are exactly the same except each target is prefixed with "ls ". So using the pattern from the "Quick Start" section we have: tar zxvf ghostpcl-xxx.tar.gz; cd ghostpcl-xxx make ls_fonts # install the fonts. make ls_product #compile and link pspcl6. make ls_test # test pspcl6 (optional). make ls_install # install it. # unpack the release and go to the release directory.
+
+Reporting bugs
+If you find a bug or have comments about this documentation, please send mail to bug-pcl@ghostscript.com.
+
+Trademark Credits
+PostScript is a registered trademark of Adobe Systems Inc. PCL is a registered trademark of Hewlett-Packard Company.
+
+6
+
+ References
+[1] XML Paper Specification v.1.0 [2] PCL 5 Printer Language Technical Reference Manual, HP Part No. 5961-0509, First Edition - October 1992 [3] PCL 5 Color Technical Reference Manual Copyright 1999, Hewlett-Packard Company. [4] PCL XL Feature Reference. [5] Printer Job Language Technical Reference Manual Edition 10, HP Part No. 5021-0380, October 1997. [6] The HP-GL/2 and HP RTL Reference Guide A Handbook for Program Developers, Addison Wesley Publishing Company, 1993. http://www.microsoft.com/whdc/xps/xpsspec.mspx
+
+7
+
+ \ No newline at end of file
diff --git a/doc/who_owns_what.txt b/doc/who_owns_what.txt
new file mode 100644
index 000000000..66f2fb205
--- /dev/null
+++ b/doc/who_owns_what.txt
@@ -0,0 +1,336 @@
+afs.dev: henry
+async.dev: ray and henry
+bbox.dev: igor
+bboxutil.dev: igor
+bcp.dev: alex
+bit.dev: ray and henry
+bitcmyk.dev: ray and henry
+bitrgb.dev: ray and henry
+bitrgbtags.dev: ray and henry
+bj10e.dev: ray and henry
+bj200.dev: ray and henry
+bjc600.dev: ray and henry
+bjc800.dev: ray and henry
+bmp16.dev: ray and henry
+bmp16m.dev: ray and henry
+bmp256.dev: ray and henry
+bmp32b.dev: ray and henry
+bmpa16m.dev: ray and henry
+bmpamono.dev: ray and henry
+bmpgray.dev: ray and henry
+bmpmono.dev: ray and henry
+bmpsep1.dev: ray and henry
+bmpsep8.dev: ray and henry
+btoken.dev: alex
+cdeskjet.dev: ray and henry
+cdj550.dev: ray and henry
+cdjcolor.dev: ray and henry
+cdjmono.dev: ray and henry
+cfax.dev: ray and henry
+cfd.dev: alex
+cfe.dev alex
+cfe.dev: alex
+cff.dev: igor
+cidfont.dev: igor
+cidlib.dev: igor
+cie.dev: ralph
+cielib.dev: ralph
+clfile.dev: igor
+clist.dev: igor
+cljet5.dev: ray and henry
+cljet5c.dev: ray and henry
+cljet5pr.dev: ray and stefan
+clmemory.dev: igor
+cmaplib.dev: igor
+cmapread.dev: igor
+cmyklib.dev: ralph
+cmykread.dev ralph
+colimlib.dev: ralph
+color.dev: ralph
+compfont.dev: igor
+crc32.dev: ken
+cspixel.dev: ralph
+cspixlib.dev: ralph
+dct.dev: alex
+dctd.dev: alex
+dcte.dev: alex
+deskjet.dev: ray and henry
+devcmap.dev: obsolete
+devicen.dev: ralph
+djet500.dev: ray and henry
+dpnxtlib.dev: ralph
+dps.dev: ?
+dps2int.dev: ?
+dps2lib.dev: ?
+dps2read.dev: ?
+dpsand2.dev: ?
+dpslib.dev: ?
+dpsnext.dev ?
+dscparse.dev: alex
+eps9high.dev: ?
+eps9mid.dev: ?
+epsf.dev: alex
+epson.dev: ralph
+epsonc.dev: ralph
+epswrite.dev: ken
+fapi.dev: igor
+fapif.dev: igor
+fapiu.dev: igor
+farc4.dev: ken
+fax.dev: ray and henry
+faxg3.dev: ray and henry
+faxg32d.dev: ray and henry
+faxg4.dev: ray and henry
+fcopy.dev: ken
+fdecode.dev: alex
+filter.dev: alex
+fimscale.dev: alex
+fmd5.dev: ken
+frsd.dev: alex
+func.dev: igor
+func4.dev: igor
+func4lib.dev: igor
+funclib.dev: igor
+fzlib.dev: alex
+gsiodevs.dev: ray and henry
+gsnogc.dev: obsolete
+gxfapiu.dev: igor
+gxfapiu1.dev: igor
+hpgl2.dev: henry
+hpgl2c.dev: henry
+htxlib.dev: ralph
+ibmpro.dev: ray and henry
+icc.dev: ralph
+icclib.dev: ralph
+ijs.dev: ray and henry
+ijslib.dev: ray and henry
+imasklib.dev: alex
+imdi.dev: ray
+iodevice.dev: ray and henry
+iscale.dev: alex
+isupport.dev: igor
+jasper.dev: ray and henry
+jasper_0.dev: ray and henry
+jbig2.dev: ken
+jbig2dec.dev: ken
+jbig2dec_0.dev: ken
+jpeg.dev: ray and henry
+jpege6.dev: third party
+jpeggray.dev: ray and henry
+jpx.dev: ken
+jpx_jasper.dev: ken
+laserjet.dev: ray and henry
+ldf_jb2.dev: ken
+libcore.dev:
+
+ gsalloc, gsmalloc, gsmemlok, gsmemory, gsmemret: igor
+
+ stream strmio: alex
+
+ gsistate: alex
+
+ gsalpha, gscolor, gshtscr, gscspace, gsovrc, gsht, gscicach,
+ gxoprect, gxdcconv, gxcmap, gxdcolor, gxht, gxhldev, gxhtbit: ralph
+
+ gsbitcom, gsbitops, gsbittab: ?
+
+ gschar, gsfont, gstext, gscedata, gscencs, gsgdata, gsgcache,
+ gxccache, gxccman, gxchar, gxfdrop: igor
+
+ gswts, gxwts: ray (probably don't belong in libcore)
+
+ gsimage, gxidata, gxifast, gximage, gximage1, gximono, gxipixel,
+ gximask, gxsample: alex
+
+ gscparam, gsdparam, gsdfilt, gpmisc, gscoord, gsdevice, gsfname,
+ gsdevmem, gsinit, gsmatrix, gsparam, gslibctx, gsnotify, gsutil,
+ gsserial, gsmisc, gsstate, gxbcache: ?
+
+ gsimpath, gsline, gspaint, gspath, gxclip, gxcpath, gxfill,
+ gxacpath, gxpaint, gxpath, gxpdash, gxpflat, gxstroke, gxpath2,
+ gxpcopy: igor
+libd.dev: ray
+libpng.dev: third party
+lj5gray.dev: ray and henry
+lj5mono.dev: ray and henry
+ljet2p.dev: ray and henry
+ljet3.dev: ray and henry
+ljet3d.dev: ray and henry
+ljet4.dev: ray and henry
+ljet4d.dev: ray and henry
+ljetplus.dev: ray and henry
+lpg.dev: third party
+luratech_jp2.dev: ken
+lzwd.dev: alex
+lzwe.dev: alex
+macglyph.dev: ralph
+macres.dev: ralph
+macroman.dev: ralph
+page.dev: ray and henry
+pagedev.dev: ray and henry
+path1.dev: igor
+path1lib.dev: igor
+patlib.dev: ralph
+patread.dev: ralph
+pattern.dev: ralph
+pbm.dev: ray and henry
+pbmraw.dev: ray and henry
+pcl5.dev: henry
+pcl5base.dev: henry
+pcl5c.dev: henry
+pcx16.dev: ray and henry
+pcx24b.dev: ray and henry
+pcx256.dev: ray and henry
+pcxcmyk.dev: ray and henry
+pcxgray.dev: ray and henry
+pcxmono.dev: ray and henry
+pdf.dev: alex
+pdffonts.dev: alex
+pdfread.dev: alex
+pdfwrite.dev: ken
+pdiff.dev: alex
+pdtext.dev: ken
+pdxtext.dev: ken
+pgm.dev: ray and henry
+pgmraw.dev: ray and henry
+pgnm.dev: ray and henry
+pgnmraw.dev: ray and henry
+pipe.dev: ray and henry
+pj.dev: ?
+pjl.dev: henry
+pjxl.dev: ?
+pjxl300.dev: ?
+pkm.dev: ray and henry
+pkmraw.dev: ray and henry
+pksm.dev: ray and henry
+pksmraw.dev: ray and henry
+pl.dev: henry
+png16.dev: ray and henry
+png16m.dev: ray and henry
+png256.dev: ray and henry
+png48.dev: ray and henry
+pngalpha.dev: ralph
+pnggray.dev: henry
+pnggray.dev henry
+pngmono.dev: henry
+pngp.dev: alex
+pnm.dev: ray and henry
+pnmraw.dev: ray and henry
+posync.dev: ?
+ppm.dev: ray and henry
+ppmraw.dev: ray and henry
+ps2write.dev: ken
+psbase.dev: alex
+psdcmyk.dev: ralph
+psdf.dev: igor
+psdrgb.dev: ray and henry
+psf.dev: igor
+psf0lib.dev: igor
+psf0read.dev: igor
+psf1lib.dev: igor
+psf2lib.dev: igor
+psgray.dev: igor
+psi.dev: ray and henry
+psl2cs.dev: ralph
+psl2lib.dev: ralph and alex
+psmono.dev: igor
+psrgb.dev: igor
+pswrite.dev: igor
+pxl.dev: henry
+pxlcolor.dev: ray and henry
+pxlmono.dev: ray and henry
+rld.dev: alex
+rle.dev: alex
+romfs0.dev: ray and henry
+romfs1.dev: ray and henry
+roplib.dev: ralph and henry
+rtlbase.dev: henry
+rtlbasec.dev: henry
+sarc4.dev: ralph
+sdctd.dev: alex
+sdcte.dev: alex
+sddparam.dev: alex
+seexec.dev: alex and ralph (ralph for gscrypt)
+sepr.dev: ralph
+seprlib.dev: ralph
+sfile.dev: ray and henry
+shadelib.dev: igor
+sicclib.dev: ralph
+simscale.dev: alex
+sjbig2.dev: ralph
+sjbig2_.dev: ralph
+sjbig2_jbig2dec.dev
+sjbig2_jbig2dec.dev: ralph
+sjbig2_luratech.dev: ralph
+sjpx.dev: ralph
+sjpx_jasper.dev
+sjpx_jasper.dev: ralph
+sjpx_luratech.dev: ralph
+slzwd.dev: alex
+slzwe.dev: alex
+smd5.dev: ralph
+spotcmyk.dev: ralph
+stcolor.dev: ?
+strdline.dev: alex
+szlibd.dev: alex
+szlibe.dev: alex
+tfax.dev: ray and henry
+tiff12nc.dev: ray and henry
+tiff24nc.dev: ray and henry
+tiff32nc.dev: ray and henry
+tiffcrle.dev: ray and henry
+tiffg3.dev: ray and henry
+tiffg32d.dev: ray and henry
+tiffg4.dev: ray and henry
+tiffgray.dev: ray and henry
+tifflzw.dev: ray and henry
+tiffpack.dev: ray and henry
+tiffs.dev: ray and henry
+tiffsep.dev: ray and henry
+tracedev.dev: igor
+translib.dev: ralph
+transpar.dev: ralph
+traplib.dev: ralph
+ttflib.dev: igor
+ttfont.dev: igor
+type1.dev: igor
+type2.dev: igor
+type32.dev: igor
+type42.dev: igor
+ufst.dev: henry
+uniprint.dev: ray and henry
+unix_.dev: ?
+upath.dev: igor
+usparam.dev: ray and henry
+vector.dev: igor
+wtscmyk.dev: ray
+wtsimdi.dev: ray
+x11.dev: ralph
+x11alpha.dev: ralph
+x11alt_.dev: ralph
+x11cmyk.dev: ralph
+x11gray2.dev: ralph
+x11gray4.dev: ralph
+x11mono.dev: ralph
+xcf.dev: ralph
+xps.dev: tor
+zfrsd.dev: alex
+zlibd.dev: third party
+zlibe.dev: third party
+
+General (high level) Ownership
+--------------------
+
+color:ralph
+fonts:igor
+gslite:henry
+images:alex
+memory:igor
+non windows makefiles:ralph
+pcl, pxl, pl:henry
+pdf interpreter:alex
+ps, pdf, eps write:ken
+vectors:igor
+windows makefiles:ray
+xps:tor
+
diff --git a/ghostpdl.sln b/ghostpdl.sln
new file mode 100644
index 000000000..464719a20
--- /dev/null
+++ b/ghostpdl.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xps", "xps\xps.vcproj", "{0C03E6E2-43A7-4945-BEA5-987E16BD82AA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0C03E6E2-43A7-4945-BEA5-987E16BD82AA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0C03E6E2-43A7-4945-BEA5-987E16BD82AA}.Debug|Win32.Build.0 = Debug|Win32
+ {0C03E6E2-43A7-4945-BEA5-987E16BD82AA}.Release|Win32.ActiveCfg = Release|Win32
+ {0C03E6E2-43A7-4945-BEA5-987E16BD82AA}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/language_switch/pspcl6_gcc.mak b/language_switch/pspcl6_gcc.mak
new file mode 100644
index 000000000..8f257685f
--- /dev/null
+++ b/language_switch/pspcl6_gcc.mak
@@ -0,0 +1,80 @@
+# The "?=" style of this makefile is designed to facilitate "deriving"
+# your own make file from it by setting your own custom options, then include'ing
+# this file. In its current form, this file will compile using default options
+# and locations. It is recommended that you make any modifications to settings
+# in this file by creating your own makefile which includes this one.
+#
+# This file only defines the portions of the makefile that are different
+# between the present language switcher vs. the standard pcl6 makefile which
+# is included near the bottom. All other settings default to the base makefile.
+
+# Define the name of this makefile.
+MAKEFILE+= ../language_switch/pspcl6_gcc.mak
+
+# The sources are taken from these directories:
+MAINSRCDIR?=../main
+PSSRCDIR?=../gs/src
+PSISRCDIR?=../psi
+PSLIBDIR?=../gs/lib
+ICCSRCDIR?=../gs/icclib
+# Path for including gs/Resource into romfs (replaces the gs default) :
+PSRESDIR?=../gs/Resource
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+PLPLATFORM?=ps
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+PSGENDIR?=$(GENDIR)
+PSOBJDIR?=$(GENDIR)
+PSIGENDIR?=$(GENDIR)
+PSIOBJDIR?=$(GENDIR)
+JGENDIR?=$(GENDIR)
+JOBJDIR?=$(GENDIR)
+ZGENDIR?=$(GENDIR)
+ZOBJDIR?=$(GENDIR)
+PSD?=$(GENDIR)/
+
+# Executable path\name w/o the .EXE extension
+TARGET_XE?=$(GENDIR)/pspcl6
+
+# Main file's name
+PSI_TOP_OBJ?=$(PSIOBJDIR)/psitop.$(OBJ)
+PCL_TOP_OBJ?=$(PCLOBJDIR)/pctop.$(OBJ)
+PXL_TOP_OBJ?=$(PXLOBJDIR)/pxtop.$(OBJ)
+
+TOP_OBJ=$(PSI_TOP_OBJ) $(PCL_TOP_OBJ) $(PXL_TOP_OBJ)
+
+# Choose COMPILE_INITS=1 for init files and fonts in ROM (otherwise =0)
+COMPILE_INITS?=0
+
+PSICFLAGS?=-DPSI_INCLUDED
+PDL_INCLUDE_FLAGS?=-DPCL_INCLUDED $(PSICFLAGS)
+
+DD=$(GLGENDIR)/
+
+FEATURE_DEVS ?= \
+ $(DD)psl3.dev \
+ $(DD)pdf.dev \
+ $(DD)dpsnext.dev \
+ $(DD)htxlib.dev \
+ $(DD)roplib.dev \
+ $(DD)ttfont.dev \
+ $(DD)pipe.dev \
+ $(DD)fapi.dev
+
+# extra objects.
+XOBJS?=$(GLOBJDIR)/gsargs.o $(GLOBJDIR)/gconfig.o \
+ $(GLOBJDIR)/gscdefs.o $(GLOBJDIR)/iconfig.o \
+ $(GLOBJDIR)/iccinit$(COMPILE_INITS).o
+
+ifeq ($(COMPILE_INITS), 1)
+include $(PSSRCDIR)/psromfs.mak
+endif
+
+# "Subclassed" makefile
+include $(MAINSRCDIR)/pcl6_gcc.mak
+
+# Subsystems
+include $(PSISRCDIR)/psi.mak
diff --git a/language_switch/pspcl6_msvc.mak b/language_switch/pspcl6_msvc.mak
new file mode 100644
index 000000000..370e2518b
--- /dev/null
+++ b/language_switch/pspcl6_msvc.mak
@@ -0,0 +1,212 @@
+# The !ifndef-laden style of this makefile is designed to facilitate "deriving"
+# your own make file from it by setting your own custom options, then !including
+# this file. In its current form, this file will compile using default options
+# and locations.
+#
+# This file only defines the portions of the MSVC makefile that are different
+# between the present language switcher vs. the standard pcl6 makefile which
+# is !included near the bottom. All other settings default to the base makefile.
+
+# Define the name of this makefile.
+MAKEFILE=$(MAKEFILE) ..\language_switch\pspcl6_msvc.mak
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+!ifndef PLPLATFORM
+PLPLATFORM=ps
+!endif
+
+# The build process will put all of its output in this directory:
+!ifndef GENDIR
+GENDIR=.\obj
+!endif
+
+# The sources are taken from these directories:
+!ifndef APPSRCDIR
+APPSRCDIR=.
+!endif
+!ifndef PSSRCDIR
+PSSRCDIR=..\gs\src
+!endif
+!ifndef PSISRCDIR
+PSISRCDIR=..\psi
+!endif
+!ifndef MAINSRCDIR
+MAINSRCDIR=..\main
+!endif
+!ifndef PSLIBDIR
+PSLIBDIR=..\gs\lib
+!endif
+!ifndef ICCSRCDIR
+ICCSRCDIR=..\gs\icclib
+!endif
+
+# Path for including gs/Resource into romfs (replaces the gs default) :
+!ifndef PSRESDIR
+PSRESDIR=..\gs\Resource
+!endif
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+!ifndef GLGENDIR
+GLGENDIR=$(GENDIR)
+!endif
+!ifndef PCLOBJDIR
+PCLOBJDIR=$(GENDIR)
+!endif
+!ifndef PXLOBJDIR
+PXLOBJDIR=$(GENDIR)
+!endif
+!ifndef ICCGENDIR
+ICCGENDIR=$(GENDIR)
+!endif
+!ifndef ICCOBJDIR
+ICCOBJDIR=$(GENDIR)
+!endif
+!ifndef PSGENDIR
+PSGENDIR=$(GENDIR)
+!endif
+!ifndef PSOBJDIR
+PSOBJDIR=$(GENDIR)
+!endif
+!ifndef GLGEN
+GLGEN=$(GENDIR)
+!endif
+!ifndef GLOBJ
+GLOBJ=$(GENDIR)
+!endif
+!ifndef PSIGENDIR
+PSIGENDIR=$(GENDIR)
+!endif
+!ifndef PSIOBJDIR
+PSIOBJDIR=$(GENDIR)
+!endif
+
+!ifndef DD
+DD=$(GLGENDIR)
+!endif
+
+
+# Executable path\name w/o the .EXE extension
+!ifndef TARGET_XE
+TARGET_XE=$(GENDIR)\pspcl6
+!endif
+!ifndef PSI_TOP_OBJ
+PSI_TOP_OBJ=$(PSIOBJDIR)\psitop.$(OBJ)
+!endif
+
+# Banding options
+!ifndef BAND_LIST_STORAGE
+BAND_LIST_STORAGE=file
+!endif
+
+!ifndef COMPILE_INITS
+COMPILE_INITS=0
+!endif
+
+!ifndef APP_CCC
+APP_CCC=$(CC_) -I..\pl -I..\gs\src -I.\obj $(C_)
+!endif
+
+# Define which major version of MSVC is being used (currently 6, 7 and
+# 8 are supported). Default should be the latest version.
+!ifndef MSVC_VERSION
+MSVC_VERSION=8
+!endif
+
+D=\\
+DD=$(GLGENDIR)
+# note agfa gives it libraries incompatible names so they cannot be
+# properly found by the linker. Change the library names to reflect the
+# following (i.e. the if library should be named libif.a
+# NB - this should all be done automatically by choosing the device
+# but it ain't.
+
+# The user is responsible for building the agfa or freetype libs. We
+# don't overload the makefile with nonsense to build these libraries
+# on the fly. If the artifex font scaler is chosen the makefiles will
+# build the scaler automatically.
+
+# Pick a font system technology. PCL and XL do not need to use the
+# same scaler, but it is necessary to tinker/hack the makefiles to get
+# it to work properly.
+
+# ufst - Agfa universal font scaler.
+# fts - FreeType font system.
+# afs - Artifex font scaler.
+# 3 mutually exclusive choices follow, pick one.
+
+PL_SCALER=afs
+PCL_FONT_SCALER=$(PL_SCALER)
+PXL_FONT_SCALER=$(PL_SCALER)
+
+# defines for building PSI against UFST
+!if "$(PL_SCALER)" == "ufst"
+
+!if "$(COMPILE_INITS)" == "1"
+UFSTFONTDIR=%rom%fontdata/
+!else
+UFSTFONTDIR=../fontdata/
+!endif
+
+!ifndef UFST_ROOT
+UFST_ROOT="../ufst"
+!endif
+!ifndef FAPI_DEFS
+FAPI_DEFS= -DUFST_BRIDGE=1 -DUFST_LIB_EXT=.lib -DGCCx86 -DUFST_ROOT=$(UFST_ROOT)
+!endif
+UFST_BRIDGE=1
+UFST_LIB_EXT=.lib
+
+# specify agfa library locations and includes.
+UFST_LIB=$(UFST_ROOT)\rts\lib
+UFST_INCLUDES=$(I_)$(UFST_ROOT)\rts\inc $(I_)$(UFST_ROOT)\sys\inc $(I_)$(UFST_ROOT)\rts\fco $(I_)$(UFST_ROOT)\rts\gray $(I_)$(UFST_ROOT)\rts\tt -DMSVC -DAGFA_FONT_TABLE
+!endif
+
+# Assorted definitions. Some of these should probably be factored out....
+# We use -O0 for debugging, because optimization confuses gdb.
+# Note that the omission of -Dconst= rules out the use of gcc versions
+# between 2.7.0 and 2.7.2 inclusive. (2.7.2.1 is OK.)
+
+!ifndef XCFLAGS
+XCFLAGS=/DPSI_INCLUDED
+!endif
+!ifndef PSICFLAGS
+PSICFLAGS=/DPSI_INCLUDED
+!endif
+
+# #define xxx_BIND is in std.h
+# putting compile time bindings here will have the side effect of having different options
+# based on application build. PSI_INCLUDED is and example of this.
+!ifndef EXPERIMENT_CFLAGS
+EXPERIMENT_CFLAGS=
+!endif
+
+# Language and configuration. These are actually platform-independent,
+# but we define them here just to keep all parameters in one place.
+!ifndef TARGET_DEVS
+TARGET_DEVS=$(PXLOBJDIR)\pxl.dev $(PCLOBJDIR)\pcl5c.dev $(PCLOBJDIR)\hpgl2c.dev
+!endif
+
+!ifndef FEATURE_DEVS
+FEATURE_CORE = \
+ $(DD)\psl3.dev \
+ $(DD)\pdf.dev \
+ $(DD)\dpsnext.dev \
+ $(DD)\htxlib.dev \
+ $(DD)\roplib.dev \
+ $(DD)\ttfont.dev \
+ $(DD)\pipe.dev
+
+FEATURE_DEVS = $(FEATURE_CORE) $(DD)\fapi.dev
+!endif
+
+!if "$(COMPILE_INITS)" == "1"
+!include $(PSSRCDIR)\psromfs.mak
+!endif
+
+!include $(MAINSRCDIR)\pcl6_msvc.mak
+
+# Subsystems
+!include $(PSISRCDIR)\psi.mak
+
diff --git a/link.icc b/link.icc
new file mode 100644
index 000000000..56cc39f4f
--- /dev/null
+++ b/link.icc
Binary files differ
diff --git a/main/pcl6_gcc.mak b/main/pcl6_gcc.mak
new file mode 100644
index 000000000..6ed003478
--- /dev/null
+++ b/main/pcl6_gcc.mak
@@ -0,0 +1,269 @@
+# The "?=" style of this makefile is designed to facilitate "deriving"
+# your own make file from it by setting your own custom options, then include'ing
+# this file. In its current form, this file will compile using default options
+# and locations. It is recommended that you make any modifications to settings
+# in this file by creating your own makefile which includes this one.
+#
+
+# Define the name of this makefile.
+MAKEFILE+= ../main/pcl6_gcc.mak
+
+# Pick (uncomment) one font system technology ufst or afs (gs native)
+#PL_SCALER?=ufst
+PL_SCALER?=afs
+
+# define if this is a cygwin system.
+CYGWIN?=
+
+# extra cflags
+XCFLAGS?=
+
+# The build process will put all of its output in this directory:
+GENDIR?=./obj
+PGGENDIR?=./pgobj
+# The sources are taken from these directories:
+GLSRCDIR?=../gs/src
+PCLSRCDIR?=../pcl
+PLSRCDIR?=../pl
+PXLSRCDIR?=../pxl
+XPSSRCDIR?=../xps
+SVGSRCDIR?=../svg
+ICCSRCDIR?=../gs/icclib
+COMMONDIR?=../common
+MAINSRCDIR?=../main
+PSSRCDIR?=../gs/src
+
+# specify the location of zlib. We use zlib for bandlist compression.
+ZSRCDIR?=../gs/zlib
+ZGENDIR?=$(GENDIR)
+ZOBJDIR?=$(GENDIR)
+SHARE_ZLIB?=0
+SHARE_LIBPNG?=0
+
+PNGSRCDIR?=../gs/libpng
+# only relevant if not shared
+PNGCCFLAGS?=-DPNG_USER_MEM_SUPPORTED
+
+IMDISRCDIR?=../gs/imdi
+
+# PCL_INCLUDED means pcl + pcl xl
+PDL_INCLUDE_FLAGS?=-DPCL_INCLUDED
+
+# Choose COMPILE_INITS=1 for init files and fonts in ROM (otherwise =0)
+COMPILE_INITS?=0
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+PLPLATFORM?=
+
+# specify the locate of the jpeg library.
+JSRCDIR?=../gs/jpeg
+JGENDIR?=$(GENDIR)
+JOBJDIR?=$(GENDIR)
+SHARE_JPEG?=0
+
+# ridiculousness, not worth documenting.
+AK?=
+
+# specify if banding should be memory or file based, and choose a
+# compression method.
+
+BAND_LIST_STORAGE=memory
+BAND_LIST_COMPRESSOR=zlib
+
+# file implementation for high level devices.
+FILE_IMPLEMENTATION=stdio
+
+# stdio
+STDIO_IMPLEMENTATION=c
+
+# taken from ugcclib.mak... hmmph.
+gsdir?=/usr/local/share/ghostscript
+gsdatadir?=$(gsdir)/$(GS_DOT_VERSION)
+GS_DOCDIR?=$(gsdatadir)/doc
+GS_LIB_DEFAULT?=$(gsdatadir)/lib:$(gsdatadir)/Resource/Font:$(gsdir)/fonts
+SEARCH_HERE_FIRST?=1
+GS_INIT?=gs_init.ps
+GS?=
+# end hmmph
+
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+GLGENDIR?=$(GENDIR)
+GLOBJDIR?=$(GENDIR)
+PLGENDIR?=$(GENDIR)
+PLOBJDIR?=$(GENDIR)
+PXLGENDIR?=$(GENDIR)
+PCLGENDIR?=$(GENDIR)
+XPSGENDIR?=$(GENDIR)
+SVGGENDIR?=$(GENDIR)
+PXLOBJDIR?=$(GENDIR)
+PCLOBJDIR?=$(GENDIR)
+XPSOBJDIR?=$(GENDIR)
+SVGOBJDIR?=$(GENDIR)
+
+TARGET_DEVS?=$(PXLOBJDIR)/pxl.dev $(PCLOBJDIR)/pcl5c.dev $(PCLOBJDIR)/hpgl2c.dev
+TARGET_XE?=$(GENDIR)/pcl6
+TARGET_LIB?=$(GENDIR)/pcl6.a
+MAIN_OBJ?=$(PLOBJDIR)/plmain.$(OBJ) $(PLOBJDIR)/plimpl.$(OBJ)
+PCL_TOP_OBJ?=$(PCLOBJDIR)/pctop.$(OBJ)
+PXL_TOP_OBJ?=$(PXLOBJDIR)/pxtop.$(OBJ)
+TOP_OBJ?=$(PCL_TOP_OBJ) $(PXL_TOP_OBJ)
+
+# note agfa gives its libraries incompatible names so they cannot be
+# properly found by the linker. Change the library names to reflect the
+# following (i.e. the if library should be named libif.a
+# NB - this should all be done automatically by choosing the device
+# but it ain't.
+
+# The user is responsible for building the agfa or freetype libs. We
+# don't overload the makefile with nonsense to build these libraries
+# on the fly. If the artifex font scaler is chosen the makefiles will
+# build the scaler automatically.
+
+# PCL and XL do not need to use the same scaler, but it is necessary to
+# tinker/hack the makefiles to get it to work properly.
+
+PCL_FONT_SCALER=$(PL_SCALER)
+PXL_FONT_SCALER=$(PL_SCALER)
+
+# to compile in the fonts uncomment the following (this option only
+# works with the artifex scaler on a unix platform)
+
+# flags for UFST scaler.
+ifeq ($(PL_SCALER), ufst)
+UFST_ROOT?=../ufst
+UFST_BRIDGE?=1
+UFST_LIB_EXT?=.a
+UFST_LIB?=$(UFST_ROOT)/rts/lib/
+UFST_CFLAGS?=-DGCCx86 -DUFST_ROOT=$(UFST_ROOT)
+UFST_INCLUDES?=-I$(UFST_ROOT)/rts/inc/ -I$(UFST_ROOT)/sys/inc/ -I$(UFST_ROOT)/rts/fco/ -I$(UFST_ROOT)/rts/gray/ -I$(UFST_ROOT)/rts/tt/ -DAGFA_FONT_TABLE
+# fco's are binary (-b), the following is only used if COMPILE_INITS=1
+UFST_ROMFS_ARGS?=-b \
+-P $(UFST_ROOT)/fontdata/mtfonts/pcl45/mt3/ -d fontdata/mtfonts/pcl45/mt3/ pcl___xj.fco plug__xi.fco wd____xh.fco \
+-P $(UFST_ROOT)/fontdata/mtfonts/pclps2/mt3/ -d fontdata/mtfonts/pclps2/mt3/ pclp2_xj.fco \
+-c
+
+EXTRALIBS?= $(UFST_LIB)if_lib.a $(UFST_LIB)fco_lib.a $(UFST_LIB)tt_lib.a $(UFST_LIB)if_lib.a
+ifeq ($(COMPILE_INITS), 0)
+UFSTFONTDIR?=/usr/local/fontdata5.0/
+else
+UFSTFONTDIR?=%rom%fontdata/
+endif
+endif # PL_SCALER = ufst
+
+# flags for artifex scaler
+ifeq ($(PL_SCALER), afs)
+UFST_BRIDGE?=
+# The mkromfs arguments for including the PCL fonts if COMPILE_INITS=1
+PCLXL_ROMFS_ARGS?= -P ../urwfonts -d ttfonts /
+
+XLDFLAGS=
+EXTRALIBS=
+UFST_OBJ=
+ifeq ($(ROMFONTS), true)
+PL_SCALER=afs
+XLDFLAGS=-L../pl/
+EXTRALIBS=-lttffont
+endif # ROMFONTS
+
+endif # PL_SCALER = afs
+
+# a 64 bit type is needed for devicen color space/model support but
+# carries a performance burden. Use this definition (uncomment) for
+# devicen support.
+
+GX_COLOR_INDEX_DEFINE?=-DGX_COLOR_INDEX_TYPE="unsigned long long"
+
+HAVE_STDINT_H_DEFINE?=-DHAVE_STDINT_H
+HAVE_MKSTEMP_DEFINE?=-DHAVE_MKSTEMP
+
+# Assorted definitions. Some of these should probably be factored out....
+# We use -O0 for debugging, because optimization confuses gdb.
+# Note that the omission of -Dconst= rules out the use of gcc versions
+# between 2.7.0 and 2.7.2 inclusive. (2.7.2.1 is OK.)
+# disable assert() with -DNDEBUG
+
+GCFLAGS?=-Wall -Wundef -Wstrict-prototypes -Wmissing-declarations \
+ -Wmissing-prototypes -Wpointer-arith -Wwrite-strings \
+ -Wcast-qual -Wwrite-strings -Wno-strict-aliasing \
+ -fno-builtin -fno-common \
+ -DNDEBUG \
+ $(HAVE_STDINT_H_DEFINE) $(HAVE_MKSTEMP_DEFINE) \
+ $(GX_COLOR_INDEX_DEFINE) $(PSICFLAGS) $(PDL_INCLUDE_FLAGS)
+
+CFLAGS?= $(GCFLAGS) $(XCFLAGS)
+
+XINCLUDE?=-I/usr/X11R6/include
+XLIBDIRS?=-L/usr/X11R6/lib
+XLIBDIR?=
+XLIBS?=Xt SM ICE Xext X11
+
+CCLD?=gcc
+
+DD=$(GLGENDIR)/
+
+
+DEVICES_DEVS?=$(DD)ljet4.dev $(DD)djet500.dev $(DD)cljet5pr.dev $(DD)cljet5c.dev\
+ $(DD)bitcmyk.dev $(DD)bitrgb.dev $(DD)bitrgbtags.dev \
+ $(DD)pcxmono.dev $(DD)pcxgray.dev $(DD)pcxcmyk.dev $(DD)pswrite.dev $(DD)pdfwrite.dev\
+ $(DD)pxlmono.dev $(DD)pxlcolor.dev\
+ $(DD)bmpmono.dev $(DD)bmpsep8.dev \
+ $(DD)pbmraw.dev $(DD)pgmraw.dev $(DD)ppmraw.dev \
+ $(DD)png16m.dev $(DD)pngmono.dev $(DD)jpeg.dev \
+ $(DD)wtscmyk.dev $(DD)wtsimdi.dev $(DD)imdi.dev \
+ $(DD)romfs$(COMPILE_INITS).dev
+
+FEATURE_DEVS?=$(DD)colimlib.dev $(DD)dps2lib.dev $(DD)path1lib.dev\
+ $(DD)patlib.dev $(DD)psl2cs.dev $(DD)rld.dev $(DD)roplib.dev\
+ $(DD)gxfapiu$(UFST_BRIDGE).dev\
+ $(DD)ttflib.dev $(DD)cielib.dev $(DD)pipe.dev $(DD)htxlib.dev\
+ $(DD)gsnogc.dev $(DD)sdctd.dev $(DD)libpng_$(SHARE_LIBPNG).dev\
+ $(DD)psl3lib.dev $(DD)seprlib.dev $(DD)translib.dev\
+ $(DD)cidlib.dev $(DD)psf0lib.dev $(DD)psf1lib.dev $(DD)psf2lib.dev\
+ $(DD)lzwd.dev
+
+# cygwin does not have threads at this time, so we don't include the
+# thread library
+ifeq ($(CYGWIN), TRUE)
+SYNC=
+CFLAGS+=-DHAVE_STDINT_H
+STDLIBS=-lm
+DEVICE_DEVS=$(DEVICES_DEVS)
+DEVICE_DEVS=$(DD)x11.dev $(DD)x11alpha.dev $(DD)x11mono.dev $(DD)x11cmyk.dev $(DEVICES_DEVS)
+
+else
+
+SYNC=posync
+# some systems may need -ldl as well as pthread
+STDLIBS=-lm -lpthread -ldl
+DEVICE_DEVS=$(DD)x11.dev $(DD)x11alpha.dev $(DD)x11mono.dev $(DD)x11cmyk.dev $(DEVICES_DEVS)
+endif
+
+#miscellaneous
+XOBJS?=$(GLOBJDIR)/gsargs.o $(GLOBJDIR)/gconfig.o $(GLOBJDIR)/gscdefs.o
+
+# Generic makefile
+include $(COMMONDIR)/ugcc_top.mak
+
+# Subsystems
+
+include $(PLSRCDIR)/pl.mak
+include $(PXLSRCDIR)/pxl.mak
+include $(PCLSRCDIR)/pcl.mak
+
+# Main program.
+
+pdl-default: $(TARGET_XE)$(XE)
+ echo Done.
+
+lib: $(TARGET_LIB)
+ echo Done lib.
+
+#### Implementation stub
+$(PLOBJDIR)plimpl.$(OBJ): $(PLSRCDIR)plimpl.c \
+ $(memory__h) \
+ $(scommon_h) \
+ $(gxdevice_h) \
+ $(pltop_h)
diff --git a/main/pcl6_msvc.mak b/main/pcl6_msvc.mak
new file mode 100644
index 000000000..4cd6a22f3
--- /dev/null
+++ b/main/pcl6_msvc.mak
@@ -0,0 +1,392 @@
+# pcl6_msvc.mak
+# Top-level makefile for PCL5* + PCL-XL on Win32 platforms using MS Visual C 4.1 or later
+
+# Define the name of this makefile.
+MAKEFILE=$(MAKEFILE) ..\main\pcl6_msvc.mak
+
+# The build process will put all of its output in this directory:
+!ifndef GENDIR
+GENDIR=.\obj
+!endif
+
+# The sources are taken from these directories:
+!ifndef GLSRCDIR
+GLSRCDIR=..\gs\src
+!endif
+!ifndef PLSRCDIR
+PLSRCDIR=..\pl
+!endif
+!ifndef PCLSRCDIR
+PCLSRCDIR=..\pcl
+!endif
+!ifndef PXLSRCDIR
+PXLSRCDIR=..\pxl
+!endif
+!ifndef ICCSRCDIR
+ICCSRCDIR=..\gs\icclib
+!endif
+!ifndef COMMONDIR
+COMMONDIR=..\common
+!endif
+!ifndef JSRCDIR
+JSRCDIR=..\gs\jpeg
+!endif
+!ifndef PNGSRCDIR
+PNGSRCDIR=..\gs\libpng
+!endif
+!ifndef ZSRCDIR
+ZSRCDIR=..\gs\zlib
+!endif
+!ifndef ICCSRCDIR
+ICCSRCDIR=..\gs\icclib
+!endif
+
+!ifndef SHARE_ZLIB
+SHARE_ZLIB=0
+!endif
+
+!ifndef SHARE_LIBPNG
+SHARE_LIBPNG=0
+!endif
+
+!ifndef IMDISRCDIR
+IMDISRCDIR=..\gs\imdi
+!endif
+
+!ifndef COMPILE_INITS
+COMPILE_INITS=0
+!endif
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+!ifndef PLPLATFORM
+PLPLATFORM=
+!endif
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+!ifndef GLGENDIR
+GLGENDIR=$(GENDIR)
+!endif
+!ifndef GLOBJDIR
+GLOBJDIR=$(GENDIR)
+!endif
+
+!ifndef PLGENDIR
+PLGENDIR=$(GENDIR)
+!endif
+
+!ifndef PLOBJDIR
+PLOBJDIR=$(GENDIR)
+!endif
+
+!ifndef PCLGENDIR
+PCLGENDIR=$(GENDIR)
+!endif
+
+!ifndef PCLOBJDIR
+PCLOBJDIR=$(GENDIR)
+!endif
+
+!ifndef PXLGENDIR
+PXLGENDIR=$(GENDIR)
+!endif
+
+!ifndef PXLOBJDIR
+PXLOBJDIR=$(GENDIR)
+!endif
+
+!ifndef JGENDIR
+JGENDIR=$(GENDIR)
+!endif
+
+!ifndef JOBJDIR
+JOBJDIR=$(GENDIR)
+!endif
+
+!ifndef ZGENDIR
+ZGENDIR=$(GENDIR)
+!endif
+
+!ifndef ZOBJDIR
+ZOBJDIR=$(GENDIR)
+!endif
+
+!ifndef DD
+DD=$(GLGENDIR)
+!endif
+
+!ifndef XPSGENDIR
+XPSGENDIR=$(GENDIR)
+!endif
+
+!ifndef XPSOBJDIR
+XPSOBJDIR=$(GENDIR)
+!endif
+
+# Executable path\name w/o the .EXE extension
+!ifndef TARGET_XE
+TARGET_XE=$(GENDIR)\pcl6
+!endif
+
+# Debugging options
+!ifndef DEBUG
+DEBUG=0
+!endif
+!ifndef TDEBUG
+TDEBUG=0
+!endif
+!ifndef DEBUGSYM
+DEBUGSYM=0
+!endif
+
+!ifndef NOPRIVATE
+NOPRIVATE=0
+!endif
+
+# Banding options
+!ifndef BAND_LIST_STORAGE
+BAND_LIST_STORAGE=memory
+!endif
+!ifndef BAND_LIST_COMPRESSOR
+BAND_LIST_COMPRESSOR=zlib
+!endif
+
+# Target options
+!ifndef CPU_TYPE
+CPU_TYPE=586
+!endif
+
+!ifndef BAND_LIST_STORAGE
+BAND_LIST_STORAGE=file
+!endif
+!ifndef BAND_LIST_COMPRESSOR
+BAND_LIST_COMPRESSOR=zlib
+!endif
+
+# Define which major version of MSVC is being used (currently, 4, 5, & 6 supported)
+# default to the latest version
+!ifndef MSVC_VERSION
+MSVC_VERSION=8
+!endif
+
+!ifndef D
+D=\\
+!endif
+
+# Main file's name
+!ifndef MAIN_OBJ
+!ifndef ALLOW_VD_TRACE
+MAIN_OBJ=$(PLOBJDIR)\plmain.$(OBJ) $(PLOBJDIR)\plimpl.$(OBJ)
+!else
+MAIN_OBJ=$(PLOBJDIR)\plmain.$(OBJ) $(PLOBJDIR)\plimpl.$(OBJ) $(PLOBJDIR)\dwtrace.$(OBJ)\
+ $(PLOBJDIR)\dwimg.$(OBJ) $(PLOBJDIR)\dwreg.$(OBJ)
+!endif
+!endif
+!ifndef PCL_TOP_OBJ
+PCL_TOP_OBJ=$(PCLOBJDIR)\pctop.$(OBJ)
+!endif
+!ifndef PXL_TOP_OBJ
+PXL_TOP_OBJ=$(PXLOBJDIR)\pxtop.$(OBJ)
+!endif
+!ifndef PSI_TOP_OBJ
+PSI_TOP_OBJ=
+!endif
+
+!ifndef PDL_INCLUDE_FLAGS
+PDL_INCLUDE_FLAGS=/DPCL_INCLUDED
+!endif
+
+!ifdef XPS_INCLUDED
+!ifndef XPS_TOP_OBJ
+XPS_TOP_OBJ=$(XPSOBJDIR)/xpstop.$(OBJ)
+XCFLAGS=/DXPS_INCLUDED
+!endif
+!endif
+
+# PCL_INCLUDED means pcl + pcl xl
+PDL_INCLUDE_FLAGS=/DPCL_INCLUDED
+XCFLAGS=$(XCFLAGS) $(PDL_INCLUDE_FLAGS)
+
+!ifndef TOP_OBJ
+TOP_OBJ=$(PCL_TOP_OBJ) $(PXL_TOP_OBJ) $(PSI_TOP_OBJ) $(XPS_TOP_OBJ)
+!endif
+
+
+# Pick a font system technology. PCL and XL do not need to use the
+# same scaler, but it is necessary to tinker with pl.mak to get it
+# to work properly.
+# ufst - Agfa universal font scaler.
+# afs - Artifex font scaler.
+!ifndef PL_SCALER
+PL_SCALER=afs
+#PL_SCALER=ufst
+!endif
+!ifndef PCL_FONT_SCALER
+PCL_FONT_SCALER=$(PL_SCALER)
+!endif
+!ifndef PXL_FONT_SCALER
+PXL_FONT_SCALER=$(PL_SCALER)
+!endif
+
+# specify agfa library locations and includes. This is ignored
+# if the current scaler is not the AGFA ufst.
+!ifndef UFST_ROOT
+UFST_ROOT=..\ufst
+!endif
+!ifndef UFST_LIB
+UFST_LIB=$(UFST_ROOT)\rts\lib
+!endif
+
+!if "$(PL_SCALER)" == "ufst"
+# fco's are binary (-b), the following is only used if COMPILE_INITS=1
+!ifndef UFST_ROMFS_ARGS
+UFST_ROMFS_ARGS=-b \
+-P $(UFST_ROOT)/fontdata/mtfonts/pcl45/mt3/ -d fontdata/mtfonts/pcl45/mt3/ pcl___xj.fco plug__xi.fco wd____xh.fco \
+-P $(UFST_ROOT)/fontdata/mtfonts/pclps2/mt3/ -d fontdata/mtfonts/pclps2/mt3/ pclp2_xj.fco \
+-c
+!endif
+
+UFST_BRIDGE=1
+
+!ifndef UFST_INCLUDES
+UFST_INCLUDES=$(I_)$(UFST_ROOT)\rts\inc $(I_)$(UFST_ROOT)\sys\inc $(I_)$(UFST_ROOT)\rts\fco $(I_)$(UFST_ROOT)\rts\gray $(I_)$(UFST_ROOT)\rts\tt -DAGFA_FONT_TABLE
+!endif
+
+!ifndef UFST_CFLAGS
+UFST_CFLAGS= -DUFST_BRIDGE=$(UFST_BRIDGE) -DUFST_LIB_EXT=.lib -DMSVC -DUFST_ROOT=$(UFST_ROOT)
+!endif
+
+!ifndef EXTRALIBS
+EXTRALIBS= $(UFST_LIB)if_lib.lib $(UFST_LIB)fco_lib.lib $(UFST_LIB)tt_lib.lib $(UFST_LIB)if_lib.lib
+!endif
+
+!ifndef UFSTFONTDIR
+UFSTFONTDIR=/usr/local/fontdata5.0/
+!endif
+
+!endif
+# end PL_SCALER == ufst
+
+# flags for artifex scaler
+!if "$(PL_SCALER)" == "afs"
+# The mkromfs arguments for including the PCL fonts if COMPILE_INITS=1
+!ifndef PCLXL_ROMFS_ARGS
+PCLXL_ROMFS_ARGS= -P ../urwfonts -d ttfonts /
+!endif
+
+!endif
+# end PL_SCALER == afs
+
+!ifdef XPS_INCLUDED
+EXTRALIBS=$(EXPATLIB)
+!endif
+
+# Language and configuration. These are actually platform-independent,
+# but we define them here just to keep all parameters in one place.
+!ifndef TARGET_DEVS
+TARGET_DEVS=$(PXLOBJDIR)\pjl.dev $(PXLOBJDIR)\pxl.dev $(PCLOBJDIR)\pcl5c.dev $(PCLOBJDIR)\hpgl2c.dev
+!endif
+
+!ifdef XPS_INCLUDED
+TARGET_DEVS= $(TARGET_DEVS) $(XPSOBJDIR)/xps.dev
+!endif
+
+!ifndef DEVICE_DEVS
+DEVICE_DEVS=$(DD)\ljet4.dev\
+ $(DD)\wtsimdi.dev\
+ $(DD)\bmpmono.dev $(DD)\bmp16m.dev $(DD)\bmp32b.dev\
+ $(DD)\bitcmyk.dev $(DD)\bitrgb.dev $(DD)\bit.dev\
+ $(DD)\pkmraw.dev $(DD)\ppmraw.dev $(DD)\pgmraw.dev $(DD)\pbmraw.dev\
+ $(DD)\pcx16.dev $(DD)\pcx256.dev $(DD)\pcx24b.dev\
+ $(DD)\cljet5.dev\
+ $(DD)\pcxmono.dev $(DD)\pcxcmyk.dev $(DD)\pcxgray.dev\
+ $(DD)\pbmraw.dev $(DD)\pgmraw.dev $(DD)\ppmraw.dev $(DD)\pkmraw.dev\
+ $(DD)\pxlmono.dev $(DD)\pxlcolor.dev\
+ $(DD)\tiffcrle.dev $(DD)\tiffg3.dev $(DD)\tiffg32d.dev $(DD)\tiffg4.dev\
+ $(DD)\tifflzw.dev $(DD)\tiffpack.dev\
+ $(DD)\tiff12nc.dev $(DD)\tiff24nc.dev \
+ $(DD)\png16m.dev $(DD)\pngmono.dev $(DD)\jpeg.dev \
+ $(DD)\pswrite.dev $(DD)\pdfwrite.dev \
+ $(DD)\wtscmyk.dev $(DD)\wtsimdi.dev $(DD)\imdi.dev
+!endif
+
+# GS options
+# Even though FEATURE_DEVS is defined in pcl_top.mak, define identically here
+# for msvc_top.mak because nmake defines macros eagerly (i.e. here & now).
+!ifndef FEATURE_DEVS
+FEATURE_DEVS = $(DD)\dps2lib.dev \
+ $(DD)\path1lib.dev \
+ $(DD)\patlib.dev \
+ $(DD)\gxfapiu$(UFST_BRIDGE).dev\
+ $(DD)\rld.dev \
+ $(DD)\psl2cs.dev \
+ $(DD)\roplib.dev \
+ $(DD)\ttflib.dev \
+ $(DD)\colimlib.dev \
+ $(DD)\cielib.dev \
+ $(DD)\htxlib.dev \
+ $(DD)\psl3lib.dev \
+ $(DD)\libpng_$(SHARE_LIBPNG).dev \
+ $(DD)\seprlib.dev \
+ $(DD)\translib.dev \
+ $(DD)\cidlib.dev \
+ $(DD)\psf1lib.dev \
+ $(DD)\psf0lib.dev \
+ $(DD)\sdctd.dev \
+ $(DD)\psf2lib.dev \
+ $(DD)\lzwd.dev
+!endif
+
+
+default: $(TARGET_XE).exe
+ echo Done.
+
+clean: config-clean clean-not-config-clean
+
+#### Implementation stub
+$(PLOBJDIR)\plimpl.$(OBJ): $(PLSRCDIR)\plimpl.c \
+ $(memory__h) \
+ $(scommon_h) \
+ $(gxdevice_h) \
+ $(pltop_h)
+
+!include $(COMMONDIR)\msvc_top.mak
+
+clean-not-config-clean: pl.clean-not-config-clean pxl.clean-not-config-clean
+ $(RMN_) $(TARGET_XE)$(XE)
+
+config-clean: pl.config-clean pxl.config-clean
+ $(RMN_) *.tr $(GD)devs.tr$(CONFIG) $(GD)ld.tr
+ $(RMN_) $(PXLGENDIR)\pconf.h $(PXLGENDIR)\pconfig.h
+
+
+# Subsystems
+!include $(PLSRCDIR)\pl.mak
+!include $(PCLSRCDIR)\pcl.mak
+!include $(PXLSRCDIR)\pxl.mak
+
+!ifdef XPS_INCLUDED
+!include $(XPSSRCDIR)\xps.mak
+!endif
+
+#### Rules for visual tracer window (copied from gs\winint.mak).
+#### Note PLCCC brings /Za, which can't compile Windows headers, so we define and use PLCCC_W instead. :
+
+CC_W=$(CC_WX) $(COMPILE_FULL_OPTIMIZED) $(ZM)
+PLCCC_W=$(CC_W) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(I_)$(GLGENDIR)$(_I) $(C_)
+
+$(PLOBJDIR)\dwtrace.$(OBJ): $(GLSRC)dwtrace.c $(AK)\
+ $(dwimg_h) $(dwtrace_h)\
+ $(gscdefs_h) $(stdpre_h) $(gsdll_h) $(vdtrace_h)
+ $(PLCCC_W) $(GLO_)dwtrace.$(OBJ) $(C_) $(GLSRC)dwtrace.c
+
+$(PLOBJDIR)\dwimg.obj: $(GLSRC)dwimg.c $(AK)\
+ $(dwmain_h) $(dwdll_h) $(dwtext_h) $(dwimg_h) $(gdevdsp_h) $(stdio__h) \
+ $(gscdefs_h) $(iapi_h) $(dwreg_h)
+ $(PLCCC_W) $(GLO_)dwimg.obj $(C_) $(GLSRC)dwimg.c
+
+$(PLOBJDIR)\dwreg.obj: $(GLSRC)dwreg.c $(AK) $(dwreg_h)
+ $(PLCCC_W) $(GLO_)dwreg.obj $(C_) $(GLSRC)dwreg.c
+
+
diff --git a/pcl/Anomalies.txt b/pcl/Anomalies.txt
new file mode 100644
index 000000000..3a7406ffe
--- /dev/null
+++ b/pcl/Anomalies.txt
@@ -0,0 +1,937 @@
+Overview:
+
+Though designed to emulate the HP Color LaserJet 5/5M, there are several areas
+where the behavior of the Artifex interpreter differs from that device. The
+first part of this document provides an overview of these differences, and
+the second part notes specific examples in the PCL 5c FTS where the differences
+between the Artifex interpreter and the HP implementation are apparent.
+
+Overview:
+
+ Fonts
+ Since the release of the LaserJet III in 1989, successive printer products
+ from HP have shifted away from using bitmap fonts toward scalable fonts,
+ originally using Intellifont fonts and more recently TrueType fonts (using
+ the InfiniFont packaging technique). The Color LaserJet 5/5M represents an
+ intermediate stage in this development. It has a single bitmap font (line-
+ printer), a primary set of scalable fonts in Intellifont format, and an
+ additional set of fonts in TrueType format.
+
+ Artifex is not a font vendor, and the default set of fonts offered with the
+ interpreter is not meant to exactly emulate the offerings of an HP product.
+ In addition, the default font set corresponds to a later stage in the
+ evolution of HP products; more similar to the monochrome LaserJet 5/5M and
+ the LaserJet 6P than the Color LaserJet 5/5M (which more closely resembles
+ the font offering of the monochrome LaserJet 4 series). Though the set of
+ typeface "names" that are supported is similar, the format in which these
+ fonts are stored and some aspects of the supported character set vary.
+
+ This discrepancy in font offerings has many visible manifestations, most of
+ them quite minor. Some of the more obvious differences are:
+
+ 1. Spacing.
+
+ Not all of the proportionally spaced fonts in the default set match
+ the spacing (advance width) of the corresponding fonts provided
+ by HP. This is most often visible when lines of text are set up to be
+ clipped at the right margin (rare in applications but more common in
+ the FTS), or when the automatic line wrap feature is used.
+
+ 2. Adherence to requested height and/or (fixed-width) space.
+
+ In normal operation, a PCL document does not directly specify which
+ fonts are to be used for a given block of text. Rather, the document
+ will specify a set of font properties which the interpreter attempts
+ to match as best possible given the set of available fonts (the rules
+ which define a "best" match are quite specific). Among the properties
+ specified are the height of the font and, in the case of a fixed-pitch
+ font, the character pitch.
+
+ All of the fonts provided in the default set for the Artifex
+ interpreter are scalable, hence all will exactly adhere to the
+ requested font size and/or pitch. In situations where a bitmap font
+ would, instead, be used by an HP printer, only an approximate match
+ may be available for font size/pitch. Hence, the size of text
+ rendered by the Artifex interpreter may differ from that of an HP
+ printer.
+
+ 3. Interaction with downloaded symbol sets.
+
+ All of the fonts in the Artifex default set are TrueType fonts, which
+ make use of the Unicode font encoding scheme. Intellifont fonts, such
+ as the base set provided with the Color LaserJet 5/5M, make use of a
+ different font encoding scheme known as MSL. (In principle there is no
+ connection between a font's scaling technology and its encoding scheme,
+ but in practice all Intellifont fonts use the MSL scheme and all
+ (unbound) TrueType fonts use the Unicode scheme.)
+
+ In PCL, a user defined (downloaded) symbol set may apply to either the
+ Unicode or the MSL encoding scheme, but not to both. Hence, a downloaded
+ symbol set that uses the MSL encoding can be used with the base font
+ set of the Color LaserJet 5/5M, but not with fonts provided with the
+ Artifex interpreter. Conversely, any downloaded symbol set that uses
+ the Unicode encoding can be used with the base font set of the Artifex
+ interpreter, but not the Color LaserJet 5/5M.
+
+ Because support for the currently selected symbol set is the highest
+ priority selection parameter in the PCL font selection mechanism, this
+ difference in font format can have dramatic effects, as is evident in
+ some of the 5c FTS tests.
+
+ 4. Font scaler anomalies
+
+ The set of Intellifont fonts distributed by Agfa includes fonts with
+ some "malformed" character outlines (outlines that do not adhere to the
+ documented format). These outlines are handled differently by the
+ HP Intellifont scaler and the scaler provided with the Artifex
+ interpreter. For example, in the 5c FTS, the lower case 't' in the
+ Park Avenue font has a malformed outline, and its rendering with the
+ Artifex interpreter is quite different (i.e., distorted) from that
+ produced by an HP interpreter.
+
+ Rendering Methods/Halftones
+
+ HP's documentation identifies 20 different "rendering algorithms" that can
+ be selected on an object-by-object basis. For the most part these rendering
+ algorithms represent different halftones, though certain rendering
+ algorithms also specify color mapping (in particular, color to monochrome
+ conversion).
+
+ No actual devices support all 20 algorithms. For any given device, many
+ algorithms are mapped to others, so that no more than 6 to 12 unique
+ algorithms are supported. This remapping respects color transformations:
+ a monochrome algorithm may be remapped to another monochrome algorithm but
+ not to a color algorithm, and vice-versa. Hence, the remapping of render
+ algorithms is essentially a mechanism for selecting amongst different
+ halftones.
+
+ Halftones for PCL 5c devices fall into two categories: "predictable" and not
+ "predictable". Prior to the release of the Color LaserJet 5/5M, all PCL 5c
+ halftones were predictable: all halftones were based on threshold arrays
+ (HP's documentation terms such halftones "ordered dithers", because they
+ have a monotonicity or "order" property), and the same halftone was used on
+ all devices. (Strictly speaking, there is "upward compatibility": some
+ devices offer more halftones than others, but when a halftone is offered on
+ multiple devices it is the same.)
+
+ The Color LaserJet 5/5M completely broke with this tradition, and offered
+ only "unpredictable", or device specific, halftones. This was accomplished
+ by adding five new halftone algorithms to the previously existing set of 15,
+ and on the Color LaserJet 5/5M, remapping all of the existing algorithms
+ that require halftoning (algorithms 1 and 2 do not) to these five.
+
+ The "predictability" of a halftone is potentially of great significance in
+ PCL 5c, because of the manner in which HP chose to implement raster
+ operations. These are defined on a pixel-by-pixel basis after halftoning
+ (at least, where such a definition is possible; see the contone discussion
+ below for further information). Hence, when using raster operations to
+ combine objects rendered with two different halftones, the order in which
+ a halftone darkens pixels is of great significance: given two objects of
+ approximately 50% intensity and an exclusive-or raster operation, the
+ resulting region may be solidly colored, fully white, or anything in
+ between.
+
+ The Artifex interpreter provides the full set of rendering algorithms that
+ use "predictable" halftones, and except for the case of the noise ordered
+ dither, the halftone used is identical to that used by HP devices prior
+ to the Color LaserJet 5/5M. The halftone provided for noise-ordered
+ dither is only roughly similar to that provided by HP, but this should
+ not cause a problem in practice. Though in principle "predictable", the
+ noise ordered dither used on HP devices is so large (128 x 128 pixels)
+ that no application could reasonably take advantage of its ordered
+ property.
+
+ The Artifex interpreter provides no device-specific halftones because it
+ is impossible to know a priori what output device it will be used with.
+ Mechanisms are provided to allow device-specific halftones to be assigned
+ to specific rendering methods--see the accompanying interface description
+ for more information. All of the rendering algorithms that would normally
+ use a device specific halftone have been remapped to a method that uses
+ a predictable halftone. A mechanism is available for modifying this
+ mapping; again, see the interface document for details.
+
+ The Artifex interpreter supports user-downloaded threshold (dither) arrays,
+ which are supported by all recent HP color devices except the Color
+ LaserJet 5/5M. If desired, this support can be disabled by remapping the
+ corresponding render algorithms (9 and 10) via the mechanism noted above;
+ by default, however, these are not remapped.
+
+ In practice, this implies that halftoned output produced by the unmodified
+ Artifex PCL 5c interpreter will have a very different appearance from that
+ produced by the Color LaserJet 5/5M, even when the former is output on the
+ 5/5M. (There are also other complications, which are described further
+ below.) In general, the output from the Artifex interpreter will be similar
+ to that of the original Color LaserJet and the HP DeskJet 1200 and 1600
+ C/CM printers. This is a reflection of a different configuration rather
+ than a fundamental difference in the interpreter.
+
+ Raster Operations, device pixel depth
+
+ In any industry that undergoes rapid technological evolution, any technical
+ term that becomes significant for purposes of marketing tends to lose its
+ technical meaning, as manufacturers shift the definition to show their
+ products in the best light. Such has been the case for the term "resolution"
+ when used with respect to inkjet and laser printers.
+
+ HP does not provided a resolution specification for the Color LaserJet 5/5M.
+ It does, however, claim "1200 dpi" equivalent performance, via the use of
+ "resolution enhancement technology" (RET).
+
+ Based on the traditional metric, namely, the thinnest horizontal and
+ vertical pure color line that can be drawn, the Color LaserJet 5/5M is
+ a 300 dpi device. The resolution enhancement technology used by HP
+ provides for more rapid modulation of the laser in the fast-scan
+ direction (the long edge of a letter or A4 page). This is used as part of
+ a halftoning technique that produces thinner lines in the slow-scan
+ direction than would be indicated by the 300 dpi resolution. This makes
+ the printer somewhat of a contone device, with between 8 and 16 levels
+ per pixel in each color plane.
+
+ Based on empirical evidence, HP does not make use of this contone capability
+ in a direct manner. Rather, the level used for a specific pixel is based
+ both on the color of that pixel and on the colors for a small number of
+ nearest neighbor pixels. A likely reason for this is that PCL rasters are
+ traditionally bi-level in each color plane (this is true for all of the
+ default or "fixed" color palettes), and the printer will only support
+ input resolutions to 300 dpi.
+
+ A side-effect of this arrangement is to make the effect of general raster
+ operations completely unpredictable; indeed, much less predictable than
+ would be indicated by usage of "unpredictable" halftones. For actual
+ applications this is almost never visible, but in several of the tests
+ in the PCL 5c FTS, the results on the Color LaserJet 5/5M bear only
+ slight resemblance to what is documented and what is produced by other
+ PCL 5c printers. In these cases, the Artifex PCL 5c interpreter
+ follows the documentation, as the results produced by the CLJ 5/5M seem to
+ be extremely specific to that device.
+
+ Color Correction
+
+ The Color LaserJet 5/5M provides sets of two device dependent and three
+ device independent color spaces. One of the latter is not, however, a fully
+ device independent color space: the "Colorimetric RGB" space is documented
+ as a device independent color space but is implemented as a set of lookup
+ tables based on the device-dependent RGB space (all above board: this
+ arrangement is noted in the documentation).
+
+ The implementation of the device dependent color spaces is simple enough,
+ with the exception of some peculiar color correction applied to the fixed
+ color spaces. The latter is discussed below. The implementation in the
+ Artifex code matches that of the Color LaserJet 5/5M quite closely in this
+ area, with the exception of the color correction anomaly.
+
+ The device independent color spaces are another matter entirely. Nothing can
+ be said directly about the "Colorimetric RGB" space since this is not
+ actually supported. The documentation for this format does, however, include
+ several parameters whose significance is, at best, obscure. The definition
+ of the chromaticities of the primaries is straightforward enough, and the
+ specification of gamma parameters for the components is reasonably
+ standard (though why the language provides for both a per component gamma
+ specification and a per-component, per-color-space lookup table is less
+ clear). The gain parameter, on the other hand, is not standard, and we
+ could find no description in the literature as to what it might mean. Based
+ on empirical work using the luminance-chrominance color space (which uses
+ the same parameter for its base color space), we have implemented the
+ gamma and gain parameters as:
+
+ out = 1.0 - (1.0 - pow(in, 1/gamma)) / gain
+
+ The CIE L*a*b* color space provided by the Color LaserJet 5/5M is also
+ somewhat peculiar. Its most unusual property is that an L* value 0 does not
+ yield black but rather a fairly solid red. This leaves one at somewhat of a
+ loss as to what the L* parameter is intended to correspond to. In any event,
+ after prior discussions with the OEM customer, the Artifex interpreter
+ was built to use the CIE specified conversion from L*a*b* to XYZ (the
+ color rendering dictionary converts the latter to device colors). The
+ difference between the two is visible in several of the tests of the PCL
+ 5c FTS.
+
+ The default color correction information provided with the Artifex
+ interpreter assumes the output device has uncorrected SMPTE primaries. This
+ is, of course, not likely to be correct for any actual output device. The
+ output observed using device independent color spaces will be incorrect
+ unless a suitable color rendering dictionary has been installed. How this
+ may be accomplished is described in the accompanying interface document.
+
+ Device dependent color correction
+
+ The fixed or "simple" color space palettes provided with the Color LaserJet
+ 5/5M are ostensibly variations of the device-dependent RGB color space.
+ However, unlike the latter, the "simple" color spaces produce different
+ results when used for raster as opposed to geometric objects: red becomes
+ orange, green becomes notably lighter in shade, cyan becomes nearly blue,
+ and blue becomes deep purple. This effect is quite noticeable and is only
+ present on the Color LaserJet 5/5M; other HP printers do not show this
+ effect.
+
+ Because rasters rendered with the simple color spaces generate output much
+ more "quickly" than rasters generated with the equivalent writeable color
+ palette by a factor of about 3, it is our belief that the simple color
+ space raster palettes represent the true colors of the device primaries,
+ and that color correction is applied to colors used with geometric objects
+ to make them more nearly match what is expected of these colors.
+
+ The Artifex PCL 5c interpreter does and, and indeed cannot, provide the
+ same form of correction. In the 5c interpreter, geometric and raster
+ objects that use the same color will have identical appearance. Hence,
+ rasters produced with simple color space in the Artifex interpreter will not
+ have the same appearance as those produced by the Color LaserJet 5/5m.
+
+ View Illuminant
+
+ For reasons that are likely specific to the implementation, the view
+ illuminant setting on the Color LaserJet 5/5m only affects rasters, not
+ geometric objects. The Artifex interpreter does not replicate this
+ behavior: the view illuminant setting affects all output. This leads to
+ different output on one of the tests of the PCL 5c FTS.
+
+ Default Colors
+
+ HP specifies that up to the first eight entries of each palette be given
+ a set of default, device dependent primary colors. Furthermore, these colors
+ are not affected by color lookup tables for the device independent color
+ spaces, but are affected by lookup tables for the appropriate device
+ dependent color space.
+
+ This effect is difficult to achieve given the design of the Artifex
+ interpreter and its underlying graphic library. The effect is also of
+ questionable merit: why use a device-dependent default color with a
+ device independent color space? Hence, in the Artifex interpreter, the
+ default colors used with device independent color spaces are themselves
+ device independent, and are affected by all applicable color lookup
+ tables.
+
+ Transparency
+
+ The implementation of transparency in the Artifex PCL 5c interpreter
+ closely follows that of HP interpreters, with one major exception. In HP
+ interpreters, the determination of which colors are white is made at the
+ device level, immediately before dithering. In the Artifex interpreter,
+ the same determination is made at the source color level, after consider-
+ ation of the black and white reference points but before any other color
+ transformation. This is arguably a bug but one that is difficult to remedy
+ given the design of the underlying graphic library.
+
+ In practice, this difference is not visible in application files, and is
+ visible in test files in only two cases: when using an inverting color
+ lookup table, and when using rendering algorithm 2 (map black to white and
+ all other colors to black). Both of these situations arise in a small
+ number of tests in the PCL 5c FTS.
+
+ Pixel Placement
+
+ Though the definition of pixel placement is consistent across all PCL 5c
+ implementations from HP, the set of objects affected is not. In all cases
+ pixel placement affects rectangles in PCL and polygon fills in GL, and do
+ not affect PCL rasters. For all devices except the Color LaserJet 5/5M,
+ pixel placement does not affect text; this is also the documented behavior.
+ For the CLJ 5/5M, pixel placement affects the rendering of scalable fonts,
+ but does so in a manner not consistent with its effects on other objects
+ (an extra pixel is added on each side of the character, as opposed to just
+ the right and bottom sides).
+
+ The Artifex PCL 5c interpreter adheres to the documented behavior: only
+ PCL rectangles and polygon fills in GL/2 are affected by pixel placement
+ (currently there is a bug that causes the pixel placement command in
+ GL/2 to have incorrect behavior, but the design intent is as stated).
+
+ Driver configuration parameters
+
+ The Artifex PCL 5c interpreter does not implement the driver configuration
+ command. This causes several tests near the end of the PCL 5c FTS to
+ produce different results than is the case for the Color LaserJet 5/5M.
+
+
+
+Difference in specific tests of the PCL 5c FTS
+
+54:
+
+ The line "12345..." is printed in an 8 pt. version of the default
+ proportionally spaced font. In the Artifex interpreter, this is a Times
+ font, as it is for the Color LaserJet 5/5M, but not with the same spacing.
+
+65, 75, 85, 95, 103:
+
+ The raster in each of these tests is printed in a "simple" color space
+ (fixed palette). As described above, the colors in these color spaces
+ vary between geometric objects and rasters for the Color LaserJet 5/5M,
+ but not for the Artifex interpreter. Hence, the colors for the raster
+ will appear different in the two interpreters.
+
+140, 143:
+
+ The vertical bar character is from the bitmap lineprinter font on
+ the HP and from the Courier font on the Artifex interpreter, hence
+ the differences in the length of the bars.
+
+273, 274, 275, 276, 284, 285, 286:
+
+ Symbol set differences.
+
+310, 320:
+
+ These two panels are printed with the printer's "line printer" font.
+ On the HP DJ 1600C/CM and the CLJ 5/5M, this is a bitmap font that is
+ not scalable and is offered in only one size, hence its size does not
+ change with pitch. On the Artifex system, the scalable Courier font is
+ substituted for the line printer font. This font does change pitch as
+ requested in the tests.
+
+403, 412:
+
+ The Univers Condensed font provided with the Artifex PCL interpreter
+ has all characters condensed. In the version of the same font provided
+ by HP, certain "universal" characters (characters that are independent
+ of font style), are not condensed.
+
+411 (et. al.):
+
+ The lower case 't' in the downloaded Park Avenue font contains a malformed
+ outline. This is handled differently by the Intellifont font scaler
+ provided with the Artifex PCL interpreter than by the scaler provided with
+ HP PCL implementations.
+
+422:
+
+ The default vertical offset applied to floating underlines by the Artifex
+ PCL interpreter is not the same as that provided by HP PCL interpreters.
+
+441 - 443, 450 - 512:
+
+ The fonts provided with the Artifex PCL 5 interpreter are TrueType fonts,
+ which use the Unicode encoding scheme. The corresponding fonts in the
+ Color LaserJet 5/5M are Intellifont fonts, which use the MSL encoding
+ scheme. Thus, downloaded symbol sets that use the MSL coding scheme
+ can be used with the resident fonts of the Color LaserJet 5/5M, but not
+ with the resident fonts provided with the Artifex interpreter. Similarly,
+ downloaded symbol sets that use the Unicode encoding scheme can be used
+ with fonts provided with the Artifex interpreter, but not with those
+ provided with the CLJ 5/5M.
+
+520, 521:
+
+ Symbol set discrepancies.
+
+680 - 682:
+
+ These rasters are generated in a simple color space, and thus have the color
+ anomalies described in the first section of this document.
+
+701:
+ The length of the bitarray for the third and fourth pair of raster
+ (magenta and yellow) differ from those on the HP CLJ 5/5M.
+
+ The output of the Artifex interpreter matches that of the HP DJ 1600C/CM.
+ The output of the CLJ 5/5M is contrary to the documentation, and likely
+ a limitation of the particular implementation due to the interaction
+ between rasters and the hardware dither method.
+
+714:
+
+ On the Color LaserJet 5/5M, two of the white gaps between the cyan lines
+ appear to be wider than the others (after the 48th line and 98th cyan
+ lines). These larger gaps are not present in the input data, and are
+ probably due to a resonance phenomenon between the raster and the
+ resolution enhancement technology used by the CLJ 5/5M. This behavior
+ is not reproduced in the Artifex PCL 5c interpreter.
+
+721:
+
+ This raster are generated in a simple color space, and thus has the color
+ anomalies described in the first section of this document.
+
+722:
+
+ On the Color LaserJet 5/5M, the first of the shorter, magenta raster lines
+ appears to be thinner than the others. In the input data all of the lines
+ are the same width, and there is no apparent reason for the thinness of
+ the first line. The Artifex PCL 5c interpreter does not replicate this
+ anomaly.
+
+750:
+
+ In the third row, the row with the greatest reduction in scale, the first
+ (thinnest) bar of the raster completely disappears on the Color LaserJet
+ 5/5M, but not with the Artifex PCL 5c interpreter.
+
+ Whether a given artifact of a raster appears or disappears when scaled down
+ is a property of the specific raster scale implementation used. There is
+ no reason to expect the results to be the same across two implementations,
+ and little reason to try to make them the same.
+
+765:
+
+ The output produced by the Artifex interpreter appears to be correct and
+ agrees with the output of the DJ 1600C/CM. The output on the CLJ 5/5M
+ differs, quite probably due to a physical limitation of the printer.
+
+ This example involves scaled PCL rasters. Such rasters are clipped to the
+ the page's printable region. In PCL, a page is always assumed to have a 1/6"
+ unprintable margin. For this test all three of the rasters present are
+ scaled by a factor of 14.5. The middle (green) raster in the example has a
+ width of 25 samples, and is placed 205 pixels to the left of the right
+ printable margin. Hence, all of the first 14 samples should be visible
+ (14 * 14.5 = 203), as well as two pixels of the 15th sample.
+
+ In this test, all raster sample lines are the same, and consist of the
+ following pattern (0 == white, 1 == color, either dark blue or green):
+
+ 0000 0001 0000 0011 0000 0111 0
+
+ Hence, the 15th sample value is colored, and a two-pixel-wide sliver of this
+ sample should be visible.
+
+800 - 804:
+
+ Each of the "bars" in these test are rendered in a different color space,
+ in the sequence RGB, CMY, Colorimetric RGB, CIE L*a*b*, Luminance-
+ Chrominance. The final three bars are in device independent color spaces,
+ hence their appearance will vary based on the color rendering
+ dictionary provided.
+
+ Note also that fourth bar in tests 800 and 803 reflect the implementation
+ of the CIE L*a*b* color space in the Color LaserJet 5/5M, which renders
+ colors with the value of L* = 0 as red rather than black.
+
+811
+
+ Each raster in this example is rendered in a different color space, in the
+ sequence RGB, CMY, Colorimetric RGB, CIE L*a*b*, and Luminance-Chrominance.
+ Hence, the appearance of the last three rows will depend on the color
+ rendering dictionary provided. For the fourth raster, the different
+ implementations of the CIE L*a*b* color spaces is also evident.
+
+813:
+ The first two rasters are printed in RGB and CMY color spaces, with the
+ white and black points reversed. Due to an error in the implementation
+ of transparency in the CLJ 5/5M, this causes BOTH white and black to be
+ considered transparent, which in turn causes the center region to be
+ fully transparent.
+
+ The Artifex implementation does not have this bug, hence either the
+ black triangles or the black background of this region is visible.
+
+ The additional three rasters are printed in device-independent color spaces,
+ hence their appearance is dependent on the color rendering dictionary
+ provided.
+
+830, 831:
+
+ A number of differences between the Artifex PCL 5c interpreter and the
+ CLJ 5/5M are visible in these tests:
+
+ 1. The Artifex PCL 5c interpreter, in its default form, supports the
+ rendering methods with predictable halftones, and does not support
+ the rendering methods with unpredictable or device-specific halftones.
+ The CLJ 5/5M has the reverse arrangement. In particular, the Artifex
+ interpreter supports user downloaded dithers, which the CLJ 5/5M
+ does not.
+
+ 2. The Artifex PCL 5c interpreter determines which pixels are "white"
+ for purposes of transparency prior to the effects of the color mapping
+ implied by the rendering algorithm; the CLJ 5/5M makes this same
+ determination after such color mapping. This is most visible in the
+ case of render algorithm 2 (prominent horizontal black lines in both
+ tests), where the output from the Artifex interpreter is transparent
+ while that of the CLJ 5/5M is opaque.
+
+ 3. The Artifex PCL 5c interpreter, in common with most HP implementations
+ of PCL 5c, implements render algorithm 1 (snap to primaries) after
+ applying gamma correction. The CLJ 5/5M is exceptional in this area in
+ snapping the colors to primaries before applying gamma correction.
+ Hence, when using render algorithm 1, the output of the Artifex
+ interpreter (and most HP PCL 5c interpreters) is always a solid
+ primary color, while for the CLJ 5/5M it may be a halftoned color.
+ This difference is visible in the latter part of test 831.
+
+ 4. The final two columns of tests 830 and 831 represent a non-solid
+ raster object combined with a non-solid foreground, using logical
+ operation 252. Especially for the larger gamma values, the appearance
+ of the result is critically dependent on the nature of the halftones
+ used for the raster and the foreground. In the Artifex PCL 5c
+ interpreter, the halftones used cause these regions to become white
+ more rapidly than is the case for the CLJ 5/5M.
+
+833:
+
+ Each pair of lines in this example constitutes a pair of rasters. The
+ data for each raster pair is the same, only resolution is changed.
+ A bug in the CLJ 5/5M interpreter, also evident in test 701, results in
+ the improper rendering of raster output at 100 and 150 dpi in some
+ situations. The Artifex PCL 5c interpreter does not mimic this bug,
+ hence the different appearance of the output.
+
+853:
+
+ The modified render algorithm referred to in the fourth line of this test
+ is render algorithm 10, monochrome user defined dither. This render method
+ is supported by the Artifex PCL 5c interpreter (in its default form),
+ but not by the CLJ 5/5M. Hence the different appearance. Note also that
+ the final foreground for the fourth line is used to draw the text for
+ the final, fifth line of the test, so its appearance is modified as well.
+
+860 - 865:
+
+ See discussion for test 830 and 831.
+
+866:
+
+ The different appearance of this test between the Artifex PCL 5c
+ interpreter and the Color LaserJet 5/5M is due to the different halftones
+ used.
+
+871:
+
+ The final three rows of rectangles in this example are rendered in a device
+ independent color space, hence their appearance will depend on the nature
+ of the color rendering dictionary provided. In the default configuration,
+ these rectangles have a yellow hue where white would be expected.
+
+883:
+
+ The output from the Artifex PCL 5c interpreter matches the documented
+ behavior, and the behavior of HP implementations other than the CLJ 5/5M.
+ For reasons that are not clear, the CLJ 5/5M will print a faint outline
+ of "Text" for the rightmost instance of this string in the first line
+ of the test. Examination under magnification reveals that this outline
+ is smaller than the design resolution of the device, so this may be a
+ print engine artifact.
+
+956:
+
+ The rectangle on the right is printed with a transparent pattern. This
+ produces the expected output on the HP 1600C/CM and with the Artifex PCL
+ interpreter. It does not produce the expected output for the HP CLJ 5/5M,
+ apparently due to a bug.
+
+
+974:
+
+ See the discussion for test 830. This particular example also demonstrates
+ a situation in which different color mapping methods are being used for the
+ foreground and the raster being printed. For reasons that are not yet
+ clear, this (highly unusual) combination is not properly supported by the
+ graphic library underlying the Artifex PCL 5c interpreter.
+
+980, 981:
+
+ 1. The raster operation mechanism of the CLJ 5/5M is broken, and thus
+ cannot be used as a reliable comparison (see notes at the start of
+ this document).
+
+ 2. The implementation of opaque text for scalable fonts in the
+ Artifex PCL 5c interpreter is somewhat imperfect. The implementation
+ requires both inside and "outside" of a path to be filled, in
+ independent operations. The two filled regions do not join exactly,
+ hence a faint outline of the original character is usually visible.
+
+ 3. When compared to the documented behavior, the behavior of the Artifex
+ interpreter varies in some of the opaque source, transparent pattern
+ cases. We have not yet analyzed why this is the case, but do not
+ expect it to cause difficulty in practice.
+
+983:
+
+ The behavior of the Artifex PCL 5c interpreter matches the documented
+ behavior, and the behavior of HP devices other than the CLJ 5/5M. Raster
+ operations on the CLJ 5/5M are broken.
+
+1053:
+
+ The behavior of the Artifex PCL 5c interpreter matches the documented
+ behavior, and the behavior of HP devices other than the CLJ 5/5M. The
+ behavior of the CLJ 5/5M is apparently a bug.
+
+1074 and 1084:
+
+ The artifex interpreter's implementation of fill type 3 and 4
+ (FT) differs slightly from HP. Artifex gl/2 vector fills always
+ radiate away from the origin in plotter units space. This can
+ cause slight discrepancies as evidenced in these two frames.
+
+1070:
+ The artifex interpreter always fills along +x and +y for hpgl/2
+ vector fills. HP apparently fills in a direction related to the
+ direction of the graphical objects. We believe our interpretation
+ is follows the HP spec.
+
+1272:
+
+ The gl/2 interpreter places scalable characters slightly to the
+ left, the discrepancy for a font scaled to 2" is about 1/16".
+ Attachment 1 below illustrates the problem. The GL/2 Label is
+ drawn then we return to pcl maintaining the current "y" coordinate,
+ select the same font and print the same string. The Artifex
+ interpreter produces the same output for each string, the expected
+ result. HP does not.
+
+begin 664 gl2chbug.pcl
+M&T4;)3!"24X[4%<P.T94-"PV,RXU+#`[4$$P+#`[4E(U,#`P,"PU,#`P,#M0
+M5S`N,C4[1E0T+#4P."PP.U!!,"PP.U)2-3`P,#`L-3`P,#`[4%<P+C4[1E0T
+M+#$P,38L,#M003`L,#M24C4P,#`P+#4P,#`P.QLE,4))3CM34#$[25`[4%<P
+M+C`T.U-$-"PQ-#0L,BPQ+#<L-#$P,3M003`L-3`P,#M,0E!#3`-003`L,#L;
+5)3%!&RAS,30T5ALH<S%04$-,&T4*
+`
+end
+
+1402 (et. al.):
+
+ The filling of GL/2 polygon regions with lines in the Artifex PCL 5c
+ interpreter is not completely accurate. Line space and phasing are both
+ incorrect. These bugs are present in many other GL/2 tests as well.
+
+1422, 1423, 1424, 1445, 1446, 1462, 1463, 1801, 1803, 1811, 1817, 1894, 1895, 1941, 1946,
+1950, 1951, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 2210 (page 1), 2220 (page 2)
+
+ Artifex GL/2 contains minor discrepancies with anchoring line
+ fills. The problem is more evident in cases where scaling is
+ specified. Low priority.
+
+1463, 1463:
+
+ The patterned line fills used in these two tests vary in appearance
+ between the CLJ 5/5M and the Artifex PCL 5c interpreter because
+ the latter does not properly set the phase of GL/2 line fills.
+
+1601, 1602:
+
+ The GL/2 label printing command ("LB") in the Artifex PCL 5c interpreter
+ does not set the initial position of text correctly when printing in the
+ vertical direction.
+
+1641:
+
+ The handling of horizontal tab in GL/2 differs between the Artifex PCL 5c
+ interpreter and the CLJ 5/5M.
+
+1642, 1650:
+
+ The position of the label origin in GL/2 varies between the Artifex PCL 5c
+ interpreter and the CLJ 5/5M.
+
+1680:
+
+ The character sets supported by the fonts used in Artifex PCL 5c
+ interpreter, in its default form, are not the same as those supported by
+ the fonts in the CLJ 5/5M.
+
+1752, 1753 (et. al.):
+
+ The lower-case 'a' in the GL/2 stick font provided with the Artifex PCL 5c
+ interpreter is a different style than that of the stick font in the
+ CLJ 5/5M. This difference is also evident in other tests.
+
+1860, 1862, 1863:
+
+ The position of the GL/2 label origin in the Artifex PCL 5c interpreter is
+ not accurate. This is particularly noticeable for arbitrary transformations
+ of text, as in the first two tests cited.
+
+2080:
+
+ The scaling of the rightmost imported image in this test is
+ different than the HP printer. The artifex interpreter complies
+ with the HP PCLTRM. The following test shows that simply entering
+ and leaving HPGL/2 <ESC>%OB<ESC>%0A has the side effect of
+ resetting HPGL/2 scaling. This should not happen according to
+ PCLTRM 18-17.
+
+ <ESC>E
+ <ESC>*c720X
+ <ESC>*c0T
+ <ESC>*c8.3K
+(1) <ESC>%0B /* enter hpgl2/2 */
+(2) <ESC>%0A /* enter pcl */
+ <ESC>*c420Y
+ <ESC>*c0T
+ <ESC>%1BSP2;PW0;IN;SP6;SC0,100,0,100;PA50,50;SC;SP7;CI450;
+ <ESC>%1A
+ <ESC>E
+
+ the two commands (1) and (2) change the behavior the HP scaling
+ but not Artifex Scaling. If (1) and (2) are removed both HP and
+ Artifex produce the same results.
+
+2101, 2102:
+
+ See comments for test 830 and 831.
+
+2106:
+
+ Logical operations are broken on the CLJ 5/5M. The behavior of the Artifex
+ PCL 5c interpreter follows the documentation.
+
+2120, 2122:
+
+ HPGL/2 pixel placement is implemented using the postscript
+ operator setfilladjust. The HP command definition is not consistant with
+ the behavior of the implementation and different devices (Color
+ Laserjet & 6MP) produce different results for each of these test files.
+
+2210 and 2220 (fourth page):
+
+ SI, SR discrenpancy.
+
+
+2322, 2323:
+
+ Because the Artifex PCL 5c interpreter determines which regions are "white"
+ for purposes of transparency before taking into account any color lookup
+ table modifications, the white arrows in the center of these images are
+ considered transparent even in the center case (the inverting color
+ lookup table). Hence, for the inverting color lookup table case, the
+ central rectangle of the raster will be completely white.
+
+2330:
+
+ The CLJ 5/5M does not support the viewing illuminant command; the Artifex
+ PCL interpreter does.
+
+2331:
+
+ These rasters are rendered in a device independent color space, hence
+ their appearance will be dependent on the color rendering dictionary
+ provided.
+
+2351, 2352:
+
+ The driver configuration command linearly maps saturation and
+ lightness arguments to pcl's gamma function. It is expected that
+ vendors will provide product specific code for this function.
+
+2412:
+
+ After downloading a color lookup table, the monochrome palettes at the
+ bottom of the first and second pages of this test have one additional
+ black entry when rendered with the Artifex PCL 5c interpreter, as compared
+ to the output of the CLJ 5/5M. This problem has not been analyzed.
+
+PCL5c ATS Anomalies
+===================
+
+
+ak506k21.bin:
+
+ A PCL raster does not overlap an HPGL/2 line segment because the
+ line is not positioned exactly like HP due to a rounding
+ difference. The HP 1600C/CM also images this differently than
+ the HP Color Laserjet breaking only half of the line. After
+ rounding to the nearest pixel the ASI interpreter places the
+ raster rectangle one 300 dpi pixel below the gl/2 line. The HP
+ overlaps for at least one pixel on the 1600C/CM and the width of
+ the line on the Color Laserjet.
+
+fp309k22.bin:
+
+ The right edge of the clipboard is missing. This is a font
+ rasterizer anomaly. The clipboard is a winding bitmap font and
+ images correctly at 600 dpi but is slightly clipped at 300 dpi.
+
+Qp606w21.bin:
+
+ It is possible for the artifex interpreter to miss closing a
+ path in polygon mode under certain unusual conditions, due to
+ rounding problems. Here is a very simple example that
+ demonstrates the problem. This problem has only manifested in
+ problems of low visibility so we have not fixed it.
+
+begin 664 Qp606w21.bin.small
+M&R4M,3(S-#580%!*3"!3150@4$%'15!23U1%0U0]05543PI`4$I,(%-%5"!2
+M15-/3%5424]./38P,`I`4$I,($5.5$52($Q!3D=504=%/5!#3`H;11LE,$))
+M3E-0,5!!4%<N-3M053(Q,C`L,SDT-CM033`[4$0[4%(M."PM,BPM-#8L+3$Q
+?+#(R,2PM.#8W+"TQ-C<L.#@P.U!-,CM%4!LE,$$;10``
+`
+end
+
+
+---
+
+HP Color Laserjet 5C FTS printed on the Color Laserjet 4600
+
+panel 411 - The HP interpreter falls back to Times Bold Italic on line
+6. On the previous line the brush font was properly selected, text
+printed with the font then typeface family 4128 is selected.
+Extracting out the non vendor bits results in typeface 32 which is the
+typeface number of the brush font. There are no intervening relevant
+commands before the next sentence is printed so, we don't see how any
+other font than brush font could be selected and assume this is a bug
+in the HP printer. Similarly we believe the Dom Casual downloaded
+font should be selected on lines 7 & 8.
+
+
+----
+
+HP Color Laserjet 4600 CET
+
+18-01.BIN page 25 - The vertical bar and checkerboard character are
+missing on this page. The glyphs are not actually present in the
+downloaded font. It will work properly with Monotype if the plugins
+are configured correctly.
+
+20-07.BIN page 18 (repeats throughout test) - The HP prints the text
+in the wrong color. The logical operation 17 (DSon) is used to paint
+green text on a white background. The result should be black, the
+text is green. The following example prints the wrong colored text
+from the example and a rectangle with the same raster operation and
+colors, the rectangle is the predicted black and the text is green.
+
+(quoted printable)
+
+=1BE=1B*r3U=1B*v2S=1B*l17O=1B*p300x400Y=1B*c90A=1B*c150B=1B*c0PDownloa=
+ding symbol set 62F and making it permanent=1BE
+
+
+24-04 page 3, 4 and 6 - The HP 4600 is incorrect. The reference point is
+explicitly set to the current position before drawing the rectangles.
+The pattern's origin should coincide with the rectangle's origin as it
+does in the Artifex output.
+
+
+28-10 page 11 - This test checks fractional bit support for the
+polyline encoding command. The last box on the page uses 26 fractional
+bits, Artifex supports this and prints the box, the HP 4600 does not
+support 26 bits and does not print the box. The PCL Technical
+Reference Manual calls states the -26 <= fractional bits <= 26. The
+HPGL/2 RTL tecnical reference manual states the value is device
+dependent.
+
+
+
+----
+
+HP Color Laserjet 4600 CET printed on the Color Laserjet 4550
+
+
+21-09.BIN :
+
+ 4550 printer infinite loop raster width range test.
+
+
+21-10.BIN :
+
+ 4550 printer infinite loop raster height range test.
+
+
+21-10.BIN page 24, 25 and
+21-12.BIN page 17 :
+
+ Raster height > raster sent and the palette
+0 entry is not white. We zero fill with white, HP with Black or
+the palette color at entry 0.
+
+
+21-12.BIN page 19 :
+
+ HP incorrectly renders the first image stretching it
+in the X dimension.
+
+
+21-13.BIN page 2 :
+
+ HP incorrectly renders 4 of the rasters on the page
+Black triangles appear in a regular pattern across the raster
+
+
+
+
diff --git a/pcl/pcbiptrn.c b/pcl/pcbiptrn.c
new file mode 100644
index 000000000..5d351e693
--- /dev/null
+++ b/pcl/pcbiptrn.c
@@ -0,0 +1,366 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcbiptrn.c - code for PCL built-in patterns */
+
+#include "math_.h"
+#include "string_.h"
+#include "gstypes.h" /* for gsstate.h */
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsmemory.h" /* for gsstate.h */
+#include "gsstate.h"
+#include "gscoord.h"
+#include "pcpatrn.h"
+#include "pcuptrn.h"
+#include "pcbiptrn.h"
+#include "pcstate.h"
+
+/*
+ * Bitmap arrays for the built-in patterns.
+ */
+static const byte bi_data_array[(PCL_NUM_SHADE_PATTERNS + PCL_NUM_CROSSHATCH_PATTERNS) * 2 * 16] = {
+
+ /* shade 1% to 2% */
+ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ /* shade 3% to 10% */
+ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ /* shade 11% to 20% */
+ 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00,
+ 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00,
+
+ /* shade 21% to 35% */
+ 0xc1, 0xc1, 0xc1, 0xc1, 0x80, 0x80, 0x08, 0x08,
+ 0x1c, 0x1c, 0x1c, 0x1c, 0x08, 0x08, 0x80, 0x80,
+ 0xc1, 0xc1, 0xc1, 0xc1, 0x80, 0x80, 0x08, 0x08,
+ 0x1c, 0x1c, 0x1c, 0x1c, 0x08, 0x08, 0x80, 0x80,
+
+ /* shade 36% to 55% */
+ 0xc1, 0xc1, 0xeb, 0xeb, 0xc1, 0xc1, 0x88, 0x88,
+ 0x1c, 0x1c, 0xbe, 0xbe, 0x1c, 0x1c, 0x88, 0x88,
+ 0xc1, 0xc1, 0xeb, 0xeb, 0xc1, 0xc1, 0x88, 0x88,
+ 0x1c, 0x1c, 0xbe, 0xbe, 0x1c, 0x1c, 0x88, 0x88,
+
+ /* shade 56% to 80% */
+ 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xdd, 0xdd,
+ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0xdd, 0xdd,
+ 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xdd, 0xdd,
+ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0xdd, 0xdd,
+
+ /* shade 81% to 99% */
+ 0xf7, 0xf7, 0xe3, 0xe3, 0xf7, 0xf7, 0xff, 0xff,
+ 0x7f, 0x7f, 0x3e, 0x3e, 0x7f, 0x7f, 0xff, 0xff,
+ 0xf7, 0xf7, 0xe3, 0xe3, 0xf7, 0xf7, 0xff, 0xff,
+ 0x7f, 0x7f, 0x3e, 0x3e, 0x7f, 0x7f, 0xff, 0xff,
+
+ /* cross-hatch 1 (horizontal stripes) */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ /* cross-hatch 2 (vertical stripes) */
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+
+ /* cross-hatch 3 (upper right/lower left diagonal stripes) */
+ 0x80, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x1c,
+ 0x00, 0x38, 0x00, 0x70, 0x00, 0xe0, 0x01, 0xc0,
+ 0x03, 0x80, 0x07, 0x00, 0x0e, 0x00, 0x1c, 0x00,
+ 0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0, 0x01,
+
+ /* cross-hatch 4 (upper left/lower right diagonal stripes) */
+ 0xc0, 0x01, 0xe0, 0x00, 0x70, 0x00, 0x38, 0x00,
+ 0x1c, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, 0x80,
+ 0x01, 0xc0, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x38,
+ 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x07, 0x80, 0x03,
+
+ /* cross-hatch 5 (aligned cross-hatch) */
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xff, 0xff,
+ 0xff, 0xff, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+
+ /* cross-hatch 6 (diagnoal cross-hatch) */
+ 0xc0, 0x03, 0xe0, 0x07, 0x70, 0x0e, 0x38, 0x1c,
+ 0x1c, 0x38, 0x0e, 0x70, 0x07, 0xe0, 0x03, 0xc0,
+ 0x03, 0xc0, 0x07, 0xe0, 0x0e, 0x70, 0x1c, 0x38,
+ 0x38, 0x1c, 0x70, 0x0e, 0xe0, 0x07, 0xc0, 0x03
+};
+
+
+#define make_pixmap(indx) \
+ { (byte *)(bi_data_array + indx * 2 * 16), 2, {16, 16}, 0, 1, 1 }
+
+static const gs_depth_bitmap bi_pixmap_array[PCL_NUM_CROSSHATCH_PATTERNS +
+ PCL_NUM_SHADE_PATTERNS] = {
+ make_pixmap(0),
+ make_pixmap(1),
+ make_pixmap(2),
+ make_pixmap(3),
+ make_pixmap(4),
+ make_pixmap(5),
+ make_pixmap(6),
+ make_pixmap(7),
+ make_pixmap(8),
+ make_pixmap(9),
+ make_pixmap(10),
+ make_pixmap(11),
+ make_pixmap(12)
+};
+
+#define bi_cross_offset 7
+
+/*
+ * A special pattern, used for rendering images that interact with solid
+ * foregrounds.
+ *
+ * Handling the interaction of rasters and foregrounds in PCL is tricky. PCL
+ * foregounds carry a full set of rendering information, including color
+ * correction and halftoning information. These may differe from the color
+ * correction information and halftone mechanism used to process the raster
+ * itself (which is always taken from the current palette at the time the
+ * raster is output). The graphic library can accommodate only a single
+ * color rendering dictionary and halftone mechanism at one time, hence the
+ * problem.
+ *
+ * The solution is to invoke a second graphic state. Patterns in the graphic
+ * library are provided with their own graphic state, so method for handling
+ * solid foreground colors is to create a solid, uncolored pattern that is
+ * is "on" (assumes the foreground color) everywhere.
+ *
+ * The following 1x1 pixel texture is used for this prupose. As with the
+ * pattern above, two copies of this structure are required: a prototype
+ * (qualified as const) and the pattern actually used.
+ */
+static const byte solid_pattern_data = 0xff;
+static const gs_depth_bitmap solid_pattern_pixmap = {
+ (byte *)&solid_pattern_data, 1, {1, 1}, 0, 1, 1
+};
+
+/*
+ * An "un-solid" pattern, similar to the solid pattern described above, but
+ * with only background. This is used primarily to handle the case of an
+ * uncolored patter with a white foreground color in GL/2, which such patterns
+ * are completely transparent (if pattern transparency is on; note that what
+ * the GL/2 documentation describes as source transparency is actually pattern
+ * transparency).
+ */
+static const byte unsolid_pattern_data = 0x0;
+static const gs_depth_bitmap unsolid_pattern_pixmap = {
+ (byte *)&unsolid_pattern_data, 1, {1, 1}, 0, 1, 1
+};
+
+/*
+ * Initialize the built-in patterns
+ */
+ void
+pcl_pattern_init_bi_patterns(
+ pcl_state_t *pcs
+)
+{
+ memset(pcs->bi_pattern_array, 0, sizeof(pcs->bi_pattern_array));
+ pcs->psolid_pattern = 0;
+ pcs->punsolid_pattern = 0;
+}
+
+/*
+ * Clear all built-in patterns. This is normally called during a reset, to
+ * conserve memory.
+ */
+ void
+pcl_pattern_clear_bi_patterns(pcl_state_t *pcs)
+{
+ int i;
+
+ for (i = 0; i < countof(pcs->bi_pattern_array); i++) {
+ if (pcs->bi_pattern_array[i] != 0) {
+ pcl_pattern_free_pattern( pcs->memory,
+ pcs->bi_pattern_array[i],
+ "clear PCL built-in patterns"
+ );
+ pcs->bi_pattern_array[i] = 0;
+ }
+ }
+
+ if (pcs->psolid_pattern != 0) {
+ pcl_pattern_free_pattern( pcs->memory,
+ pcs->psolid_pattern,
+ "clear PCL built-in patterns"
+ );
+
+ pcs->psolid_pattern = 0;
+ }
+ if (pcs->punsolid_pattern != 0) {
+ pcl_pattern_free_pattern( pcs->memory,
+ pcs->punsolid_pattern,
+ "clear PCL built-in patterns"
+ );
+
+ pcs->punsolid_pattern = 0;
+ }
+}
+
+/*
+ * pcl patterns are always always 300 dpi but we use the device
+ * resolution on devices lower than 300 dpi so we can at least see the
+ * patterns on screen resolution devices. We also provide a #define
+ * here for customers that wish to have better patterns at higher
+ * resolutions.
+ */
+
+/* #define DEVICE_RES_PATTERNS */
+
+static int
+pcl_get_pattern_resolution(pcl_state_t *pcs, gs_point *pattern_res)
+{
+ /* default is 300 */
+ pattern_res->x = 300;
+ pattern_res->y = 300;
+ /* get the current resolutions based on the device. */
+ {
+ gs_point device_res;
+ gx_device *pdev = gs_currentdevice(pcs->pgs);
+ device_res.x = pdev->HWResolution[0];
+ device_res.y = pdev->HWResolution[1];
+#ifdef DEVICE_RES_PATTERNS
+ pattern_res->x = device_res.x;
+ pattern_res->y = device_res.y;
+#else
+ /* if both are less than 300 dpi override the 300 dpi default. */
+ if ( (device_res.x < 300) && (device_res.y < 300) ) {
+ pattern_res->x = device_res.x;
+ pattern_res->y = device_res.y;
+ }
+#endif
+ }
+ return 0;
+}
+#undef DEVICE_RES_PATTERNS
+/*
+ * Return the pointer to a built-in pattern, building it if inecessary.
+ */
+ static pcl_pattern_t *
+get_bi_pattern(pcl_state_t *pcs, int indx)
+{
+ if (pcs->bi_pattern_array[indx] == 0) {
+ gs_point pattern_res;
+ pcl_get_pattern_resolution(pcs, &pattern_res);
+ (void)pcl_pattern_build_pattern( &(pcs->bi_pattern_array[indx]),
+ &(bi_pixmap_array[indx]),
+ pcl_pattern_uncolored,
+ pattern_res.x,
+ pattern_res.y,
+ pcs->memory
+ );
+ pcs->bi_pattern_array[indx]->ppat_data->storage = pcds_internal;
+ }
+ return pcs->bi_pattern_array[indx];
+}
+
+/*
+ * For a given intensity value, return the corresponding shade pattern. A
+ * null return indicates that a solid pattern should be used - the caller
+ * must look at the intensity to determine if it is black or white.
+ */
+ pcl_pattern_t *
+pcl_pattern_get_shade(pcl_state_t *pcs, int inten)
+{
+ pcl_pattern_t *shade = 0;
+ if (inten <= 0)
+ shade = 0;
+ else if (inten <= 2)
+ shade = get_bi_pattern(pcs, 0);
+ else if (inten <= 10)
+ shade = get_bi_pattern(pcs, 1);
+ else if (inten <= 20)
+ shade = get_bi_pattern(pcs, 2);
+ else if (inten <= 35)
+ shade = get_bi_pattern(pcs, 3);
+ else if (inten <= 55)
+ shade = get_bi_pattern(pcs, 4);
+ else if (inten <= 80)
+ shade = get_bi_pattern(pcs, 5);
+ else if (inten <= 99)
+ shade = get_bi_pattern(pcs, 6);
+ return shade;
+}
+
+/*
+ * For a given index value, return the corresponding cross-hatch pattern. A
+ * null return indicates that the pattern is out of range. The caller must
+ * determine what to do in this case.
+ */
+ pcl_pattern_t *
+pcl_pattern_get_cross(pcl_state_t *pcs, int indx)
+{
+ if ((indx < 1) || (indx > 6))
+ return 0;
+ else
+ return get_bi_pattern(pcs, indx + bi_cross_offset - 1);
+}
+
+/*
+ * Return the solid uncolored pattern, to be used with rasters (see above).
+ */
+ pcl_pattern_t *
+pcl_pattern_get_solid_pattern(pcl_state_t *pcs)
+{
+ if (pcs->psolid_pattern == 0) {
+ gs_point pattern_res;
+ pcl_get_pattern_resolution(pcs, &pattern_res);
+ (void)pcl_pattern_build_pattern( &(pcs->psolid_pattern),
+ &solid_pattern_pixmap,
+ pcl_pattern_uncolored,
+ pattern_res.x,
+ pattern_res.y,
+ pcs->memory
+ );
+ pcs->psolid_pattern->ppat_data->storage = pcds_internal;
+ }
+ return pcs->psolid_pattern;
+}
+
+/*
+ * Return the "unsolid" uncolored patterns, to be used with GL/2.
+ */
+ pcl_pattern_t *
+pcl_pattern_get_unsolid_pattern(pcl_state_t *pcs)
+{
+ if (pcs->punsolid_pattern == 0) {
+ gs_point pattern_res;
+ pcl_get_pattern_resolution(pcs, &pattern_res);
+ (void)pcl_pattern_build_pattern( &(pcs->punsolid_pattern),
+ &unsolid_pattern_pixmap,
+ pcl_pattern_uncolored,
+ pattern_res.x,
+ pattern_res.y,
+ pcs->memory
+ );
+ pcs->punsolid_pattern->ppat_data->storage = pcds_internal;
+ }
+ return pcs->punsolid_pattern;
+}
+
+
diff --git a/pcl/pcbiptrn.h b/pcl/pcbiptrn.h
new file mode 100644
index 000000000..8f8c13d87
--- /dev/null
+++ b/pcl/pcbiptrn.h
@@ -0,0 +1,60 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcbiptrn.h - interface for PCL's built-in patterns */
+
+#ifndef pcbiptrn_INCLUDED
+#define pcbiptrn_INCLUDED
+
+#include "pcpatrn.h"
+
+/*
+ * Initialize the built-in pattern machinery. This routine copies "const" to
+ * "non-const" structures, to facilitate working with systems that install all
+ * initialized global data in ROM.
+ */
+void pcl_pattern_init_bi_patterns( pcl_state_t *pcs );
+
+/*
+ * Clear the renderings of the built-in patterns. This may be called during
+ * a reset to conserve memory.
+ */
+void pcl_pattern_clear_bi_patterns(pcl_state_t *pcs);
+
+/*
+ * For a given intensity value, return the corresponding shade pattern. A
+ * null return indicates that a solid pattern should be used - the caller
+ * must look at the intensity to determine if it is black or white.
+ */
+pcl_pattern_t * pcl_pattern_get_shade( pcl_state_t *pcs, int inten);
+
+/*
+ * For a given index value, return the corresponding cross-hatch pattern. A
+ * null return indicates that the pattern is out of range. The caller must
+ * determine what to do in this case.
+ */
+pcl_pattern_t * pcl_pattern_get_cross(pcl_state_t *pcs, int indx);
+
+/*
+ * Return a solid, 1 x 1 pattern for use with rasters. See the comments in
+ * pcbiptrn.c for why this is necessary.
+ */
+pcl_pattern_t * pcl_pattern_get_solid_pattern(pcl_state_t *pcs);
+
+/*
+ * Return an "unsolid", 1 x 1 pattern for use with GL/2. See the comments in
+ * pcbiptrn.c for why this is necessary.
+ */
+pcl_pattern_t * pcl_pattern_get_unsolid_pattern(pcl_state_t *pcs);
+
+#endif /* pcbiptrn_INCLUDED */
diff --git a/pcl/pccid.c b/pcl/pccid.c
new file mode 100644
index 000000000..840260d9a
--- /dev/null
+++ b/pcl/pccid.c
@@ -0,0 +1,587 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccid.c - PCL configure image data command and object implementation */
+#include "gx.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcpalet.h"
+#include "pccid.h"
+#include "plsrgb.h"
+
+
+/* CID accessors */
+pcl_cspace_type_t
+pcl_cid_get_cspace(const pcl_cid_data_t *pcid)
+{
+ return pcid->u.hdr.cspace;
+}
+
+pcl_encoding_type_t
+pcl_cid_get_encoding(const pcl_cid_data_t *pcid)
+{
+ return pcid->u.hdr.bits_per_index;
+}
+
+byte
+pcl_cid_get_bits_per_index(const pcl_cid_data_t *pcid)
+{
+ return pcid->u.hdr.bits_per_index;
+}
+
+byte
+pcl_cid_get_bits_per_primary(const pcl_cid_data_t *pcid, int index)
+{
+ return pcid->u.hdr.bits_per_primary[index];
+}
+
+
+/*
+ * Convert a 32-bit floating point number stored in HP's big-endian form
+ * into the native form required by the host processor.
+ *
+ * The non-IEEE case does not even attempt optimization, or proper handling
+ * of non-numbers (+-inf, nan); there are not enough non-IEEE processors that
+ * this code is likely to run on to make the effort worth-while.
+ */
+ static float
+make_float(
+ const byte * pbuff
+)
+{
+ union {
+ float f;
+ uint32 l;
+ } lf;
+
+ lf.l = (((uint32)pbuff[0]) << 24) + (((uint32)pbuff[1]) << 16)
+ + (((uint32)pbuff[2]) << 8) + pbuff[3];
+
+#if (ARCH_FLOATS_ARE_IEEE && (ARCH_SIZEOF_FLOAT == 4))
+ return lf.f;
+#else
+ if (lf.l == 0L)
+ return 0.0;
+ else
+ return ldexp( (double)((1L << 23) | (lf.l & ((1L << 23) - 1))),
+ (((lf.l >> 23) & 0xff) - (127 + 23))
+ )
+ * ( (lf.l & (1UL << 31)) != 0 ? -1.0 : 1.0 );
+#endif
+}
+
+/*
+ * Convert an array of 32-bit floats from the HP big-endian form into the
+ * native form required by the host processor.
+ */
+ static void
+convert_float_array(
+ int num_floats,
+ const byte * pinbuff,
+ float * poutbuff
+)
+{
+ while (num_floats-- > 0) {
+ (*poutbuff++) = make_float(pinbuff);;
+ pinbuff += 4;
+ }
+}
+
+/*
+ * Convert a 16-bit integer in HP's big-endian order into native byte order.
+ */
+ static int
+make_int16(
+ const byte * pbuff
+)
+{
+ ulong l;
+
+ l = (((ulong)pbuff[0]) << 8) + pbuff[1];
+ return (int)((int16)l);
+}
+
+/*
+ * Convert an array of 16-bit integers from HP's big-endian form to the
+ * native byte order required by the host processor.
+ */
+ static void
+convert_int16_array(
+ int num_ints,
+ const byte * pinbuff,
+ int16 * poutbuff
+)
+{
+ while(num_ints-- > 0) {
+ *poutbuff++ = make_int16(pinbuff);
+ pinbuff += 2;
+ }
+}
+
+
+/*
+ * Build the various long-form configure image data structures.
+ * Returns 0 on success, < 0 in case of an error.
+ */
+ static int
+build_cid_dev_long(
+ pcl_cid_data_t * pcid,
+ const byte * pbuff
+)
+{
+ pcl_cid_dev_long_t * pdev = &(pcid->u.dev);
+
+ if (pcid->len != 18)
+ return e_Range;
+ convert_int16_array(3, pbuff + 6, pdev->white_ref);
+ convert_int16_array(3, pbuff + 12, pdev->black_ref);
+ return 0;
+}
+
+/* The documentation is not clear if these are specified 0..255 or 0..1
+ all cid long examples in the ats tests use 0..255. We use 0..1 for
+ the short form */
+static void
+normalize_cid_minmax_valrange_long(float *minmax)
+{
+ int i;
+ for ( i = 0; i < 6; i++ ) {
+ minmax[i] /= 255;
+ }
+}
+
+ static int
+build_cid_col_long(
+ pcl_cid_data_t * pcid,
+ const byte * pbuff
+)
+{
+ pcl_cid_col_long_t * pcol = &(pcid->u.col);
+
+ if (pcid->len != 86)
+ return e_Range;
+ convert_float_array(8, pbuff + 6, (float *)(pcol->colmet.chroma));
+ convert_float_array(6, pbuff + 38, (float *)(pcol->colmet.nonlin));
+ convert_float_array(6, pbuff + 62, (float *)(pcol->minmax.val_range));
+ normalize_cid_minmax_valrange_long((float *)(pcol->minmax.val_range));
+ return 0;
+}
+
+ static int
+build_cid_lab_long(
+ pcl_cid_data_t * pcid,
+ const byte * pbuff
+)
+{
+ pcl_cid_Lab_long_t * plab = &(pcid->u.lab);
+
+ if (pcid->len != 30)
+ return e_Range;
+ convert_float_array(6, pbuff + 6, (float *)(plab->minmax.val_range));
+ return 0;
+}
+
+ static int
+build_cid_lum_long(
+ pcl_cid_data_t * pcid,
+ const byte * pbuff
+)
+{
+ pcl_cid_lum_long_t * plum = &(pcid->u.lum);
+
+ if (pcid->len != 122)
+ return e_Range;
+ convert_float_array(9, pbuff + 6, plum->matrix);
+ convert_float_array(6, pbuff + 42, (float *)(plum->minmax.val_range));
+ convert_float_array(8, pbuff + 66, (float *)(plum->colmet.chroma));
+ convert_float_array(6, pbuff + 98, (float *)(plum->colmet.nonlin));
+ return 0;
+}
+
+static int (*const build_cid_longform[])( pcl_cid_data_t *, const byte * ) = {
+ build_cid_dev_long, /* pcl_cspace_RGB */
+ build_cid_dev_long, /* pcl_cspace_CMY */
+ build_cid_col_long, /* pcl_cspace_Colorimetric */
+ build_cid_lab_long, /* pcl_cspace_CIELab */
+ build_cid_lum_long /* pcl_cspace_LumChrom */
+};
+
+/*
+ * Check the configure image data short form structure.
+ *
+ * Because of the #%&&!!! confounded idiocy of causing e_Range to be ignored in
+ * the parser by seeting it to be a non-error (0), we must use literal -1 here
+ * to indicate that a palette is not acceptable.
+ *
+ * Returns 0 on success, < 0 in case of an error.
+ */
+ static int
+check_cid_hdr(
+ pcl_state_t *pcs,
+ pcl_cid_hdr_t * pcid
+)
+{
+ int i;
+
+ if ((pcid->cspace >= pcl_cspace_num) || (pcid->encoding >= pcl_penc_num))
+ return -1;
+
+ /* apparently direct by pixel encoding mode defaults bits per
+ index to 8 */
+ if (pcid->encoding == pcl_penc_direct_by_pixel)
+ pcid->bits_per_index = 8;
+
+
+ /*
+ * Map zero values. Zero bits per index is equivalent to one bit per index;
+ * zero bits per primary is equivalent to 8 bits per primary.
+ */
+ if (pcid->bits_per_index == 0)
+ pcid->bits_per_index = 1;
+ for (i = 0; i < countof(pcid->bits_per_primary); i++) {
+ if (pcid->bits_per_primary[i] == 0)
+ pcid->bits_per_primary[i] = 8;
+ if ( pcs->personality == pcl5e && pcid->bits_per_primary[i] != 1 )
+ dprintf("pcl5e personality with color primaries\n" );
+ }
+
+
+
+ switch (pcid->encoding) {
+
+ case pcl_penc_indexed_by_pixel:
+ if ((pcid->bits_per_index & (pcid->bits_per_index - 1)) != 0)
+ return -1;
+ /* fall through */
+
+ case pcl_penc_indexed_by_plane:
+ if (pcid->bits_per_index > 8)
+ return -1;
+ break;
+
+ case pcl_penc_direct_by_plane:
+ /* must be device-specific color space */
+ if ((pcid->cspace != pcl_cspace_RGB) && (pcid->cspace != pcl_cspace_CMY))
+ return -1;
+ if ( (pcid->bits_per_primary[0] != 1) ||
+ (pcid->bits_per_primary[1] != 1) ||
+ (pcid->bits_per_primary[2] != 1) )
+ return -1;
+ break;
+
+ case pcl_penc_direct_by_pixel:
+ if ( (pcid->bits_per_primary[0] != 8) ||
+ (pcid->bits_per_primary[1] != 8) ||
+ (pcid->bits_per_primary[2] != 8) )
+ return -1;
+ break;
+ }
+
+ /*
+ * Strange HP-ism: for device independent color spaces, bits per primary
+ * is always 8. For the direct by plane/pixel cases, this will already be
+ * the case, but the indexed by pixel/plane cases may require modification.
+ */
+ if ( (pcid->encoding < pcl_penc_direct_by_plane) &&
+ (pcid->cspace > pcl_cspace_CMY) ) {
+ pcid->bits_per_primary[0] = 8;
+ pcid->bits_per_primary[1] = 8;
+ pcid->bits_per_primary[2] = 8;
+ }
+
+ /* if the device handles color conversion remap the colorimetric color space to rgb */
+ if (pl_device_does_color_conversion() && pcid->cspace == pcl_cspace_Colorimetric)
+ pcid->cspace = pcl_cspace_RGB;
+
+ return 0;
+}
+
+static int
+substitute_colorimetric_cs(
+ pcl_state_t *pcs,
+ pcl_cid_data_t *pcid
+)
+{
+ pcl_cid_col_long_t * pcol = &(pcid->u.col);
+ /* it might be desirable to make these partameters for the
+ substitute color space configurable for now they are set here
+ to reasonable values */
+ floatp gamma = 2.2;
+ floatp gain = 1.0;
+ floatp min1 = 0.0;
+ floatp min2 = 0.0;
+ floatp min3 = 0.0;
+ floatp max1 = 1.0;
+ floatp max2 = 1.0;
+ floatp max3 = 1.0;
+ /* just override the color space we use the other header values
+ from the old device dependent color space */
+ pcid->original_cspace = pcid->u.hdr.cspace;
+ pcid->u.hdr.cspace = pcl_cspace_Colorimetric;
+ pcid->len = 122;
+
+ pcol->colmet.nonlin[0].gamma = gamma; pcol->colmet.nonlin[0].gain = gain;
+ pcol->colmet.nonlin[1].gamma = gamma; pcol->colmet.nonlin[1].gain = gain;
+ pcol->colmet.nonlin[2].gamma = gamma; pcol->colmet.nonlin[2].gain = gain;
+
+ pcol->minmax.val_range[0].min_val = min1;
+ pcol->minmax.val_range[1].min_val = min2;
+ pcol->minmax.val_range[2].min_val = min3;
+
+ pcol->minmax.val_range[0].max_val = max1;
+ pcol->minmax.val_range[1].max_val = max2;
+ pcol->minmax.val_range[2].max_val = max3;
+
+ /* reasonable chroma values... These could be paramaterized as well. */
+ pcol->colmet.chroma[0].x = 0.640; pcol->colmet.chroma[0].y = 0.340; /* red */
+ pcol->colmet.chroma[1].x = 0.310; pcol->colmet.chroma[1].y = 0.595; /* green */
+ pcol->colmet.chroma[2].x = 0.155; pcol->colmet.chroma[2].y = 0.070; /* blue */
+ pcol->colmet.chroma[3].x = 0.313; pcol->colmet.chroma[3].y = 0.329; /* white */
+ return 0;
+}
+
+/*
+ * Construct a configure image data object, and use it to overwrite the current
+ * active palette.
+ *
+ * Returns 0 if successful, < 0 in case of error.
+ */
+ static int
+install_cid_data(
+ int len, /* length of data */
+ const byte * pbuff, /* the data provided with command */
+ pcl_state_t * pcs, /* current state */
+ bool fixed, /* from set simple color mode */
+ bool gl2 /* from IN command in GL/2 */
+)
+{
+ pcl_cid_data_t cid;
+ int code = 0;
+
+ if ( len < 6 )
+ return e_Range;
+ cid.len = len;
+ memcpy(&(cid.u.hdr), pbuff, sizeof(pcl_cid_hdr_t));
+ /* check the header this will also make corrections if possible */
+ code = check_cid_hdr(pcs, &(cid.u.hdr));
+ if (code >= 0) {
+ /* check if we should substitute colometric for a device color space */
+ if ( (pcl_cid_get_cspace(&cid) >= pcl_cspace_RGB) &&
+ (pcl_cid_get_cspace(&cid) <= pcl_cspace_CMY) &&
+ pcs->useciecolor )
+ code = substitute_colorimetric_cs(pcs, &cid);
+ else {
+ cid.original_cspace = pcl_cspace_num;
+ if (len > 6)
+ code = build_cid_longform[pbuff[0]](&cid, pbuff);
+ }
+ }
+ if (code < 0) {
+ if (code == -1)
+ code = e_Range;
+ return code;
+ } else
+ return pcl_palette_set_cid(pcs, &cid, fixed, gl2);
+}
+
+/*
+ * Build a "simple color mode" pcl_cid_data_t structure, and use it to
+ * overwrite the current palette. This routine is separated out because it
+ * is required by both the simple color space command and the reset code.
+ */
+ static int
+set_simple_color_mode(
+ int type,
+ pcl_state_t * pcs
+)
+{
+ static const byte cid_K[6] = { (byte)pcl_cspace_RGB,
+ (byte)pcl_penc_indexed_by_plane,
+ 1, 1, 1, 1 };
+ static const byte cid_CMY[6] = { (byte)pcl_cspace_CMY,
+ (byte)pcl_penc_indexed_by_plane,
+ 3, 1, 1, 1 };
+ static const byte cid_RGB[6] = { (byte)pcl_cspace_RGB,
+ (byte)pcl_penc_indexed_by_plane,
+ 3, 1, 1, 1 };
+ const byte * pbuff = 0;
+
+ if (type == 1)
+ pbuff = cid_K;
+ else if (type == 3)
+ pbuff = cid_RGB;
+ else if (type == -3)
+ pbuff = cid_CMY;
+ else
+ return e_Range;
+
+ /* install the new color space */
+ return install_cid_data(6, pbuff, pcs, true, false);
+}
+
+
+/*
+ * ESC * v <nbytes> W
+ *
+ * This command creates only the basic element of the the palette: the cid_data
+ * array. Other parts are created as needed.
+ */
+ static int
+pcl_configure_image_data(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+ return install_cid_data( uint_arg(pargs),
+ arg_data(pargs),
+ pcs,
+ false,
+ false
+ );
+}
+
+/*
+ * ESC * r <code> U
+ *
+ * Simple color space command. Note that all the simple color spaces are
+ * variations of the RGB/CMY device-specific color space.
+ */
+ static int
+pcl_simple_color_space(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+ return set_simple_color_mode(int_arg(pargs), pcs);
+}
+
+/*
+ * ESC * i <nbytes> W
+ *
+ * Set viewing illuminant. This command is related to the configure image
+ * data object only in the sense that both apply to palettes. The command
+ * is implemented in this file as it is the only other command that involves
+ * binary floating point number arrays.
+ *
+ * This routine will convert the whitepoint to the form anticipated by the
+ * gs_cie_render structure (i.e., Y = 1.0).
+ */
+ static int
+set_view_illuminant(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint len = uint_arg(pargs);
+ const byte * pbuff = arg_data(pargs);
+ float x, y;
+ gs_vector3 wht_pt;
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ if (len != 8)
+ return e_Range;
+ x = make_float(pbuff);
+ y = make_float(pbuff + 4);
+
+ /*
+ * A white point must have a non-zero y value, as otherwise it carries
+ * no chromaticity infomration. It should also have x >= 0, y > 0, and
+ * x + y <= 1, for otherwise it represents an unrealizable color.
+ */
+ if ((x < 0.0) || (y <= 0.0) || (x + y > 1.0))
+ return e_Range;
+
+ wht_pt.u = x / y;
+ wht_pt.v = 1.0;
+ wht_pt.w = (1.0 - x - y) / y;
+
+ return pcl_palette_set_view_illuminant(pcs, &wht_pt);
+}
+
+/*
+ * The following procedure supports the GL/2 "IN" command. It would be better
+ * implemented via a reset flag, but at the moment there are no reset flags
+ * that propagate out of GL/2.
+ *
+ * Returns 0 on success, < 0 in case of an error.
+ */
+ int
+pcl_cid_IN(
+ pcl_state_t * pcs
+)
+{
+ static const byte cid_GL2_Color[6] = { (byte)pcl_cspace_RGB,
+ (byte)pcl_penc_indexed_by_plane,
+ 3, 8, 8, 8 };
+
+ static const byte cid_GL2_Mono[6] = { (byte)pcl_cspace_RGB,
+ (byte)pcl_penc_indexed_by_plane,
+ 3, 1, 1, 1 };
+
+ return install_cid_data(6,
+ pcs->personality == pcl5e ? cid_GL2_Mono : cid_GL2_Color,
+ pcs, false, true);
+}
+
+/*
+ * There is no copy code required for this module, as any copying that is
+ * required is performed at the palette level. Similarly, there is no reset
+ * code, as reset is handled at the palette level.
+ */
+ static int
+pcl_cid_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'v', 'W',
+ PCL_COMMAND("Configure Image Data", pcl_configure_image_data, pca_bytes | pca_in_rtl | pca_raster_graphics)
+ },
+ {
+ 'r', 'U',
+ PCL_COMMAND("Simple Color Mode", pcl_simple_color_space, pca_neg_ok | pca_in_rtl | pca_raster_graphics)
+ },
+ {
+ 'i', 'W',
+ PCL_COMMAND("Set Viewing Illuminant", set_view_illuminant, pca_bytes | pca_in_rtl | pca_raster_graphics)
+ },
+ END_CLASS
+ return 0;
+}
+
+static void
+pcl_cid_do_reset(pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = (pcl_reset_initial |
+ pcl_reset_cold |
+ pcl_reset_printer);
+
+ if ( (type & mask) != 0 ) {
+ pcs->useciecolor = !pjl_proc_compare(pcs->pjls,
+ pjl_proc_get_envvar(pcs->pjls, "useciecolor"), "on");
+ }
+}
+
+const pcl_init_t pcl_cid_init = { pcl_cid_do_registration, pcl_cid_do_reset, 0 };
diff --git a/pcl/pccid.h b/pcl/pccid.h
new file mode 100644
index 000000000..2837f5827
--- /dev/null
+++ b/pcl/pccid.h
@@ -0,0 +1,168 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+#ifndef pccid_INCLUDED
+#define pccid_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "pcommand.h"
+
+typedef short int16;
+typedef unsigned short uint16;
+
+/*
+ * Enumeration of the 5c color spaces.
+ *
+ * Note that there is no separate monochrome color space; the monochrome
+ * simple color space is simply an RGB color space with a two-entry palette
+ * (1-bit/index) containing white (0) and black (1).
+ *
+ * These values are defined by HP.
+ */
+typedef enum {
+ pcl_cspace_White = -1,
+ pcl_cspace_RGB = 0,
+ pcl_cspace_CMY = 1,
+ pcl_cspace_Colorimetric = 2,
+ pcl_cspace_CIELab = 3,
+ pcl_cspace_LumChrom = 4,
+ pcl_cspace_num
+} pcl_cspace_type_t;
+
+/*
+ * The pixel encoding enumeration.
+ *
+ * These values are defined by HP.
+ */
+typedef enum {
+ pcl_penc_indexed_by_plane = 0,
+ pcl_penc_indexed_by_pixel = 1,
+ pcl_penc_direct_by_plane = 2,
+ pcl_penc_direct_by_pixel = 3,
+ pcl_penc_num
+} pcl_encoding_type_t;
+
+/*
+ * The short form and various long-form configure image data structures.
+ * Though the long form structures are similar to those defined by HP,
+ * only pcl_cid_shortform is the same (the others must be different to
+ * support alignment-sensitive processors).
+ *
+ * A GC memory descriptor is provided for pcl_cid_data_t object, though
+ * it should seldom be used: the configure image data information is needed
+ * only fleetingly while an indexed color space is created. Beyond that only
+ * the header (short form) is needed, and this is so small it can be copied
+ * into any objects that require it.
+ *
+ * NB: For the long form luminance-chrominance case, rows and columns of
+ * of the RGB ==> LumChrom transformation matrix must be transposed,
+ * to go from the column-vector view of HP to row-vector view used
+ * by the pc_mtx3_t data structure and the graphics library. The column
+ * vector form is stored in the matrix field of the pcl_cid_lum_chrom_t
+ * structure.
+ */
+#define pcl_cid_hdr_common \
+ byte cspace; /* actually pcl_cspace_type_t */ \
+ byte encoding; /* actually pcl_encoding_type_t */ \
+ byte bits_per_index; \
+ byte bits_per_primary[3]
+
+typedef struct pcl_cid_hdr_s {
+ pcl_cid_hdr_common;
+} pcl_cid_hdr_t;
+
+typedef struct pcl_cid_dev_long_s {
+ pcl_cid_hdr_common;
+ int16 white_ref[3];
+ int16 black_ref[3];
+} pcl_cid_dev_long_t;
+
+typedef struct pcl_cid_minmax_s {
+ struct {
+ float min_val, max_val;
+ } val_range[3];
+} pcl_cid_minmax_t;
+
+typedef struct pcl_cid_col_common_s {
+ struct {
+ float x, y;
+ } chroma[4];
+ struct {
+ float gamma, gain;
+ } nonlin[3];
+} pcl_cid_col_common_t;
+
+typedef struct pcl_cid_col_long_s {
+ pcl_cid_hdr_common;
+ pcl_cid_col_common_t colmet;
+ pcl_cid_minmax_t minmax;
+} pcl_cid_col_long_t;
+
+typedef struct pcl_cid_Lab_long_s {
+ pcl_cid_hdr_common;
+ pcl_cid_minmax_t minmax;
+} pcl_cid_Lab_long_t;
+
+typedef struct pcl_cid_lum_long_s {
+ pcl_cid_hdr_common;
+ float matrix[9];
+ pcl_cid_minmax_t minmax;
+ pcl_cid_col_common_t colmet;
+} pcl_cid_lum_long_t;
+
+/*
+ * The unified PCL configure image data structure.
+ */
+typedef struct pcl_cid_data_s {
+ uint16 len;
+ byte original_cspace; /* the original color space if a substitution has occurred */
+ union {
+ pcl_cid_hdr_t hdr;
+ pcl_cid_dev_long_t dev;
+ pcl_cid_col_long_t col;
+ pcl_cid_Lab_long_t lab;
+ pcl_cid_lum_long_t lum;
+ } u;
+} pcl_cid_data_t;
+
+#define private_st_cid_data_t() \
+ gs_private_st_simple( st_cid_data, \
+ pcl_cid_data_t, \
+ "pcl_cid_data_t" \
+ )
+
+/*
+ * Functions for getting configuration parameters from the first six bytes of
+ * the configure image data structure.
+ */
+pcl_cspace_type_t pcl_cid_get_cspace(const pcl_cid_data_t *pcid);
+
+pcl_encoding_type_t pcl_cid_get_encoding(const pcl_cid_data_t *pcid);
+
+byte pcl_cid_get_bits_per_index(const pcl_cid_data_t *pcid);
+
+byte pcl_cid_get_bits_per_primary(const pcl_cid_data_t *pcid, int index);
+
+/*
+ * Implement the GL/2 IN command. This is probably better done via a reset flag,
+ * but currently there are no reset flags that propagate out of GL/2.
+ */
+int pcl_cid_IN(pcl_state_t * pcs);
+
+/*
+ * Entry point for the configure image data code.
+ */
+extern const pcl_init_t pcl_cid_init;
+
+#endif /* pccid_INCLUDED */
diff --git a/pcl/pccolor.c b/pcl/pccolor.c
new file mode 100644
index 000000000..52c651cf2
--- /dev/null
+++ b/pcl/pccolor.c
@@ -0,0 +1,181 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccolor.c - commands to add colors to a PCL palette */
+#include "std.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcpalet.h"
+
+/*
+ * Prior to being assigned into a palette, the PCL color component values are
+ * simple globals; they are not saved and restored with the PCL state.
+ *
+ * This implies that color components may not be converted until the set
+ * color index command is executed, as it is not possible to predict for
+ * which palette they will be used.
+ *
+ * NB: contrary to the documentation, all of the set color component commands
+ * and the assign color index command are allowed but ignored in graphics
+ * mode (i.e.: they do NOT end graphics mode, as one would expect from the
+ * documentation).
+ */
+
+/*
+ * ESC * v <cc> A
+ */
+ static int
+set_color_comp_1(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e )
+ return 0;
+ if (!pcs->raster_state.graphics_mode)
+ pcs->color_comps[0] = float_arg(pargs);
+ return 0;
+}
+
+/*
+ * ESC * v <cc> B
+ */
+ static int
+set_color_comp_2(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e )
+ return 0;
+ if (!pcs->raster_state.graphics_mode)
+ pcs->color_comps[1] = float_arg(pargs);
+ return 0;
+}
+
+/*
+ * ESC * v <cc> C
+ */
+ static int
+set_color_comp_3(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e )
+ return 0;
+ if (!pcs->raster_state.graphics_mode)
+ pcs->color_comps[2] = float_arg(pargs);
+ return 0;
+}
+
+/*
+ * ESC * v <indx> I
+ *
+ * Set a color into the active palette.
+ *
+ * This implementation matches HP's documentation, in that out-of-range indices
+ * will not affect the palette, but will reset the color component registers.
+ * This matches the behavior of the HP Color Laser Jet 5/5M, but not that of
+ * the HP DeskJet 1600C/CM. For the latter, negative indices are ignored and
+ * the color component registers are NOT cleared, while positive indices are
+ * interpreted modulo the palette size.
+ */
+ static int
+assign_color_index(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int indx = int_arg(pargs);
+
+ if ( pcs->personality == pcl5e )
+ return 0;
+ if (!pcs->raster_state.graphics_mode) {
+ if ((indx >= 0) && (indx < pcl_palette_get_num_entries(pcs->ppalet)))
+ pcl_palette_set_color(pcs, indx, pcs->color_comps);
+ pcs->color_comps[0] = 0.0;
+ pcs->color_comps[1] = 0.0;
+ pcs->color_comps[2] = 0.0;
+ }
+ return 0;
+}
+
+/*
+ * Initialization
+ */
+ static int
+color_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ /* Register commands */
+ DEFINE_CLASS('*')
+ {
+ 'v', 'A',
+ PCL_COMMAND( "Color Component 1",
+ set_color_comp_1,
+ pca_neg_ok | pca_big_error | pca_raster_graphics | pca_in_rtl
+ )
+ },
+ {
+ 'v', 'B',
+ PCL_COMMAND( "Color Component 2",
+ set_color_comp_2,
+ pca_neg_ok | pca_big_error | pca_raster_graphics | pca_in_rtl
+ )
+ },
+ {
+ 'v', 'C',
+ PCL_COMMAND( "Color Component 3",
+ set_color_comp_3,
+ pca_neg_ok | pca_big_error | pca_raster_graphics | pca_in_rtl
+ )
+ },
+ {
+ 'v', 'I',
+ PCL_COMMAND( "Assign Color Index",
+ assign_color_index,
+ pca_neg_ok | pca_big_ignore | pca_raster_graphics | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+/*
+ * Handle the various forms of reset.
+ */
+ static void
+color_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_cold
+ | pcl_reset_printer );
+
+ if ((type & mask) != 0) {
+ pcs->color_comps[0] = 0.0;
+ pcs->color_comps[1] = 0.0;
+ pcs->color_comps[2] = 0.0;
+ }
+}
+
+/*
+ * There is no copy operation for this module, as the color components are
+ * just globals.
+ */
+const pcl_init_t pcl_color_init = { color_do_registration, color_do_reset, 0 };
diff --git a/pcl/pccoord.h b/pcl/pccoord.h
new file mode 100644
index 000000000..95bdf745f
--- /dev/null
+++ b/pcl/pccoord.h
@@ -0,0 +1,37 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccoord.h - centipoint coordinate structures for PCL */
+
+#ifndef pccoord_INCLUDED
+#define pccoord_INCLUDED
+
+/*
+ * Following the PCL documentation, we represent coordinates internally in
+ * centipoints (1/7200").
+ */
+#if arch_sizeof_int == 2
+typedef long coord;
+#else
+typedef int coord;
+#endif
+
+#define pcl_coord_scale 7200
+#define inch2coord(v) ((coord)((v) * (coord)pcl_coord_scale))
+#define coord2inch(c) ((c) / (float)pcl_coord_scale)
+
+typedef struct coord_point_s {
+ coord x, y;
+} coord_point_t;
+
+#endif /* pccoord_INCLUDED */
diff --git a/pcl/pccprint.c b/pcl/pccprint.c
new file mode 100644
index 000000000..c37e71645
--- /dev/null
+++ b/pcl/pccprint.c
@@ -0,0 +1,116 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccprint.c - PCL5c print model commands */
+
+#include "std.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcfont.h"
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsstate.h"
+#include "gsrop.h"
+
+/*
+ * ESC * l <rop> O
+ *
+ * Set logical operation.
+ */
+ static int
+pcl_logical_operation(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint rop = uint_arg(pargs);
+
+ if (pcs->raster_state.graphics_mode)
+ return 0;
+ if (rop > 255)
+ return e_Range;
+
+ pcl_break_underline(pcs); /* use the 5c convention; in 5e, the
+ * underline is not broken by a change in
+ * the logical operation */
+ pcs->logical_op = rop;
+ return 0;
+}
+
+/*
+ * ESC * l <bool> R
+ *
+ * Set prixel placement. Note that this feature is not yet properly
+ * implemented.
+ */
+ static int
+pcl_pixel_placement(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ if (pcs->raster_state.graphics_mode)
+ return 0;
+ if (i > 1)
+ return 0;
+ pcs->pp_mode = i;
+ return 0;
+}
+
+/*
+ * Initialization
+ */
+ static int
+pccprint_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ /* Register commands */
+ DEFINE_CLASS('*')
+ {
+ 'l', 'O',
+ PCL_COMMAND( "Logical Operation",
+ pcl_logical_operation,
+ pca_neg_ok | pca_big_error | pca_in_rtl | pca_raster_graphics
+ )
+ },
+ {
+ 'l', 'R',
+ PCL_COMMAND( "Pixel Placement",
+ pcl_pixel_placement,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl | pca_raster_graphics
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+ static void
+pccprint_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_printer
+ | pcl_reset_overlay );
+
+ if ((type & mask) != 0) {
+ pcs->logical_op = 252;
+ pcs->pp_mode = 0;
+ }
+}
+
+const pcl_init_t pccprint_init = { pccprint_do_registration, pccprint_do_reset, 0 };
diff --git a/pcl/pccrd.c b/pcl/pccrd.c
new file mode 100644
index 000000000..019cb160d
--- /dev/null
+++ b/pcl/pccrd.c
@@ -0,0 +1,352 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccrd.c - PCL interface to the graphic library color rendering dictionary */
+#include "string_.h"
+#include "gx.h"
+#include "gsmatrix.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gsparam.h"
+#include "gsdevice.h"
+#include "gscspace.h"
+#include "gscolor2.h"
+#include "gscie.h"
+#include "gscrd.h"
+#include "gscrdp.h"
+#include "pcommand.h"
+#include "pccrd.h"
+
+/* GC routines */
+private_st_crd_t();
+
+/*
+ * The default color rendering information. This works for a monitor that
+ * uses linear SMPTE-C phosphors. This is almost certainly not the case for
+ * any actual printing device, but the approximation will do for now.
+ *
+ * The following parameters are left at their graphic-library default values:
+ *
+ * BlackPoint
+ * MatrixPQR
+ * RangePQR
+ * EncodeLMN
+ * RangeLMN
+ * MatrixABC
+ * EncodeABC
+ * RangeABC
+ * RenderTable
+ *
+ */
+static const gs_vector3 dflt_WhitePoint = { 0.95, 1.0, 1.09 };
+static const gs_range3 dflt_RangePQR = {{ {0, 1}, {0, 1}, {0, 1.09} }};
+static const gs_matrix3 dflt_MatrixLMN = { { 3.51, -1.07, 0.06 },
+ { -1.74, 1.98, -0.20 },
+ { -0.54, 0.04, 1.05 },
+ false };
+
+/*
+ * The TransformPQR structure.
+ *
+ * Unlike the earlier impelementations, there is now just a single procedure,
+ * which accepts the the component index as an operand. Rather than returning
+ * the mapped value, the location pointed to by pnew_val is used to hold the
+ * result and a success (0) or error (< 0) indication is returned.
+ */
+ static int
+dflt_TransformPQR_proc(
+ int cmp_indx,
+ floatp val,
+ const gs_cie_wbsd * cs_wbsd,
+ gs_cie_render * pcrd,
+ float * pnew_val
+)
+{
+ const float * pcrd_wht = (float *)&(cs_wbsd->wd.pqr);
+ const float * pcs_wht = (float *)&(cs_wbsd->ws.pqr);
+
+ *pnew_val = val * pcrd_wht[cmp_indx] / pcs_wht[cmp_indx];
+ return 0;
+}
+
+static const gs_cie_transform_proc3 dflt_TransformPQR_proto = {
+ dflt_TransformPQR_proc,
+ NULL,
+ { NULL, 0 },
+ NULL
+};
+
+/*
+ * Free a PCL color rendering dictionary structure.
+ */
+void
+free_crd(
+ gs_memory_t * pmem,
+ void * pvcrd,
+ client_name_t cname
+)
+{
+ pcl_crd_t * pcrd = (pcl_crd_t *)pvcrd;
+
+ if (pcrd->pgscrd != 0)
+ rc_decrement(pcrd->pgscrd, cname);
+ gs_free_object(pmem, pvcrd, cname);
+}
+
+/*
+ * Allocate a PCL color rendering dictionary structure.
+ */
+ static int
+alloc_crd(
+ pcl_crd_t ** ppcrd,
+ gs_memory_t * pmem
+)
+{
+ pcl_crd_t * pcrd = 0;
+ int code = 0;
+
+ rc_alloc_struct_1( pcrd,
+ pcl_crd_t,
+ &st_crd_t,
+ pmem,
+ return e_Memory,
+ "pcl allocate CRD"
+ );
+ pcrd->rc.free = free_crd;
+ pcrd->is_dflt_illum = true;
+ pcrd->pgscrd = 0;
+
+ code = gs_cie_render1_build(&(pcrd->pgscrd), pmem, "pcl allocate CRD");
+ if (code >= 0)
+ *ppcrd = pcrd;
+ else
+ free_crd(pmem, pcrd, "pcl allocate CRD");
+ return code;
+}
+
+#ifdef READ_DEVICE_CRD
+/*
+ * See if the default CRD is specified by the device.
+ *
+ * To simplify selection of more than one default CRD, this code allows more
+ * than one CRD to be included in the parameters associated with a device,
+ * and uses the device parameter "CRDName" to select the one that is to be
+ * used as a default.
+ *
+ * Returns
+ */
+ static bool
+read_device_CRD(
+ pcl_crd_t * pcrd,
+ pcl_state_t * pcs
+)
+{
+ gx_device * pdev = gs_currentdevice(pcs->pgs);
+ gs_c_param_list list;
+ gs_param_string dstring;
+ char nbuff[64]; /* ample size */
+ int code = 0;
+
+ /*get the CRDName parameter from the device */
+ gs_c_param_list_write(&list, pcs->memory);
+ if (param_request((gs_param_list *)&list, "CRDName") < 0)
+ return false;
+
+ if ((code = gs_getdeviceparams(pdev, (gs_param_list *)&list)) >= 0) {
+ gs_c_param_list_read(&list);
+ if ( (code = param_read_string( (gs_param_list *)&list,
+ "CRDName",
+ &dstring
+ )) == 0 ) {
+ if (dstring.size > sizeof(nbuff) - 1)
+ code = 1;
+ else {
+ strncpy(nbuff, (char *)dstring.data, dstring.size);
+ nbuff[dstring.size] = '\0';
+ }
+ }
+ }
+ gs_c_param_list_release(&list);
+ if (code != 0)
+ return false;
+
+ gs_c_param_list_write(&list, pcs->memory);
+ if (param_request((gs_param_list *)&list, nbuff) < 0)
+ return false;
+ if ((code = gs_getdeviceparams(pdev, (gs_param_list *)&list)) >= 0) {
+ gs_param_dict dict;
+
+ gs_c_param_list_read(&list);
+ if ( (code = param_begin_read_dict( (gs_param_list *)&list,
+ nbuff,
+ &dict,
+ false
+ )) == 0 ) {
+ code = param_get_cie_render1(pcrd->pgscrd, dict.list, pdev);
+ param_end_read_dict((gs_param_list *)&list, nbuff, &dict);
+ if (code > 0)
+ code = 0;
+ }
+ }
+ gs_c_param_list_release(&list);
+ return (code == 0);
+}
+#endif
+
+/*
+ * Build the default color rendering dictionary.
+ *
+ * This routine should be called only once, and then only when there is no
+ * current CRD.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_crd_build_default_crd(
+ pcl_state_t * pcs
+)
+{
+ pcl_crd_t * pcrd = pcs->pcl_default_crd;
+ int code = 0;
+
+ /* must not be a current CRD */
+ if (pcrd != 0)
+ return e_Range;
+
+ /* allocate the CRD structure */
+ if ((code = alloc_crd(&pcrd, pcs->memory)) < 0)
+ return code;
+ pcs->pcl_default_crd = pcrd;
+
+ pcs->dflt_TransformPQR = dflt_TransformPQR_proto;
+ return gs_cie_render1_initialize( pcs->memory,
+ pcrd->pgscrd,
+ NULL,
+ &dflt_WhitePoint,
+ NULL,
+ NULL,
+ &dflt_RangePQR,
+ &pcs->dflt_TransformPQR,
+ &dflt_MatrixLMN,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ );
+
+}
+
+/*
+ * Set the viewing illuminant.
+ *
+ * Though this code goes through the motions of an "unshare" operation, it
+ * will almost always allocate a new structure, as the CRD will be referred
+ * to both by the palette and the graphic state.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_crd_set_view_illuminant(
+ pcl_state_t * pcs,
+ pcl_crd_t ** ppcrd,
+ const gs_vector3 * pwht_pt
+)
+{
+ pcl_crd_t * pcrd = *ppcrd;
+ pcl_crd_t * pold = pcrd;
+ int code = 0;
+
+ if (pcrd->rc.ref_count > 1) {
+ if ((code = alloc_crd(ppcrd, pcrd->rc.memory)) < 0)
+ return code;
+ pcrd = *ppcrd;
+ }
+ pcrd->is_dflt_illum = false;
+
+ /* if no previous CRD, use the default settings */
+ if (pold == 0) {
+ pcs->dflt_TransformPQR = dflt_TransformPQR_proto;
+ return gs_cie_render1_initialize( pcs->memory,
+ pcrd->pgscrd,
+ NULL,
+ pwht_pt,
+ NULL,
+ NULL,
+ NULL,
+ &pcs->dflt_TransformPQR,
+ &dflt_MatrixLMN,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ );
+ }
+ code = gs_cie_render1_init_from( pcs->memory,
+ pcrd->pgscrd,
+ NULL, /* for now */
+ pold->pgscrd,
+ pwht_pt,
+ &(pold->pgscrd->points.BlackPoint),
+ &(pold->pgscrd->MatrixPQR),
+ &(pold->pgscrd->RangePQR),
+ &(pold->pgscrd->TransformPQR),
+ &(pold->pgscrd->MatrixLMN),
+ &(pold->pgscrd->EncodeLMN),
+ &(pold->pgscrd->RangeLMN),
+ &(pold->pgscrd->MatrixABC),
+ &(pold->pgscrd->EncodeABC),
+ &(pold->pgscrd->RangeABC),
+ &(pold->pgscrd->RenderTable)
+ );
+
+ if (pcrd != pold)
+ rc_decrement(pold, "pcl set viewing illuminant");
+ return code;
+}
+
+/*
+ * Set a color rendering dictionary into the graphic state. If the rendering
+ * dictionary does not yet exist, create a default color rendering dictionary.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_crd_set_crd(
+ pcl_crd_t ** ppcrd,
+ pcl_state_t * pcs
+)
+{
+ pcl_crd_t * pcrd = *ppcrd;
+ int code = 0;
+
+ if (pcrd == 0) {
+ if ( (pcs->pcl_default_crd == 0) &&
+ ((code = pcl_crd_build_default_crd(pcs)) < 0) )
+ return code;
+ pcrd = pcs->pcl_default_crd;
+ pcl_crd_init_from(*ppcrd, pcrd);
+ }
+
+ /* see if there is anything to do */
+ if (pcs->pids->pcrd == pcrd)
+ return 0;
+
+ if ((code = gs_setcolorrendering(pcs->pgs, pcrd->pgscrd)) >= 0)
+ pcl_crd_copy_from(pcs->pids->pcrd, pcrd);
+ return code;
+}
diff --git a/pcl/pccrd.h b/pcl/pccrd.h
new file mode 100644
index 000000000..9c922d8d5
--- /dev/null
+++ b/pcl/pccrd.h
@@ -0,0 +1,137 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccrd.h - PCL interface to color rendering dictionaries */
+
+#ifndef pccrd_INCLUDED
+#define pccrd_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gsmatrix.h"
+#include "gscspace.h"
+#include "gscolor2.h"
+#include "gscie.h"
+#include "gscrd.h"
+#include "pcident.h"
+#include "pcstate.h"
+
+/*
+ * In PCL, color rendering dictionaries are set by the device, but the
+ * default white point is specified by the language, and the white point
+ * may be modified by the language via the "View Illuminant" command.
+ *
+ * Though trivial in principle, this arrangement is a bit awkward for the
+ * graphic library as there is no make-unique functionality provided
+ * for color rendering dictionaries (none is necessary for PostScript as
+ * color rendering dictionaries may not be modified once they are set).
+ *
+ * This code hides some of the structure of the graphic library color
+ * rendering objects from the rest of the PCL code.
+ */
+
+/*
+ * The PCL id exists to provide an identifier for a color rendering
+ * dictionary. Having such an identifier is important to avoid the need
+ * to repeatedly re-insert the color rendering dictionary into the
+ * graphic state.
+ *
+ * The is_dflt_illum flag is used to optimize the case in which a CRD that
+ * already uses the default view illuminant is once again set to use this
+ * view illuminant.
+ */
+struct pcl_crd_s {
+ rc_header rc;
+ bool is_dflt_illum;
+ gs_cie_render * pgscrd;
+};
+
+#define private_st_crd_t() \
+ gs_private_st_ptrs1( st_crd_t, \
+ pcl_crd_t, \
+ "pcl color rendering dictionary", \
+ crd_enum_ptrs, \
+ crd_reloc_ptrs, \
+ pgscrd \
+ )
+
+#ifndef pcl_crd_DEFINED
+#define pcl_crd_DEFINED
+typedef struct pcl_crd_s pcl_crd_t;
+#endif
+
+/*
+ * The usual copy, init, and release macros.
+ */
+#define pcl_crd_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_crd_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_crd_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_crd_release(pindexed) \
+ rc_decrement(pindexed, "pcl_crd_release")
+
+/*
+ * Unlike other elements of the PCL "palette", color rendering dictionaries
+ * are for the most part not a feature that can be controlled from the language.
+ * Except for the white point, the parameters of a color rendering dictionary
+ * are determined by the output device rather than the language.
+ */
+
+/*
+ * Build the default color rendering dictionary.
+ *
+ * This routine should be called only once, and then only when there is no
+ * current CRD.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_crd_build_default_crd(pcl_state_t *pcs);
+
+/*
+ * Set the viewing illuminant.
+ *
+ * Though this code goes through the motions of an "unshare" operation, it
+ * will almost always allocate a new structure, as the CRD will be referred
+ * to both by the palette and the graphic state.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_crd_set_view_illuminant(
+ pcl_state_t * pcs,
+ pcl_crd_t ** ppcrd,
+ const gs_vector3 * pwht_pt
+);
+
+/*
+ * Set a color rendering dictionary into the graphic state. If the rendering
+ * dictionary does not yet exist, create a default color rendering dictionary.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_crd_set_crd(pcl_crd_t **ppcrd, pcl_state_t *pcs);
+
+void free_crd(gs_memory_t *pmem, void *pvcrd, client_name_t cname);
+
+#endif /* pccrd_INCLUDED */
diff --git a/pcl/pccsbase.c b/pcl/pccsbase.c
new file mode 100644
index 000000000..5df687d35
--- /dev/null
+++ b/pcl/pccsbase.c
@@ -0,0 +1,1191 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccsbase.h - base color space code for PCL 5c */
+
+#include "gx.h"
+#include "math_.h"
+#include "gstypes.h"
+#include "gsmatrix.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gscspace.h"
+#include "gscolor2.h"
+#include "gscie.h"
+#include "pcmtx3.h"
+#include "pccsbase.h"
+#include "pcstate.h"
+
+/* GC routines */
+private_st_cs_base_t();
+
+/*
+ * Handle min/max values for device-independent color spaces.
+ *
+ * Examples in HP's "PCL 5 Color Technical Reference Manual" are unclear
+ * about the interpretation of minimum/maximum value for components for the
+ * device independent color spaces. It is clear that the "raw" input range
+ * for these parameters is always [ 0, 255 ], but how this range is mapped
+ * is not fully obvious.
+ *
+ * Empirical observations with both the CIE L*a*b* and the luminance-
+ * chrominance color space do little to clear up this confusion. In the range
+ * [ 0, 255 ] (as suggested in the "PCL 5 Color Technical Reference Manual"),
+ * integer arithmetic overflow seems to occur at some points, leading to
+ * rather curious color progressions (a moderate brown changes abruptly to
+ * a dark green at the half-intensity point of a "gray" scale).
+ *
+ * Side Note:
+ * Device dependent color spaces in PCL 5c are not provided with
+ * ranges, but are assigned white and black points. The interpretation of
+ * these points is clear: specify the white point to get the maximum
+ * intensity value for all components on the device, and the black point
+ * to achieve the minimum value (for printers these are reasonably white
+ * and black; most screens are adjusted to achieve the same result,
+ * though there is no strict requirement for this to be the case).
+ * Values within this range [black_point, white_point] are mapped
+ * by the obvious linear transformation; values outside of the range
+ * are clamped to the nearest boundary point.
+ *
+ * Two items of note for device dependent color spaces:
+ *
+ * a CMY color space is just an RGB color space with the white and
+ * black points inverted.
+ *
+ * For a given value of bits-per-primary, it is quite possible to
+ * set the white and black points so that one or both may not be
+ * achievable
+ *
+ * In this implementation, the white and black points of the device-
+ * specific color spaces are handled in the initial "normalization"
+ * step, before colors are entered into the palette.
+ *
+ * To do something sensible for device independent color space ranges, it is
+ * ncessary to ignore HP's implementation and ask what applications might
+ * reasonably want to do with the range parameters. The answer depends on the
+ * particular color space:
+ *
+ * a. For colorimetric RGB spaces, the reasonable assumption is that the
+ * parameters correspond to the range of the input primaries, from
+ * minimal 0 to full intensity. Furthermore, the white point corresponds
+ * to the full intensity for each primary, the black point to minimum
+ * intensity.
+ *
+ * The difficulty with this interpretation is that it renders the range
+ * parameters meaningless. PCL requires input data for device-independent
+ * color spaces to be in the range [0, 255], with 0 ==> minimum value and
+ * 255 ==> maximum value. Combined with the assumption above, this will
+ * always map the "raw" input values {0, 0, 0} and {255, 255, 255} to
+ * the black and white points, respectively.
+ *
+ * To avoid making the range parameters completely meaningless in this
+ * case, we will actually use a different interpretation. The modification
+ * continues to map the raw input values such that 0 ==> minimum value
+ * and 255 ==> maximum value, but the black and white points continue
+ * to be {0, 0, 0} and {1, 1, 1}. Values outside of this range are
+ * clipped.
+ *
+ * To the extent that we can determine, this interpretation bears some
+ * relationship to that used by HP.
+ *
+ * b. For the CIE L*a*b* space, the interpretation of the value of each
+ * component is fixed by standards, so the ranges specified in the
+ * Configure Image Data command can only be interpreted as indicating
+ * which set of values the "raw" input range [0, 255] should be mapped
+ * to (0 ==> min_value, 255 ==> max value)
+ *
+ * c. For consistency it is necessary to handle the range parameters for
+ * luminance-chrominance in the same manner as they are handled for the
+ * colorimetric RGB case. This approach makes even less sense in this
+ * case than for the colorimetric RGB case, as the region of input space
+ * that corresponds to real colors for luminance-chrominance spaces is
+ * not a cube (i.e.: it is possible for each of the components to be
+ * in a reasonable range, but for the combination to yield primary
+ * component values < 0 or > 1). There is not much choice about this
+ * arrangement, however, because a luminance-chrominance space can be
+ * set up to directly mimic a colorimetric RGB space by setting the
+ * transformation between the two to the identity transformation.
+ *
+ * For all of these range mappings, the initial step is to map the "raw" input
+ * range to [min_val, max_val], and incorporate the effect of the lookup
+ * table for the particular color space (if any). This is accomplished by the
+ * following macro. Note that the initial normalization step has already
+ * converted the "raw" input range to [0, 1] (the same range as is used by
+ * device-dependent color spaces).
+ */
+
+#define convert_val(val, min_val, range, plktbl) \
+ BEGIN \
+ if ((plktbl) != 0) \
+ val = (double)(plktbl)[(int)(255 * val)] / 255.0; \
+ val = min_val + val * range; \
+ END
+
+
+/*
+ * Default Configure Image Data information for the various color spaces.
+ *
+ * The black and white points for device dependent color spaces are not included
+ * here as those are handled via palette value normalization, not via the color
+ * space. Since the black and white points are the only parameters for the
+ * device-specific color spaces, there is no default information here for them
+ * at all.
+ *
+ * Other color spaces have up to three sets of default information:
+ *
+ * default parameter ranges (all device-independent color spaces)
+ *
+ * the default chromaticity of the primaries (colorimetric RGB and
+ * luminance-chrominance spaces)
+ *
+ * the default conversion between the color components and the primaries
+ * for which chromaticities have been provided (only luminance-
+ * chrominance space)
+ */
+static const pcl_cid_minmax_t cielab_range_default = {
+ { { 0.0, 100.0 }, { -100.0, 100.0 }, { -100.0, 100.0 } }
+};
+
+static const pcl_cid_minmax_t colmet_range_default = {
+ { { 0.0, 1.0 }, { 0.0, 1.0 }, { 0.0, 1.0 } }
+};
+
+static const pcl_cid_minmax_t lumchrom_range_default = {
+ { { 0.0, 1.0 }, { -0.89, 0.89 }, { -0.70, 0.70 } }
+};
+
+static const pcl_cid_col_common_t chroma_default = {
+ {
+ { 0.640, 0.340 }, /* "red" primary chromaticity */
+ { 0.310, 0.595 }, /* "green" primary chromaticity */
+ { 0.155, 0.070 }, /* "blue" chromaticity */
+ { 0.313, 0.329 } /* white chromaticity */
+ },
+ { { 1, 1.0 }, { 1, 1.0 }, { 1, 1.0 } }
+};
+
+static const float lumchrom_xform_default[9] = {
+ 0.30, 0.59, 0.11, -0.30, -0.59, 0.89, 0.70, -0.59, -0.11
+};
+
+/* structure of default values for all color spaces */
+static const struct {
+ const pcl_cid_minmax_t * pminmax;
+ const pcl_cid_col_common_t * pchroma;
+ const float * pxform;
+} cid_data_default[(int)pcl_cspace_num] = {
+ { 0, 0, 0 }, /* pcl_cspace_RGB */
+ { 0, 0, 0 }, /* pcl_cspace_CMY */
+ { &colmet_range_default, &chroma_default, 0 }, /* pcl_cspace_Colorimetric */
+ { &cielab_range_default, 0, 0}, /* pcl_cspace_CIELab */
+ { &lumchrom_range_default, &chroma_default, lumchrom_xform_default }
+ /* pcl_cspace_LumChrom */
+};
+
+
+/*
+ * Code for constructing/modifying the client data structure of PCL base
+ * color spaces.
+ */
+
+/*
+ * Set the range parameters for a color space.
+ */
+ static void
+set_client_info_range(
+ pcl_cs_client_data_t * pdata,
+ const pcl_cid_minmax_t * pminmax
+)
+{
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ pdata->min_val[i] = pminmax->val_range[i].min_val;
+ pdata->range[i] = pminmax->val_range[i].max_val
+ - pminmax->val_range[i].min_val;
+ }
+}
+
+/*
+ * Set the gamma/gain information for a color space.
+ */
+ static void
+set_client_info_chroma(
+ pcl_cs_client_data_t * pdata,
+ const pcl_cid_col_common_t * pchroma
+)
+{
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ floatp gamma = pchroma->nonlin[i].gamma;
+ floatp gain = pchroma->nonlin[i].gain;
+
+ pdata->inv_gamma[i] = (gamma == 0.0 ? 1.0 : 1.0 / gamma);
+ pdata->inv_gain[i] = (gain == 0.0 ? 1.0 : 1.0 / gain);
+ }
+}
+
+/*
+ * Build the client information structure for a color space.
+ */
+ static void
+build_client_data(
+ pcl_cs_client_data_t * pdata,
+ const pcl_cid_data_t * pcid,
+ gs_memory_t * pmem
+)
+{
+ pcl_cspace_type_t type = pcl_cid_get_cspace(pcid);
+ const pcl_cid_minmax_t * pminmax = cid_data_default[type].pminmax;
+ const pcl_cid_col_common_t * pchroma = cid_data_default[type].pchroma;
+
+ /* see if we have long-form information for device-independent spaces */
+ if (pcid->len > 6) {
+ if (type == pcl_cspace_Colorimetric) {
+ pminmax = &(pcid->u.col.minmax);
+ pchroma = &(pcid->u.col.colmet);
+ } else if (type == pcl_cspace_CIELab)
+ pminmax = &(pcid->u.lab.minmax);
+ else if (type == pcl_cspace_LumChrom) {
+ pminmax = &(pcid->u.lum.minmax);
+ pchroma = &(pcid->u.col.colmet);
+ }
+ }
+
+ /* set the range and gamma/gain parameters, as required */
+ if (pminmax != 0)
+ set_client_info_range(pdata, pminmax);
+ if (pchroma != 0)
+ set_client_info_chroma(pdata, pchroma);
+}
+
+/*
+ * Init a client data structure from an existing client data structure.
+ */
+static void
+init_client_data_from( pcl_cs_client_data_t * pnew,
+ const pcl_cs_client_data_t * pfrom
+)
+{
+ *pnew = *pfrom;
+ pcl_lookup_tbl_init_from(pnew->plktbl1, pfrom->plktbl1);
+ pcl_lookup_tbl_init_from(pnew->plktbl2, pfrom->plktbl2);
+}
+
+/*
+ * Update the lookup table information in a PCL base color space.
+ */
+ static void
+update_lookup_tbls(
+ pcl_cs_client_data_t * pdata,
+ pcl_lookup_tbl_t * plktbl1,
+ pcl_lookup_tbl_t * plktbl2
+)
+{
+ pcl_lookup_tbl_copy_from(pdata->plktbl1, plktbl1);
+ pcl_lookup_tbl_copy_from(pdata->plktbl2, plktbl2);
+}
+
+/*
+ * Free a client data structure. This releases the lookup tables, if they
+ * are present.
+ */
+#define free_lookup_tbls(pdata) \
+ update_lookup_tbls((pdata), NULL, NULL)
+
+
+/*
+ * The colorimetric case.
+ *
+ * The information provided with this color space consists of the CIE (x, y)
+ * chromaticities of the three primaries, and the white point. In order to
+ * derive a color space from this information, three additional assumptions
+ * are required:
+ *
+ * the intensity (Y value) or the white point is 1.0 (identical to the
+ * convention used by PostScript)
+ *
+ * the white point is achieved by setting each of the primaries to its
+ * maximum value (1.0)
+ *
+ * the black point (in this case, { 0, 0, 0 }, since it is not specified)
+ * is achieved by setting each of the primaries to its minimum value
+ * (0.0)
+ *
+ * Relaxing the former assumption would only modify the mapping provided by the
+ * color space by a multiplicative constant. The assumption is also reasonable
+ * for a printing device: even under the strongest reasonable assumptions, the
+ * actual intensity achieved by printed output is determined by the intensity
+ * of the illuminant and the reflectivity of the paper, neither one of which is
+ * known to the color space. Hence, the value of Y selected is arbitrary (so
+ * long as it is > 0), and using 1.0 simplifies the calculations a bit.
+ *
+ * The second and third assumptions are standard and, in fact, define the
+ * concept of "white point" and "black point" for the purposes of this color
+ * space. These assumptions are, however, often either poorly documented or
+ * not documented at all. At least the former is also not particularly intuitive:
+ * in an additive color arrangement (such as a display), the color achieved by
+ * full intensity on each of the primaries may be colored, and its color need
+ * not correspond to any of the standard "color temperatures" usually used
+ * as white points.
+ *
+ * The assumption is, unfortunately, critical to allow derivation of the
+ * transformation from the primaries provided to the XYZ color space. If we
+ * let {Xr, Yr, Zr}, {Xg, Yg, Z,}, and {Xb, Yb, Zb} denote the XYZ coordinates
+ * of the red, green, and blue primaries, respectively, then the desired
+ * conversion is:
+ *
+ * - -
+ * {X, Y, Z} = {R, G, B} * | Xr Yr Zr |
+ * | Xg Yg Zg |
+ * | Xb Yb Zb |
+ * - -
+ *
+ * The chromaticities of the primaries and the white point are derived by
+ * adjusting the X, Y, and Z coordinates such that x + y + z = 1. Hence:
+ *
+ * x = X / (X + Y + Z)
+ *
+ * y = Y / (X + Y + Z)
+ *
+ * z = Z / (X + Y + Z)
+ *
+ * Note that these relationships preserve the ratios between components:
+ *
+ * x / y = X / Y
+ *
+ * Hence:
+ *
+ * X = (x / y) * Y
+ *
+ * Z = ((1 - (x + y)) / y) * Y
+ *
+ * Using this relationship, the conversion equation above can be restated as:
+ *
+ * - -
+ * {X, Y, Z} = {R, G, B} * | Yr * xr / yr Yr Yr * zr / yr |
+ * | Yg * xg / yg Yg Yg * zg / yg |
+ * | Yb * xb / yb Yb Yb * zb / yb |
+ * - -
+ *
+ * Where zr = 1.0 - (xr + yr), zg = 1.0 - (xg + yg), and zb = 1.0 - (xb + yb).
+ *
+ * As discussed above, in order to make the range parameters of the long form
+ * Configure Image Data command meaningful, we must use the convention that
+ * full intensity for all components is {1, 1, 1}, and no intensity is
+ * {0, 0, 0}. Because the transformation is linear, the latter point provides
+ * no information, but the former establishes the following relationship.
+ *
+ * - -
+ * {Xw, Yw, Zw} = {1, 1, 1} * | Yr * xr / yr Yr Yr * zr / yr |
+ * | Yg * xg / yg Yg Yg * zg / yg |
+ * | Yb * xb / yb Yb Yb * zb / yb |
+ * - -
+ *
+ * This is equivalent to:
+ *
+ * - -
+ * {Xw, Yw, Zw} = {Yr, Yg, Yb} * | xr / yr 1.0 zr / yr |
+ * | xg / yg 1.0 zg / yg |
+ * | xb / yb 1.0 zb / yb |
+ * - -
+ *
+ * = {Yr, Yg, Yb} * mtx
+ *
+ * Using the assumption that Yw = 1.0, we have Xw = xw / yw and Zw = zw / yw
+ * (zw = 1 - (xw + yw)), so:
+ *
+ * {Yr, Yg, Yb} = {xw / yw, 1.0, zw / yw} * mtx^-1
+ *
+ * Since Yr, Yg, and Yb are now known, it is possible to generate the
+ * RGB ==> XYZ transformation.
+ *
+ * HP also provides for a gamma and gain parameter to be applied to each
+ * primary, though it does not specify exactly what these mean. The
+ * interpretation provided below (in the EncodeABC procedures) seems to
+ * correspond with the observed phenomena, though it is not clear that this
+ * interpretation is correct. Note also that the interpretation of gamma
+ * requires that component intensities be positive.
+ */
+
+/*
+ * The EncodeABC procedures for colorimetric RGB spaces. All three procedures
+ * are the same, except for the array index used.
+ */
+#define colmet_DecodeABC_proc(procname, indx) \
+ static float \
+ procname( \
+ floatp val, \
+ const gs_cie_abc * pabc \
+ ) \
+ { \
+ const pcl_cs_client_data_t * pdata = \
+ (const pcl_cs_client_data_t *) \
+ pabc->common.client_data; \
+ floatp inv_gamma = pdata->inv_gamma[indx]; \
+ floatp inv_gain = pdata->inv_gain[indx]; \
+ \
+ convert_val( val, \
+ pdata->min_val[indx], \
+ pdata->range[indx], \
+ pcl_lookup_tbl_get_tbl(pdata->plktbl1, indx) \
+ ); \
+ if (val < 0.0) \
+ val = 0.0; \
+ if (inv_gamma != 1.0) \
+ val = pow(val, inv_gamma); \
+ if (inv_gain != 1.0) \
+ val = 1.0 - (1.0 - val) * inv_gain; \
+ return val; \
+ }
+
+colmet_DecodeABC_proc(colmet_DecodeABC_0, 0)
+colmet_DecodeABC_proc(colmet_DecodeABC_1, 1)
+colmet_DecodeABC_proc(colmet_DecodeABC_2, 2)
+
+static const gs_cie_abc_proc3 colmet_DecodeABC = {
+ { colmet_DecodeABC_0, colmet_DecodeABC_1, colmet_DecodeABC_2 }
+};
+
+/*
+ * Build the matrix to convert a calibrated RGB color space to XYZ space; see
+ * the discussion above for the reasoning behind this derivation.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+build_colmet_conv_mtx(
+ const pcl_cid_col_common_t * pdata,
+ pcl_vec3_t * pwhite_pt,
+ pcl_mtx3_t * pmtx
+)
+{
+ pcl_vec3_t tmp_vec;
+ pcl_mtx3_t inv_mtx;
+ const float * pf = (float *)pdata->chroma;
+ int i, code;
+
+ for (i = 0; i < 3; i++) {
+ floatp x = pf[2 * i];
+ floatp y = pf[2 * i + 1];
+
+ pmtx->a[3 * i] = x / y;
+ pmtx->a[3 * i + 1] = 1.0;
+ pmtx->a[3 * i + 2] = (1.0 - x - y) / y;
+ }
+ if ((code = pcl_mtx3_invert(pmtx, &inv_mtx)) < 0)
+ return code;
+
+ pwhite_pt->vc.v1 = pdata->chroma[3].x / pdata->chroma[3].y;
+ pwhite_pt->vc.v2 = 1.0;
+ pwhite_pt->vc.v3 = (1.0 - pdata->chroma[3].x - pdata->chroma[3].y)
+ / pdata->chroma[3].y;
+ pcl_vec3_xform(pwhite_pt, &tmp_vec, &inv_mtx);
+
+ for (i = 0; i < 9; i++)
+ pmtx->a[i] *= tmp_vec.va[i / 3];
+ return 0;
+}
+
+/*
+ * Finish the creation of a colorimetric RGB color space.
+ */
+ static int
+finish_colmet_cspace(
+ gs_color_space * pcspace,
+ const pcl_cid_data_t * pcid
+)
+{
+ pcl_mtx3_t mtxABC;
+ pcl_vec3_t white_pt;
+ const pcl_cid_col_common_t * pcoldata;
+ int code = 0;
+
+ if (pcid->len == 6)
+ pcoldata = cid_data_default[pcl_cspace_Colorimetric].pchroma;
+ else
+ pcoldata = &(pcid->u.col.colmet);
+ if ((code = build_colmet_conv_mtx(pcoldata, &white_pt, &mtxABC)) < 0)
+ return code;
+
+ /* RangeABC has the default value */
+ *(gs_cie_abc_DecodeABC(pcspace)) = colmet_DecodeABC;
+ pcl_mtx3_convert_to_gs(&mtxABC, gs_cie_abc_MatrixABC(pcspace));
+
+ gs_cie_RangeLMN(pcspace)->ranges[0].rmin = 0;
+ gs_cie_RangeLMN(pcspace)->ranges[0].rmax = white_pt.va[0];
+ gs_cie_RangeLMN(pcspace)->ranges[1].rmin = 0;
+ gs_cie_RangeLMN(pcspace)->ranges[1].rmax = white_pt.va[1];
+ gs_cie_RangeLMN(pcspace)->ranges[2].rmin = 0;
+ gs_cie_RangeLMN(pcspace)->ranges[2].rmax = white_pt.va[2];
+ /* DecodeLMN and MatrixLMN have the default values */
+
+ pcl_vec3_to_gs_vector3(gs_cie_WhitePoint(pcspace), white_pt);
+ /* BlackPoint has the default value */
+
+ return 0;
+}
+
+/*
+ * The CIE L*a*b* case.
+ *
+ * The mapping from L*a*b* space to XYZ space is fairly simple over most of
+ * its range, but becomes complicated in the range of dark grays because the
+ * dominant cubic/cube root relationship changes to linear in this region.
+ *
+ * Let:
+ *
+ * f(h) = (h > (6/29)^3 ? h^(1/3) : (29^2 / (3 * 6^2)) * h + 4/29)
+ *
+ * g(h) = (h > (6/29)^3 ? 116 * h^(1/3) - 16 : (29/3)^3 * h)
+ *
+ * Note that, for h = (6/29)^3, the two different expressions for g(h) yield
+ * the same result:
+ *
+ * 116 * h^(1.3) - 16 = (116 * 6 / 29) - 16 = 24 - 16 = 8, and
+ *
+ * (29/3)^3 * h = (29 * 6 / 3 * 29)^3 = 2^3 = 8
+ *
+ * Since each part of g is monotonically increasing, g(h) is itself
+ * monotonically increasing, and therefore invertible. Similarly, for
+ * this value of h both expressions for f yield the same result:
+ *
+ * h^(1/3) = 6/29, and
+ *
+ * (29^2 / (3 * 6^2)) * h + 4/29 = (29^2 * 6^3) / (29^3 * 3 * 6^2) + 4/29
+ *
+ * = 2/29 + 4/29 = 6/29
+ *
+ * Again, the individual parts of f are monotonically increasing, hence f is
+ * monotonically increasing and therefore invertible.
+ *
+ * Let { Xw, 1.0, Yw } be the desired white-point. Then, the conversion from
+ * XYZ ==> L*a*b* is given by:
+ *
+ * L* = g(Y)
+ *
+ * a* = 500 * (f(X/Xw) - f(Y))
+ *
+ * b* = 200 * (f(Y) - f(Z/Zw))
+ *
+ * Inverting this relationship, we find that:
+ *
+ * Y = g^-1(L*)
+ *
+ * X = Xw * f^-1(a* / 500 + f(Y)) = Xw * f^-1(a* / 500 + f(g^-1(L*)))
+ *
+ * Z = Zw * f^-1(b* / 200 + f(Y)) = Zw * f^-1(f(g^-1(L*)) - b* / 200)
+ *
+ * Before providing expressions for f^-1 and g^-1 (we know from the argument
+ * above that these functions exist), we should note that the structure of the
+ * PostScript CIE color spaces cannot deal directly with a relationship such as
+ * described above, because all cross-component steps (operations that depend
+ * more than one component) must be linear. It is possible, however, to convert
+ * the relationship to the required form by extracting the value of Y in two
+ * steps. This is accomplished by the following algorithm:
+ *
+ * T1 = f(g^-1(L*))
+ * a1 = a* / 500
+ * b1 = b* / 200
+ * - -
+ * { a2, T1, b2 } = { T1, a1, b1 } * | 1 1 1 |
+ * | 1 0 0 |
+ * | 0 0 -1 |
+ * - -
+ * X = Xw * f^-1(a2)
+ * Y = f^-1(f(g^-1(L*)))
+ * Z = Zw * f^-1(b2)
+ *
+ * While the handling of the L* ==> Y conversion in this algorithm may seem a
+ * bit overly complex, it is perfectly legitimate and, as shown below, results
+ * in a very simple expression.
+ *
+ * To complete the algorithm, expressions for f^-1 and g^-1 must be provided.
+ * These are derived directly from the forward expressions:
+ *
+ * f^-1(h) = (h > 6/29 ? h^3 : (3 * 6^2) * (h - 4/29) / 29^2)
+ *
+ * g^-1(h) = (h > 8 ? ((h + 16) / 116)^3 : (3/29)^3 * h)
+ *
+ * Note that because both f and g change representations at the same point,
+ * there is only a single representation of f(g^-1(h)) required. Specifically,
+ * if h > 8, then
+ *
+ * g-1(h) = ((h + 16) / 116)^3 > (24 / 116)^3 = (6/29)^3
+ *
+ * so
+ *
+ * f(g^-1(h)) = (g^-1(h))^(1/3) = (h + 16) / 116
+ *
+ * while if h <= 8
+ *
+ * g-1(h) = (3/29)^3 * h <= (6/29)^3
+ *
+ * so
+ *
+ * f(g-1(h)) = (29^2 / (3 * 6^2)) * g^-1(h) + 4/29
+ *
+ * = ((29^2 * 3^3) / (29^3 * 3 * 6^2)) * h + 4/29
+ *
+ * = h/116 + 16/116 = (h + 16) / 116
+ *
+ * This is the algorithm used below, with the Encode procedures also responsible
+ * for implementing the color lookup tables (if present).
+ */
+
+/*
+ * Unlike the other color spaces, the DecodeABC procedures for the CIE L*a*b*
+ * color space have slightly different code for the different components. The
+ * conv_code operand allows for this difference.
+ */
+#define lab_DecodeABC_proc(procname, indx, conv_code) \
+ static float \
+ procname( \
+ floatp val, \
+ const gs_cie_abc * pabc \
+ ) \
+ { \
+ const pcl_cs_client_data_t * pdata = \
+ (const pcl_cs_client_data_t *)\
+ pabc->common.client_data; \
+ \
+ convert_val( val, \
+ pdata->min_val[indx], \
+ pdata->range[indx], \
+ pcl_lookup_tbl_get_tbl(pdata->plktbl1, indx) \
+ ); \
+ conv_code; \
+ return val; \
+ }
+
+lab_DecodeABC_proc(lab_DecodeABC_0, 0, (val = (val + 16.0) / 116.0))
+lab_DecodeABC_proc(lab_DecodeABC_1, 1, (val /= 500))
+lab_DecodeABC_proc(lab_DecodeABC_2, 2, (val /= 200))
+
+static const gs_cie_abc_proc3 lab_DecodeABC = {
+ { lab_DecodeABC_0, lab_DecodeABC_1, lab_DecodeABC_2 }
+};
+
+static const gs_matrix3 lab_MatrixABC = {
+ { 1, 1, 1 }, { 1, 0, 0 }, { 0, 0, -1 },
+ false
+};
+
+/*
+ * The DecodeLMN procedures for CIE L*a*b* color spaces are all identical
+ * except for the index. The explicit use of the white point is overkill,
+ * since we know this will always be the D65 white point with Y normalized
+ * to 1.0, but it guards against future variations.
+ */
+#define lab_DecodeLMN_proc(procname, indx) \
+ static float \
+ procname( \
+ floatp val, \
+ const gs_cie_common * pcie \
+ ) \
+ { \
+ if (val > 6.0 / 29.0) \
+ val = val * val * val; \
+ else \
+ val = 108 * (29.0 * val + 4) / (29.0 * 29.0 * 29.0); \
+ val *= (&(pcie->points.WhitePoint.u))[indx]; \
+ return val; \
+ }
+
+lab_DecodeLMN_proc(lab_DecodeLMN_0, 0)
+lab_DecodeLMN_proc(lab_DecodeLMN_1, 1)
+lab_DecodeLMN_proc(lab_DecodeLMN_2, 2)
+
+static const gs_cie_common_proc3 lab_DecodeLMN = {
+ { lab_DecodeLMN_0, lab_DecodeLMN_1, lab_DecodeLMN_2 }
+};
+
+static const gs_vector3 lab_WhitePoint = { .9504, 1.0, 1.0889 };
+
+
+/*
+ * Finish the creation of a CIE L*a*b* color space.
+ */
+ static int
+finish_lab_cspace(
+ gs_color_space * pcspace,
+ const pcl_cid_data_t * pcid
+)
+{
+ /* RangeABC has the default value */
+ *(gs_cie_abc_DecodeABC(pcspace)) = lab_DecodeABC;
+ *(gs_cie_abc_MatrixABC(pcspace)) = lab_MatrixABC;
+
+ /* RangeLMN and MatrixLMN have the default values */
+ *(gs_cie_DecodeLMN(pcspace)) = lab_DecodeLMN;
+
+ gs_cie_WhitePoint(pcspace) = lab_WhitePoint;
+ /* BlackPoint has the default value */
+ return 0;
+}
+
+
+/*
+ * The luminance-chrominance color space
+ *
+ * As HP would have it, the matrix provided in the long-form luminance-
+ * chrominance color space specification maps the calibrated RGB coordinates
+ * to the coordinates of the source space. This is, of course, the inverse
+ * of the transform that is useful: from the desired color space to calibrated
+ * RGB.
+ *
+ * The rest of the handling of luminance-chrominance spaces is similar to
+ * that for colorimetric RGB spaces. Note, however, that in this case the
+ * RangeLMN is the default value (primary components must be clipped to
+ * [0, 1]), and the DecodeLMN function must verify that its output is still
+ * in this range.
+ *
+ * As commented upon elsewhere, HP allows multiple lookup tables to be attached
+ * to the same color space, but does not clarify what this should do. The
+ * lookup table for the device dependent color spaces is not a problem; this
+ * is implemented as a transfer function. The situation with device independent
+ * color spaces is not as clear. The choice made here is to allow two device
+ * independent lookup tables to be applied to the luminance-chrominance color
+ * space: the luminance-chrominance lookup table and the colorimetric RGB
+ * lookup table. This does not match HP's behavior, but the latter does not
+ * make any sense, so this should not be an issue.
+ */
+
+/*
+ * The DecodeABC procedures for luminance-chrominance color space are simple.
+ */
+#define lumchrom_DecodeABC_proc(procname, indx) \
+ static float \
+ procname( \
+ floatp val, \
+ const gs_cie_abc * pabc \
+ ) \
+ { \
+ const pcl_cs_client_data_t * pdata = \
+ (const pcl_cs_client_data_t *) \
+ pabc->common.client_data; \
+ \
+ convert_val( val, \
+ pdata->min_val[indx], \
+ pdata->range[indx], \
+ pcl_lookup_tbl_get_tbl(pdata->plktbl1, indx) \
+ ); \
+ return val; \
+ }
+
+lumchrom_DecodeABC_proc(lumchrom_DecodeABC_0, 0)
+lumchrom_DecodeABC_proc(lumchrom_DecodeABC_1, 1)
+lumchrom_DecodeABC_proc(lumchrom_DecodeABC_2, 2)
+
+static const gs_cie_abc_proc3 lumchrom_DecodeABC = {
+ { lumchrom_DecodeABC_0, lumchrom_DecodeABC_1, lumchrom_DecodeABC_2 }
+};
+
+/*
+ * The DecodeLMN procedures for luminance-chrominance spaces are similar
+ * to the colorimetric DecodeABC procedures. Since there is no Range* parameter
+ * for the XYZ components, this procedure checks the range of its output.
+ */
+#define lumchrom_DecodeLMN_proc(procname, indx) \
+ static float \
+ procname( \
+ floatp val, \
+ const gs_cie_common * pcie \
+ ) \
+ { \
+ const pcl_cs_client_data_t * pdata = \
+ (const pcl_cs_client_data_t *)\
+ pcie->client_data; \
+ floatp inv_gamma = pdata->inv_gamma[indx]; \
+ floatp inv_gain = pdata->inv_gain[indx]; \
+ \
+ convert_val( val, \
+ 0.0, \
+ 1.0, \
+ pcl_lookup_tbl_get_tbl(pdata->plktbl2, indx)); \
+ if (inv_gamma != 1.0) \
+ val = pow(val, inv_gamma); \
+ if (inv_gain != 1.0) \
+ val = 1.0 - (1.0 - val) * inv_gain; \
+ if (val < 0.0) \
+ val = 0.0; \
+ else if (val > 1.0) \
+ val = 1.0; \
+ return val; \
+ }
+
+lumchrom_DecodeLMN_proc(lumchrom_DecodeLMN_0, 0)
+lumchrom_DecodeLMN_proc(lumchrom_DecodeLMN_1, 1)
+lumchrom_DecodeLMN_proc(lumchrom_DecodeLMN_2, 2)
+
+static const gs_cie_common_proc3 lumchrom_DecodeLMN = {
+ { lumchrom_DecodeLMN_0, lumchrom_DecodeLMN_1, lumchrom_DecodeLMN_2 }
+};
+
+
+/*
+ * Build the MatrixABC value for a luminance/chrominance color space. Note that
+ * this is the inverse of the matrix provided in the Configure Image Data
+ * command.
+ *
+ * Return 0 on success, < 0 in the event of an error.
+ */
+ static int
+build_lum_chrom_mtxABC(
+ const float pin_mtx[9],
+ pcl_mtx3_t * pmtxABC
+)
+{
+ int i;
+ pcl_mtx3_t tmp_mtx;
+
+ /* transpose the input to create a row-order matrix */
+ for (i = 0; i < 3; i++) {
+ int j;
+
+ for (j = 0; j < 3; j++)
+ tmp_mtx.a[i * 3 + j] = pin_mtx[i + 3 * j];
+ }
+
+ return pcl_mtx3_invert(&tmp_mtx, pmtxABC);
+}
+
+/*
+ * Finish the creation of a luminance-chrominance color space.
+ */
+ static int
+finish_lumchrom_cspace(
+ gs_color_space * pcspace,
+ const pcl_cid_data_t * pcid
+)
+{
+ const float * pin_mtx;
+ pcl_mtx3_t mtxABC, mtxLMN;
+ pcl_vec3_t white_pt;
+ const pcl_cid_col_common_t * pcoldata;
+ int code = 0;
+
+ if (pcid->len == 6) {
+ pcoldata = cid_data_default[pcl_cspace_LumChrom].pchroma;
+ pin_mtx = cid_data_default[pcl_cspace_LumChrom].pxform;
+ } else {
+ pcoldata = &(pcid->u.lum.colmet);
+ pin_mtx = pcid->u.lum.matrix;
+ }
+
+ if ( ((code = build_lum_chrom_mtxABC(pin_mtx, &mtxABC)) < 0) ||
+ ((code = build_colmet_conv_mtx(pcoldata, &white_pt, &mtxLMN)) < 0) )
+ return code;
+
+ /* RangeABC has the default value */
+ *(gs_cie_abc_DecodeABC(pcspace)) = lumchrom_DecodeABC;
+ pcl_mtx3_convert_to_gs(&mtxABC, gs_cie_abc_MatrixABC(pcspace));
+
+ /* RangeLMN has the default value */
+ *(gs_cie_DecodeLMN(pcspace)) = lumchrom_DecodeLMN;
+ pcl_mtx3_convert_to_gs(&mtxLMN, gs_cie_MatrixLMN(pcspace));
+
+ pcl_vec3_to_gs_vector3(gs_cie_WhitePoint(pcspace), white_pt);
+ /* BlackPoint has the default value */
+
+ return 0;
+}
+
+static int (*const finish_cspace[(int)pcl_cspace_num])( gs_color_space *,
+ const pcl_cid_data_t *
+ ) = {
+ 0, /* pcl_cspace_RGB */
+ 0, /* pcl_cspace_CMY */
+ finish_colmet_cspace, /* pcl_cspace_Colorimetric */
+ finish_lab_cspace, /* pcl_cspace_CIELab */
+ finish_lumchrom_cspace /* pcl_cspace_LumChrom */
+};
+
+
+/*
+ * Free a PCL base color space. This decrements the reference count for the
+ * GS color space, and frees any lookup tables that might have been
+ * used (device independent color spaces only).
+ */
+ static void
+free_base_cspace(
+ gs_memory_t * pmem,
+ void * pvbase,
+ client_name_t cname
+)
+{
+ pcl_cs_base_t * pbase = (pcl_cs_base_t *)pvbase;
+
+ rc_decrement(pbase->pcspace, "free_base_cspace");
+ gs_free_object(pmem, pvbase, cname);
+}
+
+/*
+ * Allocate a PCL base color space.
+ *
+ * Because a PCL base color space and the associated graphic-library color
+ * space must be kept in a one-to-one relationship, the latter color space is
+ * allocated here as well. For this reason the PCL color space type is
+ * an operand.
+ *
+ * Returns 0 on success, e_Memory in the event of a memory error.
+ */
+ static int
+alloc_base_cspace(
+ pcl_cs_base_t ** ppbase,
+ pcl_cspace_type_t type,
+ gs_memory_t * pmem
+)
+{
+ pcl_cs_base_t * pbase = 0;
+ int code = 0;
+
+ *ppbase = 0;
+ rc_alloc_struct_1( pbase,
+ pcl_cs_base_t,
+ &st_cs_base_t,
+ pmem,
+ return e_Memory,
+ "allocate pcl base color space"
+ );
+ pbase->rc.free = free_base_cspace;
+ pbase->type = type;
+ pbase->client_data.plktbl1 = 0;
+ pbase->client_data.plktbl2 = 0;
+ pbase->pcspace = 0;
+
+ if (type == pcl_cspace_White)
+ pbase->pcspace = gs_cspace_new_DeviceGray(pmem);
+ else if (type <= pcl_cspace_CMY)
+ pbase->pcspace = gs_cspace_new_DeviceRGB(pmem);
+ else
+ code = gs_cspace_build_CIEABC( &(pbase->pcspace),
+ &(pbase->client_data),
+ pmem
+ );
+ if (code < 0 || pbase->pcspace == NULL)
+ free_base_cspace(pmem, pbase, "allocate pcl base color space");
+ else
+ *ppbase = pbase;
+ return code;
+}
+
+/*
+ * Create a unique instance of a pcl_cs_base_t object (if one does not already
+ * exist).
+ *
+ * This code is not fully legitimate. To assure that a PCL base color space is
+ * unique, it is also necessary to assure that the associated graphics library
+ * color space is unique. Unfortunately, that is not a simple matter, because
+ * graphic library color spaces are not themselves reference counted, though
+ * they have reference-counted elements.
+ *
+ * We can get away with this arrangement for now by relying on a one-to-one
+ * association between PCL base color spaces and the associated graphic library
+ * color spaces. For all current implementations of the graphic library this
+ * will work. The code may fail, however, for implementations that use a
+ * "lazy evaluation" technique, as these may require access to the graphics
+ * library color space after the PCL base color space has been released (the
+ * graphic library color space will still be present in this case, but its
+ * client data may have been changed).
+ */
+static int
+unshare_base_cspace(const gs_memory_t *mem,
+ pcl_cs_base_t ** ppbase
+)
+{
+ pcl_cs_base_t * pbase = *ppbase;
+ pcl_cs_base_t * pnew = 0;
+ int code;
+
+ /* check if there is anything to do */
+ if (pbase->rc.ref_count == 1)
+ return 0;
+ rc_decrement(pbase, "unshare PCL base color space");
+
+ /* allocate a new gs_color_space */
+ if ((code = alloc_base_cspace(ppbase, pbase->type, pbase->rc.memory)) < 0)
+ return code;
+ pnew = *ppbase;
+
+ /* copy the client data */
+ init_client_data_from(&(pnew->client_data), &(pbase->client_data));
+
+ /* copy the color space (primarily for CIE color spaces; UGLY!!!) */
+ if (pbase->type > pcl_cspace_CMY) {
+ gs_cie_abc * pcs1 = pbase->pcspace->params.abc;
+ gs_cie_abc * pcs2 = pnew->pcspace->params.abc;
+
+ pcs2->common.install_cspace = pcs1->common.install_cspace;
+ pcs2->common.RangeLMN = pcs1->common.RangeLMN;
+ pcs2->common.DecodeLMN = pcs1->common.DecodeLMN;
+ pcs2->common.MatrixLMN = pcs1->common.MatrixLMN;
+ pcs2->common.points = pcs1->common.points;
+ pcs2->RangeABC = pcs1->RangeABC;
+ pcs2->DecodeABC = pcs1->DecodeABC;
+ pcs2->MatrixABC = pcs1->MatrixABC;
+ } else
+ pnew->pcspace->params.pixel = pbase->pcspace->params.pixel;
+ return 0;
+}
+
+/*
+ * Build a PCL base color space. This should be invoked whenever a color space
+ * is required, typically after a Configure Image Data (CID) command.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_cs_base_build_cspace(
+ pcl_cs_base_t ** ppbase,
+ const pcl_cid_data_t * pcid,
+ gs_memory_t * pmem
+)
+{
+ pcl_cs_base_t * pbase = *ppbase;
+ pcl_cspace_type_t type = pcl_cid_get_cspace(pcid);
+ int code = 0;
+
+ /* release the existing color space, if present */
+ if (pbase != 0)
+ rc_decrement(pbase, "build base pcl color space");
+
+ /* build basic structure and client info. structure */
+ if ((code = alloc_base_cspace(ppbase, type, pmem)) < 0)
+ return code;
+ pbase = *ppbase;
+ build_client_data(&(pbase->client_data), pcid, pmem);
+
+ /* fill in color space parameters */
+ if ( (finish_cspace[type] != 0) &&
+ ((code = finish_cspace[type](pbase->pcspace, pcid)) < 0) )
+ free_base_cspace(pmem, pbase, "build base pcl color space");
+ return code;
+}
+
+/*
+ * Build a special base color space, used for setting the color white.
+ * This base space is unique in that it uses the DeviceGray graphic library
+ * color space.
+ *
+ * This routine is usually called once at initialization.
+ */
+ int
+pcl_cs_base_build_white_cspace(
+ pcl_state_t * pcs,
+ pcl_cs_base_t ** ppbase,
+ gs_memory_t * pmem
+)
+{
+ int code = 0;
+
+ if (pcs->pwhite_cs == 0)
+ code = alloc_base_cspace(&pcs->pwhite_cs, pcl_cspace_White, pmem);
+ if (code >= 0)
+ pcl_cs_base_copy_from(*ppbase, pcs->pwhite_cs);
+ return code;
+}
+
+/*
+ * Update the lookup table information for a base color space. This applies
+ * only to device-independent color spaces (updating device dependent color
+ * spaces updates the transfer function in the current halftone). Passing a
+ * null pointer for the lookup table operand resets the tables for ALL color
+ * spaces to be the identity table.
+ *
+ * See the comments in pclookup.h for a description of how device independent
+ * lookup tables are interpreted in this implementation.
+ *
+ * Returns > 0 if the update changed the color space, 0 if the update did not
+ * change the color space, and < 0 in the event of an error. If the base color
+ * Space was updated, the current PCL indexed color space (which includes this
+ * color space as a base color space) must also be updated.
+ */
+ int
+pcl_cs_base_update_lookup_tbl(
+ pcl_cs_base_t ** ppbase,
+ pcl_lookup_tbl_t * plktbl
+)
+{
+ pcl_cs_base_t * pbase = *ppbase;
+ pcl_lookup_tbl_t * plktbl1 = pbase->client_data.plktbl1;
+ pcl_lookup_tbl_t * plktbl2 = pbase->client_data.plktbl2;
+ int code = 0;
+
+ if (plktbl == 0) {
+ if ( (pbase->client_data.plktbl1 == 0) &&
+ (pbase->client_data.plktbl2 == 0) )
+ return 0;
+ plktbl1 = 0;
+ plktbl2 = 0;
+
+ } else {
+ pcl_cspace_type_t cstype = pbase->type;
+ pcl_cspace_type_t lktype = pcl_lookup_tbl_get_cspace(plktbl);
+
+ /* lookup tables for "higher" color spaces are always ignored */
+ if ( (cstype < lktype) ||
+ (lktype == pcl_cspace_RGB) ||
+ (lktype == pcl_cspace_CMY) )
+ return 0;
+
+ /* CIE L*a*b* space and the L*a*b* lookup table must match */
+ if ((cstype == pcl_cspace_CIELab) || (lktype == pcl_cspace_CIELab)) {
+ plktbl1 = plktbl;
+ } else if (cstype == lktype)
+ plktbl1 = plktbl;
+ else
+ plktbl2 = plktbl;
+ }
+
+ /* make a unique copy of the base color space */
+ if ((code = unshare_base_cspace(pbase->rc.memory, ppbase)) < 0)
+ return code;
+ pbase = *ppbase;
+
+ /* update the lookup table information */
+ update_lookup_tbls( &(pbase->client_data),
+ plktbl1,
+ plktbl2
+ );
+
+ return 1;
+}
+
+/*
+ * Install a base color space into the graphic state.
+ *
+ * The pointer-pointer form of the first operand is for consistency with the
+ * other "install" procedures.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_cs_base_install(
+ pcl_cs_base_t ** ppbase,
+ pcl_state_t * pcs
+)
+{
+ return gs_setcolorspace(pcs->pgs, (*ppbase)->pcspace);
+}
+
+/*
+ * One-time initialization routine. This exists only to handle possible non-
+ * initialization of BSS.
+ */
+ void
+pcl_cs_base_init(pcl_state_t *pcs)
+{
+ pcs->pwhite_cs = 0;
+}
diff --git a/pcl/pccsbase.h b/pcl/pccsbase.h
new file mode 100644
index 000000000..3f92e85b4
--- /dev/null
+++ b/pcl/pccsbase.h
@@ -0,0 +1,173 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pccsbase.h - base color space portion of the PCL 5c palette object */
+
+#ifndef pccsbase_INCLUDED
+#define pccsbase_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gscspace.h"
+#include "pcident.h"
+#include "pcommand.h"
+#include "pccid.h"
+#include "pclookup.h"
+
+
+/*
+ * The client data structure for use with color-metric RGB, CIE L*a*b*, and
+ * luminanace-chrominance color spaces.
+ *
+ * Two color lookup table pointers are provided, but only the luminance-
+ * chrominance space will ever use both; for all other space plktbl2 is
+ * null. The inv_gamma and inv_gain parameters are not used by the CIE L*a*b*
+ * color space.
+ */
+typedef struct pcl_cs_client_data_s {
+ pcl_lookup_tbl_t * plktbl1; /* null ==> identity map */
+ pcl_lookup_tbl_t * plktbl2; /* null ==> identity map */
+ float min_val[3];
+ float range[3]; /* max_val - min_val */
+ float inv_gamma[3]; /* 1 / gamma */
+ float inv_gain[3]; /* 1 / gain */
+} pcl_cs_client_data_t;
+
+/*
+ * Base color space structure for PCL 5c.
+ *
+ * The client_data structure is referenced by the color space, but that space
+ * does not take ownership of the data nor is aware of its content, hence the
+ * need to keep a separate structure that ties the two elements together.
+ *
+ * Note that PCL has the responsibility of keeping this structure around until
+ * the cloro space is not longer needed. If it fails to do so, the client data
+ * may not be available when required by the (graphic library) color space.
+ * This is messy, but to do otherwise would require passing a release function
+ * along with the client data.
+ *
+ * The type field is included to allow subsequent addition of color lookup
+ * tables; the type is necessary to determine if a color lookup table is
+ * applicable.
+ *
+ * The color space referenced by this structure is always a base color space
+ * (there is no particular reason it could not be a separation of DeviceN
+ * color space, but these are not required by the current PCL 5c
+ * specification.)
+ */
+typedef struct pcl_cs_base_s {
+ rc_header rc;
+ pcl_cspace_type_t type;
+ pcl_cs_client_data_t client_data;
+ gs_color_space * pcspace;
+} pcl_cs_base_t;
+
+#define private_st_cs_base_t() \
+ gs_private_st_ptrs3( st_cs_base_t, \
+ pcl_cs_base_t, \
+ "pcl base color space",\
+ cs_base_enum_ptrs, \
+ cs_base_reloc_ptrs, \
+ client_data.plktbl1, \
+ client_data.plktbl2, \
+ pcspace \
+ )
+
+/*
+ * Macros to init, copy, and release PCL base color spaces.
+ */
+#define pcl_cs_base_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_cs_base_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_cs_base_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_cs_base_release(pbase) \
+ rc_decrement(pbase, "pcl_cs_base_release")
+
+
+/*
+ * Build a PCL base color space. In principle this may be invoked at any time,
+ * but it should generally be called the first time a color space is required
+ * after a "configure image data" command. The new color space will always be
+ * given null color lookup tables (the identity map).
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_base_build_cspace(
+ pcl_cs_base_t ** ppbase,
+ const pcl_cid_data_t * pcid,
+ gs_memory_t * pmem
+);
+
+/*
+ * Build a special base color space, used for setting the color white.
+ * This base space is unique in that it uses the DeviceGray graphic library
+ * color space.
+ *
+ * This routine is usually called once at initialization.
+ */
+int pcl_cs_base_build_white_cspace(
+ pcl_state_t * pcs,
+ pcl_cs_base_t ** ppbase,
+ gs_memory_t * pmem
+);
+
+/*
+ * Update the lookup table information for a PCL base color space. This is
+ * necessary only for lookup tables associated with device-independent color
+ * spaces; lookup tables for the device dependent color spaces are implemented
+ * as transfer functions.
+ *
+ * To reset all color lookup tables for device-independent color spaces, call
+ * with a null second operand.
+ *
+ * Returns 1 if successful and the lookup table actually modified the base
+ * color space, 0 if no modification occurred but there was no error, and < 0
+ * in the event of an error.
+ */
+int pcl_cs_base_update_lookup_tbl(
+ pcl_cs_base_t ** ppbase,
+ pcl_lookup_tbl_t * plktbl
+);
+
+/*
+ * Install a base color space into the graphic state.
+ *
+ * The pointer-pointer form of the first operand is for consistency with the
+ * other "install" procedures.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_base_install(
+ pcl_cs_base_t ** ppbase,
+ pcl_state_t * pcs
+);
+
+/*
+ * One-time initialization routine. This exists only to handle possible non-
+ * initialization of BSS.
+ */
+void pcl_cs_base_init(pcl_state_t *pcs);
+
+#endif /* pccsbase_INCLUDED */
diff --git a/pcl/pcdict.h b/pcl/pcdict.h
new file mode 100644
index 000000000..4eaa41527
--- /dev/null
+++ b/pcl/pcdict.h
@@ -0,0 +1,39 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcdict.h - PCL utilities for interfacing the PL's dictionary mechanism */
+
+#ifndef pcdict_INCLUDED
+#define pcdict_INCLUDED
+
+#include "gx.h"
+
+
+/* Define the type for an ID key used in a dictionary. */
+typedef struct pcl_id_s {
+ uint value;
+ byte key[2]; /* key for dictionaries */
+} pcl_id_t;
+
+#define id_key(id) ((id).key)
+#define id_value(id) ((id).value)
+
+#define id_set_key(id, bytes) \
+ ( (id).key[0] = (bytes)[0], \
+ (id).key[1] = (bytes)[1], \
+ (id).value = ((id).key[0] << 8) + (id).key[1] )
+
+#define id_set_value(id, val) \
+ ( (id).value = (val), (id).key[0] = (val) >> 8, (id).key[1] = (byte)(val) )
+
+#endif /* pcdict_INCLUDED */
diff --git a/pcl/pcdither.c b/pcl/pcdither.c
new file mode 100644
index 000000000..aeaf9ff31
--- /dev/null
+++ b/pcl/pcdither.c
@@ -0,0 +1,158 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcdither.c - PCL user-defined dither object implementation */
+
+#include "pcommand.h"
+#include "pcpalet.h"
+#include "pcdither.h"
+
+/* GC Routines */
+private_st_udither_t();
+
+/*
+ * Return a pointer to the thershold array appropriate for one color plane.
+ */
+ const byte *
+pcl_udither_get_threshold(
+ const pcl_udither_t * pdither,
+ int indx
+)
+{
+ uint nplanes = pdither->ptbl->nplanes;
+
+ if (nplanes == 1)
+ return pdither->ptbl->data;
+ else
+ return pdither->ptbl->data + indx * pcl_udither_get_size(pdither);
+}
+
+/*
+ * Free a dither matrix structure.
+ */
+ static void
+free_dither_matrix(
+ gs_memory_t * pmem,
+ void * pvdither,
+ client_name_t cname
+)
+{
+ pcl_udither_t * pdither = (pcl_udither_t *)pvdither;
+
+ if (pdither->ptbl != 0)
+ gs_free_object(pmem, (void *)pdither->ptbl, cname);
+ gs_free_object(pmem, pvdither, cname);
+}
+
+/*
+ * ESC * m <nbytes> W
+ *
+ * Download dither matrix.
+ */
+ static int
+download_dither_matrix(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint len = uint_arg(pargs);
+ pcl_udither_t * pdither = 0;
+ const pcl__udither_t * ptbl = (pcl__udither_t *)arg_data(pargs);
+ uint nplanes, h, w, rlen;
+ int code = 0;
+ byte * bp;
+
+ if ( pcs->raster_state.graphics_mode )
+ return 0;
+ /* check for legitimate parameter values */
+ if (len < 7)
+ return 0;
+ nplanes = ptbl->nplanes;
+ h = (ptbl->height[0] << 8) + ptbl->height[1];
+ w = (ptbl->width[0] << 8) + ptbl->width[1];
+ rlen = nplanes * h * w + 6;
+ if ( ((nplanes != 1) && (nplanes != 3)) ||
+ (h == 0) ||
+ (w == 0) ||
+ (len < rlen) )
+ return e_Range;
+
+ rc_alloc_struct_1( pdither,
+ pcl_udither_t,
+ &st_udither_t,
+ pcs->memory,
+ return e_Memory,
+ "download dither matrix"
+ );
+ pdither->rc.free = free_dither_matrix;
+ pdither->ptbl = 0;
+
+ /* either take possession of buffer, or allocate a new one */
+ if (pargs->data_on_heap)
+ arg_data(pargs) = 0;
+ else {
+ pcl__udither_t * ptmp = 0;
+
+ ptmp = (pcl__udither_t *)gs_alloc_bytes( pcs->memory,
+ rlen,
+ "donwload dither matrix"
+ );
+ if (ptmp == 0) {
+ free_dither_matrix( pdither->rc.memory,
+ pdither,
+ "download dither matrix"
+ );
+ return e_Memory;
+ }
+ memcpy(ptmp, ptbl, rlen);
+ ptbl = ptmp;
+ }
+ pdither->height = h;
+ pdither->width = w;
+ pdither->ptbl = ptbl;
+
+ /* do not allow the value 0 in the array - black must be black */
+ bp = (byte *)ptbl->data;
+ rlen -= 6;
+ while (rlen-- > 0) {
+ byte b = *bp;
+
+ *bp++ = (b == 0 ? 1 : b);
+ }
+
+ /* update the dither matrix; release our reference */
+ code = pcl_palette_set_udither(pcs, pdither);
+ pcl_udither_release(pdither);
+ return code;
+}
+
+/*
+ * There is no reset or copy procedure for this module, as both functions are
+ * handled at the palette level.
+ */
+ static int
+udither_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'm', 'W',
+ PCL_COMMAND("Download Dither Matrix", download_dither_matrix, pca_bytes | pca_raster_graphics)
+ },
+ END_CLASS
+ return 0;
+}
+
+const pcl_init_t pcl_udither_init = { udither_do_registration, 0, 0 };
diff --git a/pcl/pcdither.h b/pcl/pcdither.h
new file mode 100644
index 000000000..00c011cc8
--- /dev/null
+++ b/pcl/pcdither.h
@@ -0,0 +1,107 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcdither.h - PCL user-defined dither object */
+
+#ifndef pcdither_INCLUDED
+#define pcdither_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "pcstate.h"
+#include "pcommand.h"
+
+/*
+ * PCL user-defined dither matrix structure.
+ *
+ * This structure is defined by HP.
+ *
+ * NB: don't take sizeof of this structure.
+ *
+ */
+typedef struct pcl__udither_s {
+ byte format;
+ byte nplanes;
+ byte height[2];
+ byte width[2];
+ byte data[1 /* actually height * width * nplanes */ ];
+} pcl__udither_t;
+
+/*
+ * Header for tha PCL user-defined dither object. This exists to provide a
+ * reference-counting mechanism for the user-defined dithers. It also is a
+ * convenient location in which to store endian-adjusted size information
+ * about the dither.
+ */
+typedef struct pcl_udither_s {
+ rc_header rc;
+ uint height;
+ uint width;
+ const pcl__udither_t * ptbl;
+} pcl_udither_t;
+
+#define private_st_udither_t() \
+ gs_private_st_ptrs1( st_udither_t, \
+ pcl_udither_t, \
+ "pcl user defined dither matrix", \
+ udither_enum_ptr, \
+ udither_reloc_ptr, \
+ ptbl \
+ )
+
+/*
+ * Copy, init, and release macros.
+ */
+#define pcl_udither_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_udither_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_udither_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_udither_release(pdither) \
+ rc_decrement(pdither, "pcl_udither_release")
+
+/*
+ * Macros for retrieving information from a pcl_udither_t structure.
+ */
+#define pcl_udither_get_nplanes(pdither) ((pdither)->ptbl->nplanes)
+#define pcl_udither_get_height(pdither) ((pdither)->height)
+#define pcl_udither_get_width(pdither) ((pdither)->width)
+
+#define pcl_udither_get_size(pdither) ((pdither)->height * (pdither)->width)
+
+/*
+ * Get a pointer to the appropriate portion of the dither table in a user
+ * defined dither structure.
+ */
+const byte *pcl_udither_get_threshold(
+ const pcl_udither_t * pdither,
+ int indx
+);
+
+/*
+ * External access to the user-defined dither matrix machinery.
+ */
+extern const pcl_init_t pcl_udither_init;
+
+#endif /* pcdither_INCLUDED */
diff --git a/pcl/pcdraw.c b/pcl/pcdraw.c
new file mode 100644
index 000000000..072ec8f6a
--- /dev/null
+++ b/pcl/pcdraw.c
@@ -0,0 +1,184 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcdraw.c - PCL5 drawing utilities */
+
+#include "gx.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gsstate.h"
+#include "gsrop.h"
+#include "gxfixed.h"
+#include "pcstate.h"
+#include "pcht.h"
+#include "pccrd.h"
+#include "pcpatrn.h"
+#include "pcdraw.h"
+
+
+/*
+ * Set all necessary graphics state parameters for PCL drawing
+ * (currently only CTM and clipping region).
+ */
+ int
+pcl_set_graphics_state(
+ pcl_state_t * pcs
+)
+{
+ int code = pcl_set_ctm(pcs, true);
+
+ return ( code < 0 ? code
+ : gx_clip_to_rectangle( pcs->pgs,
+ &(pcs->xfm_state.dev_print_rect)
+ ) );
+}
+
+/*
+ * Backwards compatibility function. Now, however, it provides accurate
+ * results.
+ */
+ int
+pcl_set_ctm(
+ pcl_state_t * pcs,
+ bool use_pd
+)
+{
+ return gs_setmatrix( pcs->pgs,
+ ( use_pd ? &(pcs->xfm_state.pd2dev_mtx)
+ : &(pcs->xfm_state.lp2dev_mtx) )
+ );
+}
+
+/*
+ * set pcl's drawing color. Uses pcl state values to determine
+ * rotation and translation of patterns.
+ *
+ * The final operand indicates if a PCL raster (image) is being rendered;
+ * special considerations apply in this case. See the comments in pcbipatrn.c
+ * pcpatrn.c for further information.
+ *
+ * PCL no longer uses the graphic library transparency mechanism.
+ */
+ int
+pcl_set_drawing_color(
+ pcl_state_t * pcs,
+ pcl_pattern_source_t type,
+ int id,
+ bool for_image
+)
+{ int code;
+
+ /* use PCL's pattern transparency */
+ pcs->pattern_transparent = pcs->pcl_pattern_transparent;
+
+ if (type == pcl_pattern_raster_cspace)
+ code = (pcl_pattern_get_proc_PCL(type))(pcs, 0, true);
+ else
+ code = (pcl_pattern_get_proc_PCL(type))(pcs, id, (int)for_image);
+ if (code >= 0) {
+ gs_setrasterop(pcs->pgs, (gs_rop3_t)pcs->logical_op);
+ gs_setfilladjust(pcs->pgs, 0.0, 0.0);
+ }
+ return 0;
+}
+
+/*
+ * The pcl state structure retains information concerning the current contents
+ * of the grpahic state. To keep this information synchronized with the
+ * graphic state itself, this information is kept in a stack that is pushed
+ * or poped, repsectively, for each invocation of gsave and grestore.
+ * This opertion is prefromed by the following pair of routines, which should
+ * be used in place of gsave and grestore.
+ */
+
+private_st_gstate_ids_t();
+
+ int
+pcl_gsave(
+ pcl_state_t * pcs
+)
+{
+ int code = 0;
+ pcl_gstate_ids_t * pids = gs_alloc_struct( pcs->memory,
+ pcl_gstate_ids_t,
+ &st_gstate_ids_t,
+ "PCL gsave"
+ );
+ if (pids == 0)
+ return e_Memory;
+
+ pids->pht = 0;
+ pids->pcrd = 0;
+ pids->pccolor = 0;
+
+ if ((code = gs_gsave(pcs->pgs)) >= 0) {
+ pids->prev = pcs->pids->prev;
+ pcs->pids->prev = pids;
+ pcl_ccolor_init_from(pids->pccolor, pcs->pids->pccolor);
+ pcl_ht_init_from(pids->pht, pcs->pids->pht);
+ pcl_crd_init_from(pids->pcrd, pcs->pids->pcrd);
+ } else
+ gs_free_object(pcs->memory, pids, "PCL gsave");
+
+ return code;
+}
+
+ int
+pcl_grestore(
+ pcl_state_t * pcs
+)
+{
+ pcl_gstate_ids_t * pids = pcs->pids->prev;
+ int code = 0;
+ /* check for bottom of graphic state stack */
+ if (pcs == 0 || pcs->pids == 0 || pids == 0)
+ return e_Range;
+ if ((code = gs_grestore(pcs->pgs)) >= 0) {
+ pcs->pids->prev = pids->prev;
+ pcl_ccolor_copy_from(pcs->pids->pccolor, pids->pccolor);
+ pcl_ccolor_release(pids->pccolor);
+ pcl_ht_copy_from(pcs->pids->pht, pids->pht);
+ pcl_ht_release(pids->pht);
+ pcl_crd_copy_from(pcs->pids->pcrd, pids->pcrd);
+ pcl_crd_release(pids->pcrd);
+ gs_free_object(pcs->memory, pids, "PCL grestore");
+ }
+
+ return code;
+}
+
+ void
+pcl_init_gstate_stk(
+ pcl_state_t * pcs
+)
+{
+ pcl_gstate_ids_t * pids = gs_alloc_struct( pcs->memory,
+ pcl_gstate_ids_t,
+ &st_gstate_ids_t,
+ "PCL gsave"
+ );
+ if (pids != 0) { /* otherwise will crash soon enough */
+ pids->prev = 0;
+ pids->pccolor = 0;
+ pids->pht = 0;
+ pids->pcrd = 0;
+ }
+ pcs->pids = pids;
+}
+
+void
+pcl_free_gstate_stk(pcl_state_t *pcs)
+{
+ gs_free_object(pcs->memory, pcs->pids, "PCL grestore");
+}
+
diff --git a/pcl/pcdraw.h b/pcl/pcdraw.h
new file mode 100644
index 000000000..980aa06c4
--- /dev/null
+++ b/pcl/pcdraw.h
@@ -0,0 +1,35 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcdraw.h - Interface to PCL5 drawing utilities */
+
+#ifndef pcdraw_INCLUDED
+#define pcdraw_INCLUDED
+
+#include "pcstate.h"
+
+/* compatibility function */
+int pcl_set_ctm(pcl_state_t * pcs, bool print_direction);
+
+/* set CTM and clip rectangle for drawing PCL object */
+int pcl_set_graphics_state(pcl_state_t * pcs);
+
+/* set the current drawing color */
+int pcl_set_drawing_color(
+ pcl_state_t * pcs,
+ pcl_pattern_source_t type,
+ int pcl_id,
+ bool for_image
+);
+
+#endif /* pcdraw_INCLUDED */
diff --git a/pcl/pcfont.c b/pcl/pcfont.c
new file mode 100644
index 000000000..0a9487c32
--- /dev/null
+++ b/pcl/pcfont.c
@@ -0,0 +1,661 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfont.c */
+/* PCL5 font selection and text printing commands */
+#include "std.h"
+#include <stdlib.h>
+#include "memory_.h"
+/* The following are all for gxfont42.h. */
+#include "gx.h"
+#include "gsccode.h"
+#include "gsmatrix.h"
+#include "gxfixed.h"
+#include "gxchar.h"
+#include "gxfcache.h"
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "gxchar.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcursor.h"
+#include "pcfont.h"
+#include "pcfsel.h"
+#include "pjtop.h"
+#include "pllfont.h"
+
+/*
+ * Decache the HMI after resetting the font. According to TRM 5-22,
+ * this always happens, regardless of how the HMI was set; formerly,
+ * we only invalidated the HMI if it was set from the font rather than
+ * explicitly. TRM 7-14 any font characteristic change decaches HMI
+ */
+#define pcl_decache_hmi(pcs)\
+ do {\
+ pcs->hmi_cp = HMI_DEFAULT;\
+ } while (0)
+
+
+/* Clear the font pointer cache after changing a font parameter. set
+ * indicates which font (0/1 for primary/secondary). -1 means both. */
+void
+pcl_decache_font(pcl_state_t *pcs, int set)
+{
+ if ( set < 0 )
+ {
+ pcl_decache_font(pcs, 0);
+ pcl_decache_font(pcs, 1);
+ }
+ else
+ {
+ pcs->font_selection[set].font = NULL;
+ pcs->font_selection[set].selected_id = -1;
+ pcs->g.font_selection[set].font = NULL;
+ if ( pcs->font_selected == set )
+ {
+ pcs->font = NULL;
+ pcs->map = NULL;
+ pcs->g.font = NULL;
+ pcs->g.map = NULL;
+ pcl_decache_hmi(pcs);
+ }
+ }
+}
+
+/* set current font and symbol table to selected parameter's font and
+ symbol table */
+static int
+pcl_set_font(pcl_state_t *pcs, pcl_font_selection_t *pfs)
+{
+ pcs->font = pfs->font;
+ pcs->map = pfs->map;
+ return 0;
+}
+
+/* Recompute the current font from the descriptive parameters. */
+/* This is exported for resetting HMI. */
+int
+pcl_recompute_font(pcl_state_t *pcs)
+{ pcl_font_selection_t *pfs = &pcs->font_selection[pcs->font_selected];
+ int code = pcl_reselect_font(pfs, pcs);
+
+ if ( code < 0 )
+ return code;
+ pcl_set_font(pcs, pfs);
+ /* load it if necessary */
+ return pl_load_resident_font_data_from_file(pcs->memory, pfs->font);
+}
+
+/* The font parameter commands all come in primary and secondary variants. */
+static int
+pcl_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ uint num = uint_arg(pargs);
+ uint symset;
+
+ if ( num > 1023 )
+ return e_Range;
+
+ pcl_decache_hmi(pcs);
+ /* The following algorithm is from Appendix C of the */
+ /* PCL5 Comparison Guide. */
+ symset = (num << 5) + pargs->command - 64;
+ if ( symset != pcs->font_selection[set].params.symbol_set )
+ {
+ pcs->font_selection[set].params.symbol_set = symset;
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( <> others */
+pcl_primary_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_symbol_set(pargs, pcs, 0);
+}
+static int /* ESC ) <> others */
+pcl_secondary_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_symbol_set(pargs, pcs, 1);
+}
+
+static int
+pcl_spacing(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ uint spacing = uint_arg(pargs);
+
+ if ( spacing > 1 )
+ return 0;
+
+ pcl_decache_hmi(pcs);
+ if ( spacing != pcs->font_selection[set].params.proportional_spacing )
+ {
+ pcs->font_selection[set].params.proportional_spacing = spacing;
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( s <prop_bool> P */
+pcl_primary_spacing(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_spacing(pargs, pcs, 0);
+}
+static int /* ESC ) s <prop_bool> P */
+pcl_secondary_spacing(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_spacing(pargs, pcs, 1);
+}
+
+static int
+pcl_pitch(floatp cpi, pcl_state_t *pcs, int set)
+{ uint pitch_cp;
+ pcl_font_selection_t *pfs = &pcs->font_selection[set];
+
+ pcl_decache_hmi(pcs);
+ if ( cpi < 0.1 )
+ cpi = 0.1;
+ /* Convert characters per inch to 100ths of design units. */
+ pitch_cp = 7200.0 / cpi;
+ if ( pitch_cp > 65535 )
+ return e_Range;
+ if ( pitch_cp < 1 )
+ pitch_cp = 1;
+ if ( pitch_cp != pl_fp_pitch_cp(&pfs->params) )
+ {
+ pl_fp_set_pitch_cp(&pfs->params, pitch_cp);
+ if ( (int)pfs->selected_id < 0)
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( s <pitch> H */
+pcl_primary_pitch(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_pitch(float_arg(pargs), pcs, 0);
+}
+static int /* ESC ) s <pitch> H */
+pcl_secondary_pitch(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_pitch(float_arg(pargs), pcs, 1);
+}
+
+static int
+pcl_height(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ uint height_4ths = (uint)(float_arg(pargs) * 4 + 0.5);
+ pcl_font_selection_t *pfs = &pcs->font_selection[set];
+
+ pcl_decache_hmi(pcs);
+ if ( height_4ths != pfs->params.height_4ths )
+ {
+ pfs->params.height_4ths = height_4ths;
+ if ( (int)pfs->selected_id < 0)
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( s <height> V */
+pcl_primary_height(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_height(pargs, pcs, 0);
+}
+static int /* ESC ) s <height> V */
+pcl_secondary_height(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_height(pargs, pcs, 1);
+}
+
+static int
+pcl_style(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ uint style = uint_arg(pargs);
+
+ pcl_decache_hmi(pcs);
+ if ( style != pcs->font_selection[set].params.style )
+ {
+ pcs->font_selection[set].params.style = style;
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( s <style> S */
+pcl_primary_style(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_style(pargs, pcs, 0);
+}
+static int /* ESC ) s <style> S */
+pcl_secondary_style(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_style(pargs, pcs, 1);
+}
+
+static int
+pcl_stroke_weight(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ int weight = int_arg(pargs);
+
+ pcl_decache_hmi(pcs);
+ if ( weight < -7 )
+ weight = -7;
+ else if ( weight > 7 )
+ weight = 7;
+ if ( weight != pcs->font_selection[set].params.stroke_weight )
+ {
+ pcs->font_selection[set].params.stroke_weight = weight;
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( s <weight> B */
+pcl_primary_stroke_weight(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_stroke_weight(pargs, pcs, 0);
+}
+static int /* ESC ) s <weight> B */
+pcl_secondary_stroke_weight(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_stroke_weight(pargs, pcs, 1);
+}
+
+static int
+pcl_typeface(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ uint typeface = uint_arg(pargs);
+
+ pcl_decache_hmi(pcs);
+ if ( typeface != pcs->font_selection[set].params.typeface_family )
+ {
+ pcs->font_selection[set].params.typeface_family = typeface;
+ pcl_decache_font(pcs, set);
+ }
+ return 0;
+}
+static int /* ESC ( s <typeface> T */
+pcl_primary_typeface(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_typeface(pargs, pcs, 0);
+}
+static int /* ESC ) s <typeface> T */
+pcl_secondary_typeface(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_typeface(pargs, pcs, 1);
+}
+
+static int
+pcl_font_selection_id(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{ uint id = uint_arg(pargs);
+ pcl_font_selection_t *pfs = &pcs->font_selection[set];
+ int code = pcl_select_font_by_id(pfs, id, pcs);
+
+ switch ( code )
+ {
+ default: /* error */
+ return code;
+ case 0:
+ pcl_decache_font(pcs, -1);
+ pfs->selected_id = id;
+ case 1: /* not found */
+ return 0;
+ }
+}
+static int /* ESC ( <font_id> X */
+pcl_primary_font_selection_id(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_font_selection_id(pargs, pcs, 0);
+}
+static int /* ESC ) <font_id> X */
+pcl_secondary_font_selection_id(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_font_selection_id(pargs, pcs, 1);
+}
+
+static int
+pcl_select_default_font(pcl_args_t *pargs, pcl_state_t *pcs, int set)
+{
+ if ( int_arg(pargs) != 3 )
+ return e_Range;
+
+ pcs->font_selection[set].params.proportional_spacing = false;
+ pcs->font_selection[set].params.symbol_set = pcs->default_symbol_set_value;
+ pl_fp_set_pitch_per_inch(&pcs->font_selection[set].params,
+ pjl_proc_vartof(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "pitch")));
+ pcs->font_selection[set].params.height_4ths =
+ pjl_proc_vartof(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "ptsize")) * 4.0;
+
+ pcs->font_selection[set].params.style = 0;
+ pcs->font_selection[set].params.stroke_weight = 0;
+ pcs->font_selection[set].params.typeface_family = 3; /* courier */
+ pcs->font_selection[set].font = 0; /* not looked up yet */
+ pcl_decache_font(pcs, set);
+ return e_Unimplemented;
+}
+static int /* ESC ( 3 @ */
+pcl_select_default_font_primary(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_select_default_font(pargs, pcs, 0);
+}
+static int /* ESC ) 3 @ */
+pcl_select_default_font_secondary(pcl_args_t *pargs, pcl_state_t *pcs)
+{ return pcl_select_default_font(pargs, pcs, 1);
+}
+
+static int /* SO */
+pcl_SO(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ if ( pcs->font_selected != 1 ) {
+ pcs->font_selected = secondary;
+ pcl_decache_font(pcs, secondary);
+ }
+ return 0;
+}
+
+static int /* SI */
+pcl_SI(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ if ( pcs->font_selected != 0 ) {
+ pcs->font_selected = primary;
+ pcl_decache_font(pcs, primary);
+ }
+ return 0;
+}
+
+/* This command is listed only on p. A-7 of the PCL5 Comparison Guide. */
+static int /* ESC & k <mode> S */
+pcl_set_pitch_mode(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int mode = int_arg(pargs);
+ floatp cpi;
+ int code = 0;
+
+ /*
+ * The specification in the PCL5 Comparison Guide is:
+ * 0 => 10.0, 2 => 16.67, 4 => 12.0.
+ */
+ switch ( mode )
+ {
+ case 0: cpi = 10.0; break;
+ case 2: cpi = 16.67; break;
+ case 4: cpi = 12.0; break;
+ default: return e_Range;
+ }
+
+ /* set the pitch in both primary and secondary font selection tables */
+ {
+ code = pcl_pitch(cpi, pcs, primary);
+ if (code == 0)
+ code = pcl_pitch(cpi, pcs, secondary);
+ }
+ return code;
+}
+
+/* Initialization */
+static int
+pcfont_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ { int chr;
+ /*
+ * The H-P manual only talks about A through Z, but it appears
+ * that characters from A through ^ (94) can be used.
+ */
+ for ( chr = 'A'; chr <= '^'; ++chr )
+ if ( chr != 'X' )
+ { DEFINE_CLASS_COMMAND_ARGS('(', 0, chr, "Primary Symbol Set",
+ pcl_primary_symbol_set,
+ pca_neg_error|pca_big_error);
+ DEFINE_CLASS_COMMAND_ARGS(')', 0, chr, "Secondary Symbol Set",
+ pcl_secondary_symbol_set,
+ pca_neg_error|pca_big_error);
+ }
+ }
+ DEFINE_CLASS('(')
+ {'s', 'P',
+ PCL_COMMAND("Primary Spacing", pcl_primary_spacing,
+ pca_neg_ignore|pca_big_ignore)},
+ {'s', 'H',
+ PCL_COMMAND("Primary Pitch", pcl_primary_pitch,
+ pca_neg_error|pca_big_error)},
+ {'s', 'V',
+ PCL_COMMAND("Primary Height", pcl_primary_height,
+ pca_neg_error|pca_big_error)},
+ {'s', 'S',
+ PCL_COMMAND("Primary Style", pcl_primary_style,
+ pca_neg_error|pca_big_clamp)},
+ {'s', 'B',
+ PCL_COMMAND("Primary Stroke Weight", pcl_primary_stroke_weight,
+ pca_neg_ok|pca_big_error)},
+ {'s', 'T',
+ PCL_COMMAND("Primary Typeface", pcl_primary_typeface,
+ pca_neg_error|pca_big_ok)},
+ {0, 'X',
+ PCL_COMMAND("Primary Font Selection ID",
+ pcl_primary_font_selection_id,
+ pca_neg_error|pca_big_error)},
+ {0, '@',
+ PCL_COMMAND("Default Font Primary",
+ pcl_select_default_font_primary,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ DEFINE_CLASS(')')
+ {'s', 'P',
+ PCL_COMMAND("Secondary Spacing", pcl_secondary_spacing,
+ pca_neg_ignore|pca_big_ignore)},
+ {'s', 'H',
+ PCL_COMMAND("Secondary Pitch", pcl_secondary_pitch,
+ pca_neg_error|pca_big_error)},
+ {'s', 'V',
+ PCL_COMMAND("Secondary Height", pcl_secondary_height,
+ pca_neg_error|pca_big_error)},
+ {'s', 'S',
+ PCL_COMMAND("Secondary Style", pcl_secondary_style,
+ pca_neg_error|pca_big_clamp)},
+ {'s', 'B',
+ PCL_COMMAND("Secondary Stroke Weight",
+ pcl_secondary_stroke_weight,
+ pca_neg_ok|pca_big_error)},
+ {'s', 'T',
+ PCL_COMMAND("Secondary Typeface", pcl_secondary_typeface,
+ pca_neg_error|pca_big_ok)},
+ {0, 'X',
+ PCL_COMMAND("Secondary Font Selection ID",
+ pcl_secondary_font_selection_id,
+ pca_neg_error|pca_big_error)},
+ {0, '@',
+ PCL_COMMAND("Default Font Secondary",
+ pcl_select_default_font_secondary,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ DEFINE_CONTROL(SO, "SO", pcl_SO)
+ DEFINE_CONTROL(SI, "SI", pcl_SI)
+ DEFINE_CLASS('&')
+ {'k', 'S',
+ PCL_COMMAND("Set Pitch Mode", pcl_set_pitch_mode,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ return 0;
+}
+
+/* look up pjl font number with data storage type. Return 0 on
+ success, 1 if we cannot find the font number and -1 if the data
+ storage type does not exist. Return the font parameters for the
+ requested font number or the font parameters of the first found
+ font for the active resource. */
+static int
+pcl_lookup_pjl_font(pcl_state_t *pcs, int pjl_font_number,
+ pcl_data_storage_t pcl_data_storage, pl_font_params_t *params)
+{
+ pl_dict_enum_t dictp;
+ gs_const_string key;
+ void *value;
+ bool found_resource = false;
+
+ pl_dict_enum_begin(&pcs->soft_fonts, &dictp);
+ while ( pl_dict_enum_next(&dictp, &key, &value) ) {
+ pl_font_t *fp = (pl_font_t *)value;
+ int ds = fp->storage;
+ if ( (int)pcl_data_storage == ds ) {
+ found_resource = true;
+ *params = fp->params;
+ if ( fp->params.pjl_font_number == pjl_font_number ) {
+ return 0;
+ }
+ }
+ }
+ return (found_resource ? 1 : -1);
+}
+
+/* inherit the current pjl font environment */
+ int
+pcl_set_current_font_environment(pcl_state_t *pcs)
+{
+ /* Loop through font resources until we find some fonts. Set up
+ pcl's storage identifier to mirror pjl's */
+ pcl_data_storage_t pcl_data_storage;
+ while( 1 ) {
+ /* get current font source */
+ pjl_envvar_t *fontsource = pjl_proc_get_envvar(pcs->pjls, "fontsource");
+ switch (fontsource[0]) {
+ case 'I':
+ /* NB what happens if pjl command is not I - hmmph? */
+ if (!pl_load_built_in_fonts(pjl_proc_fontsource_to_path(pcs->pjls, fontsource),
+ pcs->memory,
+ &pcs->built_in_fonts,
+ pcs->font_dir, (int)pcds_internal,
+ false /* do not use unicode font names for keys */ ))
+ /* simply continue without fonts if none are found */
+ return 0;
+ pcl_data_storage = pcds_internal;
+ break;
+ case 'S':
+ /* nothing to load */
+ pcl_data_storage = pcds_permanent;
+ break;
+ /* NB we incorrectly treat C, C1, C2... as one collective resource */
+ case 'C':
+ if ( !pl_load_cartridge_fonts(pjl_proc_fontsource_to_path(pcs->pjls, fontsource),
+ pcs->memory,
+ &pcs->cartridge_fonts,
+ pcs->font_dir, (int)pcds_all_cartridges)) {
+ pjl_proc_set_next_fontsource(pcs->pjls);
+ continue; /* try next resource */
+ }
+ pcl_data_storage = pcds_all_cartridges;
+ break;
+ /* NB we incorrectly treat M, M1, M2... as one collective resource */
+ case 'M':
+ if ( !pl_load_simm_fonts(pjl_proc_fontsource_to_path(pcs->pjls, fontsource),
+ pcs->memory,
+ &pcs->simm_fonts,
+ pcs->font_dir, (int)pcds_all_simms)) {
+
+ continue; /* try next resource */
+ }
+ pcl_data_storage = pcds_all_simms;
+ break;
+ default:
+ dprintf("pcfont.c: unknown pjl resource\n");
+ return -1;
+ }
+ {
+ int code;
+ pl_font_params_t params;
+ code = pcl_lookup_pjl_font(pcs,
+ pjl_proc_vartoi(pcs->pjls,
+ pjl_proc_get_envvar(pcs->pjls, "fontnumber")),
+ pcl_data_storage, &params);
+ /* resource found, but if code is 1 we did not match the
+ font number. NB unsure what to do when code == 1. */
+ if ( code >= 0 ) {
+ /* copy parameters to the requested font and
+ apply the other pjl settings to construct the
+ initial font request from pjltrm: "The recommended
+ order for setting FONTNUMBER, FONTSOURCE, and
+ SYMSET is SYMSET first, then FONTSOURCE, then
+ FONTNUMBER". Perhaps this is a clue as to how
+ these interact. We search for the font number in
+ the fontsource and apply pjl's SYMSET, PTSIZE and
+ PITCH to the font we found. That in turn becomes
+ the default requested font */
+ pcs->font_selection[0].params = params;
+ pcs->default_symbol_set_value = pcs->font_selection[0].params.symbol_set;
+ /* NB: The fontsource and fontnumber selection
+ parameters get stepped on next, unless pjl symset,
+ pitch and ptsize are properly updated by the PJL
+ interpreter when the font changes. Our pjl
+ interpreter does not currently do this.
+ Consequently wrong selections are possible. */
+ pcs->default_symbol_set_value = pcs->font_selection[0].params.symbol_set =
+ pjl_proc_map_pjl_sym_to_pcl_sym(pcs->pjls,
+ pjl_proc_get_envvar(pcs->pjls, "symset"));
+ pl_fp_set_pitch_per_inch(&pcs->font_selection[0].params,
+ pjl_proc_vartof(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "pitch")));
+ pcs->font_selection[0].params.height_4ths =
+ pjl_proc_vartof(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "ptsize")) * 4.0;
+ pcs->font_selection[0].font = 0;
+ pcs->font_selection[0].selected_id = (uint)-1;
+ pcs->font_selection[1] = pcs->font_selection[0];
+ pcs->font_selected = primary;
+ pcs->font = 0;
+ }
+ else {
+ /* no resouce found - Note for everything but 'S' this
+ is a double check, since we should have failed when
+ checking for the resource Note this is fatal for
+ internal resources but should be caught above. */
+ pjl_proc_set_next_fontsource(pcs->pjls);
+ continue; /* try next resource */
+
+ }
+ }
+ return 0; /* done */
+ }
+}
+
+static bool
+purge_all(const gs_memory_t *mem, cached_char * cc, void *dummy)
+{
+ return true;
+}
+
+static void
+pcl_unload_resident_fonts(pcl_state_t *pcs)
+{
+ pl_dict_enum_t dictp;
+ gs_const_string key;
+ void *value;
+ /* we'll try to unload everything. The procedure should not
+ affect soft fonts */
+ pl_dict_enum_begin(&pcs->soft_fonts, &dictp);
+ while ( pl_dict_enum_next(&dictp, &key, &value) ) {
+ pl_font_t *plfont = (pl_font_t *)value;
+ if ( plfont->font_file )
+ if ( pl_store_resident_font_data_in_file(plfont->font_file, pcs->memory, plfont) < 0 )
+ dprintf1("%s", "could not store data" );
+
+ }
+}
+
+static void
+pcfont_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{
+ if ((type & pcl_reset_initial) != 0) {
+ pcs->font_dir = gs_font_dir_alloc(pcs->memory);
+ pcs->font = 0;
+ pcs->font_selection[0].font =
+ pcs->font_selection[1].font = 0;
+ pcs->font_selected = primary;
+ pl_dict_init(&pcs->built_in_fonts, pcs->memory, pl_free_font);
+ pl_dict_init(&pcs->soft_fonts, pcs->memory, pl_free_font);
+ pl_dict_init(&pcs->cartridge_fonts, pcs->memory, pl_free_font);
+ pl_dict_init(&pcs->simm_fonts, pcs->memory, pl_free_font);
+ pl_dict_set_parent(&pcs->soft_fonts, &pcs->built_in_fonts);
+ pl_dict_set_parent(&pcs->cartridge_fonts, &pcs->soft_fonts);
+ pl_dict_set_parent(&pcs->simm_fonts, &pcs->cartridge_fonts);
+ }
+ if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay) ) {
+ int code = 0;
+ if ( pcs->personality != rtl )
+ code = pcl_set_current_font_environment(pcs);
+ /* corrupt configuration */
+ if ( code != 0 )
+ exit( 1 );
+ }
+ if ( type & pcl_reset_permanent ) {
+ pcl_unload_resident_fonts(pcs);
+ pl_dict_release(&pcs->soft_fonts);
+ pl_dict_release(&pcs->built_in_fonts);
+ pl_dict_release(&pcs->cartridge_fonts);
+ pl_dict_release(&pcs->simm_fonts);
+ }
+}
+
+const pcl_init_t pcfont_init = {
+ pcfont_do_registration, pcfont_do_reset, 0
+};
diff --git a/pcl/pcfont.h b/pcl/pcfont.h
new file mode 100644
index 000000000..ae436354b
--- /dev/null
+++ b/pcl/pcfont.h
@@ -0,0 +1,118 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfont.h - Definitions for PCL5 fonts */
+
+#ifndef pcfont_INCLUDED
+#define pcfont_INCLUDED
+
+#include "pcstate.h"
+#include "plfont.h"
+
+/*
+ * Clear the font pointer cache. Some non-font operations--removing a
+ * downloaded symbol set, or changing orientations--can cause this.
+ * set == -1 means all.
+ */
+void pcl_decache_font(pcl_state_t * pcs, int set);
+
+/*
+ * Recompute the font if necessary. This is exported for resetting HMI.
+ */
+int pcl_recompute_font(pcl_state_t * pcs);
+
+/*
+ * Do any underlining just before a break in motion (vertical motion or
+ * negative horizontal motion)...
+ */
+#define pcl_break_underline(pcs) \
+ BEGIN \
+ if (pcs->underline_enabled) \
+ pcl_do_underline(pcs); \
+ END
+
+/* ...and then, after repositioning, restart underlining if necessary... */
+#define pcl_continue_underline(pcs) \
+ BEGIN \
+ if (pcs->underline_enabled) \
+ pcs->underline_start = pcs->cap; \
+ END
+
+void pcl_do_underline(pcl_state_t *pcs);
+
+/* Define the common structure of downloaded font headers. */
+typedef struct pcl_font_header_s {
+ byte FontDescriptorSize[2]; /* must be >=64 */
+ byte HeaderFormat;
+ byte FontType;
+ byte StyleMSB;
+ byte Reserved; /* must be 0 */
+ byte BaselinePosition[2];
+ byte CellWidth[2];
+ byte CellHeight[2];
+ byte Orientation;
+ byte Spacing;
+ byte SymbolSet[2];
+ byte Pitch[2];
+ byte Height[2];
+ byte xHeight[2];
+ byte WidthType;
+ byte StyleLSB;
+ byte StrokeWeight;
+ byte TypefaceLSB;
+ byte TypefaceMSB;
+ byte SerifStyle;
+ byte Quality;
+ byte Placement;
+ byte UnderlinePosition;
+ byte UnderlineThickness;
+ byte TextHeight[2];
+ byte TextWidth[2];
+ byte FirstCode[2];
+ byte LastCode[2];
+ byte PitchExtended;
+ byte HeightExtended;
+ byte CapHeight[2];
+ byte FontNumber[4];
+ char FontName[16];
+} pcl_font_header_t;
+
+/* Define the downloaded font header formats. */
+typedef enum {
+ pcfh_bitmap = 0,
+ pcfh_resolution_bitmap = 20,
+ pcfh_intellifont_bound = 10,
+ pcfh_intellifont_unbound = 11,
+ pcfh_truetype = 15,
+ pcfh_truetype_large = 16
+} pcl_font_header_format_t;
+
+/* Define the extended of resolution-specified bitmap font header (type 20). */
+typedef struct pcl_resolution_bitmap_header_s {
+ pcl_font_header_t common;
+ byte XResolution[2];
+ byte YResolution[2];
+ char Copyright[1];
+} pcl_resolution_bitmap_header_t;
+
+/* set the default font environment based on setting from the pjl
+ interpreter */
+int pcl_set_current_font_environment(pcl_state_t *pcs);
+
+/* debugging to to print font parameters */
+#ifdef DEBUG
+void dprint_font_params_t(const pl_font_params_t *pfp);
+#else
+#define dprint_font_params_t(p) DO_NOTHING
+#endif /* DEBUG */
+#endif /* pcfont_INCLUDED */
diff --git a/pcl/pcfontpg.c b/pcl/pcfontpg.c
new file mode 100644
index 000000000..5118e8676
--- /dev/null
+++ b/pcl/pcfontpg.c
@@ -0,0 +1,115 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfontpg - print pcl resident typefaces */
+
+#include "std.h"
+#include "gstypes.h"
+#include "pldict.h"
+#include "pcfont.h"
+#include "pcstate.h"
+#include "pcursor.h"
+#include "pcommand.h"
+
+
+/* utility procedure to print n blank lines */
+static inline void
+print_blank_lines(pcl_state_t *pcs, int count)
+{
+ while( count-- ) {
+ pcl_do_CR(pcs);
+ pcl_do_LF(pcs);
+ }
+}
+/* print a pcl font page. We do a pcl printer reset before and after
+ the font list is printed */
+int
+pcl_print_font_page(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ pl_dict_enum_t font_enum;
+ gs_const_string key;
+ void *value;
+
+ /* reset the printer for a clean page */
+ if ( pcl_do_printer_reset(pcs) < 0 )
+ return -1;
+ /* font page header */
+ {
+ const char *header_str = "PCL Font List";
+ const char *sample_str = "Sample";
+ const char *select_str = "Font Selection Command";
+ uint hlen = strlen(header_str);
+ /* assume the pcl font list string is 1 inch 7200 units */
+ uint pos = pcs->margins.right / 2 - 7200 / 2;
+ pcl_set_cap_x(pcs, pos, false, false);
+ pcl_text(header_str, hlen, pcs, false);
+ print_blank_lines(pcs, 2);
+ pcl_text(sample_str, strlen(sample_str), pcs, false);
+ pcl_set_cap_x(pcs, pcs->margins.right / 2, false, false);
+ pcl_text(select_str, strlen(select_str), pcs, false);
+ print_blank_lines(pcs, 2);
+ }
+
+ /* enumerate all of the fonts */
+ pl_dict_enum_begin(&pcs->soft_fonts, &font_enum);
+ while ( pl_dict_enum_next(&font_enum, &key, &value) ) {
+ pl_font_t *fp = (pl_font_t *)value;
+ pcl_font_selection_t * pfs = &pcs->font_selection[pcs->font_selected];
+ pcl_decache_font(pcs, -1);
+ pfs->params = fp->params;
+ pl_fp_set_pitch_per_inch(&pfs->params, 10);
+ pfs->params.height_4ths = 12 * 4;
+ {
+ const byte *alphabet = "ABCDEFGHIJKLMNOPQRSTUVWYZ";
+ /* current parameters */
+ pl_font_params_t *pfp = &pfs->params;
+ char buff[150];
+ if ( pcl_text(alphabet, strlen(alphabet), pcs, false) < 0 ) {
+ dprintf("pcl_text failed\n" );
+ return 1;
+ }
+ /* go to approx center of the page */
+ pcl_set_cap_x(pcs, pcs->margins.right / 2, false, false);
+ /* create the string command for font selection */
+ sprintf(buff, "<esc>(%u<esc>(s%dp%uv%us%db%dT\n",
+ pfp->symbol_set, (pfp->proportional_spacing ? 1 : 0),
+ pfp->height_4ths / 10, pfp->style, pfp->stroke_weight,
+ pfp->typeface_family);
+ pcl_decache_font(pcs, -1);
+ /* reset to default font and print the select font string */
+ if ( pcl_set_current_font_environment(pcs) < 0 ) {
+ dprintf("pcl_set_current_font_environment failed\n");
+ return -1;
+ }
+ pcl_text(buff, strlen(buff), pcs, false);
+ }
+ print_blank_lines(pcs, 2);
+ }
+ if ( pcl_do_printer_reset(pcs) < 0 )
+ return -1;
+ return 0;
+}
+
+static int
+pcfontpg_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{
+ DEFINE_ESCAPE_ARGS('A', "Print Font Page", pcl_print_font_page, pca_in_rtl);
+ return 0;
+}
+
+const pcl_init_t fontpg_init = {
+ pcfontpg_do_registration, 0, 0
+};
diff --git a/pcl/pcfontst.h b/pcl/pcfontst.h
new file mode 100644
index 000000000..585c10f6d
--- /dev/null
+++ b/pcl/pcfontst.h
@@ -0,0 +1,39 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfontst.h - font information structures for the PCL state */
+
+#include "gx.h"
+#include "plfont.h"
+
+#ifndef pcfontst_INCLUDED
+#define pcfontst_INCLUDED
+
+#ifndef pl_font_t_DEFINED
+# define pl_font_t_DEFINED
+typedef struct pl_font_s pl_font_t;
+#endif
+
+typedef struct pcl_font_selection_s {
+ /* Parameters used for selection, or loaded from font selected by ID. */
+ pl_font_params_t params;
+
+ /* Font found by matching or by ID */
+ pl_font_t * font;
+ uint selected_id;
+
+ /* The symbol map that goes with it. */
+ pl_symbol_map_t * map;
+} pcl_font_selection_t;
+
+#endif /* pcfontst_INCLUDED */
diff --git a/pcl/pcfrgrnd.c b/pcl/pcfrgrnd.c
new file mode 100644
index 000000000..979cf0c6f
--- /dev/null
+++ b/pcl/pcfrgrnd.c
@@ -0,0 +1,268 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfrgrnd.c - PCL foreground object implementation */
+#include "gx.h"
+#include "pcommand.h"
+#include "pcfont.h"
+#include "pcfrgrnd.h"
+
+/* GC routines */
+private_st_frgrnd_t();
+
+
+/*
+ * Free a pcl foreground object.
+ */
+static void
+free_foreground(
+ gs_memory_t * pmem,
+ void * pvfrgrnd,
+ client_name_t cname
+)
+{
+ pcl_frgrnd_t * pfrgrnd = (pcl_frgrnd_t *)pvfrgrnd;
+
+ if (pfrgrnd->pbase != 0)
+ pcl_cs_base_release(pfrgrnd->pbase);
+ if (pfrgrnd->pht != 0)
+ pcl_ht_release(pfrgrnd->pht);
+ if (pfrgrnd->pcrd != 0)
+ pcl_crd_release(pfrgrnd->pcrd);
+ gs_free_object(pmem, pvfrgrnd, cname);
+}
+
+/*
+ * Allocate a pcl foreground object.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+alloc_foreground(
+ pcl_state_t *pcs,
+ pcl_frgrnd_t ** ppfrgrnd,
+ gs_memory_t * pmem
+)
+{
+ pcl_frgrnd_t * pfrgrnd = 0;
+ rc_alloc_struct_1( pfrgrnd,
+ pcl_frgrnd_t,
+ &st_frgrnd_t,
+ pmem,
+ return e_Memory,
+ "allocate pcl foreground object"
+ );
+ pfrgrnd->rc.free = free_foreground;
+ pfrgrnd->id = pcl_next_id(pcs);
+ pfrgrnd->pbase = 0;
+ pfrgrnd->pht = 0;
+ pfrgrnd->pcrd = 0;
+ *ppfrgrnd = pfrgrnd;
+ return 0;
+}
+
+/*
+ * Build a foreground object from a palette object, releasing any exsiting
+ * foreground object.
+ *
+ * There is no "unshare" routine for foreground, as a foreground object cannot
+ * be modified.
+ *
+ * Returns 0 on success, < 0 in the event of an error
+ */
+ static int
+build_foreground(
+ pcl_state_t * pcs,
+ pcl_frgrnd_t ** ppfrgrnd,
+ const pcl_palette_t * ppalet,
+ int pal_entry,
+ gs_memory_t * pmem
+)
+{
+ pcl_frgrnd_t * pfrgrnd = *ppfrgrnd;
+ const pcl_cs_indexed_t * pindexed = ppalet->pindexed;
+ int num_entries = pindexed->num_entries;
+ bool is_default = false;
+ int code = 0;
+
+ /*
+ * Check for a request for the default foreground. Since there are only
+ * three fixed palettes, it is sufficient to check that the palette provided
+ * is fixed and has two entries. The default foreground is black, which is
+ * the second of the two entries.
+ */
+ if ( (pindexed != 0) &&
+ (pindexed->pfixed) &&
+ (num_entries == 2) &&
+ (pal_entry == 1) ) {
+ is_default = true;
+ if (pcs->pdflt_frgrnd != 0) {
+ pcl_frgrnd_copy_from(*ppfrgrnd, pcs->pdflt_frgrnd);
+ return 0;
+ }
+ }
+
+ /* release the existing foreground */
+ if (pfrgrnd != 0) {
+ rc_decrement(pfrgrnd, "build pcl foreground");
+ *ppfrgrnd = 0;
+ }
+
+ if ((code = alloc_foreground(pcs, ppfrgrnd, pmem)) < 0)
+ return code;
+ pfrgrnd = *ppfrgrnd;
+
+ /* pal_entry is interpreted modulo the current palette size */
+ if ((pal_entry < 0) || (pal_entry >= num_entries)) {
+ if (pindexed->is_GL) {
+ int max_pen = num_entries -1;
+ while (pal_entry > max_pen)
+ pal_entry -= max_pen;
+ } else {
+ pal_entry %= num_entries;
+ if (pal_entry < 0)
+ pal_entry += num_entries;
+ }
+ }
+
+ pfrgrnd->is_cmy = (ppalet->pindexed->original_cspace == 1);
+ pfrgrnd->color[0] = pindexed->palette.data[3 * pal_entry];
+ pfrgrnd->color[1] = pindexed->palette.data[3 * pal_entry + 1];
+ pfrgrnd->color[2] = pindexed->palette.data[3 * pal_entry + 2];
+ pcl_cs_base_init_from(pfrgrnd->pbase, ppalet->pindexed->pbase);
+ pcl_ht_init_from(pfrgrnd->pht, ppalet->pht);
+ pcl_crd_init_from(pfrgrnd->pcrd, ppalet->pcrd);
+
+ if (is_default)
+ pcl_frgrnd_init_from(pcs->pdflt_frgrnd, pfrgrnd);
+
+ return 0;
+}
+
+/*
+ * Build the default foreground. This should be called by the reset function
+ * for palettes, and should only be called when the current palette is the
+ * default 2-entry palette.
+ */
+ int
+pcl_frgrnd_set_default_foreground(
+ pcl_state_t * pcs
+)
+{
+ int code = 0;
+
+ /* check that the palette is complete */
+ if ((code = pcl_palette_check_complete(pcs)) < 0)
+ return code;
+
+ return build_foreground( pcs,
+ &(pcs->pfrgrnd),
+ pcs->ppalet,
+ 1,
+ pcs->memory
+ );
+}
+
+/*
+ * ESC * v # S
+ *
+ * Set foreground. It is not clear the handling of negative values is accurate.
+ */
+ static int
+set_foreground(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int code;
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ /* check that the palette is complete */
+ if ((code = pcl_palette_check_complete(pcs)) < 0)
+ return code;
+
+ return build_foreground( pcs,
+ &(pcs->pfrgrnd),
+ pcs->ppalet,
+ int_arg(pargs),
+ pcs->memory
+ );
+}
+
+
+/*
+ * Initialization, reset, and copy procedures.
+ *
+ * There is no reset procedure for this module, as the function is accomplished
+ * by the palette module.
+ */
+ static int
+frgrnd_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'v', 'S',
+ PCL_COMMAND("Set Foreground", set_foreground, pca_neg_ok | pca_raster_graphics)
+ },
+ END_CLASS
+ return 0;
+}
+
+static void
+frgrnd_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{
+ if ( type & (pcl_reset_permanent) ) {
+ rc_decrement(pcs->pfrgrnd, "foreground reset pfrgrnd");
+ rc_decrement(pcs->pdflt_frgrnd, "foreground reset pdflt_frgrnd");
+ rc_decrement(pcs->pwhite_cs, "foreground reset p_white_cs");
+ }
+}
+
+ static int
+frgrnd_do_copy(
+ pcl_state_t * psaved,
+ const pcl_state_t * pcs,
+ pcl_copy_operation_t operation
+)
+{
+ if ((operation & (pcl_copy_before_call | pcl_copy_before_overlay)) != 0)
+ pcl_frgrnd_init_from(psaved->pfrgrnd, pcs->pfrgrnd);
+ else if ((operation & pcl_copy_after) != 0)
+ pcl_frgrnd_release(((pcl_state_t *)pcs)->pfrgrnd);
+ return 0;
+}
+
+/* (white pattern or white foreground color) and transparent pattern
+ * is a NOP
+ */
+bool
+is_invisible_pattern( pcl_state_t *pcs )
+{
+ if ( pcs->pattern_transparent ) {
+ if (pcs->pattern_type == pcl_pattern_solid_white )
+ return true;
+ if ( pcs->pfrgrnd->color[0] == 0xff &&
+ pcs->pfrgrnd->color[1] == 0xff &&
+ pcs->pfrgrnd->color[2] == 0xff )
+ return true; /* NB: depends on CMY conversion to internal RGB */
+ }
+ return false;
+}
+
+
+const pcl_init_t pcl_frgrnd_init = { frgrnd_do_registration, frgrnd_do_reset, frgrnd_do_copy };
diff --git a/pcl/pcfrgrnd.h b/pcl/pcfrgrnd.h
new file mode 100644
index 000000000..95ea9f66d
--- /dev/null
+++ b/pcl/pcfrgrnd.h
@@ -0,0 +1,138 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfrgrnd.h - PCL foreground object */
+
+#ifndef pcfrgrnd_INCLUDED
+# define pcfrgrnd_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "pcstate.h"
+#include "pcommand.h"
+#include "pccsbase.h"
+#include "pcht.h"
+#include "pccrd.h"
+#include "pcpalet.h"
+
+/*
+ * Foreground data structure for PCL 5c; see Chapter 3 of the "PCL 5 Color
+ * Technical Reference Manual". This structure is part of the PCL state.
+ *
+ * The handling of foreground color in PCL 5c is somewhat unintuitive, as
+ * changing parameters that affect the foreground (rendering method, color
+ * palette, etc.) does not affect the foreground until the latter is
+ * explicitly modified. Clearly, this definition reflected HP's particular
+ * implementation: a set of textures (one per component) is generated for
+ * the current color index, current color palette, and current rendering
+ * method when the foreground color command is issued, and this rendered
+ * representation is stored in the PCL state.
+ *
+ * In a system such a Ghostscript graphic library, where rendered
+ * representations are (properly) not visible to the client, a fair amount
+ * of information must be kept to achieve the desired behavior. In essence,
+ * the foreground color maintains the foreground color, base color space,
+ * halfone/transfer function, and CRD with which it was created.
+ *
+ * When necessary, the foreground color also builds one additional color
+ * space, to work around a limitation in the graphics library. All PCL's
+ * built-in patterns (including shades) and format 0 user defined patterns
+ * are, in the PostScript sense, uncolored: they adopt the foreground color
+ * current when they are rendered. Unfortunately, these patterns also have
+ * the transparency property of colored patterns: pixels outside of the mask
+ * can still be opaque. The graphics library does not currently support
+ * opaque rendering of uncolored patterns, so all PCL patterns are rendered
+ * as colored. The foreground will build an indexed color space with two
+ * entries for this purpose.
+ *
+ * The foreground structure is reference-counted. It is also assigned an
+ * identifier, so that we can track when it is necessary to re-render
+ * uncolored patterns.
+ *
+ * HP Bug is_cmy is set when the base colorspace of the foreground color
+ * is CMY.
+ * if foreground colorspace is the different than palette's force black
+ * CMY foreground + RGB raster --> black + raster
+ * RGB foreground + CMY raster --> black + raster
+ * else same colorspaces:
+ * foreground + raster -> fg_color + raster
+ * This is an HP bug in the 4550 4600.
+ */
+struct pcl_frgrnd_s {
+ rc_header rc;
+ pcl_gsid_t id;
+ bool is_cmy; /* NB: see HP Bug above */
+ byte color[3];
+ pcl_cs_base_t * pbase;
+ pcl_ht_t * pht;
+ pcl_crd_t * pcrd;
+};
+
+#ifndef pcl_frgrnd_DEFINED
+#define pcl_frgrnd_DEFINED
+typedef struct pcl_frgrnd_s pcl_frgrnd_t;
+#endif
+
+#define private_st_frgrnd_t() \
+ gs_private_st_ptrs3( st_frgrnd_t, \
+ pcl_frgrnd_t, \
+ "pcl foreground object", \
+ frgrnd_enum_ptrs, \
+ frgrnd_reloc_ptrs, \
+ pbase, \
+ pht, \
+ pcrd \
+ )
+
+/*
+ * The usual init, copy,and release macros.
+ */
+#define pcl_frgrnd_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_frgrnd_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_frgrnd_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_frgrnd_release(pbase) \
+ rc_decrement(pbase, "pcl_frgrnd_release")
+
+/*
+ * Get the base color space type from a foreground object
+ */
+#define pcl_frgrnd_get_cspace(pfrgrnd) ((pfrgrnd)->pbase->type)
+
+/*
+ * Build the default foreground. This should be called by the reset function
+ * for palettes, and should only be called when the current palette is the
+ * default 2-entry palette.
+ */
+int pcl_frgrnd_set_default_foreground(pcl_state_t * pcs);
+
+/* checks for:
+ * (white pattern or white foreground color) and transparent pattern
+ * is a NOP
+ */
+bool
+is_invisible_pattern( pcl_state_t *pcs );
+
+#endif /* pcfrgrnd_INCLUDED */
diff --git a/pcl/pcfsel.c b/pcl/pcfsel.c
new file mode 100644
index 000000000..8fc0644db
--- /dev/null
+++ b/pcl/pcfsel.c
@@ -0,0 +1,487 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfsel.c */
+/* PCL5 / HP-GL/2 font selection */
+#include "stdio_.h" /* stdio for gdebug */
+#include "gdebug.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcfont.h"
+#include "pcfsel.h"
+#include "pcsymbol.h"
+
+/* hack to avoid compiler message */
+#ifndef abs
+extern int abs( int );
+#endif
+
+/* Vector for scoring how well a font matches selection criteria. It
+ * would be nice to do this with a single scalar, but pitch/height in
+ * particular require too much info. Elements of the vector correspond
+ * to the selection criteria, in order - TRM Ch 8. */
+typedef enum {
+ score_first = 0,
+ score_symbol_set=score_first,
+ score_spacing,
+ score_pitch,
+ score_height,
+ score_style,
+ score_weight,
+ score_typeface,
+ score_location,
+ score_orientation,
+ score_fontnumber,
+ score_limit
+} score_index_t;
+typedef int match_score_t[score_limit];
+
+#ifdef DEBUG
+
+static const char * const score_name[] = {
+ "symbol",
+ "spacing",
+ "pitch",
+ "height",
+ "style",
+ "weight",
+ "typeface",
+ "location",
+ "orientation",
+ "fontnumber"
+};
+
+static void
+dprint_cc(const byte *pcc)
+{ dprintf8("cc=%02x %02x %02x %02x %02x %02x %02x %02x", pcc[0],
+ pcc[1], pcc[2], pcc[3], pcc[4], pcc[5], pcc[6], pcc[7]);
+}
+void
+dprint_font_params_t(const pl_font_params_t *pfp)
+{ dprintf8("symset=%u %s pitch=%g ht=%u style=%u wt=%d face=%u:%u\n",
+ pfp->symbol_set,
+ (pfp->proportional_spacing ? "prop." : "fixed"),
+ pl_fp_pitch_cp(pfp) / 100.0, pfp->height_4ths / 4, pfp->style,
+ pfp->stroke_weight, pfp->typeface_family, (0x07FF &pfp->typeface_family) );
+}
+
+#include "plftable.h"
+
+static void
+dprint_font_name(const pl_font_t *pfont)
+{
+ int i;
+ bool found = false;
+
+ for (i = 0; strlen(resident_table[i].full_font_name); i++) {
+ if (!memcmp(&resident_table[i].params,
+ &pfont->params, sizeof(pfont->params))) {
+
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ dprintf1("%s ", resident_table[i].full_font_name);
+ } else {
+ if (pfont->storage == pcds_internal) {
+ dprintf("internal font not found in resident table");
+ dprintf1("%s\n", pfont->font_file);
+ }
+ dprintf("external font ");
+ }
+}
+
+static void
+dprint_font_t(const pl_font_t *pfont)
+{
+ dprint_font_name(pfont);
+ dprintf3("storage=%d scaling=%d type=%d ",
+ pfont->storage, pfont->scaling_technology, pfont->font_type);
+ dprint_cc(pfont->character_complement);
+ dputs(";\n ");
+ dprint_font_params_t(&pfont->params);
+}
+
+static void
+dprintf_font_scoring(const char *type, const pl_font_t *pfont, match_score_t score)
+{
+ int i;
+ dprintf1("%s: ", type);
+ dprint_font_t(pfont);
+ dputs(" score:");
+ for ( i = 0; i < score_limit; ++i )
+ dprintf2(" %s: %d", score_name[i], score[i]);
+ dputs("\n");
+}
+
+#endif
+
+/* Decide whether an unbound font supports a symbol set (mostly
+ convenient setup for pcl_check_symbol_support(). (HAS) Has the
+ peculiar side effect of setting the symbol table to the default if
+ the requested map is not available or to the requested symbol set
+ if it is available. 2 is returned for no matching symbol set, 1 for
+ mismatched vocabulary and 0 if the sets match. */
+static int
+check_support(const pcl_state_t *pcs, uint symbol_set, const pl_font_t *fp,
+ pl_symbol_map_t **mapp)
+{
+ pl_glyph_vocabulary_t gv;
+ byte id[2];
+
+ id[0] = symbol_set >> 8;
+ id[1] = symbol_set;
+ gv = pl_complement_to_vocab(fp->character_complement);
+ *mapp = pcl_find_symbol_map(pcs, id, gv);
+ if ( *mapp == 0 ) {
+ /* Default to Roman 8: 277 0x115 not the default symbol set!
+ * Basically roman8
+ */
+ id[0] = 0x01;
+ id[1] = 0x15;
+ *mapp = pcl_find_symbol_map(pcs, id, gv);
+ return 0; /* worst */
+ }
+
+ if ( pcl_check_symbol_support((*mapp)->character_requirements,
+ fp->character_complement) )
+ return 2; /* best */
+ else
+ return 1;
+}
+
+/* a font may be scalable but we want to treat it a bitmap for the
+ purpose of selection. Right now lineprinter is the only example of
+ this */
+static bool
+font_is_scalable_selection_wise(const pl_font_t *fp)
+{
+ if (fp->params.typeface_family == 0)
+ return false;
+ else
+ return pl_font_is_scalable(fp);
+}
+
+
+/* Compute a font's score against selection parameters. TRM 8-27.
+ * Also set *mapp to the symbol map to be used if this font wins. */
+static void
+score_match(const pcl_state_t *pcs, const pcl_font_selection_t *pfs,
+ const pl_font_t *fp, pl_symbol_map_t **mapp, match_score_t score)
+{
+ int tscore;
+
+ /* 1. Symbol set. 2 for exact match or full support, 1 for
+ * default supported, 0 for no luck. */
+ if ( pl_font_is_bound(fp) )
+ {
+ score[score_symbol_set] =
+ pfs->params.symbol_set == fp->params.symbol_set? 2:
+ (fp->params.symbol_set == pcs->default_symbol_set_value);
+ *mapp = 0; /* bound fonts have no map */
+ }
+ else
+ score[score_symbol_set] = check_support(pcs, pfs->params.symbol_set, fp, mapp);
+ /* 2. Spacing. */
+ score[score_spacing] =
+ pfs->params.proportional_spacing == fp->params.proportional_spacing;
+
+ /* 3. Pitch. */
+ /* Need to score this so that (1) exact match is highest, (2) any
+ * higher-than-requested pitch is better than any lower-than-
+ * requested pitch, (3) within these categories, nearer is better. */
+ if ( pfs->params.proportional_spacing )
+ score[score_pitch] = 0; /* should not influence score */
+ else { /* fixed space selection */
+ if ( fp->params.proportional_spacing )
+ /* scalable; match is worst possible */
+ score[score_pitch] = 0;
+ else {
+ int delta = pl_fp_pitch_per_inch_x100(&fp->params) -
+ pl_fp_pitch_per_inch_x100(&pfs->params);
+
+ /* If within one unit, call it exact; otherwise give
+ * preference to higher pitch than requested. */
+ if (font_is_scalable_selection_wise(fp) || (abs(delta) <= 10 ))
+ score[score_pitch] = 0x2000000;
+ else if ( delta > 0 )
+ score[score_pitch] = 0x2000000 - delta;
+ else
+ score[score_pitch] = 0x1000000 + delta;
+ }
+ }
+ /* 4. Height. */
+ /* Closest match scores highest (no preference for + or -). Otherwise
+ * similar to pitch, and again, values assigned have no meaning out-
+ * side this code. */
+ if ( font_is_scalable_selection_wise(fp) )
+ score[score_height] = 0x1000000;
+ else
+ { int delta = abs(pfs->params.height_4ths - fp->params.height_4ths);
+
+ /* As before, allow one unit of error to appear "exact". */
+ if ( delta <= 1 )
+ delta = 0;
+ score[score_height] = 0x1000000 - delta;
+ }
+
+ /* 5. Style. */
+ if ( pfs->params.style == fp->params.style )
+ score[score_style] = 2;
+ else if ( fp->params.style == 0 && pfs->params.style != 0 )
+ score[score_style] = 1; /* prefer NO style fonts to wrong style */
+ else
+ score[score_style] = 0;
+
+ /* 6. Stroke Weight. */
+ /* If not exact match, prefer closest value away from 0 (more
+ * extreme). If none, then prefer closest value nearer 0. Once
+ * again, the actual values assigned here have no meaning outside
+ * this chunk of code. */
+ { /* Worst cases (font value toward zero from request) 0..13.
+ * Nearest more extreme: 14..21. 21 is exact. */
+ int fwt = fp->params.stroke_weight;
+ int pwt = pfs->params.stroke_weight;
+ int delta = pwt - fwt;
+
+ /* With a little time, this could be collapsed. */
+ if ( pwt >= 0 )
+ if ( fwt >= pwt )
+ tscore = 21 + delta;
+ else
+ tscore = 14 - delta;
+ else
+ if ( fwt <= pwt )
+ tscore = 21 - delta;
+ else
+ tscore = 14 + delta;
+ score[score_weight] = tscore;
+ }
+
+ /* 7. Typeface family. */
+ {
+ uint diff = pfs->params.typeface_family - fp->params.typeface_family;
+ if (diff == 0)
+ score[score_typeface] = 2;
+ else {
+ diff = (pfs->params.typeface_family & 0x7ff) - (fp->params.typeface_family & 0x7ff);
+ if (diff == 0)
+ score[score_typeface] = 1;
+ else
+ score[score_typeface] = 0;
+ }
+ }
+
+ /* 8. Location. */
+ /* Rearrange the value from "storage" into priority for us. We
+ * only care that we get the priority sequence: soft-font, cartridge,
+ * SIMM, and internal, and that we order at least 2 cartridges. (TRM
+ * implies that SIMMs are *not* to be ordered.) Once again, values
+ * assigned here have no external meaning. */
+ /* 1 bit at bottom for SIMM _vs_ internal, then cartridge-number
+ * bits, then soft-font bit at top. */
+ if ( fp->storage & pcds_downloaded )
+ tscore = 1 << (pcds_cartridge_max + 1);
+ else if ( fp->storage & pcds_all_cartridges )
+ tscore = (fp->storage & pcds_all_cartridges) >>
+ (pcds_cartridge_shift - 1);
+ else
+ /* no priority among SIMMs, and internal is 0 */
+ tscore = (fp->storage & pcds_all_simms)? 1: 0;
+ score[score_location] = tscore;
+
+ /* 9. Orientation */
+ if ( fp->scaling_technology != plfst_bitmap )
+ score[score_orientation] = 1;
+ else
+ { pcl_font_header_t *fhp = (pcl_font_header_t *)(fp->header);
+
+ score[score_orientation] = fhp?
+ fhp->Orientation == pcs->xfm_state.lp_orient :
+ 0;
+ }
+
+ /* 10. Location: 11 in the implementors Guide.
+ * lower typeface ID's are better.
+ * supposed to be ordered by bitmap/scalable and SoftFont ... Internal but
+ * these didn't seem to have an effect.
+ *
+ * Lineprinter has a special case, making it harder to accidently select.
+ */
+
+ if (fp->params.typeface_family == 0)
+ score[score_fontnumber] = 0x100000 - fp->params.typeface_family;
+ else
+ score[score_fontnumber] = 0x200000 - fp->params.typeface_family;
+
+#ifdef DEBUG
+ if ( gs_debug_c('=') )
+ dprintf_font_scoring("candidate", fp, score);
+#endif
+
+}
+
+/* Recompute the current font from the descriptive parameters. */
+/* This is used by both PCL and HP-GL/2. */
+int
+pcl_reselect_font(pcl_font_selection_t *pfs, const pcl_state_t *pcs)
+{ if ( pfs->font == 0 )
+ { pl_dict_enum_t dictp;
+ gs_const_string key;
+ void *value;
+ pl_font_t *best_font = 0;
+ pl_symbol_map_t *best_map = 0;
+ pl_symbol_map_t *mapp = 0;
+ match_score_t best_match;
+ score_index_t i;
+
+#ifdef DEBUG
+ if ( gs_debug_c('=') )
+ { dputs("[=]request: ");
+ dprint_font_params_t(&pfs->params);
+ }
+#endif
+ /* if the font table is set up to select character by id
+ we attempt to reselect the font by id. As a fallback
+ we use family selection. NB We do not correctly handle
+ the fonts with alphanumeric id's */
+ if ( (int)pfs->selected_id >= 0 ) {
+ byte id_key[2];
+ void *value;
+ id_key[0] = pfs->selected_id >> 8;
+ id_key[1] = (byte)(pfs->selected_id);
+ if ( pl_dict_find((pl_dict_t *)&pcs->soft_fonts, id_key, 2, &value) ) {
+
+ pfs->font = (pl_font_t *)value;
+ /* probably not necessary */
+ if ( !pl_font_is_bound(pfs->font) ) {
+ if ( check_support(pcs, pfs->params.symbol_set, pfs->font, &pfs->map) )
+ DO_NOTHING;
+ else if ( check_support(pcs, pcs->default_symbol_set_value,
+ pfs->font, &pfs->map)
+ )
+ DO_NOTHING;
+ else { /*
+ * This font doesn't support the required symbol set.
+ * Punt -- map 1-for-1.
+ */
+ }
+ }
+ return 0;
+ }
+ }
+ /* Initialize the best match to be worse than any real font. */
+ for (i=(score_index_t)0; i<score_limit; i++)
+ best_match[i] = -1;
+
+ pl_dict_enum_begin(&pcs->soft_fonts, &dictp);
+ while ( pl_dict_enum_next(&dictp, &key, &value) )
+ { pl_font_t *fp = (pl_font_t *)value;
+ match_score_t match;
+ score_match(pcs, pfs, fp, &mapp, match);
+#ifdef DEBUG
+ if ( gs_debug_c('=') ) {
+ if (best_match[0] != -1) /* skip sentinel */
+ dprintf_font_scoring("best", best_font, best_match);
+ }
+#endif
+ for (i=(score_index_t)0; i<score_limit; i++)
+ if ( match[i] != best_match[i] )
+ {
+ if ( match[i] > best_match[i] )
+ {
+ best_font = fp;
+ best_map = mapp;
+ memcpy((void*)best_match, (void*)match,
+ sizeof(match));
+#ifdef DEBUG
+ if ( gs_debug_c('=') ) {
+ dprintf_font_scoring("usurper", fp, best_match);
+ dprintf1(" better %s***)\n", score_name[i]);
+
+ }
+#endif
+
+ }
+ break;
+ }
+ }
+ if ( best_font == 0 )
+ return -1; /* no fonts */
+#ifdef DEBUG
+ if ( gs_debug_c('=') ) {
+ dprintf_font_scoring("champion", best_font, best_match);
+ }
+#endif
+
+ pfs->font = best_font;
+ pfs->map = best_map;
+ }
+ pfs->selected_id = (uint)-1;
+ return 0;
+}
+
+/* set font parameters after an id selection */
+void
+pcl_set_id_parameters(const pcl_state_t *pcs,
+ pcl_font_selection_t *pfs, pl_font_t *fp, uint id)
+{
+ /* Transfer parameters from the selected font into the selection
+ * parameters, being careful with the softer parameters. */
+ pfs->font = fp;
+ pfs->selected_id = id;
+ pfs->map = 0;
+ if ( pl_font_is_bound(fp) )
+ pfs->params.symbol_set = fp->params.symbol_set;
+ else
+ { if ( check_support(pcs, pfs->params.symbol_set, fp, &pfs->map) )
+ DO_NOTHING;
+ else if ( check_support(pcs, pcs->default_symbol_set_value,
+ fp, &pfs->map)
+ )
+ DO_NOTHING;
+ else
+ { /*
+ * This font doesn't support the required symbol set.
+ * Punt -- map 1-for-1.
+ */
+ }
+ }
+ pfs->params.proportional_spacing = fp->params.proportional_spacing;
+ if ( !pfs->params.proportional_spacing && !pl_font_is_scalable(fp) )
+ pfs->params.pitch = fp->params.pitch;
+ if ( !pl_font_is_scalable(fp) )
+ pfs->params.height_4ths = fp->params.height_4ths;
+ pfs->params.style = fp->params.style;
+ pfs->params.stroke_weight = fp->params.stroke_weight;
+ pfs->params.typeface_family = fp->params.typeface_family;
+ return;
+}
+
+/* Select a font by ID, updating the selection parameters. */
+/* Return 0 normally, 1 if no font was found, or an error code. */
+int
+pcl_select_font_by_id(pcl_font_selection_t *pfs, uint id, pcl_state_t *pcs)
+{ byte id_key[2];
+ void *value;
+ pl_font_t *fp;
+
+ id_key[0] = id >> 8;
+ id_key[1] = (byte)id;
+ if ( !pl_dict_find(&pcs->soft_fonts, id_key, 2, &value) )
+ return 1; /* font not found */
+ fp = (pl_font_t *)value;
+ pcl_set_id_parameters(pcs, pfs, fp, id);
+ return 0;
+}
diff --git a/pcl/pcfsel.h b/pcl/pcfsel.h
new file mode 100644
index 000000000..20617facc
--- /dev/null
+++ b/pcl/pcfsel.h
@@ -0,0 +1,41 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcfsel.h */
+/* Interface to PCL5 / HP-GL/2 font selection */
+
+#ifndef pcfsel_INCLUDED
+# define pcfsel_INCLUDED
+
+#include "pcstate.h"
+
+
+/* Recompute the font from the parameters if necessary. */
+/* This is used by both PCL and HP-GL/2. */
+int pcl_reselect_font(pcl_font_selection_t *pfs, const pcl_state_t *pcs);
+
+/*
+ * Select a font by ID, updating the selection parameters. Return 0
+ * normally, 1 if no font was found, or an error code. The pcl_state_t is
+ * used only for the font and symbol set dictionaries.
+ */
+int pcl_select_font_by_id(pcl_font_selection_t *pfs, uint id,
+ pcl_state_t *pcs);
+
+/* set font parameters after an id selection */
+void
+pcl_set_id_parameters(const pcl_state_t *pcs,
+ pcl_font_selection_t *pfs, pl_font_t *fp, uint id);
+
+
+#endif /* pcfsel_INCLUDED */
diff --git a/pcl/pcht.c b/pcl/pcht.c
new file mode 100644
index 000000000..f2e3fbc3c
--- /dev/null
+++ b/pcl/pcht.c
@@ -0,0 +1,1995 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcht.c - PCL halftone/rendering object implementation */
+#include "gx.h"
+#include "math_.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gsdevice.h"
+#include "gsparam.h"
+#include "gxdevice.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcdither.h"
+#include "pcht.h"
+#include "pcpalet.h"
+#include "pcindxed.h"
+#include "plht.h"
+
+/*
+ * GC routines
+ */
+static
+ENUM_PTRS_BEGIN(ht_dither_enum_ptrs)
+
+ return 0;
+
+ case 1:
+ {
+ pcl_ht_builtin_dither_t * pdither = (pcl_ht_builtin_dither_t *)vptr;
+
+ if (pdither->type == pcl_halftone_Threshold)
+ ENUM_RETURN(pdither->u.thresh.pdata);
+ else if (pdither->type == pcl_halftone_Table_Dither)
+ ENUM_RETURN(pdither->u.tdither.pdata);
+ else
+ return 0;
+ }
+ENUM_PTRS_END
+
+static
+RELOC_PTRS_BEGIN(ht_dither_reloc_ptrs)
+ pcl_ht_builtin_dither_t * pdither = (pcl_ht_builtin_dither_t *)vptr;
+
+ if (pdither->type == pcl_halftone_Threshold)
+ RELOC_VAR(pdither->u.thresh.pdata);
+ else if (pdither->type == pcl_halftone_Table_Dither)
+ RELOC_VAR(pdither->u.tdither.pdata);
+RELOC_PTRS_END
+
+private_st_ht_builtin_dither_t();
+
+
+static
+ENUM_PTRS_BEGIN(ht_enum_ptrs)
+ return 0;
+ ENUM_PTR(0, pcl_ht_t, client_data[0].plktbl);
+ ENUM_PTR(1, pcl_ht_t, client_data[1].plktbl);
+ ENUM_PTR(2, pcl_ht_t, client_data[2].plktbl);
+ ENUM_PTR(3, pcl_ht_t, pdither);
+ ENUM_STRING_PTR(4, pcl_ht_t, thresholds[0]);
+ ENUM_STRING_PTR(5, pcl_ht_t, thresholds[1]);
+ ENUM_STRING_PTR(6, pcl_ht_t, thresholds[2]);
+ ENUM_PTR(7, pcl_ht_t, pfg_ht);
+ ENUM_PTR(8, pcl_ht_t, pim_ht);
+ENUM_PTRS_END
+
+static
+RELOC_PTRS_BEGIN(ht_reloc_ptrs)
+ RELOC_PTR(pcl_ht_t, client_data[0].plktbl);
+ RELOC_PTR(pcl_ht_t, client_data[1].plktbl);
+ RELOC_PTR(pcl_ht_t, client_data[2].plktbl);
+ RELOC_PTR(pcl_ht_t, pdither);
+ RELOC_STRING_PTR(pcl_ht_t, thresholds[0]);
+ RELOC_STRING_PTR(pcl_ht_t, thresholds[1]);
+ RELOC_STRING_PTR(pcl_ht_t, thresholds[2]);
+ RELOC_PTR(pcl_ht_t, pfg_ht);
+ RELOC_PTR(pcl_ht_t, pim_ht);
+RELOC_PTRS_END
+
+private_st_ht_t();
+
+/*
+ * Built-in dither information. The ordered and clustered-ordered dither
+ * matrices are fixed so as to give predictable results when used in combination
+ * with logical operations (raster-ops).
+ */
+static const byte ordered_dither_data[16 * 16] = {
+ 142, 46, 174, 6, 134, 38, 166, 12, 140, 44, 172, 4, 132, 36, 164, 14,
+ 78, 238, 110, 198, 70, 230, 102, 204, 76, 236, 108, 196, 68, 228, 100, 206,
+ 190, 30, 158, 54, 182, 22, 150, 60, 188, 28, 156, 52, 180, 20, 148, 62,
+ 126, 222, 94, 246, 118, 214, 86, 252, 124, 220, 92, 244, 116, 212, 84, 254,
+ 129, 33, 161, 9, 137, 41, 169, 3, 131, 35, 163, 11, 139, 43, 171, 1,
+ 65, 225, 97, 201, 73, 233, 105, 195, 67, 227, 99, 203, 75, 235, 107, 193,
+ 177, 17, 145, 57, 185, 25, 153, 51, 179, 19, 147, 59, 187, 27, 155, 49,
+ 113, 209, 81, 249, 121, 217, 89, 243, 115, 211, 83, 251, 123, 219, 91, 241,
+ 141, 45, 173, 5, 133, 37, 165, 15, 143, 47, 175, 7, 135, 39, 167, 13,
+ 77, 237, 109, 197, 69, 229, 101, 207, 79, 239, 111, 199, 71, 231, 103, 205,
+ 189, 29, 157, 53, 181, 21, 149, 63, 191, 31, 159, 55, 183, 23, 151, 61,
+ 125, 221, 93, 245, 117, 213, 85, 255, 127, 223, 95, 247, 119, 215, 87, 253,
+ 130, 34, 162, 10, 138, 42, 170, 1, 128, 32, 160, 8, 136, 40, 168, 2,
+ 66, 226, 98, 202, 74, 234, 106, 192, 64, 224, 96, 200, 72, 232, 104, 194,
+ 178, 18, 146, 58, 186, 26, 154, 48, 176, 16, 144, 56, 184, 24, 152, 50,
+ 114, 210, 82, 250, 122, 218, 90, 240, 112, 208, 80, 248, 120, 216, 88, 242
+};
+
+static const byte clustered_dither_data[16 * 16] = {
+ 228, 164, 40, 8, 24, 152, 199, 247, 231, 167, 43, 11, 27, 155, 196, 244,
+ 116, 52, 96, 176, 80, 64, 135, 215, 119, 55, 99, 179, 83, 67, 132, 212,
+ 20, 148, 192, 240, 224, 160, 39, 7, 23, 151, 195, 243, 227, 163, 36, 4,
+ 94, 78, 128, 208, 112, 48, 109, 189, 93, 77, 131, 211, 115, 51, 111, 190,
+ 238, 174, 32, 1, 16, 144, 205, 253, 237, 173, 35, 3, 19, 147, 206, 254,
+ 126, 62, 106, 186, 90, 74, 141, 221, 125, 61, 105, 185, 89, 73, 142, 222,
+ 30, 158, 202, 250, 234, 170, 45, 13, 29, 157, 201, 249, 233, 169, 46, 14,
+ 86, 70, 138, 218, 122, 58, 101, 181, 85, 69, 137, 217, 121, 57, 102, 182,
+ 230, 166, 42, 10, 26, 154, 197, 245, 229, 165, 41, 9, 25, 153, 198, 246,
+ 118, 54, 98, 178, 82, 66, 133, 213, 117, 53, 97, 177, 81, 65, 134, 214,
+ 22, 150, 194, 242, 226, 162, 37, 5, 21, 149, 193, 241, 225, 161, 38, 6,
+ 92, 76, 130, 210, 114, 50, 111, 191, 95, 79, 129, 209, 113, 49, 108, 188,
+ 236, 172, 34, 2, 18, 146, 207, 255, 239, 175, 33, 1, 17, 145, 204, 252,
+ 124, 60, 104, 184, 88, 72, 143, 223, 127, 63, 107, 187, 91, 75, 140, 220,
+ 28, 156, 200, 248, 232, 168, 47, 15, 31, 159, 203, 251, 235, 171, 44, 12,
+ 84, 68, 136, 216, 120, 56, 103, 183, 87, 71, 139, 219, 123, 59, 100, 180
+};
+
+static const byte noise_dither_data[128 * 128] = {
+ 112, 122, 183, 239, 27, 78, 115, 52, 204, 212, 6, 114, 72, 134, 205, 61,
+ 1, 38, 91, 107, 30, 206, 115, 168, 184, 7, 148, 32, 16, 195, 103, 191,
+ 15, 121, 109, 64, 246, 184, 48, 208, 245, 220, 34, 187, 216, 30, 35, 148,
+ 30, 167, 189, 158, 38, 9, 209, 51, 114, 133, 82, 29, 137, 240, 245, 73,
+ 196, 27, 97, 54, 28, 9, 62, 201, 80, 202, 253, 183, 50, 6, 47, 92,
+ 152, 73, 47, 81, 91, 10, 46, 191, 55, 119, 199, 188, 39, 178, 122, 212,
+ 230, 16, 151, 203, 178, 96, 176, 62, 172, 50, 102, 148, 190, 117, 85, 105,
+ 183, 85, 107, 222, 88, 181, 171, 47, 82, 106, 58, 240, 46, 142, 195, 214,
+ 1, 223, 24, 174, 203, 89, 151, 99, 154, 184, 138, 80, 238, 31, 186, 148,
+ 51, 132, 166, 183, 216, 63, 231, 10, 214, 105, 82, 120, 74, 27, 62, 146,
+ 194, 182, 129, 171, 49, 119, 160, 122, 90, 27, 101, 128, 105, 243, 115, 9,
+ 1, 59, 210, 129, 190, 99, 207, 140, 53, 68, 159, 33, 195, 118, 148, 94,
+ 244, 75, 40, 187, 94, 41, 71, 163, 37, 25, 112, 129, 115, 72, 148, 190,
+ 177, 124, 32, 34, 101, 52, 137, 249, 150, 164, 135, 233, 140, 145, 93, 246,
+ 43, 215, 98, 242, 144, 2, 124, 252, 18, 71, 126, 207, 64, 195, 161, 48,
+ 160, 114, 201, 115, 182, 129, 6, 118, 48, 126, 206, 184, 55, 16, 210, 108,
+ 57, 70, 201, 45, 169, 10, 240, 46, 166, 98, 92, 251, 13, 127, 175, 245,
+ 118, 158, 239, 18, 155, 254, 106, 72, 237, 70, 204, 48, 24, 245, 145, 236,
+ 212, 244, 44, 22, 86, 3, 76, 110, 10, 170, 133, 52, 179, 84, 174, 237,
+ 85, 98, 74, 35, 17, 115, 145, 246, 215, 72, 229, 181, 63, 171, 2, 32,
+ 96, 122, 13, 149, 234, 254, 221, 191, 85, 217, 174, 56, 168, 247, 225, 107,
+ 209, 204, 108, 243, 120, 173, 218, 74, 43, 64, 28, 90, 59, 77, 165, 200,
+ 53, 28, 107, 186, 240, 37, 202, 30, 95, 246, 224, 6, 20, 237, 154, 217,
+ 166, 18, 75, 11, 230, 80, 156, 62, 20, 72, 239, 2, 22, 169, 95, 148,
+ 254, 94, 147, 139, 249, 198, 161, 124, 226, 47, 59, 28, 210, 106, 95, 44,
+ 243, 203, 73, 209, 35, 143, 96, 164, 141, 162, 57, 255, 223, 84, 123, 130,
+ 240, 73, 147, 95, 234, 165, 209, 21, 196, 138, 79, 222, 204, 135, 53, 69,
+ 113, 202, 231, 244, 163, 70, 212, 87, 168, 203, 243, 14, 106, 172, 37, 217,
+ 131, 209, 176, 239, 105, 136, 120, 154, 227, 125, 147, 7, 144, 220, 206, 19,
+ 162, 240, 133, 6, 155, 22, 207, 236, 223, 104, 2, 210, 227, 26, 11, 98,
+ 89, 173, 132, 66, 201, 79, 104, 150, 38, 221, 134, 184, 4, 73, 254, 133,
+ 237, 34, 253, 50, 112, 219, 241, 23, 211, 172, 143, 146, 74, 177, 252, 119,
+ 214, 54, 176, 97, 242, 213, 32, 178, 107, 55, 69, 219, 102, 194, 221, 140,
+ 139, 61, 39, 192, 205, 86, 1, 170, 169, 129, 227, 4, 14, 201, 110, 113,
+ 78, 232, 143, 217, 16, 231, 221, 152, 201, 151, 94, 57, 181, 12, 172, 63,
+ 188, 149, 116, 16, 48, 160, 6, 78, 218, 255, 54, 193, 228, 192, 100, 156,
+ 236, 167, 53, 134, 23, 177, 1, 235, 135, 109, 68, 10, 22, 173, 180, 1,
+ 58, 44, 237, 89, 68, 193, 149, 35, 95, 203, 7, 156, 139, 187, 197, 33,
+ 159, 110, 243, 93, 32, 235, 84, 244, 122, 45, 27, 57, 12, 116, 228, 223,
+ 87, 7, 223, 111, 212, 247, 155, 120, 109, 174, 32, 41, 208, 36, 77, 232,
+ 33, 182, 128, 206, 14, 135, 86, 157, 189, 229, 88, 228, 77, 120, 81, 7,
+ 233, 2, 121, 252, 69, 212, 182, 22, 36, 235, 153, 47, 232, 135, 41, 165,
+ 167, 104, 157, 242, 175, 136, 29, 42, 26, 163, 180, 239, 100, 223, 156, 200,
+ 138, 223, 235, 75, 230, 84, 251, 62, 23, 127, 96, 155, 1, 76, 19, 226,
+ 74, 3, 91, 155, 78, 132, 116, 204, 219, 207, 81, 251, 121, 143, 212, 237,
+ 224, 27, 186, 141, 94, 5, 115, 189, 16, 181, 245, 117, 170, 222, 234, 49,
+ 231, 192, 125, 166, 182, 127, 80, 51, 77, 14, 156, 83, 141, 189, 101, 21,
+ 19, 116, 53, 249, 84, 9, 5, 204, 215, 136, 228, 13, 251, 3, 164, 28,
+ 131, 67, 146, 1, 105, 68, 177, 43, 170, 25, 197, 15, 21, 233, 173, 152,
+ 152, 29, 80, 218, 251, 228, 160, 59, 71, 12, 179, 88, 157, 92, 75, 23,
+ 38, 82, 50, 198, 107, 203, 77, 254, 214, 68, 98, 250, 85, 25, 40, 124,
+ 254, 60, 206, 111, 200, 125, 134, 185, 164, 104, 191, 3, 126, 166, 83, 220,
+ 29, 197, 250, 103, 243, 158, 152, 218, 228, 153, 170, 42, 248, 198, 150, 104,
+ 169, 9, 146, 99, 53, 231, 172, 19, 238, 61, 110, 114, 253, 113, 88, 158,
+ 65, 200, 24, 1, 44, 219, 129, 205, 138, 220, 162, 233, 68, 171, 61, 131,
+ 150, 70, 193, 192, 38, 141, 73, 190, 203, 43, 130, 65, 137, 66, 64, 103,
+ 225, 30, 247, 84, 62, 116, 156, 236, 121, 153, 137, 38, 255, 64, 179, 39,
+ 174, 78, 181, 111, 122, 97, 137, 46, 194, 224, 101, 117, 242, 220, 53, 177,
+ 2, 178, 31, 120, 192, 116, 91, 51, 126, 36, 7, 142, 227, 255, 70, 134,
+ 21, 95, 40, 165, 211, 24, 175, 102, 80, 227, 22, 141, 143, 64, 197, 34,
+ 44, 192, 216, 123, 101, 87, 35, 60, 51, 118, 24, 164, 30, 43, 63, 70,
+ 121, 254, 69, 206, 242, 106, 134, 213, 71, 167, 216, 37, 1, 107, 24, 75,
+ 33, 222, 136, 59, 7, 169, 106, 158, 248, 198, 100, 187, 199, 36, 236, 88,
+ 227, 170, 133, 45, 229, 167, 110, 61, 123, 90, 248, 163, 213, 121, 153, 188,
+ 42, 93, 136, 16, 191, 56, 19, 199, 150, 227, 208, 216, 195, 224, 132, 215,
+ 200, 151, 247, 94, 79, 50, 125, 198, 207, 58, 68, 250, 193, 49, 33, 171,
+ 149, 252, 111, 59, 39, 229, 19, 249, 45, 43, 211, 56, 202, 72, 125, 191,
+ 183, 105, 233, 150, 219, 186, 45, 15, 39, 224, 139, 4, 43, 28, 208, 131,
+ 179, 83, 17, 90, 31, 117, 141, 69, 64, 159, 110, 240, 194, 142, 252, 185,
+ 252, 130, 226, 54, 219, 80, 163, 230, 248, 48, 109, 166, 12, 85, 143, 148,
+ 26, 174, 35, 188, 157, 113, 46, 81, 145, 177, 5, 142, 209, 149, 39, 193,
+ 149, 125, 33, 99, 187, 76, 89, 217, 51, 194, 168, 35, 1, 205, 176, 178,
+ 187, 58, 158, 22, 12, 103, 172, 82, 65, 8, 130, 40, 129, 100, 168, 41,
+ 140, 175, 222, 230, 241, 136, 238, 126, 109, 150, 144, 172, 114, 67, 138, 249,
+ 218, 207, 140, 14, 164, 118, 193, 215, 251, 137, 117, 226, 13, 205, 233, 60,
+ 20, 47, 196, 69, 90, 194, 239, 79, 198, 25, 93, 238, 56, 182, 50, 157,
+ 226, 151, 203, 67, 59, 100, 182, 2, 66, 139, 166, 205, 36, 12, 102, 79,
+ 65, 23, 202, 128, 63, 208, 144, 180, 62, 201, 125, 87, 184, 228, 205, 168,
+ 120, 86, 1, 56, 10, 214, 245, 114, 123, 103, 92, 76, 140, 232, 108, 180,
+ 54, 94, 135, 173, 234, 152, 101, 122, 134, 81, 24, 104, 238, 250, 147, 144,
+ 83, 193, 74, 165, 141, 71, 248, 209, 167, 126, 37, 246, 87, 192, 253, 125,
+ 15, 66, 108, 187, 8, 176, 180, 87, 185, 9, 226, 43, 89, 147, 98, 188,
+ 150, 17, 123, 93, 102, 6, 58, 190, 186, 87, 145, 108, 20, 33, 83, 146,
+ 173, 204, 57, 249, 5, 153, 241, 174, 154, 184, 77, 97, 81, 250, 169, 7,
+ 39, 133, 113, 255, 178, 214, 86, 162, 188, 26, 14, 242, 233, 161, 145, 4,
+ 220, 131, 76, 42, 36, 160, 29, 86, 175, 132, 214, 154, 79, 126, 100, 20,
+ 210, 238, 60, 99, 229, 208, 74, 40, 163, 34, 225, 23, 67, 8, 170, 54,
+ 67, 179, 244, 1, 30, 158, 42, 52, 233, 246, 117, 8, 56, 96, 92, 17,
+ 222, 118, 232, 252, 48, 159, 231, 109, 51, 111, 188, 9, 11, 26, 75, 50,
+ 116, 44, 21, 60, 37, 100, 215, 17, 213, 20, 81, 124, 211, 234, 6, 26,
+ 230, 183, 18, 66, 80, 131, 88, 153, 195, 169, 4, 32, 97, 139, 166, 248,
+ 91, 117, 142, 8, 103, 123, 132, 58, 170, 248, 55, 107, 120, 237, 216, 112,
+ 58, 172, 222, 11, 241, 48, 238, 146, 95, 127, 34, 199, 114, 55, 93, 210,
+ 179, 82, 147, 13, 118, 1, 250, 112, 66, 3, 31, 225, 247, 50, 21, 211,
+ 197, 139, 249, 160, 91, 164, 181, 19, 241, 147, 211, 52, 69, 253, 118, 13,
+ 200, 224, 29, 231, 199, 12, 131, 243, 154, 79, 191, 209, 68, 44, 97, 196,
+ 211, 20, 190, 113, 234, 35, 202, 155, 144, 250, 63, 217, 96, 123, 104, 18,
+ 202, 19, 56, 244, 42, 149, 189, 13, 128, 90, 40, 199, 65, 208, 159, 85,
+ 106, 155, 161, 23, 185, 176, 158, 81, 92, 112, 235, 144, 132, 188, 75, 89,
+ 26, 108, 12, 214, 13, 110, 27, 71, 124, 213, 61, 86, 89, 41, 232, 152,
+ 8, 119, 57, 45, 108, 77, 137, 46, 195, 230, 98, 213, 65, 16, 232, 128,
+ 185, 56, 40, 229, 136, 60, 190, 153, 123, 161, 159, 215, 116, 129, 30, 96,
+ 47, 58, 25, 155, 135, 75, 153, 49, 179, 137, 22, 72, 82, 11, 255, 41,
+ 26, 4, 226, 102, 165, 124, 221, 39, 189, 254, 140, 105, 100, 37, 138, 161,
+ 5, 34, 237, 163, 143, 119, 164, 220, 2, 101, 36, 180, 145, 142, 79, 230,
+ 34, 76, 197, 5, 83, 64, 229, 161, 167, 95, 133, 55, 3, 142, 221, 173,
+ 247, 141, 1, 228, 41, 71, 65, 11, 197, 55, 241, 189, 238, 37, 99, 8,
+ 88, 146, 205, 234, 221, 151, 161, 199, 177, 11, 121, 179, 242, 130, 201, 147,
+ 246, 200, 175, 156, 215, 189, 89, 208, 61, 157, 33, 106, 165, 20, 193, 186,
+ 251, 127, 183, 72, 15, 103, 241, 105, 41, 195, 192, 8, 232, 102, 198, 151,
+ 239, 204, 216, 165, 183, 97, 251, 226, 111, 196, 175, 234, 167, 185, 213, 227,
+ 71, 159, 132, 186, 98, 63, 197, 180, 162, 93, 151, 127, 185, 157, 91, 235,
+ 110, 90, 49, 133, 108, 4, 29, 85, 73, 235, 23, 196, 181, 60, 244, 218,
+ 156, 112, 163, 127, 102, 77, 248, 31, 154, 219, 246, 240, 253, 45, 178, 225,
+ 96, 47, 213, 61, 62, 130, 1, 224, 168, 24, 46, 127, 159, 28, 199, 54,
+ 135, 46, 119, 253, 92, 247, 225, 144, 236, 44, 252, 136, 31, 65, 10, 180,
+ 184, 82, 124, 224, 138, 211, 126, 171, 169, 130, 229, 181, 140, 52, 223, 160,
+ 221, 174, 25, 157, 18, 84, 45, 194, 83, 111, 78, 239, 14, 38, 255, 217,
+ 128, 3, 90, 191, 168, 42, 218, 206, 247, 63, 212, 115, 194, 146, 70, 112,
+ 216, 21, 113, 255, 145, 25, 78, 83, 202, 57, 15, 225, 128, 242, 220, 14,
+ 76, 207, 149, 243, 185, 53, 241, 66, 91, 117, 162, 160, 171, 17, 3, 200,
+ 210, 93, 190, 131, 217, 196, 134, 119, 11, 25, 186, 54, 104, 28, 99, 52,
+ 74, 103, 177, 162, 225, 236, 206, 114, 154, 5, 67, 210, 253, 219, 113, 173,
+ 176, 42, 67, 187, 52, 36, 178, 122, 162, 66, 109, 18, 101, 128, 222, 49,
+ 99, 231, 18, 73, 5, 245, 21, 49, 15, 76, 88, 32, 38, 249, 84, 111,
+ 97, 138, 92, 4, 235, 176, 67, 196, 142, 17, 244, 51, 57, 70, 182, 171,
+ 130, 250, 78, 109, 94, 119, 29, 15, 9, 152, 87, 17, 143, 31, 121, 55,
+ 49, 198, 86, 175, 139, 245, 236, 10, 218, 59, 40, 31, 60, 207, 27, 69,
+ 8, 91, 169, 180, 237, 88, 156, 197, 170, 95, 70, 33, 45, 209, 155, 125,
+ 102, 175, 32, 206, 187, 83, 223, 1, 137, 250, 79, 132, 173, 197, 159, 231,
+ 4, 205, 84, 71, 231, 93, 203, 157, 130, 202, 251, 165, 222, 139, 85, 39,
+ 207, 181, 78, 245, 161, 217, 156, 251, 36, 81, 149, 200, 130, 249, 9, 69,
+ 126, 62, 171, 178, 61, 250, 141, 156, 79, 82, 184, 157, 144, 72, 41, 148,
+ 232, 20, 79, 220, 75, 255, 137, 15, 236, 139, 199, 243, 104, 159, 168, 229,
+ 123, 154, 57, 242, 138, 248, 45, 236, 246, 160, 8, 218, 113, 225, 135, 112,
+ 119, 170, 221, 58, 195, 153, 192, 237, 245, 136, 99, 86, 82, 63, 210, 32,
+ 101, 127, 232, 251, 10, 247, 100, 79, 121, 227, 136, 158, 201, 17, 87, 254,
+ 72, 14, 243, 150, 237, 103, 198, 106, 186, 191, 89, 229, 64, 177, 26, 81,
+ 228, 34, 50, 170, 224, 59, 15, 67, 17, 110, 151, 87, 164, 119, 41, 148,
+ 115, 97, 60, 5, 136, 112, 190, 13, 234, 139, 183, 246, 187, 22, 94, 55,
+ 4, 212, 253, 136, 185, 101, 215, 65, 175, 139, 47, 90, 174, 114, 107, 225,
+ 56, 242, 119, 90, 36, 192, 148, 47, 179, 23, 149, 35, 202, 76, 212, 248,
+ 118, 211, 232, 26, 189, 223, 153, 73, 103, 81, 237, 167, 7, 197, 49, 165,
+ 231, 77, 156, 90, 166, 18, 219, 116, 27, 36, 142, 209, 145, 252, 69, 13,
+ 205, 147, 223, 32, 63, 157, 167, 113, 22, 249, 58, 219, 11, 173, 104, 236,
+ 144, 48, 214, 227, 242, 158, 21, 142, 163, 108, 13, 118, 128, 35, 201, 6,
+ 126, 141, 98, 210, 105, 254, 169, 123, 187, 65, 43, 223, 3, 49, 190, 20,
+ 165, 129, 228, 15, 30, 38, 88, 53, 163, 56, 21, 109, 227, 158, 121, 170,
+ 237, 109, 93, 43, 120, 166, 32, 7, 201, 29, 115, 49, 20, 55, 13, 214,
+ 133, 1, 145, 204, 171, 87, 223, 18, 107, 200, 114, 53, 123, 59, 135, 24,
+ 202, 108, 179, 171, 114, 162, 100, 14, 20, 207, 143, 182, 224, 80, 147, 184,
+ 34, 187, 11, 193, 255, 52, 76, 102, 78, 151, 2, 114, 130, 238, 128, 39,
+ 54, 46, 75, 142, 139, 42, 211, 28, 1, 108, 181, 199, 47, 131, 186, 71,
+ 55, 94, 124, 190, 38, 164, 54, 68, 212, 59, 30, 47, 78, 101, 130, 246,
+ 146, 132, 253, 22, 138, 21, 37, 186, 103, 56, 12, 234, 204, 255, 238, 107,
+ 206, 113, 39, 68, 239, 73, 194, 119, 80, 122, 8, 214, 223, 43, 82, 197,
+ 30, 131, 66, 198, 94, 206, 48, 239, 6, 248, 221, 227, 189, 197, 241, 54,
+ 173, 102, 178, 42, 100, 194, 127, 230, 66, 10, 170, 89, 7, 85, 45, 189,
+ 34, 66, 1, 70, 203, 90, 61, 1, 38, 124, 47, 74, 25, 87, 48, 245,
+ 100, 246, 134, 21, 94, 38, 5, 131, 203, 230, 49, 181, 178, 111, 173, 207,
+ 250, 50, 15, 200, 141, 235, 102, 165, 74, 143, 198, 106, 129, 97, 221, 13,
+ 234, 138, 58, 33, 119, 160, 219, 42, 82, 218, 230, 181, 91, 20, 97, 170,
+ 28, 160, 44, 246, 177, 36, 158, 116, 243, 181, 155, 161, 218, 201, 127, 145,
+ 198, 255, 216, 173, 154, 204, 92, 243, 93, 48, 49, 180, 114, 224, 193, 240,
+ 80, 18, 199, 240, 21, 142, 76, 87, 78, 89, 27, 226, 42, 238, 172, 128,
+ 130, 195, 33, 150, 77, 52, 210, 131, 95, 201, 147, 177, 193, 142, 88, 49,
+ 29, 156, 133, 51, 209, 210, 77, 227, 69, 126, 41, 163, 50, 84, 128, 169,
+ 122, 208, 92, 217, 53, 1, 20, 188, 115, 154, 239, 242, 226, 223, 31, 68,
+ 68, 174, 82, 98, 203, 246, 185, 1, 118, 52, 183, 94, 128, 207, 76, 233,
+ 153, 86, 109, 241, 254, 80, 17, 188, 16, 145, 90, 162, 253, 43, 213, 189,
+ 162, 72, 191, 193, 239, 136, 112, 214, 82, 66, 226, 142, 40, 23, 252, 8,
+ 50, 6, 87, 218, 172, 71, 135, 238, 166, 141, 29, 247, 101, 11, 70, 177,
+ 143, 40, 155, 192, 200, 63, 176, 152, 64, 246, 162, 117, 179, 96, 251, 105,
+ 166, 28, 99, 213, 185, 197, 6, 82, 111, 239, 25, 169, 109, 157, 69, 183,
+ 79, 95, 174, 98, 22, 42, 173, 104, 9, 214, 31, 230, 188, 249, 16, 131,
+ 161, 66, 55, 249, 196, 157, 233, 65, 33, 103, 1, 214, 4, 109, 42, 159,
+ 134, 234, 220, 149, 212, 64, 83, 40, 6, 44, 172, 230, 56, 162, 80, 248,
+ 23, 208, 1, 117, 205, 56, 96, 236, 62, 73, 127, 245, 195, 235, 51, 15,
+ 86, 113, 209, 111, 74, 172, 54, 92, 109, 7, 19, 194, 144, 173, 73, 60,
+ 66, 116, 132, 104, 52, 7, 17, 117, 145, 79, 233, 12, 96, 140, 155, 24,
+ 254, 119, 165, 220, 243, 10, 183, 234, 207, 11, 39, 110, 5, 132, 147, 205,
+ 51, 65, 240, 254, 160, 41, 115, 216, 68, 12, 128, 37, 175, 21, 215, 235,
+ 215, 190, 116, 235, 94, 64, 152, 194, 92, 52, 146, 82, 99, 17, 136, 40,
+ 28, 16, 171, 160, 98, 35, 164, 117, 93, 200, 59, 189, 124, 132, 190, 81,
+ 190, 20, 29, 114, 146, 73, 27, 124, 214, 23, 229, 159, 48, 189, 137, 19,
+ 178, 77, 211, 168, 133, 172, 3, 98, 131, 36, 18, 203, 113, 65, 143, 146,
+ 184, 13, 133, 64, 16, 247, 27, 207, 47, 124, 62, 211, 83, 99, 182, 237,
+ 148, 25, 42, 184, 18, 211, 108, 185, 103, 100, 213, 179, 254, 40, 176, 57,
+ 108, 1, 81, 44, 222, 35, 125, 98, 223, 191, 138, 154, 22, 73, 218, 51,
+ 96, 3, 121, 188, 161, 26, 101, 247, 246, 132, 54, 217, 39, 122, 1, 245,
+ 10, 27, 252, 183, 130, 120, 3, 180, 129, 244, 204, 186, 228, 196, 58, 220,
+ 137, 110, 232, 44, 216, 140, 80, 247, 113, 37, 175, 15, 206, 174, 251, 62,
+ 57, 107, 241, 151, 67, 9, 96, 253, 18, 164, 217, 179, 216, 116, 213, 55,
+ 12, 248, 232, 70, 179, 114, 207, 240, 154, 60, 107, 161, 104, 217, 40, 4,
+ 143, 46, 80, 58, 131, 212, 117, 76, 96, 120, 30, 196, 149, 106, 77, 53,
+ 35, 188, 196, 175, 133, 106, 41, 65, 150, 1, 98, 47, 126, 230, 157, 201,
+ 97, 167, 204, 149, 86, 14, 124, 228, 247, 181, 224, 36, 137, 230, 91, 74,
+ 55, 73, 5, 140, 205, 125, 61, 30, 93, 153, 32, 234, 117, 206, 9, 19,
+ 178, 12, 60, 119, 97, 121, 161, 144, 11, 62, 19, 229, 72, 213, 247, 134,
+ 197, 57, 108, 228, 70, 12, 125, 201, 85, 202, 41, 213, 48, 138, 184, 205,
+ 240, 122, 78, 171, 41, 191, 239, 12, 110, 119, 84, 35, 206, 177, 140, 152,
+ 183, 100, 165, 215, 85, 29, 8, 148, 180, 238, 224, 134, 247, 204, 228, 92,
+ 90, 225, 118, 180, 250, 25, 51, 179, 178, 101, 244, 154, 232, 220, 91, 185,
+ 134, 31, 152, 248, 124, 208, 23, 241, 203, 72, 27, 89, 192, 26, 33, 212,
+ 202, 25, 121, 235, 196, 133, 168, 17, 50, 233, 28, 92, 182, 169, 252, 15,
+ 152, 58, 219, 120, 113, 86, 8, 72, 207, 224, 105, 136, 176, 83, 227, 14,
+ 166, 158, 231, 254, 177, 88, 195, 37, 105, 168, 191, 125, 33, 115, 23, 155,
+ 248, 176, 73, 26, 167, 243, 152, 88, 168, 141, 74, 7, 118, 61, 250, 212,
+ 133, 38, 26, 16, 176, 51, 204, 150, 154, 255, 120, 61, 25, 166, 243, 65,
+ 88, 37, 115, 24, 209, 123, 49, 166, 126, 255, 44, 9, 28, 76, 156, 50,
+ 229, 195, 219, 1, 14, 208, 236, 89, 134, 38, 70, 1, 200, 24, 6, 114,
+ 86, 54, 110, 74, 178, 209, 235, 160, 59, 210, 225, 226, 10, 111, 162, 84,
+ 229, 130, 70, 177, 103, 75, 188, 46, 104, 159, 99, 164, 100, 12, 53, 122,
+ 226, 196, 167, 92, 48, 155, 112, 172, 78, 63, 40, 4, 98, 221, 74, 144,
+ 24, 39, 212, 96, 145, 59, 217, 251, 255, 36, 85, 76, 13, 91, 193, 172,
+ 129, 30, 123, 95, 17, 185, 54, 107, 235, 104, 180, 51, 14, 169, 149, 91,
+ 202, 182, 92, 210, 130, 193, 123, 85, 49, 2, 208, 226, 112, 14, 86, 43,
+ 157, 202, 129, 52, 249, 53, 99, 46, 200, 87, 31, 74, 169, 167, 120, 141,
+ 100, 176, 150, 11, 29, 163, 88, 156, 221, 52, 168, 230, 174, 115, 45, 248,
+ 1, 128, 232, 215, 62, 169, 16, 85, 174, 189, 143, 120, 77, 63, 242, 142,
+ 38, 2, 56, 85, 209, 151, 52, 244, 77, 193, 113, 9, 219, 194, 160, 34,
+ 22, 34, 250, 164, 233, 225, 222, 190, 182, 251, 163, 118, 146, 64, 244, 181,
+ 137, 67, 107, 208, 239, 75, 18, 4, 205, 200, 139, 159, 56, 102, 234, 148,
+ 198, 9, 147, 182, 234, 143, 224, 43, 254, 24, 121, 155, 211, 106, 72, 19,
+ 81, 7, 194, 138, 184, 196, 62, 109, 228, 99, 161, 89, 72, 178, 4, 93,
+ 95, 174, 22, 226, 125, 71, 182, 93, 7, 184, 105, 152, 121, 27, 233, 220,
+ 33, 183, 26, 240, 63, 121, 81, 102, 61, 97, 166, 199, 233, 167, 159, 57,
+ 19, 195, 244, 105, 20, 253, 137, 58, 102, 51, 229, 76, 236, 131, 32, 202,
+ 145, 67, 24, 211, 217, 231, 134, 59, 106, 146, 127, 60, 31, 71, 216, 150,
+ 124, 162, 110, 27, 94, 187, 71, 16, 228, 50, 151, 165, 143, 11, 17, 180,
+ 122, 201, 192, 28, 164, 142, 181, 219, 109, 21, 93, 5, 43, 68, 176, 199,
+ 127, 22, 89, 150, 199, 84, 101, 215, 3, 133, 148, 96, 162, 83, 120, 45,
+ 77, 21, 105, 60, 34, 168, 252, 5, 153, 69, 36, 224, 160, 132, 24, 244,
+ 57, 151, 75, 225, 135, 155, 239, 34, 171, 67, 10, 116, 66, 39, 61, 251,
+ 94, 147, 55, 69, 171, 32, 215, 242, 140, 249, 48, 79, 217, 68, 189, 245,
+ 95, 147, 221, 37, 205, 125, 219, 46, 28, 83, 220, 146, 182, 90, 61, 3,
+ 95, 195, 123, 255, 187, 88, 118, 23, 163, 186, 140, 213, 8, 58, 153, 83,
+ 81, 57, 154, 186, 231, 249, 46, 126, 134, 29, 116, 44, 67, 141, 43, 97,
+ 2, 106, 240, 89, 117, 243, 83, 65, 187, 198, 150, 111, 238, 86, 30, 141,
+ 220, 244, 79, 64, 60, 225, 67, 6, 29, 97, 179, 194, 50, 253, 204, 105,
+ 242, 117, 148, 163, 31, 222, 126, 238, 3, 245, 30, 195, 37, 218, 188, 53,
+ 45, 185, 111, 122, 199, 252, 63, 176, 221, 19, 222, 84, 194, 140, 192, 69,
+ 10, 241, 135, 206, 137, 78, 227, 42, 125, 188, 216, 31, 108, 35, 129, 128,
+ 151, 191, 127, 45, 231, 14, 64, 168, 144, 167, 252, 44, 67, 171, 153, 123,
+ 135, 210, 1, 173, 3, 111, 242, 170, 26, 68, 203, 84, 245, 208, 116, 129,
+ 209, 38, 191, 129, 31, 218, 62, 156, 108, 80, 184, 203, 60, 106, 174, 214,
+ 54, 241, 175, 132, 110, 206, 53, 226, 170, 140, 216, 233, 250, 221, 101, 127,
+ 10, 40, 87, 135, 241, 47, 139, 25, 172, 75, 218, 229, 146, 8, 23, 222,
+ 215, 39, 225, 192, 66, 145, 144, 90, 103, 187, 59, 135, 175, 115, 231, 111,
+ 5, 193, 139, 216, 11, 110, 25, 210, 41, 244, 136, 196, 147, 112, 2, 149,
+ 122, 175, 213, 104, 197, 192, 153, 9, 235, 5, 152, 75, 198, 2, 95, 18,
+ 4, 237, 75, 138, 159, 91, 107, 164, 186, 118, 2, 199, 222, 99, 34, 250,
+ 57, 190, 19, 102, 158, 37, 69, 180, 16, 249, 33, 236, 232, 161, 45, 112,
+ 13, 252, 237, 70, 208, 103, 138, 158, 211, 2, 241, 84, 91, 198, 253, 238,
+ 71, 222, 149, 35, 32, 6, 151, 46, 44, 78, 253, 55, 15, 157, 63, 185,
+ 165, 186, 183, 227, 126, 163, 177, 158, 240, 112, 46, 56, 236, 191, 144, 71,
+ 218, 246, 113, 150, 245, 97, 33, 117, 252, 36, 9, 210, 5, 14, 83, 139,
+ 248, 187, 83, 25, 196, 115, 156, 49, 21, 4, 41, 147, 191, 52, 210, 146,
+ 112, 30, 166, 200, 40, 49, 70, 141, 104, 215, 144, 228, 110, 92, 43, 168,
+ 195, 237, 54, 104, 66, 53, 236, 193, 228, 241, 57, 48, 234, 99, 215, 242,
+ 113, 240, 51, 190, 45, 11, 237, 206, 212, 62, 228, 150, 245, 47, 103, 200,
+ 72, 113, 226, 222, 1, 156, 27, 118, 177, 88, 49, 116, 175, 240, 150, 109,
+ 157, 52, 139, 181, 252, 6, 151, 135, 164, 94, 193, 232, 192, 116, 85, 202,
+ 133, 192, 117, 99, 151, 248, 123, 162, 107, 167, 223, 155, 9, 69, 39, 210,
+ 171, 27, 230, 108, 228, 195, 15, 20, 208, 209, 128, 102, 169, 202, 43, 254,
+ 63, 205, 45, 2, 240, 33, 105, 17, 110, 93, 250, 134, 38, 230, 22, 78,
+ 38, 88, 253, 224, 185, 8, 81, 219, 76, 186, 173, 32, 114, 62, 153, 227,
+ 246, 42, 68, 211, 40, 203, 254, 144, 108, 149, 115, 196, 177, 50, 125, 201,
+ 32, 112, 204, 172, 182, 84, 152, 66, 72, 196, 149, 246, 186, 14, 122, 138,
+ 253, 165, 138, 202, 111, 59, 179, 234, 18, 137, 237, 160, 139, 254, 192, 117,
+ 72, 235, 227, 121, 60, 169, 19, 166, 11, 97, 54, 152, 16, 239, 160, 209,
+ 160, 25, 221, 255, 45, 75, 83, 56, 181, 203, 6, 101, 23, 136, 112, 50,
+ 11, 45, 141, 76, 148, 185, 53, 133, 25, 159, 78, 187, 220, 103, 178, 52,
+ 149, 172, 144, 216, 167, 243, 218, 132, 61, 174, 219, 204, 202, 127, 244, 135,
+ 14, 240, 137, 67, 115, 174, 255, 28, 134, 183, 52, 84, 199, 252, 27, 78,
+ 26, 179, 145, 96, 81, 151, 183, 118, 138, 187, 84, 56, 90, 23, 34, 173,
+ 93, 70, 159, 248, 133, 29, 59, 170, 102, 124, 75, 31, 58, 148, 68, 225,
+ 33, 52, 24, 2, 77, 135, 45, 252, 112, 169, 14, 208, 56, 20, 93, 70,
+ 201, 4, 10, 172, 112, 115, 88, 36, 178, 26, 141, 99, 176, 76, 22, 110,
+ 164, 228, 73, 195, 197, 240, 217, 4, 27, 53, 85, 242, 120, 163, 87, 152,
+ 181, 81, 49, 203, 60, 223, 161, 93, 95, 162, 56, 134, 123, 229, 70, 156,
+ 72, 117, 107, 179, 183, 91, 70, 8, 192, 67, 225, 113, 106, 166, 1, 87,
+ 116, 177, 158, 33, 196, 231, 156, 69, 124, 39, 4, 235, 16, 189, 210, 143,
+ 131, 124, 174, 11, 163, 112, 8, 28, 168, 221, 2, 18, 7, 156, 140, 78,
+ 142, 34, 3, 219, 100, 236, 120, 218, 117, 176, 4, 40, 94, 210, 169, 28,
+ 106, 188, 92, 110, 215, 204, 75, 166, 61, 22, 224, 251, 206, 214, 10, 36,
+ 84, 103, 212, 44, 196, 67, 211, 226, 66, 34, 215, 247, 254, 119, 63, 18,
+ 89, 46, 52, 12, 109, 134, 19, 166, 198, 142, 47, 72, 188, 205, 234, 245,
+ 41, 84, 219, 145, 16, 19, 96, 152, 217, 7, 164, 147, 39, 226, 37, 112,
+ 19, 162, 9, 160, 129, 203, 186, 168, 99, 48, 118, 60, 143, 54, 84, 40,
+ 249, 184, 95, 60, 101, 142, 35, 205, 37, 17, 94, 179, 182, 20, 3, 154,
+ 89, 44, 51, 128, 247, 166, 159, 43, 109, 154, 226, 63, 3, 32, 148, 171,
+ 195, 252, 52, 98, 131, 41, 184, 220, 173, 50, 146, 187, 42, 6, 53, 20,
+ 134, 83, 28, 128, 124, 162, 143, 79, 209, 216, 167, 42, 178, 73, 8, 43,
+ 174, 80, 9, 236, 129, 91, 251, 98, 150, 195, 5, 48, 243, 130, 224, 8,
+ 8, 20, 124, 121, 54, 94, 178, 111, 40, 200, 10, 140, 218, 7, 18, 60,
+ 61, 180, 165, 79, 239, 72, 177, 138, 132, 18, 126, 100, 80, 200, 174, 244,
+ 44, 161, 208, 125, 253, 232, 50, 65, 242, 199, 58, 236, 151, 119, 108, 215,
+ 25, 45, 209, 160, 128, 147, 1, 29, 123, 208, 155, 99, 86, 107, 204, 139,
+ 143, 182, 248, 101, 238, 97, 76, 200, 197, 67, 119, 92, 198, 122, 47, 250,
+ 154, 119, 18, 140, 254, 26, 92, 157, 222, 235, 69, 101, 251, 160, 161, 132,
+ 105, 63, 154, 232, 31, 203, 38, 238, 47, 153, 186, 32, 140, 185, 152, 19,
+ 33, 46, 220, 114, 2, 65, 126, 180, 140, 189, 90, 53, 51, 71, 78, 198,
+ 183, 185, 215, 36, 15, 193, 122, 43, 82, 64, 115, 3, 168, 230, 157, 236,
+ 255, 17, 237, 98, 120, 46, 63, 249, 201, 241, 42, 89, 30, 1, 149, 191,
+ 112, 209, 95, 137, 214, 154, 98, 37, 221, 159, 24, 139, 234, 249, 69, 207,
+ 193, 165, 108, 132, 192, 167, 221, 93, 140, 61, 66, 1, 225, 73, 163, 223,
+ 69, 239, 6, 191, 110, 91, 5, 49, 142, 217, 41, 252, 58, 188, 129, 214,
+ 89, 33, 165, 227, 16, 121, 174, 64, 48, 137, 194, 115, 114, 233, 85, 217,
+ 196, 16, 161, 44, 91, 163, 230, 1, 200, 13, 243, 131, 119, 245, 219, 228,
+ 107, 199, 244, 143, 64, 221, 28, 41, 122, 101, 255, 30, 42, 133, 89, 182,
+ 232, 147, 249, 66, 250, 24, 225, 148, 159, 247, 212, 165, 90, 204, 141, 97,
+ 142, 194, 10, 106, 170, 166, 216, 109, 75, 231, 192, 50, 135, 118, 86, 215,
+ 231, 251, 53, 73, 75, 28, 128, 10, 184, 94, 11, 170, 5, 163, 18, 177,
+ 222, 15, 65, 120, 247, 53, 239, 75, 243, 232, 216, 171, 246, 63, 41, 117,
+ 172, 19, 150, 222, 161, 212, 16, 116, 31, 178, 169, 9, 220, 77, 94, 100,
+ 15, 181, 74, 221, 205, 65, 231, 99, 17, 1, 88, 244, 191, 178, 105, 54,
+ 247, 217, 181, 68, 220, 55, 103, 149, 78, 120, 85, 82, 54, 104, 95, 147,
+ 148, 29, 82, 186, 155, 168, 197, 231, 170, 217, 228, 70, 156, 25, 225, 118,
+ 61, 86, 173, 65, 144, 67, 169, 219, 239, 104, 55, 186, 37, 127, 182, 68,
+ 22, 122, 38, 94, 205, 57, 243, 26, 235, 12, 110, 82, 225, 251, 40, 130,
+ 254, 181, 59, 109, 223, 126, 81, 136, 239, 120, 104, 3, 20, 103, 62, 15,
+ 87, 55, 56, 148, 229, 90, 46, 10, 13, 105, 149, 130, 72, 97, 5, 50,
+ 98, 86, 123, 243, 233, 121, 186, 45, 120, 93, 225, 4, 62, 206, 244, 20,
+ 207, 129, 5, 109, 87, 163, 208, 44, 39, 175, 95, 143, 234, 91, 141, 57,
+ 249, 86, 115, 67, 142, 164, 255, 87, 121, 145, 81, 76, 171, 193, 246, 212,
+ 234, 20, 92, 55, 105, 95, 73, 35, 93, 213, 79, 14, 138, 74, 194, 187,
+ 202, 71, 95, 190, 105, 177, 128, 28, 29, 114, 35, 241, 38, 143, 93, 30,
+ 160, 232, 101, 199, 158, 238, 74, 124, 207, 224, 153, 114, 92, 121, 66, 146,
+ 193, 43, 131, 212, 6, 30, 252, 155, 241, 35, 194, 158, 228, 86, 140, 152,
+ 195, 236, 6, 136, 22, 197, 172, 175, 96, 211, 203, 51, 145, 207, 113, 226,
+ 204, 30, 38, 61, 153, 137, 1, 202, 175, 27, 75, 147, 29, 189, 82, 223,
+ 21, 180, 238, 242, 209, 79, 155, 179, 127, 130, 71, 198, 167, 214, 185, 250,
+ 176, 15, 148, 141, 205, 108, 183, 5, 182, 144, 37, 170, 159, 236, 46, 26,
+ 146, 132, 190, 127, 171, 158, 31, 253, 131, 237, 163, 128, 216, 240, 96, 106,
+ 103, 254, 172, 153, 58, 149, 2, 129, 98, 84, 145, 224, 49, 150, 244, 174,
+ 168, 222, 55, 131, 35, 85, 4, 213, 71, 116, 54, 21, 190, 167, 32, 204,
+ 233, 31, 123, 171, 237, 74, 51, 169, 133, 57, 27, 89, 182, 211, 201, 229,
+ 23, 212, 180, 164, 109, 254, 126, 58, 34, 127, 79, 241, 18, 220, 102, 83,
+ 73, 1, 216, 155, 64, 87, 25, 70, 139, 59, 213, 181, 240, 133, 114, 74,
+ 224, 56, 19, 81, 24, 108, 134, 60, 61, 12, 215, 232, 76, 82, 201, 147,
+ 189, 197, 210, 30, 39, 198, 6, 80, 250, 58, 221, 7, 133, 66, 107, 4,
+ 68, 214, 167, 45, 125, 238, 219, 185, 23, 38, 241, 179, 17, 120, 162, 145,
+ 26, 16, 41, 132, 235, 78, 175, 194, 137, 77, 11, 237, 1, 70, 110, 191,
+ 242, 6, 182, 77, 184, 105, 144, 172, 250, 129, 34, 179, 64, 8, 221, 67,
+ 153, 13, 79, 92, 197, 85, 178, 42, 217, 80, 165, 185, 34, 176, 122, 68,
+ 48, 98, 242, 118, 133, 213, 159, 74, 170, 188, 2, 238, 44, 162, 190, 248,
+ 165, 184, 135, 235, 245, 160, 80, 210, 230, 107, 33, 208, 15, 164, 103, 158,
+ 123, 156, 171, 73, 10, 107, 241, 226, 255, 25, 192, 111, 23, 118, 8, 38,
+ 98, 231, 64, 40, 57, 126, 158, 233, 225, 195, 21, 99, 53, 127, 89, 191,
+ 204, 109, 7, 249, 49, 1, 144, 183, 102, 56, 147, 206, 245, 62, 12, 43,
+ 118, 44, 216, 226, 91, 251, 17, 214, 57, 158, 187, 196, 209, 207, 125, 227,
+ 28, 3, 48, 65, 62, 31, 188, 211, 176, 59, 140, 197, 24, 136, 183, 44,
+ 189, 32, 1, 213, 71, 245, 46, 227, 175, 180, 36, 76, 29, 235, 47, 96,
+ 11, 157, 36, 119, 176, 68, 187, 234, 245, 12, 201, 100, 82, 251, 191, 161,
+ 72, 55, 227, 167, 224, 37, 117, 192, 157, 180, 255, 162, 105, 232, 170, 152,
+ 135, 223, 189, 116, 247, 63, 144, 2, 90, 188, 27, 49, 13, 164, 229, 197,
+ 190, 96, 213, 174, 235, 248, 71, 223, 239, 94, 184, 130, 50, 41, 199, 173,
+ 246, 32, 203, 159, 175, 248, 61, 153, 154, 27, 77, 108, 113, 205, 86, 149,
+ 76, 246, 213, 59, 113, 42, 199, 229, 1, 135, 48, 189, 13, 208, 211, 33,
+ 186, 212, 247, 91, 175, 1, 107, 137, 189, 47, 87, 227, 51, 125, 214, 151,
+ 16, 64, 246, 238, 121, 164, 206, 130, 102, 247, 226, 23, 141, 255, 148, 188,
+ 250, 237, 218, 131, 64, 91, 42, 244, 54, 125, 85, 152, 202, 26, 121, 214,
+ 17, 12, 209, 111, 102, 52, 205, 10, 85, 127, 65, 13, 251, 36, 79, 14,
+ 153, 36, 110, 243, 193, 77, 230, 104, 162, 136, 43, 249, 96, 253, 183, 22,
+ 125, 97, 62, 146, 172, 122, 201, 34, 25, 242, 101, 60, 151, 123, 136, 65,
+ 40, 57, 81, 117, 24, 75, 230, 104, 229, 47, 87, 124, 21, 39, 3, 223,
+ 116, 88, 131, 154, 108, 184, 21, 130, 92, 233, 138, 126, 74, 139, 179, 96,
+ 58, 119, 143, 240, 236, 69, 193, 115, 253, 29, 154, 68, 88, 163, 73, 206,
+ 195, 82, 145, 111, 220, 138, 55, 97, 116, 224, 39, 157, 7, 173, 101, 198,
+ 103, 71, 169, 178, 7, 150, 194, 24, 146, 47, 19, 230, 151, 57, 31, 129,
+ 113, 88, 39, 253, 231, 132, 141, 95, 46, 130, 24, 218, 194, 190, 219, 126,
+ 83, 30, 203, 9, 177, 1, 86, 151, 97, 67, 199, 216, 125, 145, 80, 106,
+ 132, 227, 29, 194, 100, 12, 23, 187, 168, 35, 155, 3, 102, 211, 84, 229,
+ 208, 59, 100, 1, 123, 137, 200, 222, 242, 218, 13, 58, 69, 233, 134, 111,
+ 31, 201, 161, 180, 222, 171, 14, 81, 220, 63, 243, 106, 102, 62, 170, 252,
+ 198, 173, 99, 155, 23, 234, 90, 157, 127, 111, 2, 196, 104, 13, 233, 248,
+ 114, 150, 66, 142, 26, 12, 190, 88, 200, 14, 100, 90, 56, 124, 222, 77,
+ 206, 21, 59, 89, 138, 106, 122, 198, 181, 135, 217, 80, 9, 77, 111, 233,
+ 185, 146, 199, 134, 71, 249, 21, 176, 60, 106, 207, 229, 136, 35, 22, 83,
+ 37, 168, 239, 78, 128, 46, 202, 166, 158, 7, 211, 126, 35, 213, 139, 55,
+ 74, 48, 9, 241, 129, 157, 51, 90, 207, 114, 218, 69, 17, 244, 180, 11,
+ 142, 165, 191, 210, 83, 188, 15, 37, 207, 161, 184, 136, 50, 250, 177, 173,
+ 231, 34, 100, 5, 253, 51, 156, 80, 79, 206, 176, 22, 238, 32, 146, 119,
+ 198, 111, 188, 54, 24, 135, 229, 13, 102, 202, 215, 120, 141, 106, 94, 193,
+ 111, 64, 237, 46, 38, 168, 192, 115, 122, 167, 191, 198, 66, 231, 9, 219,
+ 116, 244, 9, 227, 104, 123, 250, 4, 166, 237, 74, 52, 118, 23, 249, 109,
+ 76, 193, 59, 212, 54, 254, 238, 93, 136, 225, 88, 187, 45, 120, 255, 153,
+ 11, 215, 158, 25, 181, 116, 170, 201, 55, 183, 232, 136, 109, 35, 79, 119,
+ 146, 246, 44, 224, 53, 188, 148, 97, 231, 78, 135, 12, 242, 7, 90, 226,
+ 238, 164, 28, 160, 126, 214, 49, 4, 151, 17, 201, 241, 148, 142, 247, 5,
+ 183, 173, 214, 24, 223, 127, 74, 171, 35, 216, 149, 227, 59, 232, 123, 207,
+ 246, 219, 26, 235, 182, 163, 184, 156, 62, 67, 251, 166, 250, 101, 183, 231,
+ 21, 181, 153, 15, 5, 90, 81, 76, 112, 17, 86, 145, 92, 194, 120, 25,
+ 97, 193, 55, 91, 200, 132, 140, 203, 101, 98, 46, 5, 179, 3, 63, 171,
+ 99, 44, 222, 74, 100, 210, 9, 23, 167, 248, 118, 49, 130, 234, 176, 103,
+ 251, 44, 227, 101, 255, 139, 46, 58, 175, 9, 124, 27, 187, 223, 253, 205,
+ 71, 192, 51, 143, 32, 38, 15, 82, 42, 199, 105, 116, 35, 158, 99, 182,
+ 54, 249, 114, 1, 132, 161, 239, 163, 76, 218, 131, 190, 121, 166, 63, 180,
+ 119, 147, 133, 1, 14, 32, 103, 249, 125, 199, 172, 187, 203, 9, 190, 43,
+ 77, 140, 7, 58, 118, 224, 253, 45, 191, 41, 17, 83, 171, 30, 1, 53,
+ 140, 175, 89, 69, 152, 29, 207, 210, 1, 254, 60, 65, 50, 157, 245, 134,
+ 158, 135, 187, 42, 218, 13, 87, 176, 154, 27, 206, 136, 153, 88, 144, 201,
+ 137, 81, 1, 232, 126, 47, 201, 169, 105, 134, 7, 214, 91, 8, 207, 78,
+ 177, 39, 202, 137, 106, 26, 77, 84, 156, 96, 71, 31, 150, 32, 167, 6,
+ 204, 127, 29, 147, 165, 227, 131, 103, 214, 52, 241, 30, 72, 140, 128, 58,
+ 189, 65, 222, 37, 246, 157, 42, 83, 9, 95, 51, 227, 66, 194, 193, 19,
+ 197, 101, 39, 235, 186, 146, 36, 229, 76, 5, 57, 251, 86, 19, 167, 155,
+ 153, 160, 125, 42, 51, 85, 100, 66, 129, 154, 16, 230, 69, 137, 218, 43,
+ 118, 224, 241, 201, 137, 36, 250, 240, 37, 218, 129, 234, 43, 187, 100, 166,
+ 22, 174, 222, 66, 62, 186, 45, 68, 189, 95, 212, 255, 239, 221, 48, 80,
+ 162, 180, 31, 154, 50, 156, 140, 184, 65, 33, 199, 28, 185, 29, 213, 56,
+ 92, 65, 117, 145, 238, 216, 149, 1, 204, 211, 239, 112, 138, 62, 95, 233,
+ 101, 2, 237, 87, 50, 244, 216, 194, 189, 151, 175, 96, 171, 26, 198, 220,
+ 141, 106, 204, 90, 100, 186, 29, 72, 105, 48, 115, 165, 41, 231, 104, 91,
+ 83, 58, 244, 78, 51, 93, 137, 194, 129, 102, 96, 18, 138, 70, 109, 247,
+ 65, 200, 59, 29, 165, 143, 223, 61, 130, 52, 238, 204, 195, 70, 186, 5,
+ 170, 51, 142, 193, 246, 84, 156, 189, 33, 106, 55, 249, 14, 35, 253, 61,
+ 173, 77, 205, 110, 106, 49, 84, 121, 162, 107, 14, 75, 124, 214, 51, 234,
+ 18, 113, 101, 196, 27, 79, 197, 124, 131, 150, 102, 41, 181, 128, 80, 164,
+ 200, 93, 218, 157, 20, 2, 249, 206, 134, 192, 51, 28, 166, 99, 37, 199,
+ 17, 170, 121, 75, 138, 48, 109, 213, 94, 33, 187, 210, 195, 80, 160, 36,
+ 94, 221, 12, 169, 23, 7, 175, 73, 162, 192, 219, 77, 13, 39, 251, 18,
+ 255, 88, 16, 23, 177, 253, 41, 150, 181, 12, 63, 164, 225, 20, 72, 245,
+ 104, 187, 225, 220, 47, 71, 122, 248, 222, 11, 241, 175, 87, 32, 228, 60,
+ 19, 209, 147, 230, 24, 138, 103, 73, 93, 13, 214, 117, 161, 18, 183, 132,
+ 148, 183, 10, 120, 29, 6, 57, 160, 139, 185, 21, 197, 102, 251, 143, 39,
+ 144, 170, 96, 209, 244, 16, 85, 141, 84, 230, 242, 3, 132, 82, 253, 4,
+ 8, 163, 228, 24, 67, 85, 48, 140, 82, 155, 97, 174, 60, 126, 61, 22,
+ 234, 61, 179, 223, 19, 79, 228, 207, 155, 100, 162, 68, 249, 168, 114, 236,
+ 232, 109, 143, 199, 178, 70, 64, 154, 56, 235, 96, 98, 128, 118, 206, 211,
+ 99, 61, 224, 200, 120, 174, 28, 130, 112, 228, 117, 29, 192, 81, 49, 148,
+ 126, 92, 2, 167, 159, 21, 12, 236, 97, 33, 76, 124, 146, 112, 217, 38,
+ 107, 82, 127, 1, 206, 104, 57, 6, 53, 233, 158, 178, 196, 126, 236, 102,
+ 253, 220, 228, 89, 248, 190, 163, 233, 126, 149, 236, 216, 177, 194, 78, 165,
+ 186, 58, 11, 21, 38, 166, 55, 110, 163, 219, 125, 60, 208, 34, 152, 237,
+ 242, 107, 98, 191, 194, 213, 179, 100, 254, 195, 66, 42, 94, 5, 250, 190,
+ 129, 6, 45, 157, 130, 56, 169, 117, 124, 9, 205, 27, 54, 110, 21, 191,
+ 31, 187, 116, 145, 102, 117, 233, 253, 35, 158, 20, 200, 182, 92, 69, 236,
+ 160, 48, 179, 231, 10, 206, 68, 91, 204, 134, 80, 246, 166, 217, 15, 42,
+ 152, 37, 233, 113, 180, 206, 86, 110, 155, 31, 90, 181, 123, 144, 252, 174,
+ 177, 23, 244, 70, 212, 173, 39, 235, 144, 32, 208, 172, 222, 151, 67, 94,
+ 141, 19, 35, 33, 40, 196, 137, 210, 93, 50, 47, 240, 156, 96, 1, 30,
+ 249, 157, 236, 77, 155, 235, 217, 178, 19, 190, 198, 68, 218, 62, 97, 30,
+ 63, 34, 144, 73, 49, 153, 165, 114, 230, 121, 15, 210, 143, 133, 229, 219,
+ 201, 112, 253, 83, 245, 186, 10, 89, 141, 252, 203, 55, 85, 211, 16, 136,
+ 40, 50, 225, 59, 209, 43, 198, 133, 1, 248, 127, 139, 173, 103, 146, 53,
+ 67, 132, 121, 176, 219, 236, 94, 50, 156, 73, 221, 38, 208, 98, 113, 100,
+ 177, 201, 148, 114, 1, 216, 115, 39, 127, 96, 189, 176, 173, 81, 44, 128,
+ 146, 226, 98, 136, 160, 11, 42, 119, 242, 121, 49, 78, 97, 41, 182, 248,
+ 53, 83, 69, 181, 81, 76, 157, 115, 169, 108, 54, 26, 17, 86, 145, 56,
+ 127, 216, 172, 251, 220, 75, 133, 87, 171, 109, 72, 233, 246, 114, 108, 200,
+ 74, 247, 7, 168, 245, 125, 83, 164, 178, 52, 81, 4, 17, 193, 241, 127,
+ 208, 251, 118, 232, 126, 137, 31, 172, 41, 218, 149, 240, 25, 177, 239, 139,
+ 36, 21, 228, 125, 234, 71, 196, 30, 120, 202, 10, 134, 220, 45, 207, 252,
+ 202, 25, 139, 158, 110, 195, 175, 7, 241, 52, 198, 89, 11, 239, 71, 170,
+ 93, 234, 133, 205, 3, 134, 169, 179, 9, 213, 75, 244, 190, 78, 203, 63,
+ 96, 131, 123, 217, 83, 202, 27, 162, 95, 221, 108, 195, 227, 30, 80, 2,
+ 134, 25, 103, 150, 223, 131, 28, 38, 243, 71, 211, 152, 99, 138, 65, 125,
+ 107, 61, 92, 148, 52, 39, 106, 247, 139, 241, 32, 64, 66, 51, 36, 182,
+ 54, 131, 162, 90, 142, 21, 151, 189, 171, 41, 110, 248, 104, 169, 3, 76,
+ 102, 64, 86, 167, 229, 1, 46, 154, 92, 144, 57, 67, 70, 11, 145, 120,
+ 86, 140, 25, 242, 217, 159, 33, 87, 88, 47, 172, 78, 130, 68, 82, 240,
+ 218, 163, 69, 27, 21, 222, 144, 40, 135, 211, 234, 185, 152, 178, 53, 136,
+ 161, 55, 19, 48, 196, 227, 91, 150, 197, 36, 142, 28, 239, 8, 20, 212,
+ 68, 180, 22, 54, 56, 114, 247, 101, 174, 3, 31, 135, 200, 155, 62, 141,
+ 1, 219, 43, 113, 191, 254, 105, 235, 36, 7, 161, 92, 2, 41, 232, 184,
+ 73, 191, 43, 13, 5, 24, 158, 147, 121, 90, 160, 10, 211, 94, 143, 240,
+ 69, 38, 197, 13, 188, 80, 53, 240, 203, 115, 148, 78, 217, 45, 152, 225,
+ 37, 152, 133, 20, 74, 247, 217, 95, 4, 174, 8, 250, 77, 163, 107, 63,
+ 191, 212, 75, 15, 188, 144, 52, 97, 213, 243, 177, 26, 60, 108, 113, 185,
+ 56, 3, 188, 90, 180, 62, 95, 237, 131, 108, 8, 169, 45, 118, 26, 106,
+ 80, 245, 88, 15, 72, 98, 254, 35, 237, 64, 157, 105, 255, 131, 145, 103,
+ 45, 12, 205, 238, 74, 211, 229, 188, 159, 190, 213, 44, 171, 128, 75, 223,
+ 168, 241, 202, 238, 61, 170, 8, 198, 129, 199, 225, 114, 151, 252, 217, 207,
+ 138, 203, 226, 6, 115, 228, 183, 206, 188, 195, 42, 223, 1, 175, 26, 149,
+ 235, 159, 120, 222, 33, 214, 105, 10, 30, 113, 212, 226, 91, 59, 130, 185,
+ 183, 65, 222, 13, 59, 108, 181, 197, 111, 123, 206, 185, 255, 39, 212, 196,
+ 99, 155, 195, 167, 254, 124, 2, 171, 84, 224, 61, 147, 6, 32, 174, 152,
+ 215, 122, 233, 111, 116, 145, 75, 243, 124, 44, 77, 31, 92, 252, 212, 161,
+ 84, 208, 56, 211, 73, 149, 243, 4, 121, 82, 6, 168, 147, 74, 108, 194,
+ 48, 8, 105, 72, 110, 87, 125, 184, 148, 186, 116, 20, 163, 232, 216, 88,
+ 31, 59, 209, 188, 44, 245, 213, 58, 20, 192, 224, 204, 60, 208, 130, 79,
+ 2, 25, 63, 111, 46, 231, 250, 67, 20, 98, 179, 146, 135, 37, 161, 192,
+ 87, 57, 123, 221, 234, 208, 68, 182, 16, 111, 196, 220, 246, 43, 236, 154,
+ 18, 219, 14, 161, 142, 73, 5, 60, 28, 238, 47, 84, 23, 164, 62, 230,
+ 110, 62, 122, 16, 8, 93, 46, 27, 179, 67, 129, 150, 181, 156, 107, 229,
+ 240, 126, 105, 85, 151, 97, 2, 210, 82, 165, 107, 230, 115, 79, 46, 226,
+ 79, 107, 209, 172, 99, 136, 226, 57, 25, 199, 109, 210, 242, 162, 18, 50,
+ 113, 203, 149, 165, 251, 176, 154, 228, 99, 40, 164, 71, 150, 124, 179, 243,
+ 15, 229, 167, 73, 32, 85, 226, 128, 231, 12, 242, 159, 122, 90, 215, 24,
+ 122, 117, 243, 177, 15, 189, 95, 194, 205, 83, 165, 252, 224, 245, 204, 227,
+ 237, 180, 147, 207, 243, 56, 224, 86, 29, 160, 50, 122, 19, 198, 103, 12,
+ 193, 69, 178, 150, 125, 93, 190, 34, 66, 49, 221, 3, 106, 113, 134, 76,
+ 203, 81, 216, 80, 244, 184, 237, 223, 89, 101, 119, 215, 22, 58, 34, 210,
+ 159, 22, 66, 254, 238, 87, 193, 157, 242, 6, 37, 191, 13, 154, 220, 143,
+ 46, 14, 138, 117, 95, 221, 119, 207, 240, 132, 34, 158, 139, 10, 214, 170,
+ 197, 4, 58, 239, 220, 63, 77, 130, 16, 143, 59, 85, 185, 139, 47, 52,
+ 133, 70, 178, 117, 11, 67, 100, 142, 37, 64, 127, 82, 172, 182, 112, 246,
+ 173, 35, 89, 215, 123, 174, 57, 142, 53, 229, 71, 116, 145, 119, 40, 12,
+ 40, 108, 75, 252, 146, 141, 1, 102, 231, 88, 184, 173, 209, 70, 89, 128,
+ 22, 225, 88, 235, 243, 166, 176, 156, 122, 159, 98, 115, 153, 1, 180, 248,
+ 255, 183, 24, 176, 74, 111, 137, 138, 250, 38, 230, 14, 149, 85, 3, 205,
+ 162, 182, 1, 213, 30, 250, 184, 128, 65, 17, 64, 114, 189, 55, 248, 84,
+ 151, 192, 23, 249, 27, 164, 178, 40, 49, 68, 247, 185, 22, 116, 89, 232,
+ 169, 252, 91, 133, 26, 10, 34, 199, 225, 204, 255, 215, 7, 28, 109, 79,
+ 111, 34, 147, 247, 146, 175, 195, 180, 94, 119, 164, 72, 230, 18, 155, 16,
+ 239, 159, 168, 69, 104, 22, 202, 151, 129, 48, 14, 221, 86, 17, 70, 112,
+ 14, 132, 172, 18, 23, 118, 47, 161, 72, 129, 36, 244, 176, 135, 64, 186,
+ 91, 132, 43, 119, 24, 209, 233, 104, 173, 200, 184, 254, 40, 215, 202, 81,
+ 153, 136, 44, 226, 170, 55, 208, 123, 57, 168, 197, 11, 112, 79, 245, 135,
+ 60, 47, 140, 201, 142, 54, 34, 33, 209, 153, 205, 141, 196, 104, 168, 4,
+ 246, 93, 50, 169, 83, 136, 243, 207, 15, 143, 54, 68, 1, 106, 45, 188,
+ 37, 11, 139, 87, 117, 7, 229, 103, 138, 22, 249, 57, 68, 169, 186, 13,
+ 163, 60, 250, 85, 179, 95, 247, 100, 32, 147, 188, 50, 37, 173, 255, 221,
+ 220, 35, 16, 116, 218, 112, 253, 56, 178, 12, 77, 142, 36, 136, 82, 85,
+ 247, 185, 164, 118, 12, 215, 127, 45, 145, 252, 62, 21, 173, 69, 139, 108,
+ 47, 220, 225, 178, 161, 194, 17, 141, 81, 126, 102, 164, 105, 217, 232, 185,
+ 208, 67, 240, 162, 254, 54, 187, 84, 172, 98, 58, 220, 151, 103, 63, 207,
+ 181, 39, 19, 192, 47, 143, 72, 3, 199, 69, 94, 214, 31, 175, 34, 155,
+ 231, 67, 144, 113, 121, 63, 8, 218, 226, 156, 98, 186, 165, 215, 255, 195,
+ 110, 243, 172, 223, 21, 189, 164, 41, 214, 98, 47, 119, 85, 134, 81, 200,
+ 78, 182, 224, 138, 49, 211, 117, 140, 47, 113, 248, 219, 1, 71, 160, 96,
+ 181, 87, 243, 70, 235, 208, 29, 177, 37, 196, 252, 119, 118, 172, 21, 13,
+ 37, 76, 102, 63, 133, 197, 242, 3, 106, 222, 43, 162, 220, 104, 154, 205,
+ 37, 19, 241, 83, 216, 252, 35, 98, 193, 42, 240, 244, 104, 245, 53, 4,
+ 209, 184, 91, 99, 44, 210, 110, 29, 243, 139, 228, 18, 227, 70, 213, 40,
+ 11, 172, 236, 230, 213, 122, 153, 244, 4, 131, 18, 170, 206, 99, 238, 5,
+ 151, 36, 31, 201, 44, 232, 11, 158, 252, 163, 128, 39, 120, 225, 159, 75,
+ 239, 124, 203, 156, 75, 242, 135, 55, 177, 230, 197, 74, 226, 36, 196, 155,
+ 14, 17, 236, 198, 176, 41, 181, 228, 235, 69, 205, 144, 21, 115, 190, 103,
+ 59, 200, 108, 155, 2, 154, 168, 69, 169, 231, 84, 173, 38, 210, 153, 246,
+ 138, 32, 7, 155, 59, 86, 142, 166, 233, 79, 201, 6, 17, 89, 44, 244,
+ 5, 144, 169, 200, 50, 124, 91, 184, 67, 180, 11, 18, 95, 154, 152, 136,
+ 52, 7, 118, 36, 4, 128, 153, 170, 155, 28, 108, 68, 131, 23, 11, 177,
+ 71, 83, 210, 145, 197, 191, 150, 61, 64, 35, 154, 249, 224, 254, 54, 113,
+ 220, 178, 100, 12, 168, 104, 180, 65, 25, 197, 91, 224, 37, 22, 85, 116,
+ 24, 50, 79, 183, 92, 201, 129, 217, 161, 71, 3, 152, 26, 250, 56, 123,
+ 101, 40, 153, 119, 6, 18, 70, 152, 112, 10, 93, 165, 133, 196, 232, 58,
+ 165, 233, 137, 17, 115, 114, 47, 54, 51, 97, 14, 147, 188, 232, 202, 72,
+ 218, 231, 194, 83, 180, 58, 101, 239, 114, 113, 153, 74, 9, 204, 54, 188,
+ 118, 146, 65, 84, 16, 147, 237, 71, 142, 54, 224, 153, 207, 38, 76, 26,
+ 138, 249, 26, 117, 136, 230, 202, 76, 14, 186, 194, 94, 82, 251, 122, 161,
+ 108, 130, 49, 124, 12, 103, 86, 226, 180, 240, 109, 120, 95, 177, 138, 76,
+ 71, 152, 46, 132, 38, 16, 112, 236, 175, 202, 92, 10, 177, 155, 28, 217,
+ 108, 179, 38, 88, 255, 120, 171, 70, 76, 240, 14, 45, 101, 181, 224, 17,
+ 57, 192, 72, 148, 16, 108, 52, 30, 208, 174, 240, 212, 118, 74, 89, 137,
+ 184, 207, 126, 145, 49, 198, 180, 20, 39, 50, 234, 179, 247, 170, 55, 143,
+ 246, 123, 191, 81, 55, 217, 198, 95, 60, 116, 206, 11, 13, 255, 18, 207,
+ 253, 12, 48, 206, 213, 247, 111, 46, 233, 226, 120, 208, 49, 1, 254, 170,
+ 92, 3, 215, 31, 1, 203, 81, 56, 174, 48, 216, 51, 85, 21, 15, 113,
+ 237, 13, 157, 218, 40, 219, 229, 164, 70, 25, 139, 151, 179, 66, 251, 82,
+ 229, 203, 115, 254, 89, 253, 29, 127, 138, 26, 34, 230, 114, 129, 78, 96,
+ 1, 136, 127, 202, 132, 209, 106, 59, 122, 107, 25, 159, 142, 19, 97, 62,
+ 167, 33, 114, 2, 146, 66, 243, 38, 109, 44, 178, 7, 5, 164, 245, 207,
+ 33, 86, 103, 249, 132, 83, 106, 240, 214, 1, 104, 139, 211, 109, 204, 192,
+ 1, 131, 66, 214, 122, 161, 30, 141, 251, 229, 168, 149, 212, 52, 128, 68,
+ 221, 151, 143, 191, 239, 115, 177, 148, 89, 2, 135, 218, 97, 219, 199, 28,
+ 135, 106, 169, 160, 12, 75, 211, 178, 97, 132, 24, 180, 38, 226, 168, 217,
+ 202, 73, 127, 97, 137, 125, 105, 92, 183, 209, 57, 116, 220, 44, 98, 163,
+ 60, 184, 13, 79, 70, 149, 154, 161, 241, 105, 125, 59, 240, 166, 7, 55,
+ 149, 228, 63, 168, 185, 43, 206, 150, 208, 83, 252, 130, 5, 89, 80, 247,
+ 218, 201, 237, 254, 142, 180, 229, 200, 75, 251, 94, 131, 46, 216, 53, 97,
+ 215, 148, 11, 22, 121, 6, 250, 80, 242, 201, 96, 66, 123, 26, 156, 239,
+ 174, 202, 35, 160, 109, 65, 181, 241, 31, 94, 72, 192, 46, 134, 238, 163,
+ 125, 231, 62, 86, 52, 96, 78, 163, 9, 172, 112, 36, 34, 192, 87, 80,
+ 231, 55, 119, 66, 121, 159, 248, 234, 200, 13, 245, 238, 152, 201, 225, 62,
+ 178, 30, 33, 89, 147, 185, 207, 7, 100, 65, 171, 16, 234, 198, 53, 1,
+ 214, 170, 103, 30, 223, 57, 134, 193, 73, 212, 182, 160, 227, 35, 102, 196,
+ 244, 69, 213, 31, 91, 238, 27, 10, 175, 49, 219, 180, 174, 234, 147, 178,
+ 132, 25, 98, 65, 209, 162, 92, 121, 156, 110, 29, 36, 239, 185, 23, 157,
+ 131, 238, 68, 64, 129, 40, 209, 176, 124, 27, 174, 150, 89, 71, 4, 45,
+ 61, 27, 236, 112, 15, 47, 156, 226, 41, 99, 223, 129, 88, 111, 150, 182,
+ 107, 31, 69, 175, 138, 203, 32, 15, 189, 51, 61, 159, 134, 230, 156, 119,
+ 198, 241, 39, 185, 33, 105, 164, 140, 50, 79, 158, 124, 144, 182, 109, 72,
+ 52, 243, 168, 140, 250, 80, 29, 62, 239, 42, 193, 246, 126, 136, 24, 146,
+ 99, 88, 153, 179, 249, 204, 123, 69, 101, 23, 49, 157, 219, 131, 95, 248,
+ 23, 163, 116, 58, 121, 211, 220, 192, 218, 114, 236, 53, 162, 145, 35, 93,
+ 54, 158, 9, 102, 155, 26, 124, 242, 67, 15, 184, 168, 244, 55, 104, 3,
+ 254, 34, 161, 117, 251, 151, 236, 128, 187, 164, 157, 110, 99, 18, 65, 206,
+ 130, 179, 250, 40, 70, 64, 209, 103, 176, 57, 249, 137, 125, 151, 221, 136,
+ 106, 130, 73, 235, 229, 176, 197, 45, 211, 20, 64, 183, 25, 190, 33, 121,
+ 69, 114, 27, 37, 32, 195, 115, 250, 45, 49, 223, 244, 16, 221, 80, 123,
+ 107, 159, 68, 50, 165, 189, 104, 255, 204, 221, 241, 85, 132, 101, 212, 235,
+ 72, 209, 41, 86, 133, 110, 210, 185, 221, 74, 82, 24, 198, 9, 183, 176,
+ 39, 194, 154, 8, 167, 102, 131, 205, 109, 176, 182, 86, 113, 133, 32, 184,
+ 90, 252, 122, 204, 195, 43, 183, 210, 246, 64, 123, 107, 125, 82, 186, 175,
+ 152, 30, 7, 228, 182, 73, 42, 101, 194, 113, 62, 223, 229, 167, 15, 183,
+ 158, 26, 82, 53, 228, 245, 29, 93, 237, 199, 115, 48, 28, 71, 38, 16,
+ 27, 248, 215, 166, 68, 222, 59, 23, 99, 93, 187, 10, 167, 139, 90, 57,
+ 104, 41, 87, 193, 101, 163, 78, 6, 93, 150, 65, 167, 232, 242, 179, 96,
+ 135, 228, 87, 15, 51, 225, 20, 38, 110, 123, 28, 169, 36, 8, 252, 203,
+ 228, 206, 3, 51, 53, 47, 2, 208, 237, 187, 141, 244, 18, 58, 146, 107,
+ 137, 170, 78, 212, 4, 30, 34, 66, 248, 199, 160, 48, 111, 251, 237, 210,
+ 189, 143, 77, 161, 172, 68, 84, 62, 225, 213, 86, 139, 31, 220, 199, 80,
+ 74, 191, 93, 144, 130, 23, 199, 216, 241, 88, 46, 25, 219, 149, 245, 92,
+ 121, 75, 213, 8, 5, 177, 117, 196, 78, 189, 14, 23, 178, 56, 170, 97,
+ 13, 123, 129, 43, 181, 113, 108, 140, 72, 44, 133, 128, 157, 210, 79, 234,
+ 253, 142, 5, 176, 89, 130, 196, 235, 133, 20, 100, 229, 22, 90, 143, 42,
+ 176, 216, 201, 46, 74, 10, 88, 114, 141, 161, 148, 79, 162, 27, 184, 84,
+ 21, 139, 251, 173, 130, 84, 27, 164, 14, 171, 122, 205, 233, 66, 119, 43,
+ 99, 235, 241, 90, 153, 51, 95, 246, 115, 2, 77, 1, 54, 198, 6, 73,
+ 217, 35, 19, 202, 134, 4, 230, 91, 48, 206, 13, 151, 149, 42, 130, 231,
+ 100, 203, 224, 60, 163, 9, 61, 81, 10, 75, 140, 225, 52, 98, 134, 32,
+ 200, 169, 230, 105, 147, 140, 175, 33, 146, 92, 100, 219, 96, 254, 227, 195,
+ 75, 204, 165, 56, 145, 1, 94, 255, 238, 158, 251, 174, 3, 205, 101, 250,
+ 189, 157, 218, 236, 46, 64, 191, 149, 206, 188, 126, 8, 53, 146, 199, 165,
+ 187, 23, 247, 118, 195, 211, 158, 81, 43, 45, 6, 200, 77, 119, 156, 60,
+ 192, 247, 108, 162, 56, 194, 87, 33, 97, 213, 52, 48, 150, 77, 19, 61,
+ 195, 40, 28, 216, 233, 215, 33, 118, 141, 15, 151, 204, 12, 173, 46, 94,
+ 171, 22, 215, 159, 11, 76, 154, 227, 1, 241, 191, 214, 238, 81, 120, 111,
+ 175, 222, 227, 57, 135, 43, 146, 255, 111, 48, 190, 125, 102, 31, 160, 127,
+ 42, 187, 20, 110, 148, 77, 135, 24, 87, 85, 159, 143, 167, 34, 2, 73,
+ 100, 40, 149, 122, 63, 74, 162, 82, 24, 137, 29, 223, 131, 179, 227, 6,
+ 77, 102, 183, 252, 154, 73, 219, 222, 74, 129, 25, 255, 239, 30, 86, 156,
+ 59, 115, 67, 231, 75, 245, 215, 152, 128, 2, 90, 78, 26, 121, 208, 186,
+ 199, 42, 17, 118, 174, 234, 145, 216, 126, 167, 200, 181, 81, 242, 190, 6,
+ 232, 245, 16, 166, 143, 84, 187, 72, 128, 188, 67, 112, 29, 61, 191, 52,
+ 136, 99, 127, 8, 223, 170, 59, 28, 56, 45, 20, 87, 61, 222, 177, 27,
+ 185, 24, 107, 226, 19, 105, 217, 122, 138, 78, 248, 90, 67, 205, 41, 141,
+ 171, 144, 80, 90, 190, 25, 208, 119, 216, 1, 183, 36, 98, 235, 51, 248,
+ 127, 14, 85, 168, 8, 155, 30, 132, 228, 88, 171, 103, 110, 41, 198, 173,
+ 148, 34, 137, 17, 88, 134, 247, 181, 83, 1, 166, 145, 127, 205, 173, 71,
+ 41, 134, 22, 205, 233, 129, 194, 173, 48, 223, 149, 190, 166, 56, 21, 55,
+ 147, 137, 64, 238, 142, 245, 1, 117, 250, 62, 32, 5, 191, 222, 239, 172,
+ 82, 65, 105, 144, 227, 193, 20, 104, 96, 231, 18, 165, 253, 100, 225, 125,
+ 253, 51, 34, 83, 126, 135, 226, 88, 166, 234, 203, 105, 194, 145, 116, 12,
+ 120, 159, 133, 79, 193, 63, 3, 189, 1, 158, 58, 171, 53, 237, 5, 91,
+ 225, 193, 50, 157, 4, 211, 172, 243, 165, 120, 234, 232, 224, 152, 84, 184,
+ 77, 214, 201, 182, 114, 236, 109, 243, 186, 7, 202, 150, 209, 92, 242, 70,
+ 95, 57, 171, 125, 60, 116, 19, 2, 59, 107, 147, 120, 43, 141, 61, 9,
+ 188, 14, 106, 242, 37, 117, 111, 96, 112, 142, 227, 196, 232, 93, 144, 102,
+ 4, 211, 80, 94, 109, 20, 189, 76, 90, 235, 135, 148, 40, 140, 111, 124,
+ 42, 126, 146, 190, 60, 9, 158, 148, 254, 44, 222, 64, 157, 221, 140, 207,
+ 193, 79, 233, 187, 106, 169, 24, 197, 150, 141, 128, 73, 63, 129, 249, 39,
+ 44, 8, 195, 94, 221, 162, 95, 76, 28, 230, 213, 197, 244, 212, 186, 166,
+ 210, 253, 124, 10, 91, 240, 107, 39, 67, 49, 203, 22, 126, 186, 19, 132,
+ 212, 21, 246, 58, 196, 39, 188, 195, 66, 117, 249, 60, 160, 55, 22, 116,
+ 237, 10, 190, 212, 47, 175, 112, 204, 35, 197, 233, 224, 192, 246, 111, 214,
+ 133, 174, 91, 217, 58, 182, 9, 32, 167, 248, 17, 63, 222, 1, 160, 253,
+ 105, 81, 202, 191, 117, 168, 34, 24, 55, 179, 200, 214, 15, 42, 28, 102,
+ 165, 107, 143, 150, 220, 13, 189, 174, 234, 85, 185, 16, 182, 68, 24, 132,
+ 241, 56, 75, 188, 203, 104, 17, 237, 242, 74, 103, 170, 131, 58, 79, 23,
+ 232, 236, 59, 188, 179, 160, 4, 105, 167, 46, 187, 64, 228, 102, 140, 66,
+ 40, 145, 220, 132, 165, 161, 222, 34, 94, 169, 60, 209, 200, 228, 147, 75,
+ 222, 120, 21, 11, 18, 241, 144, 76, 236, 138, 146, 166, 30, 15, 217, 69,
+ 138, 68, 239, 83, 101, 124, 14, 232, 250, 73, 227, 127, 212, 186, 133, 72,
+ 95, 125, 79, 160, 12, 247, 109, 165, 51, 101, 142, 152, 105, 136, 254, 190,
+ 3, 211, 31, 244, 194, 233, 18, 99, 241, 159, 103, 212, 189, 74, 157, 232,
+ 96, 198, 35, 122, 54, 208, 226, 136, 37, 102, 59, 216, 214, 45, 251, 7,
+ 209, 33, 232, 137, 243, 162, 215, 92, 159, 133, 223, 6, 236, 4, 115, 196,
+ 112, 77, 199, 219, 210, 212, 51, 83, 222, 30, 193, 226, 180, 29, 164, 45,
+ 55, 126, 178, 12, 127, 70, 97, 193, 128, 39, 4, 109, 122, 250, 218, 10,
+ 199, 77, 110, 240, 7, 238, 204, 213, 189, 8, 45, 62, 232, 203, 141, 250,
+ 216, 171, 20, 200, 174, 147, 254, 203, 195, 32, 142, 149, 15, 59, 114, 43,
+ 137, 186, 212, 215, 78, 232, 130, 115, 18, 214, 126, 158, 128, 218, 74, 59,
+ 129, 71, 124, 172, 143, 220, 243, 154, 69, 134, 23, 116, 125, 227, 215, 83,
+ 191, 25, 228, 1, 100, 235, 128, 84, 242, 160, 140, 168, 83, 156, 194, 120,
+ 205, 128, 2, 129, 138, 43, 7, 72, 225, 9, 52, 94, 109, 70, 149, 216,
+ 94, 1, 163, 154, 28, 174, 195, 244, 73, 115, 132, 16, 126, 8, 213, 245,
+ 92, 29, 162, 225, 87, 129, 62, 242, 231, 177, 138, 249, 102, 151, 120, 189,
+ 248, 143, 165, 192, 172, 186, 94, 107, 80, 244, 205, 84, 152, 178, 96, 115,
+ 58, 37, 4, 141, 210, 95, 181, 57, 182, 78, 1, 62, 153, 236, 241, 31,
+ 13, 246, 167, 32, 184, 48, 217, 201, 73, 88, 177, 35, 90, 200, 175, 39,
+ 44, 226, 155, 60, 7, 95, 181, 49, 41, 165, 93, 2, 121, 205, 171, 50,
+ 74, 205, 53, 249, 40, 79, 30, 159, 206, 32, 69, 116, 63, 111, 237, 172,
+ 105, 172, 18, 95, 63, 161, 117, 150, 186, 38, 206, 119, 47, 180, 175, 254,
+ 122, 143, 37, 20, 74, 47, 123, 129, 152, 85, 107, 254, 96, 49, 203, 141,
+ 73, 247, 98, 203, 28, 235, 7, 149, 144, 201, 19, 78, 37, 25, 90, 54,
+ 89, 46, 61, 159, 64, 145, 119, 40, 27, 104, 208, 127, 112, 53, 162, 36,
+ 185, 251, 123, 108, 19, 129, 38, 69, 109, 29, 176, 218, 97, 94, 167, 207,
+ 36, 205, 64, 108, 147, 34, 19, 93, 5, 238, 163, 252, 10, 27, 148, 240,
+ 78, 20, 185, 38, 230, 91, 58, 122, 208, 174, 133, 145, 245, 163, 43, 152,
+ 202, 126, 134, 163, 41, 183, 133, 252, 158, 27, 106, 229, 108, 135, 10, 201,
+ 66, 240, 199, 250, 249, 20, 73, 132, 12, 251, 24, 220, 193, 60, 65, 42,
+ 38, 136, 196, 116, 119, 169, 101, 208, 124, 23, 91, 55, 21, 217, 172, 253,
+ 188, 27, 248, 196, 47, 148, 30, 58, 24, 105, 141, 36, 5, 84, 236, 59,
+ 148, 108, 87, 175, 43, 75, 13, 183, 160, 227, 24, 242, 135, 206, 174, 71,
+ 184, 152, 71, 47, 131, 89, 76, 120, 247, 201, 99, 116, 102, 163, 199, 21,
+ 224, 150, 102, 231, 25, 234, 161, 211, 104, 2, 208, 77, 146, 129, 44, 14,
+ 195, 219, 10, 173, 213, 147, 206, 253, 22, 53, 218, 239, 94, 217, 178, 138,
+ 49, 58, 187, 46, 221, 227, 118, 52, 127, 67, 12, 250, 179, 162, 60, 87,
+ 83, 98, 218, 140, 219, 116, 96, 200, 77, 99, 153, 204, 21, 127, 139, 10,
+ 209, 186, 99, 225, 144, 88, 218, 181, 197, 12, 75, 192, 128, 159, 61, 185,
+ 239, 100, 85, 163, 241, 195, 71, 99, 229, 16, 185, 159, 114, 155, 181, 31,
+ 44, 136, 14, 126, 63, 22, 226, 168, 182, 167, 111, 55, 125, 12, 93, 37,
+ 211, 10, 140, 194, 205, 23, 49, 249, 220, 3, 82, 42, 70, 190, 40, 92,
+ 22, 70, 249, 117, 85, 8, 156, 38, 248, 178, 221, 56, 23, 58, 84, 116,
+ 96, 151, 242, 231, 14, 109, 142, 79, 82, 16, 120, 247, 110, 228, 70, 9,
+ 28, 222, 244, 104, 80, 14, 29, 184, 167, 42, 190, 193, 20, 243, 210, 65,
+ 123, 145, 178, 40, 34, 53, 190, 1, 30, 185, 86, 176, 89, 148, 179, 252,
+ 155, 25, 7, 251, 230, 35, 247, 78, 162, 142, 237, 242, 104, 39, 15, 227,
+ 197, 1, 63, 33, 179, 224, 11, 167, 221, 82, 252, 41, 245, 48, 214, 76,
+ 65, 234, 1, 164, 82, 194, 239, 101, 202, 86, 223, 118, 158, 99, 52, 28,
+ 111, 86, 115, 27, 213, 237, 104, 160, 157, 162, 17, 173, 135, 52, 98, 233,
+ 162, 87, 143, 9, 49, 192, 100, 71, 11, 123, 134, 229, 76, 164, 181, 209,
+ 80, 144, 57, 118, 17, 47, 161, 183, 66, 36, 104, 187, 25, 196, 64, 127,
+ 70, 11, 124, 236, 173, 94, 151, 103, 51, 215, 129, 88, 148, 39, 209, 115,
+ 13, 62, 151, 31, 210, 100, 155, 163, 234, 141, 57, 126, 228, 167, 177, 111,
+ 168, 92, 53, 71, 31, 33, 153, 3, 150, 103, 36, 220, 79, 202, 89, 134,
+ 80, 130, 153, 119, 240, 83, 131, 123, 207, 67, 174, 115, 204, 176, 139, 106,
+ 247, 49, 215, 198, 130, 153, 117, 214, 132, 39, 68, 6, 255, 221, 229, 188,
+ 170, 253, 197, 61, 44, 188, 12, 172, 67, 134, 34, 225, 228, 223, 7, 158,
+ 204, 63, 41, 180, 195, 144, 120, 253, 168, 159, 43, 86, 245, 196, 111, 239,
+ 141, 255, 216, 33, 188, 209, 176, 249, 235, 182, 164, 92, 89, 67, 250, 39,
+ 207, 81, 64, 26, 114, 91, 152, 97, 57, 17, 6, 82, 161, 101, 19, 218,
+ 120, 208, 187, 222, 248, 168, 213, 239, 195, 160, 88, 26, 202, 142, 49, 217,
+ 13, 148, 72, 138, 69, 65, 5, 26, 62, 158, 10, 90, 67, 149, 161, 48,
+ 156, 183, 142, 243, 50, 52, 238, 194, 17, 61, 108, 150, 49, 26, 68, 96,
+ 56, 73, 190, 41, 32, 50, 155, 180, 97, 179, 35, 92, 251, 54, 33, 147,
+ 229, 166, 215, 106, 113, 11, 214, 110, 35, 151, 13, 175, 80, 100, 18, 169,
+ 139, 118, 99, 179, 236, 30, 169, 33, 6, 50, 230, 89, 203, 121, 174, 17,
+ 85, 166, 130, 76, 193, 46, 61, 132, 139, 56, 65, 101, 199, 52, 123, 5,
+ 245, 145, 240, 212, 18, 61, 217, 239, 1, 225, 139, 192, 200, 73, 43, 230,
+ 64, 8, 144, 158, 135, 183, 207, 106, 244, 114, 46, 192, 45, 91, 101, 227,
+ 60, 19, 81, 97, 87, 207, 146, 58, 249, 233, 100, 68, 130, 2, 189, 248,
+ 124, 104, 217, 205, 137, 113, 89, 173, 77, 184, 43, 255, 226, 186, 160, 206,
+ 253, 74, 105, 124, 5, 230, 245, 81, 151, 235, 51, 252, 42, 137, 88, 122,
+ 128, 90, 33, 243, 187, 77, 234, 39, 244, 26, 209, 93, 117, 219, 51, 125,
+ 47, 194, 213, 244, 206, 155, 69, 98, 176, 133, 251, 187, 97, 7, 237, 191,
+ 63, 236, 197, 112, 106, 119, 4, 150, 204, 223, 126, 153, 30, 238, 184, 222,
+ 8, 138, 78, 98, 246, 48, 3, 177, 72, 157, 213, 253, 131, 56, 90, 146,
+ 164, 85, 253, 67, 93, 37, 157, 35, 230, 224, 108, 80, 173, 245, 55, 15,
+ 166, 241, 41, 127, 243, 118, 44, 133, 11, 198, 108, 40, 224, 231, 120, 86,
+ 79, 21, 175, 15, 253, 187, 211, 107, 212, 91, 121, 234, 215, 22, 135, 2,
+ 26, 140, 231, 150, 83, 116, 201, 123, 142, 23, 211, 10, 177, 31, 4, 233,
+ 193, 177, 75, 137, 252, 178, 150, 136, 74, 231, 103, 60, 191, 235, 156, 85,
+ 154, 65, 227, 16, 235, 1, 57, 122, 199, 114, 157, 53, 60, 243, 67, 94,
+ 13, 190, 128, 21, 240, 27, 72, 88, 48, 1, 26, 246, 140, 97, 175, 148,
+ 123, 186, 44, 170, 130, 164, 77, 197, 166, 196, 89, 119, 147, 255, 110, 2,
+ 28, 238, 44, 90, 124, 16, 19, 69, 1, 51, 169, 102, 22, 121, 181, 156,
+ 204, 211, 238, 145, 194, 183, 171, 229, 173, 139, 214, 177, 98, 63, 27, 200,
+ 93, 46, 56, 227, 32, 1, 157, 45, 166, 13, 140, 199, 101, 81, 168, 219,
+ 9, 216, 176, 195, 156, 38, 72, 224, 170, 207, 78, 121, 171, 103, 209, 197,
+ 22, 155, 63, 5, 9, 161, 64, 87, 202, 121, 189, 132, 255, 8, 204, 46,
+ 61, 83, 31, 172, 220, 183, 131, 81, 72, 20, 42, 202, 46, 151, 210, 135,
+ 115, 6, 167, 8, 68, 1, 86, 100, 198, 32, 77, 146, 192, 87, 210, 251,
+ 181, 99, 47, 137, 178, 34, 121, 223, 66, 22, 142, 219, 31, 86, 109, 180,
+ 97, 27, 50, 136, 48, 113, 246, 134, 125, 11, 36, 255, 41, 154, 212, 82,
+ 70, 239, 137, 14, 175, 113, 80, 32, 121, 18, 190, 6, 42, 156, 84, 17,
+ 111, 38, 8, 213, 230, 42, 191, 208, 172, 74, 112, 202, 65, 95, 44, 182,
+ 67, 131, 254, 163, 95, 243, 114, 133, 48, 3, 134, 225, 1, 249, 19, 58,
+ 41, 105, 54, 91, 24, 154, 16, 217, 122, 148, 180, 30, 53, 221, 118, 196,
+ 1, 250, 185, 40, 29, 222, 166, 132, 37, 119, 4, 141, 171, 107, 110, 145,
+ 75, 180, 254, 136, 45, 149, 169, 160, 59, 84, 221, 229, 111, 158, 203, 131,
+ 38, 233, 149, 224, 141, 92, 199, 254, 50, 5, 247, 204, 113, 211, 33, 176,
+ 118, 147, 214, 166, 165, 78, 235, 107, 194, 221, 130, 110, 229, 25, 14, 76,
+ 178, 106, 201, 43, 57, 93, 221, 205, 215, 252, 56, 95, 182, 110, 176, 255,
+ 125, 88, 143, 146, 51, 69, 103, 170, 3, 216, 251, 233, 133, 152, 198, 232,
+ 228, 106, 20, 60, 57, 185, 173, 219, 79, 246, 184, 25, 113, 98, 181, 169,
+ 146, 65, 183, 240, 230, 246, 66, 144, 84, 55, 248, 206, 79, 45, 242, 28,
+ 54, 106, 28, 80, 103, 15, 188, 55, 62, 92, 255, 68, 26, 52, 21, 182,
+ 90, 156, 37, 201, 177, 19, 98, 237, 114, 135, 170, 186, 73, 225, 51, 12,
+ 93, 15, 203, 248, 155, 4, 231, 112, 238, 36, 125, 95, 241, 144, 9, 232,
+ 247, 81, 39, 5, 211, 32, 146, 182, 84, 152, 226, 59, 198, 122, 143, 233,
+ 250, 54, 170, 114, 1, 131, 184, 157, 191, 240, 109, 76, 52, 50, 9, 135,
+ 64, 180, 192, 66, 86, 20, 9, 117, 14, 136, 158, 53, 116, 6, 110, 254,
+ 128, 85, 191, 16, 196, 66, 220, 157, 90, 129, 109, 218, 212, 70, 149, 200,
+ 126, 145, 208, 245, 168, 179, 119, 107, 222, 48, 6, 81, 143, 192, 96, 164,
+ 140, 225, 153, 219, 82, 242, 75, 127, 24, 173, 112, 233, 223, 228, 193, 66,
+ 234, 207, 108, 54, 137, 62, 224, 248, 107, 11, 252, 40, 113, 162, 35, 29,
+ 117, 169, 23, 71, 76, 21, 171, 55, 175, 188, 105, 154, 195, 153, 75, 62,
+ 201, 68, 189, 231, 3, 197, 61, 87, 29, 71, 174, 191, 184, 171, 54, 112,
+ 147, 223, 82, 24, 34, 234, 111, 246, 165, 22, 125, 151, 216, 206, 235, 117,
+ 237, 23, 164, 244, 134, 246, 223, 154, 190, 35, 72, 118, 171, 18, 57, 210,
+ 154, 210, 17, 193, 2, 34, 29, 100, 161, 59, 187, 102, 91, 237, 47, 139,
+ 25, 1, 224, 130, 198, 88, 36, 50, 238, 56, 165, 139, 2, 159, 112, 226,
+ 207, 124, 170, 91, 226, 149, 45, 198, 197, 138, 216, 189, 241, 113, 96, 3,
+ 114, 196, 58, 164, 40, 178, 39, 250, 23, 42, 140, 145, 155, 44, 119, 130,
+ 254, 79, 22, 94, 65, 241, 28, 175, 9, 69, 179, 42, 126, 76, 88, 27,
+ 219, 36, 62, 241, 92, 165, 154, 45, 136, 60, 88, 37, 5, 169, 48, 177,
+ 209, 163, 227, 12, 203, 33, 237, 130, 102, 168, 228, 254, 122, 108, 67, 250,
+ 235, 159, 80, 37, 147, 78, 184, 230, 169, 122, 21, 2, 106, 58, 128, 14,
+ 45, 162, 137, 185, 81, 156, 203, 238, 186, 125, 42, 12, 82, 214, 173, 80,
+ 69, 21, 128, 162, 230, 84, 138, 146, 52, 122, 174, 245, 119, 166, 67, 40,
+ 98, 138, 245, 32, 111, 252, 228, 220, 246, 126, 5, 45, 21, 77, 46, 56,
+ 212, 143, 33, 148, 70, 168, 127, 32, 238, 217, 186, 115, 98, 176, 181, 255,
+ 100, 82, 129, 5, 145, 15, 43, 197, 234, 18, 246, 96, 160, 168, 98, 202,
+ 14, 79, 199, 202, 116, 7, 193, 188, 160, 252, 163, 198, 244, 104, 30, 70,
+ 69, 149, 141, 206, 73, 159, 249, 29, 151, 25, 79, 48, 46, 133, 199, 240,
+ 254, 206, 163, 94, 64, 244, 200, 210, 149, 112, 140, 205, 87, 134, 245, 31,
+ 248, 97, 89, 235, 191, 2, 98, 107, 170, 51, 239, 134, 145, 233, 108, 119,
+ 254, 217, 235, 2, 6, 216, 35, 193, 99, 187, 209, 152, 145, 59, 8, 213,
+ 116, 54, 148, 164, 66, 16, 17, 191, 209, 52, 153, 93, 248, 201, 176, 82,
+ 180, 72, 93, 28, 11, 87, 133, 218, 7, 50, 100, 79, 71, 26, 232, 3,
+ 211, 178, 59, 193, 63, 239, 103, 116, 99, 123, 148, 203, 58, 255, 137, 221,
+ 127, 148, 137, 95, 251, 130, 53, 68, 214, 85, 240, 32, 224, 98, 59, 134,
+ 90, 119, 100, 60, 121, 175, 75, 218, 182, 94, 54, 113, 174, 180, 95, 15,
+ 20, 39, 100, 132, 139, 115, 9, 93, 66, 189, 224, 12, 181, 203, 152, 162,
+ 127, 224, 79, 64, 139, 22, 215, 175, 244, 219, 27, 129, 138, 200, 3, 17,
+ 181, 109, 205, 141, 9, 164, 70, 251, 73, 240, 87, 4, 94, 201, 17, 246,
+ 178, 230, 12, 49, 169, 140, 43, 70, 76, 195, 108, 165, 13, 104, 184, 226,
+ 245, 197, 1, 97, 160, 94, 205, 236, 82, 183, 150, 244, 209, 83, 62, 207,
+ 237, 45, 173, 136, 60, 215, 141, 183, 143, 150, 51, 219, 238, 16, 169, 39,
+ 175, 192, 109, 22, 222, 227, 19, 100, 66, 126, 181, 8, 233, 178, 157, 81,
+ 186, 40, 26, 243, 61, 105, 178, 3, 223, 194, 8, 143, 49, 24, 154, 213,
+ 125, 187, 3, 215, 165, 34, 107, 17, 70, 252, 60, 240, 68, 228, 220, 35,
+ 152, 30, 16, 204, 252, 56, 34, 66, 78, 103, 184, 87, 49, 254, 47, 177,
+ 58, 136, 96, 41, 191, 62, 106, 126, 32, 203, 47, 132, 229, 105, 130, 188,
+ 42, 212, 196, 88, 147, 202, 86, 53, 135, 239, 31, 181, 159, 129, 199, 121,
+ 229, 153, 88, 128, 147, 234, 175, 116, 166, 237, 8, 194, 233, 163, 220, 67,
+ 206, 231, 108, 93, 196, 83, 118, 120, 161, 119, 236, 97, 247, 57, 87, 198,
+ 223, 55, 77, 18, 4, 150, 242, 39, 2, 253, 82, 167, 215, 135, 207, 152,
+ 17, 161, 255, 97, 9, 134, 239, 165, 253, 30, 126, 110, 116, 193, 183, 144,
+ 89, 195, 48, 85, 95, 216, 111, 18, 41, 11, 144, 236, 83, 157, 194, 209,
+ 220, 160, 143, 90, 187, 77, 199, 216, 63, 242, 205, 155, 243, 148, 217, 48,
+ 234, 195, 12, 81, 172, 182, 31, 243, 90, 10, 60, 131, 255, 114, 227, 80,
+ 249, 139, 194, 145, 179, 113, 247, 130, 143, 187, 28, 106, 81, 213, 234, 161,
+ 252, 112, 47, 224, 52, 90, 129, 29, 35, 158, 110, 21, 199, 2, 107, 36,
+ 243, 134, 66, 23, 104, 70, 252, 157, 29, 184, 200, 36, 21, 48, 228, 156,
+ 102, 231, 124, 3, 28, 105, 120, 94, 168, 29, 122, 74, 225, 164, 180, 33,
+ 230, 150, 219, 38, 123, 217, 43, 181, 34, 235, 13, 215, 62, 172, 88, 251,
+ 72, 164, 97, 4, 69, 238, 119, 166, 91, 73, 180, 51, 248, 179, 110, 171,
+ 29, 15, 106, 122, 104, 151, 8, 176, 140, 14, 195, 25, 93, 111, 178, 76,
+ 23, 117, 108, 154, 236, 127, 101, 37, 75, 156, 202, 228, 88, 158, 5, 103,
+ 57, 11, 74, 97, 62, 41, 65, 132, 235, 206, 10, 216, 141, 1, 55, 152,
+ 55, 53, 192, 144, 184, 73, 201, 223, 64, 253, 121, 214, 49, 146, 249, 22,
+ 176, 61, 127, 1, 165, 192, 226, 217, 249, 149, 216, 50, 140, 78, 167, 102,
+ 155, 90, 139, 161, 162, 185, 117, 234, 44, 143, 49, 138, 31, 71, 93, 1,
+ 140, 36, 80, 96, 64, 22, 104, 158, 162, 129, 68, 160, 103, 70, 37, 6,
+ 150, 221, 49, 246, 124, 13, 50, 42, 213, 160, 103, 250, 54, 118, 136, 33,
+ 229, 179, 60, 43, 116, 246, 38, 135, 182, 124, 37, 75, 113, 207, 11, 136,
+ 149, 86, 44, 244, 1, 139, 160, 78, 22, 231, 39, 100, 171, 56, 200, 135,
+ 37, 170, 27, 91, 3, 173, 221, 96, 71, 48, 149, 95, 69, 180, 203, 18,
+ 203, 162, 1, 18, 48, 106, 251, 10, 182, 95, 142, 66, 120, 134, 65, 190,
+ 181, 38, 152, 220, 7, 34, 24, 49, 130, 13, 67, 85, 8, 115, 218, 191,
+ 16, 190, 243, 204, 201, 58, 73, 220, 103, 209, 239, 206, 101, 247, 118, 63,
+ 114, 11, 201, 189, 197, 71, 246, 84, 58, 81, 200, 156, 152, 211, 28, 187,
+ 237, 190, 129, 25, 151, 198, 178, 218, 32, 207, 120, 174, 1, 231, 65, 23,
+ 171, 193, 251, 58, 240, 19, 74, 44, 100, 91, 166, 225, 23, 172, 50, 210,
+ 218, 66, 185, 63, 206, 222, 92, 50, 115, 168, 184, 210, 165, 18, 219, 26,
+ 236, 124, 163, 210, 30, 107, 208, 229, 123, 64, 168, 225, 112, 39, 243, 125,
+ 254, 92, 235, 69, 59, 20, 222, 125, 240, 13, 17, 243, 19, 185, 45, 74,
+ 109, 52, 162, 146, 84, 213, 47, 80, 209, 1, 144, 64, 248, 89, 153, 111,
+ 13, 69, 173, 229, 83, 230, 24, 51, 110, 158, 11, 212, 129, 151, 78, 187,
+ 112, 44, 244, 214, 65, 188, 10, 221, 191, 229, 66, 173, 212, 164, 35, 146,
+ 170, 61, 5, 47, 233, 40, 242, 138, 71, 131, 16, 104, 53, 143, 241, 98,
+ 36, 131, 181, 226, 92, 128, 69, 46, 72, 183, 141, 95, 109, 9, 169, 218,
+ 192, 104, 241, 120, 183, 163, 198, 226, 1, 133, 20, 83, 189, 238, 15, 173,
+ 100, 207, 83, 144, 174, 20, 190, 51, 193, 99, 157, 90, 25, 75, 222, 160,
+ 173, 38, 208, 61, 231, 200, 139, 109, 108, 111, 68, 191, 91, 246, 6, 156,
+ 201, 74, 188, 214, 105, 131, 114, 14, 204, 147, 110, 180, 32, 138, 172, 222,
+ 65, 184, 217, 108, 159, 213, 128, 15, 56, 250, 131, 41, 114, 52, 21, 40,
+ 202, 63, 145, 7, 167, 106, 137, 47, 131, 42, 120, 98, 195, 107, 83, 177,
+ 222, 137, 185, 145, 15, 105, 219, 208, 46, 226, 197, 167, 79, 126, 146, 86,
+ 71, 247, 59, 167, 249, 234, 194, 165, 227, 126, 245, 163, 189, 28, 73, 83,
+ 157, 38, 71, 214, 24, 76, 137, 248, 167, 150, 110, 186, 25, 77, 36, 207,
+ 167, 61, 19, 150, 227, 94, 146, 136, 162, 253, 40, 78, 47, 224, 59, 197,
+ 126, 30, 136, 105, 37, 75, 171, 226, 135, 174, 27, 131, 138, 63, 123, 169,
+ 20, 10, 19, 125, 26, 182, 233, 208, 33, 253, 30, 73, 235, 11, 53, 72,
+ 34, 140, 17, 205, 142, 195, 171, 186, 170, 123, 75, 228, 97, 197, 156, 91,
+ 135, 225, 31, 171, 238, 245, 93, 59, 153, 86, 16, 32, 2, 136, 241, 128,
+ 253, 82, 113, 77, 123, 19, 192, 62, 251, 121, 155, 183, 22, 191, 8, 158,
+ 117, 102, 157, 1, 84, 57, 7, 120, 147, 223, 105, 6, 61, 144, 250, 153,
+ 197, 176, 30, 55, 151, 13, 124, 48, 43, 215, 199, 250, 93, 212, 51, 140,
+ 38, 215, 238, 2, 1, 128, 110, 241, 58, 9, 182, 218, 120, 89, 137, 244,
+ 210, 16, 188, 151, 9, 161, 154, 84, 86, 54, 213, 193, 215, 195, 225, 102,
+ 139, 229, 225, 86, 151, 250, 54, 170, 163, 92, 122, 210, 113, 185, 37, 207,
+ 246, 64, 145, 113, 50, 107, 248, 43, 27, 179, 194, 87, 238, 254, 12, 216,
+ 192, 77, 82, 101, 142, 27, 204, 127, 252, 56, 196, 216, 52, 55, 232, 20,
+ 225, 102, 188, 28, 172, 63, 81, 153, 55, 211, 30, 96, 212, 38, 202, 239,
+ 206, 5, 211, 85, 21, 221, 158, 188, 24, 196, 39, 55, 115, 197, 236, 33,
+ 82, 11, 239, 144, 85, 211, 64, 111, 237, 53, 123, 79, 112, 118, 252, 155,
+ 242, 119, 80, 185, 223, 205, 68, 34, 114, 142, 26, 240, 102, 192, 6, 155,
+ 206, 80, 103, 228, 157, 141, 187, 96, 241, 159, 179, 34, 5, 89, 4, 132,
+ 177, 244, 124, 41, 164, 132, 90, 62, 107, 166, 232, 199, 106, 117, 227, 194,
+ 237, 153, 26, 111, 10, 89, 35, 112, 208, 47, 86, 236, 46, 106, 245, 232,
+ 139, 170, 236, 220, 57, 109, 132, 169, 111, 208, 23, 76, 198, 179, 51, 117,
+ 84, 52, 116, 182, 154, 127, 177, 243, 24, 161, 199, 114, 227, 27, 176, 186,
+ 180, 231, 154, 118, 255, 123, 159, 32, 237, 198, 190, 209, 110, 18, 161, 20,
+ 89, 34, 179, 223, 74, 95, 19, 232, 68, 170, 129, 247, 91, 54, 142, 29,
+ 63, 251, 211, 24, 73, 133, 85, 151, 127, 8, 60, 250, 4, 255, 67, 23,
+ 137, 177, 85, 31, 216, 198, 99, 172, 57, 124, 81, 15, 60, 152, 242, 211,
+ 101, 81, 240, 158, 195, 112, 189, 6, 133, 154, 40, 77, 212, 44, 56, 187,
+ 218, 72, 191, 141, 149, 189, 235, 196, 20, 182, 249, 9, 42, 172, 84, 1,
+ 148, 124, 4, 99, 1, 72, 248, 190, 91, 184, 115, 138, 19, 147, 87, 234,
+ 7, 232, 36, 29, 234, 92, 59, 141, 130, 57, 75, 229, 247, 108, 88, 156,
+ 202, 133, 230, 112, 88, 54, 70, 10, 96, 253, 31, 52, 149, 86, 4, 208,
+ 221, 249, 194, 14, 113, 148, 33, 107, 116, 3, 147, 61, 125, 204, 102, 159,
+ 44, 175, 188, 131, 15, 231, 103, 117, 177, 156, 233, 214, 158, 217, 237, 171,
+ 56, 122, 12, 221, 14, 77, 247, 24, 101, 113, 219, 230, 118, 189, 239, 204,
+ 3, 4, 46, 75, 159, 68, 251, 128, 25, 190, 95, 223, 71, 91, 31, 242,
+ 203, 6, 38, 174, 54, 121, 23, 176, 99, 57, 211, 166, 25, 183, 221, 67,
+ 205, 45, 74, 50, 207, 222, 85, 18, 210, 53, 41, 166, 39, 78, 118, 176,
+ 109, 173, 223, 148, 26, 67, 6, 217, 99, 175, 90, 44, 56, 117, 193, 142,
+ 40, 53, 168, 13, 174, 192, 41, 232, 1, 164, 101, 65, 146, 241, 213, 132,
+ 121, 28, 97, 143, 7, 169, 134, 57, 98, 196, 27, 225, 175, 72, 190, 220,
+ 101, 198, 87, 232, 50, 204, 36, 254, 33, 105, 84, 115, 35, 22, 92, 109,
+ 248, 149, 170, 41, 51, 227, 117, 43, 167, 25, 78, 202, 165, 46, 104, 76,
+ 135, 174, 224, 205, 17, 35, 230, 186, 2, 245, 121, 55, 142, 171, 12, 155,
+ 119, 61, 96, 226, 255, 210, 133, 80, 76, 115, 146, 144, 147, 200, 132, 125,
+ 92, 21, 185, 233, 157, 125, 226, 1, 14, 155, 231, 247, 5, 89, 224, 242,
+ 76, 204, 249, 133, 45, 168, 101, 201, 10, 255, 135, 214, 43, 1, 196, 74,
+ 26, 94, 222, 68, 201, 130, 99, 212, 150, 142, 35, 121, 114, 228, 67, 62,
+ 161, 153, 42, 49, 224, 208, 177, 253, 65, 180, 178, 46, 242, 45, 233, 16,
+ 154, 72, 122, 7, 29, 189, 219, 172, 186, 166, 14, 79, 200, 118, 183, 134,
+ 232, 128, 147, 178, 153, 173, 198, 96, 84, 219, 47, 228, 69, 244, 52, 1,
+ 143, 209, 29, 188, 104, 49, 31, 238, 106, 75, 169, 28, 197, 233, 178, 124,
+ 11, 245, 120, 213, 166, 160, 71, 203, 59, 89, 75, 152, 38, 31, 247, 112,
+ 83, 108, 197, 121, 67, 153, 30, 217, 206, 82, 171, 216, 134, 245, 116, 192,
+ 122, 211, 87, 238, 52, 121, 149, 195, 36, 196, 15, 134, 82, 177, 7, 114,
+ 90, 43, 249, 51, 85, 227, 67, 248, 18, 255, 81, 174, 212, 142, 228, 253,
+ 2, 150, 179, 252, 12, 65, 240, 192, 239, 13, 117, 140, 180, 85, 131, 59,
+ 233, 60, 120, 255, 53, 13, 73, 221, 176, 148, 1, 67, 104, 136, 41, 7,
+ 67, 199, 242, 40, 102, 80, 51, 35, 162, 226, 54, 75, 182, 86, 160, 48,
+ 149, 7, 120, 77, 223, 180, 39, 13, 221, 56, 194, 15, 78, 64, 129, 36,
+ 84, 228, 19, 194, 22, 41, 10, 95, 126, 172, 250, 155, 135, 186, 82, 159,
+ 48, 176, 179, 254, 56, 186, 165, 81, 164, 236, 74, 2, 145, 91, 229, 151,
+ 245, 135, 173, 40, 34, 106, 3, 165, 229, 182, 125, 30, 244, 147, 45, 109,
+ 117, 72, 22, 225, 49, 151, 167, 26, 6, 220, 150, 86, 152, 186, 126, 164,
+ 238, 224, 100, 111, 200, 113, 82, 130, 211, 176, 71, 201, 156, 81, 28, 116,
+ 180, 99, 14, 224, 46, 196, 177, 96, 223, 106, 91, 117, 18, 59, 150, 195,
+ 50, 176, 17, 12, 137, 185, 8, 254, 6, 126, 204, 101, 115, 170, 135, 110,
+ 95, 30, 247, 55, 138, 243, 118, 203, 119, 184, 234, 248, 220, 27, 94, 158,
+ 85, 164, 97, 57, 104, 55, 121, 225, 46, 231, 202, 1, 117, 179, 50, 232,
+ 147, 139, 19, 49, 26, 195, 1, 253, 27, 143, 130, 33, 73, 112, 220, 8,
+ 152, 72, 66, 23, 93, 26, 243, 189, 91, 254, 172, 79, 202, 50, 167, 28,
+ 101, 200, 188, 2, 48, 136, 198, 108, 80, 187, 38, 115, 109, 57, 75, 197,
+ 66, 163, 49, 127, 44, 234, 61, 153, 90, 148, 27, 64, 165, 196, 243, 219,
+ 36, 134, 88, 71, 250, 94, 124, 151, 208, 28, 123, 228, 128, 149, 189, 194,
+ 103, 202, 142, 70, 118, 225, 210, 18, 14, 151, 180, 131, 203, 209, 231, 31,
+ 199, 111, 175, 205, 83, 150, 165, 69, 89, 145, 48, 141, 1, 242, 168, 91,
+ 153, 178, 42, 80, 222, 255, 131, 177, 29, 210, 102, 133, 195, 175, 5, 72,
+ 72, 177, 13, 228, 234, 123, 138, 92, 118, 252, 110, 54, 39, 31, 55, 196,
+ 6, 186, 62, 207, 74, 138, 227, 214, 155, 57, 209, 102, 68, 144, 212, 240,
+ 154, 217, 176, 132, 191, 123, 223, 11, 63, 237, 140, 208, 8, 23, 27, 82,
+ 91, 37, 30, 205, 161, 98, 20, 168, 245, 25, 188, 97, 45, 4, 237, 68,
+ 130, 173, 27, 207, 172, 141, 21, 235, 40, 184, 251, 54, 248, 76, 89, 211,
+ 155, 23, 127, 193, 201, 138, 152, 29, 60, 130, 224, 121, 88, 129, 157, 41,
+ 8, 159, 219, 208, 14, 66, 137, 110, 32, 152, 172, 239, 229, 47, 252, 192,
+ 238, 94, 129, 168, 167, 244, 137, 227, 149, 215, 140, 18, 44, 77, 171, 132,
+ 226, 113, 133, 181, 45, 129, 148, 80, 71, 57, 201, 88, 65, 24, 89, 167,
+ 117, 160, 58, 86, 44, 178, 98, 210, 242, 136, 14, 181, 60, 255, 184, 200,
+ 251, 118, 50, 185, 157, 135, 163, 213, 137, 42, 165, 93, 12, 60, 69, 128,
+ 110, 118, 213, 244, 70, 14, 39, 22, 154, 72, 232, 9, 50, 207, 247, 171,
+ 90, 110, 32, 170, 229, 57, 61, 107, 64, 97, 153, 45, 113, 167, 35, 205,
+ 55, 250, 15, 100, 177, 211, 163, 98, 150, 229, 187, 82, 194, 243, 63, 66,
+ 21, 82, 114, 76, 63, 126, 255, 154, 185, 250, 108, 144, 176, 9, 87, 146,
+ 9, 254, 134, 101, 67, 87, 150, 107, 204, 240, 162, 34, 86, 17, 14, 211,
+ 53, 36, 76, 198, 59, 29, 221, 84, 162, 40, 247, 211, 185, 213, 15, 208,
+ 236, 31, 9, 216, 157, 215, 19, 96, 104, 222, 43, 83, 150, 85, 78, 27,
+ 170, 24, 139, 106, 102, 254, 10, 120, 107, 158, 45, 113, 41, 153, 89, 218,
+ 169, 34, 184, 55, 251, 105, 126, 183, 167, 194, 135, 221, 92, 147, 109, 215,
+ 33, 162, 213, 17, 25, 118, 164, 69, 203, 138, 114, 220, 78, 100, 62, 146,
+ 44, 73, 192, 215, 124, 34, 79, 83, 106, 26, 200, 164, 181, 172, 111, 217,
+ 98, 38, 254, 226, 19, 189, 162, 224, 6, 122, 59, 86, 207, 134, 22, 222,
+ 73, 15, 113, 197, 123, 205, 51, 188, 81, 251, 69, 60, 191, 62, 98, 234,
+ 25, 90, 210, 7, 103, 172, 241, 182, 189, 131, 107, 3, 240, 244, 144, 160,
+ 48, 73, 198, 139, 53, 77, 5, 120, 169, 126, 21, 145, 17, 194, 99, 4,
+ 68, 159, 233, 84, 65, 194, 236, 37, 216, 54, 25, 196, 195, 28, 172, 189,
+ 208, 155, 233, 8, 57, 172, 218, 228, 106, 189, 38, 86, 190, 229, 78, 36,
+ 143, 145, 230, 11, 140, 185, 42, 214, 22, 161, 238, 253, 231, 222, 81, 241,
+ 94, 236, 166, 143, 252, 9, 61, 230, 245, 22, 72, 11, 13, 233, 125, 28,
+ 173, 43, 113, 187, 34, 195, 92, 235, 217, 206, 46, 71, 128, 53, 112, 80,
+ 36, 54, 221, 189, 8, 212, 39, 25, 114, 181, 7, 109, 246, 208, 147, 122,
+ 150, 170, 101, 243, 207, 231, 12, 100, 157, 21, 119, 235, 63, 44, 99, 120,
+ 248, 192, 163, 100, 232, 166, 130, 193, 237, 56, 70, 197, 226, 103, 162, 113,
+ 3, 193, 47, 221, 92, 180, 52, 7, 252, 231, 14, 181, 129, 98, 240, 250,
+ 21, 141, 79, 88, 95, 198, 159, 144, 253, 33, 19, 122, 133, 115, 7, 31,
+ 122, 66, 204, 252, 199, 244, 8, 159, 6, 72, 191, 95, 133, 26, 188, 3,
+ 7, 113, 78, 184, 123, 168, 3, 222, 148, 16, 255, 175, 171, 235, 46, 213,
+ 227, 62, 251, 103, 139, 225, 1, 54, 153, 85, 16, 73, 177, 44, 123, 105,
+ 206, 145, 64, 66, 157, 43, 182, 161, 23, 158, 128, 130, 58, 218, 3, 198,
+ 38, 215, 212, 105, 219, 96, 42, 70, 168, 104, 233, 23, 10, 251, 43, 64,
+ 16, 190, 51, 148, 127, 221, 1, 239, 233, 101, 41, 140, 32, 146, 161, 13,
+ 199, 242, 207, 29, 206, 162, 70, 1, 245, 239, 211, 31, 146, 222, 166, 4,
+ 84, 204, 16, 214, 128, 1, 227, 54, 222, 121, 76, 250, 1, 231, 246, 104,
+ 112, 225, 16, 23, 20, 80, 137, 154, 186, 144, 158, 166, 169, 5, 182, 212,
+ 165, 216, 136, 90, 227, 95, 122, 179, 97, 39, 238, 132, 246, 4, 53, 76,
+ 117, 198, 23, 74, 164, 244, 68, 200, 179, 215, 60, 101, 93, 174, 17, 11,
+ 163, 223, 138, 184, 236, 65, 253, 196, 63, 83, 224, 76, 243, 143, 45, 56,
+ 242, 200, 61, 175, 47, 155, 97, 6, 50, 156, 250, 115, 149, 114, 194, 95,
+ 203, 228, 107, 37, 18, 131, 69, 39, 253, 142, 187, 12, 81, 111, 241, 124,
+ 5, 160, 130, 110, 61, 244, 99, 95, 125, 55, 97, 74, 59, 71, 177, 96,
+ 181, 74, 158, 254, 145, 210, 137, 80, 206, 226, 3, 99, 142, 46, 199, 93,
+ 92, 52, 34, 201, 165, 236, 243, 85, 108, 247, 210, 12, 65, 109, 254, 131,
+ 107, 25, 45, 253, 59, 33, 65, 104, 27, 49, 223, 189, 109, 20, 156, 149,
+ 216, 190, 5, 156, 3, 181, 90, 130, 245, 25, 201, 228, 72, 183, 57, 232,
+ 47, 27, 108, 16, 68, 141, 24, 49, 100, 6, 192, 226, 106, 93, 124, 209,
+ 75, 9, 154, 32, 142, 239, 173, 191, 69, 136, 202, 68, 174, 66, 102, 178,
+ 129, 250, 220, 24, 55, 185, 151, 249, 61, 208, 88, 20, 133, 64, 67, 204,
+ 175, 56, 83, 78, 35, 230, 156, 214, 15, 171, 87, 148, 247, 122, 46, 205,
+ 41, 53, 173, 138, 107, 42, 241, 193, 187, 160, 164, 26, 69, 123, 151, 11,
+ 190, 242, 155, 216, 183, 102, 58, 202, 63, 206, 37, 74, 47, 87, 56, 237,
+ 56, 140, 214, 195, 32, 154, 241, 196, 197, 119, 91, 74, 120, 208, 87, 139,
+ 167, 88, 33, 135, 99, 115, 42, 213, 37, 127, 148, 133, 160, 218, 142, 241,
+ 119, 239, 90, 249, 110, 1, 127, 219, 252, 201, 170, 35, 20, 183, 165, 146,
+ 187, 128, 94, 132, 125, 205, 20, 249, 11, 34, 222, 183, 140, 17, 232, 218,
+ 76, 118, 84, 168, 199, 97, 89, 175, 128, 171, 80, 217, 153, 38, 231, 219,
+ 36, 121, 173, 215, 21, 100, 133, 178, 182, 144, 204, 39, 112, 32, 234, 134,
+ 103, 230, 29, 119, 17, 73, 177, 139, 136, 43, 87, 60, 191, 162, 209, 58,
+ 135, 79, 126, 175, 217, 116, 38, 1, 227, 115, 19, 93, 198, 29, 101, 160,
+ 24, 37, 133, 10, 141, 183, 57, 5, 218, 206, 30, 159, 81, 158, 221, 248,
+ 191, 79, 131, 12, 4, 136, 51, 61, 236, 116, 84, 70, 96, 125, 202, 140,
+ 96, 26, 230, 4, 103, 70, 118, 28, 193, 136, 53, 125, 12, 217, 116, 92,
+ 204, 58, 106, 122, 146, 62, 230, 5, 93, 203, 141, 77, 137, 161, 46, 188,
+ 8, 230, 59, 90, 188, 94, 213, 54, 137, 206, 46, 35, 159, 25, 71, 223,
+ 219, 203, 40, 155, 79, 241, 179, 127, 143, 13, 58, 119, 111, 235, 184, 210,
+ 67, 40, 124, 96, 32, 120, 56, 175, 203, 6, 114, 132, 35, 63, 149, 23,
+ 121, 193, 98, 9, 70, 219, 2, 156, 125, 48, 50, 86, 103, 55, 246, 132,
+ 212, 85, 89, 174, 220, 19, 186, 92, 62, 249, 114, 38, 169, 134, 191, 205,
+ 155, 20, 45, 163, 211, 161, 121, 109, 212, 10, 166, 170, 210, 2, 186, 231,
+ 187, 78, 169, 111, 91, 241, 40, 185, 174, 105, 13, 48, 33, 79, 52, 180,
+ 163, 255, 135, 190, 184, 111, 1, 78, 180, 4, 169, 209, 14, 124, 52, 18,
+ 108, 176, 75, 247, 252, 235, 1, 170, 174, 123, 29, 246, 115, 225, 42, 205,
+ 73, 9, 19, 229, 238, 145, 192, 105, 76, 34, 246, 88, 243, 64, 44, 66,
+ 5, 170, 129, 24, 157, 10, 236, 52, 223, 101, 225, 48, 220, 15, 134, 235,
+ 129, 49, 24, 192, 249, 30, 142, 111, 234, 240, 187, 105, 127, 215, 84, 77,
+ 251, 64, 99, 190, 234, 43, 117, 108, 1, 188, 161, 36, 21, 42, 116, 71,
+ 58, 100, 193, 97, 151, 240, 41, 196, 204, 147, 50, 107, 18, 102, 157, 230,
+ 220, 144, 115, 37, 61, 216, 207, 139, 233, 32, 214, 88, 148, 242, 173, 142,
+ 225, 41, 223, 28, 248, 86, 199, 166, 159, 22, 37, 238, 193, 224, 79, 98,
+ 33, 158, 10, 191, 65, 143, 47, 179, 218, 110, 95, 49, 2, 180, 141, 112,
+ 53, 77, 103, 149, 224, 1, 62, 30, 147, 20, 201, 232, 131, 168, 91, 16,
+ 217, 51, 212, 146, 255, 202, 143, 178, 248, 18, 182, 152, 83, 75, 102, 125,
+ 232, 68, 245, 44, 51, 163, 43, 200, 218, 197, 174, 4, 31, 226, 168, 178,
+ 146, 207, 237, 77, 145, 68, 167, 247, 144, 93, 105, 239, 240, 2, 112, 58,
+ 81, 214, 253, 237, 246, 182, 24, 67, 132, 35, 249, 26, 171, 65, 52, 40,
+ 248, 199, 154, 21, 176, 151, 237, 2, 74, 235, 156, 190, 99, 30, 229, 200,
+ 152, 16, 87, 60, 127, 126, 35, 214, 109, 51, 227, 117, 158, 85, 246, 237,
+ 116, 132, 224, 201, 105, 22, 119, 154, 156, 234, 183, 11, 63, 92, 164, 251,
+ 226, 124, 183, 138, 161, 141, 33, 94, 169, 104, 190, 209, 202, 114, 17, 116,
+ 195, 242, 112, 185, 89, 216, 108, 47, 77, 62, 94, 174, 166, 249, 197, 186,
+ 209, 147, 171, 82, 181, 119, 239, 83, 75, 139, 10, 152, 39, 15, 179, 157
+};
+
+static const pcl_ht_builtin_threshold_t ordered_dither_thresh = {
+ 1, /* all planes the same */
+ 16, 16, /* 16 x 16 pixels */
+ ordered_dither_data
+};
+
+static const pcl_ht_builtin_threshold_t clustered_dither_thresh = {
+ 1, /* all planes the same */
+ 16, 16, /* 16 x 16 pixels */
+ clustered_dither_data
+};
+
+static const pcl_ht_builtin_threshold_t noise_dither_thresh = {
+
+ 1, /* all planes the same */
+ 128, 128, /* 128 x 128 pixels */
+ noise_dither_data
+};
+
+/* table used to map color rendering modes into monochrome
+ */
+static const byte monochrome_remap[20] = { 5, 5, 2, 5,
+ 6, 5, 6, 8,
+ 8, 10, 10, 12,
+ 12, 14, 14, 17,
+ 16, 17, 19, 19 };
+
+/* if true an all gray palette will automatically map
+ * itself to a monochrome rendering mode using the monochrome_remap
+ * if false all render algorithms are are left alone
+ *
+ * This is an optimization that if only gray is used on a page the page is printed with
+ * only the K plane. This is a work around for PCL not having a gray colorspace.
+ * Should match the behavior of hp clj 4500, 4550 printers.
+ */
+static const bool ENABLE_AUTO_GRAY_RENDER_METHODS = false;
+
+/*
+ * Update built-in rendering information. Attempts to changed fixed rendering
+ * infomration are ignored.
+ */
+static void
+pcl_ht_update_rendering_info(
+ pcl_state_t * pcs,
+ int method,
+ const pcl_ht_builtin_dither_t * pbidither
+)
+{
+ if ( (method > 0) &&
+ (method < countof(pcs->rendering_info)) &&
+ ((pcs->rendering_info[method].flags & HT_FIXED) == 0) &&
+ (pbidither->type >= pcl_halftone_Threshold) &&
+ (pbidither->type < pcl_halftone_num) )
+ pcs->rendering_info[method].pbidither = pbidither;
+}
+
+/*
+ * Read dither information from a parameter dictionary held by the device.
+ */
+static void
+read_dither(
+ pcl_state_t * pcs,
+ int method,
+ gs_param_list * plist,
+ gs_memory_t * pmem
+)
+{
+ pcl_ht_builtin_dither_t * pdt = 0;
+ int itype;
+ int height, width;
+ int nplanes = 1, nlevels = 1;
+ uint req_size = 0;
+ gs_param_string dstring;
+
+ /* gather the common parameters */
+ if ( (param_read_int(plist, "Type", &itype) != 0) ||
+ (param_read_int(plist, "NumPlanes", &nplanes) < 0) ||
+ (param_read_int(plist, "Height", &height) != 0) ||
+ (param_read_int(plist, "Width", &width) != 0) ||
+ (param_read_string(plist, "Data", &dstring) != 0) )
+ return;
+
+ /* check for a recognized type, and number of levels for table dither */
+ if (itype == pcl_halftone_Threshold)
+ req_size = width * height;
+ else if ( (itype == pcl_halftone_Table_Dither) &&
+ (param_read_int(plist, "NumLevels", &nlevels) == 0) )
+ req_size = ((width + 7) / 8) * height;
+ else
+ return;
+
+ /* check that the data is large enough; copy it if necessary */
+ req_size *= nplanes * nlevels;
+ if (dstring.size < req_size)
+ return;
+
+ pdt = gs_alloc_struct( pmem,
+ pcl_ht_builtin_dither_t,
+ &st_ht_builtin_dither_t,
+ "read device dither"
+ );
+ if (pdt == 0)
+ return;
+
+ if (!dstring.persistent) {
+ byte * pdata = gs_alloc_bytes(pmem, req_size, "read device dither");
+
+ if (pdata == 0) {
+ gs_free_object(pmem, pdt, "read device dither");
+ return;
+ }
+ memcpy(pdata, dstring.data, req_size);
+ dstring.data = pdata;
+ dstring.persistent = true;
+ }
+
+ /* update rendering information */
+ pdt->type = (pcl_halftone_type_t)itype;
+ if (itype == pcl_halftone_Threshold) {
+ pdt->u.thresh.nplanes = nplanes;
+ pdt->u.thresh.height = height;
+ pdt->u.thresh.width = width;
+ pdt->u.thresh.pdata = dstring.data;
+ } else {
+ pdt->u.tdither.nplanes = nplanes;
+ pdt->u.tdither.height = height;
+ pdt->u.tdither.width = width;
+ pdt->u.tdither.nlevels = nlevels;
+ pdt->u.tdither.pdata = dstring.data;
+ }
+ pcl_ht_update_rendering_info(pcs, method, pdt);
+}
+
+/*
+ * Modify the rendering remap table. Note that the change will not take
+ * effect until the next time the print mode is reset.
+ */
+static void
+pcl_ht_update_rendering_remap(
+ pcl_state_t * pcs,
+ const byte * map
+)
+{
+ memcpy(pcs->dflt_rendering_remap, map, sizeof(pcs->dflt_rendering_remap));
+}
+
+/*
+ * Read a re-mapping array for rendering methods.
+ */
+static void
+read_remap_array(
+ pcl_state_t *pcs,
+ gs_param_list * plist,
+ gs_memory_t * pmem
+)
+{
+ gs_param_string dstring;
+ int i;
+
+ if ( (param_read_string(plist, "RenderRemap", &dstring) != 0) ||
+ (dstring.size < countof(pcs->dflt_rendering_remap)) )
+ return;
+ for (i = 0; i < countof(pcs->dflt_rendering_remap); i++) {
+ if (dstring.data[i] >= countof(pcs->dflt_rendering_remap))
+ return;
+ }
+ pcl_ht_update_rendering_remap(pcs, dstring.data);
+}
+
+/*
+ * Initialize the default rendering information.
+ */
+void
+pcl_ht_init_render_methods(
+ pcl_state_t * pcs,
+ gs_memory_t * pmem
+)
+{
+ int i;
+ gx_device * pcur_dev = gs_currentdevice(pcs->pgs);
+ gs_c_param_list list;
+
+ if (pcs->pdflt_ht) return; /* init_render_methods should happen once */
+
+ pcs->ordered_dither.type = pcl_halftone_Threshold;
+ pcs->ordered_dither.u.thresh = ordered_dither_thresh;
+ pcs->clustered_dither.type = pcl_halftone_Threshold;
+ pcs->clustered_dither.u.thresh = clustered_dither_thresh;
+ pcs->noise_dither.type = pcl_halftone_Threshold;
+ pcs->noise_dither.u.thresh = noise_dither_thresh;
+
+ /* 0 */
+ pcs->rendering_info[0].flags = HT_NONE;
+
+ pcs->rendering_info[0].pbidither = &pcs->ordered_dither;
+
+ /* 1 - dither doesn't matter */
+ pcs->rendering_info[1].flags = HT_FIXED | HT_DEVCSPACE;
+ pcs->rendering_info[1].pbidither = &pcs->ordered_dither;
+
+ /* 2 - dither doesn't matter */
+ pcs->rendering_info[2].flags = HT_FIXED | HT_DEVCSPACE;
+ pcs->rendering_info[2].pbidither = &pcs->ordered_dither;
+
+ /* 3 - the default */
+ pcs->rendering_info[3].flags = HT_NONE;
+ pcs->rendering_info[3].pbidither = &pcs->ordered_dither;
+
+ /* 4 - currently not supported */
+ pcs->rendering_info[4].flags = HT_FIXED | HT_IMONLY;
+ pcs->rendering_info[4].pbidither = 0;
+
+ /* 5 - monochrome version of 3 */
+ pcs->rendering_info[5].flags = HT_NONE;
+ pcs->rendering_info[5].pbidither = &pcs->ordered_dither;
+
+ /* 6 - currently not supported */
+ pcs->rendering_info[6].flags = HT_FIXED | HT_IMONLY;
+ pcs->rendering_info[6].pbidither = 0;
+
+ /* 7 */
+ pcs->rendering_info[7].flags = HT_FIXED;
+ pcs->rendering_info[7].pbidither = &pcs->clustered_dither;
+
+ /* 8 */
+ pcs->rendering_info[8].flags = HT_FIXED;
+ pcs->rendering_info[8].pbidither = &pcs->clustered_dither;
+
+ /* 9 - dither comes from user */
+ pcs->rendering_info[9].flags = HT_FIXED | HT_USERDEF | HT_DEVCSPACE;
+ pcs->rendering_info[9].pbidither = 0;
+
+ pcs->rendering_info[10].flags = HT_FIXED | HT_USERDEF | HT_DEVCSPACE;
+ pcs->rendering_info[10].pbidither = 0;
+
+ /* 11 */
+ pcs->rendering_info[11].flags = HT_FIXED | HT_USERDEF | HT_DEVCSPACE;
+ pcs->rendering_info[11].pbidither = &pcs->ordered_dither;
+
+ /* 12 */
+ pcs->rendering_info[12].flags = HT_FIXED;
+ pcs->rendering_info[12].pbidither = &pcs->ordered_dither;
+
+ /* 13 - device should override */
+ pcs->rendering_info[13].flags = HT_NONE;
+ pcs->rendering_info[13].pbidither = &pcs->noise_dither;
+
+ /* 14 - device should override */
+ pcs->rendering_info[14].flags = HT_NONE;
+ pcs->rendering_info[14].pbidither = &pcs->noise_dither;
+
+ /* 15 - device should override */
+ pcs->rendering_info[15].flags = HT_NONE;
+ pcs->rendering_info[15].pbidither = &pcs->ordered_dither;
+
+ /* 16 - device should override */
+ pcs->rendering_info[16].flags = HT_NONE;
+ pcs->rendering_info[16].pbidither = &pcs->ordered_dither;
+
+ /* 17 - device should override */
+ pcs->rendering_info[17].flags = HT_NONE;
+ pcs->rendering_info[17].pbidither = &pcs->ordered_dither;
+
+ /* 18 - device should override */
+ pcs->rendering_info[18].flags = HT_NONE;
+ pcs->rendering_info[18].pbidither = &pcs->ordered_dither;
+
+ /* 19 - device should override */
+ pcs->rendering_info[19].flags = HT_NONE;
+ pcs->rendering_info[19].pbidither = &pcs->ordered_dither;
+
+ {
+ /*
+ * Remap the the rendering methods. This will generally be
+ * selected from the device; the default value provided below
+ * maps all methods to ones that are supported in the default
+ * system.
+ */
+ static const byte rendering_remap[20] = {
+ 0, 1, 2, 3, /* 0 - 3 */
+ 3, 5, 5, 7, /* 4 - 7 */
+ 8, 9, 10, 11, /* 8 - 11 */
+ 12, 13, 14, 3, /* 12 - 15 */
+ 5, 5, 3, 5 /* 16 - 19 */
+ };
+ for ( i = 0; i < countof(rendering_remap); i++ )
+ pcs->dflt_rendering_remap[i] =
+ pcs->rendering_remap[i] = rendering_remap[i];
+ }
+
+ /* get any dither information from the current device */
+ for (i = 0; i < countof(pcs->rendering_info); i++) {
+ char nbuff[12];
+
+ if ((pcs->rendering_info[i].flags & HT_FIXED) != 0)
+ continue;
+ gs_c_param_list_write(&list, pmem);
+ sprintf(nbuff, "Dither_%d", i);
+ if ( (param_request((gs_param_list *)&list, nbuff) >= 0) &&
+ (gs_getdeviceparams(pcur_dev, (gs_param_list *)&list) >= 0) ) {
+ gs_param_dict dict;
+
+ gs_c_param_list_read(&list);
+ if ( param_begin_read_dict( (gs_param_list *)&list,
+ nbuff,
+ &dict,
+ false
+ ) == 0 )
+ read_dither(pcs, i, dict.list, pmem);
+ param_end_read_dict((gs_param_list *)&list, nbuff, &dict);
+ }
+
+ gs_c_param_list_release(&list);
+ }
+ gs_c_param_list_release(&list);
+
+ /* read in a new remapping array (if any) */
+ gs_c_param_list_write(&list, pmem);
+ if ( (param_request((gs_param_list *)&list, "RenderRemap") >= 0) &&
+ (gs_getdeviceparams(pcur_dev, (gs_param_list *)&list) >= 0) ) {
+ gs_c_param_list_read(&list);
+ read_remap_array(pcs, (gs_param_list *)&list, pmem);
+ }
+ gs_c_param_list_release(&list);
+}
+
+/*
+ * Set up normal or monochrome print mode. The latter is accomplished by
+ * remapping each of the rendering algorithms to its monochrome equivalent.
+ * The handling of the snap-to-primaries rendering method (1) is almost
+ * certianly wrong, but it is the best that can be done with the current
+ * scheme.
+ *
+ * Note that the current rendering method must be set before this change
+ * will take effect.
+ */
+
+void
+pcl_ht_set_print_mode(
+ pcl_state_t * pcs,
+ bool monochrome
+)
+{
+ memcpy(pcs->rendering_remap, pcs->dflt_rendering_remap, sizeof(pcs->rendering_remap));
+ if (monochrome) {
+ int i;
+ for (i = 0; i < countof(pcs->rendering_remap); i++)
+ pcs->rendering_remap[i] = monochrome_remap[pcs->rendering_remap[i]];
+ }
+}
+
+
+/*
+ * Free the graphic library halftone objects associated with a PCL halftone
+ * object.
+ *
+ * Note that freeing of the halftone strings is legitimate, as graphic library
+ * halftones are never shared among PCL halftone objects.
+ */
+static void
+free_gs_hts(
+ pcl_ht_t * pht
+)
+{
+ int i;
+
+ if (pht->pfg_ht != 0)
+ gs_ht_release(pht->pfg_ht);
+ if (pht->pim_ht != 0)
+ gs_ht_release(pht->pim_ht);
+ pht->pfg_ht = 0;
+ pht->pim_ht = 0;
+
+ for (i = 0; i < countof(pht->thresholds); i++) {
+ gs_string * pstr = &(pht->thresholds[i]);
+
+ if (pstr->data != 0)
+ gs_free_string( pht->rc.memory,
+ pstr->data,
+ pstr->size,
+ "free_gs_hts"
+ );
+ pstr->size = 0;
+ pstr->data = 0;
+ }
+}
+
+/*
+ * Free a PCL halftone object.
+ *
+ * Note that the pointers in the three string constants are ignored by this
+ * code: all three refer to the same dither object, which is either statically
+ * allocated or also refered to by the pudither field. The string pointers
+ * exist only because they are required by the graphic library halftone
+ * structures.
+ */
+static void
+free_pcl_ht(
+ gs_memory_t * pmem,
+ void * pvht,
+ client_name_t cname
+)
+{
+ pcl_ht_t * pht = (pcl_ht_t *)pvht;
+
+ if (pht->client_data[0].plktbl != 0)
+ rc_adjust(pht->client_data[0].plktbl, -3, cname);
+ pcl_udither_release(pht->pdither);
+
+ /* free_gs_hts frees the string pointers */
+ free_gs_hts(pht);
+
+ gs_free_object(pmem, pvht, cname);
+}
+
+/*
+ * Allocate a PCL halftone object.
+ *
+ * Note that this allocates only the PCL halftone object, not the associated
+ * graphic library halftone object.
+ *
+ * Returns 0 on success, < 0 in event of an error.
+ */
+static int
+alloc_pcl_ht(
+ pcl_ht_t ** ppht,
+ gs_memory_t * pmem
+)
+{
+ pcl_ht_t * pht = 0;
+ int i;
+
+ rc_alloc_struct_1( pht,
+ pcl_ht_t,
+ &st_ht_t,
+ pmem,
+ return e_Memory,
+ "allocate pcl halftone object"
+ );
+ pht->rc.free = free_pcl_ht;
+
+ pht->pdither = 0;
+ pht->render_method = 3; /* HP specified default value */
+ pht->orig_render_method = 3;
+ pht->is_gray_render_method = false;
+ pht->pfg_ht = 0;
+ pht->pim_ht = 0;
+
+ for (i = 0; i < 3; i++) {
+ pht->client_data[i].comp_indx = i;
+ pht->client_data[i].inv_gamma = 1.0;
+ pht->client_data[i].plktbl = 0;
+
+ /* don't need the threshold string pointers yet */
+ pht->thresholds[i].data = 0;
+ pht->thresholds[i].size = 0;
+ }
+
+ *ppht = pht;
+ return 0;
+}
+
+
+/*
+ * Make a unique copy of a PCL halftone object.
+ *
+ * Because the graphic library does not provide a "make unique" feature for
+ * the its halftone objects, it is necessary to keep the PCL halftone object
+ * and the associated graphic library halftone object in a one-to-one
+ * relationship. Hence, two of PCL objects will never share a grahpic library
+ * halftone object, and so the "unshared" PCL halftone object will always
+ * start without any associated graphic library halftone objects.
+ *
+ * To simplify the other code in this module, "unshared" halftones are always
+ * given new identifiers, even if the unshare operation itself does not
+ * change anything.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+static int
+unshare_pcl_ht(
+ pcl_ht_t ** ppht
+)
+{
+ pcl_ht_t * pht = *ppht;
+ pcl_ht_t * pnew = 0;
+ int code = 0;
+ int i;
+
+ /* check if there is anything to do */
+ if (pht->rc.ref_count == 1) {
+ free_gs_hts(pht);
+ return 0;
+ }
+ rc_decrement(pht, "unshare pcl halftone object");
+
+ if ((code = alloc_pcl_ht(ppht, pht->rc.memory)) < 0)
+ return code;
+ pnew = *ppht;
+
+ if (pht->pdither != 0)
+ pcl_udither_init_from(pnew->pdither, pht->pdither);
+ pnew->render_method = pht->render_method;
+ pnew->orig_render_method = pht->orig_render_method;
+ pnew->is_gray_render_method = pht->is_gray_render_method;
+
+ for (i = 0; i < 3; i++) {
+ pnew->client_data[i].comp_indx = pht->client_data[i].comp_indx;
+ pnew->client_data[i].inv_gamma = pht->client_data[i].inv_gamma;
+ if (pht->client_data[i].plktbl != 0)
+ pcl_lookup_tbl_copy_from( pnew->client_data[i].plktbl,
+ pht->client_data[i].plktbl
+ );
+ }
+
+ /* all other fields are left "null" until needed */
+
+ return 0;
+}
+
+/* return true if all palette entries are gray
+ * return false if any entry is color
+ * checks the entire palette
+ * all gray palette ONLY has meaning if ENABLE_AUTO_GRAY_RENDER_METHODS is true
+ * otherwise this is a NOP that always returns false.
+ */
+bool
+pcl_ht_is_all_gray_palette(pcl_state_t *pcs)
+{
+ if ( pcs->monochrome_mode )
+ return true;
+ if ( ENABLE_AUTO_GRAY_RENDER_METHODS ) {
+
+ bool is_gray = true;
+ const char *pb = 0;
+ pcl_palette_t * ppalet = pcs->ppalet;
+ pcl_cs_indexed_t * pindexed = ppalet->pindexed;
+ int i;
+
+ for ( i = 0; i < pindexed->num_entries; i++ ) {
+ pb = pindexed->palette.data + (3 * i);
+ if ( pb[0] == pb[1] && pb[0] == pb[2] ) {
+ continue;
+ }
+ else {
+ is_gray = false;
+ break;
+ }
+ }
+ return is_gray;
+ }
+ return false; /* feature disabled, concider it color */
+}
+
+/*
+ * Set the render method.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int
+pcl_ht_set_render_method(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ uint render_method
+)
+{
+ int code = 0;
+ uint color_render_method;
+
+ if (render_method >= countof(pcs->rendering_info))
+ return 0;
+
+ /* normal rendering remap */
+ color_render_method = pcs->rendering_remap[render_method];
+
+ if (color_render_method == (*ppht)->orig_render_method)
+ return 0;
+
+ if ((code = unshare_pcl_ht(ppht)) < 0)
+ return code;
+
+ /* use color render method by default */
+ (*ppht)->orig_render_method = (*ppht)->render_method = color_render_method;
+ (*ppht)->is_gray_render_method = false;
+
+ /* remap render algo based on is the palette gray palette check */
+ return pcl_ht_remap_render_method(pcs,
+ &(pcs->ppalet->pht),
+ pcl_ht_is_all_gray_palette(pcs));
+}
+
+/* if the palette is gray remap the render_algorithm to a gray algo
+ * if the palette is color use the original "color" render_algorithm
+ * degenerates to NOP if ENABLE_AUTO_GRAY_RENDER_METHODS is false
+ */
+int
+pcl_ht_remap_render_method(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ bool is_gray
+ )
+{
+ if ( ENABLE_AUTO_GRAY_RENDER_METHODS ) {
+ uint render_method = (*ppht)->orig_render_method;
+ int code = 0;
+ if (is_gray != (*ppht)->is_gray_render_method ) {
+ if( is_gray ) {
+ render_method = monochrome_remap[pcs->rendering_remap[render_method]];
+ (*ppht)->is_gray_render_method = is_gray;
+ }
+ else {
+ render_method = (*ppht)->orig_render_method;
+ }
+
+ if ((code = unshare_pcl_ht(ppht)) < 0)
+ return code;
+
+ (*ppht)->render_method = render_method;
+ }
+ }
+ /* else feature disabled NOP */
+ return 0;
+}
+
+/*
+ * Update the gamma parameter.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int
+pcl_ht_set_gamma(
+ pcl_ht_t ** ppht,
+ float gamma
+)
+{
+ pcl_ht_t * pht = *ppht;
+ float inv_gamma = (gamma == 0.0 ? 1.0 : 1.0 / gamma);
+ int code = 0;
+ int i;
+
+ /*
+ * All of the gamma correction factors and lookup table pointers are the
+ * same, so just check the first of these. If nothing has changed, just
+ * return.
+ */
+ if ( (pht->client_data[0].inv_gamma == inv_gamma) &&
+ (pht->client_data[0].plktbl == 0) )
+ return 0;
+
+ /* get a unique copy of the halftone object */
+ if ((code = unshare_pcl_ht(ppht)) < 0)
+ return code;
+ pht = *ppht;
+
+ /* discard the device specific color lookup table, if present */
+ for (i = 0; i < 3; i++) {
+ pht->client_data[i].inv_gamma = inv_gamma;
+ pcl_lookup_tbl_release(pht->client_data[i].plktbl);
+ pht->client_data[i].plktbl = 0;
+ }
+
+ return 0;
+}
+
+/*
+ * Update the color lookup table information. This takes action only for lookup
+ * tables associated with device-dependent color spaces; other lookup tables
+ * are handled via color spaces.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int
+pcl_ht_set_lookup_tbl(
+ pcl_ht_t ** ppht,
+ pcl_lookup_tbl_t * plktbl
+)
+{
+ pcl_ht_t * pht = *ppht;
+ int code = 0;
+ int i;
+
+ /* check if this is a nop clear lookup table command */
+ if ((plktbl == 0) && (pht->client_data[0].plktbl == 0))
+ return 0;
+
+ /* check that the table is for a device-specific color space */
+ if ((plktbl != 0) && (pcl_lookup_tbl_get_cspace(plktbl) > pcl_cspace_CMY))
+ return 0;
+
+ /* get a unique copy of the halftone object */
+ if ((code = unshare_pcl_ht(ppht)) < 0)
+ return code;
+ pht = *ppht;
+
+ for (i = 0; i < 3; i++)
+ pcl_lookup_tbl_copy_from(pht->client_data[i].plktbl, plktbl);
+ return 0;
+}
+
+/*
+ * Set the user-defined dither matrix for a halftone object.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int
+pcl_ht_set_udither(
+ pcl_ht_t ** ppht,
+ pcl_udither_t * pdither
+)
+{
+ pcl_ht_t * pht = *ppht;
+ int code = 0;
+
+ /* get a unique copy of the halftone object */
+ if ((code = unshare_pcl_ht(ppht)) < 0)
+ return code;
+ pht = *ppht;
+
+ pcl_udither_copy_from(pht->pdither, pdither);
+ return 0;
+}
+
+/*
+ * Update the current halftone for a change in the color space.
+ *
+ * The color space usually does not affect the halftone, but it can in cases
+ * in which a device-independent color space is used with a rendering method
+ * that is not compatible with device-independent color spaces.
+ */
+int
+pcl_ht_update_cspace(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ pcl_cspace_type_t cstype_old,
+ pcl_cspace_type_t cstype_new
+)
+{
+ pcl_ht_t * pht = *ppht;
+ uint i = pht->render_method;
+ uint flags = pcs->rendering_info[i].flags;
+
+ if ( ((pht->pfg_ht == 0) && (pht->pim_ht == 0)) ||
+ ((flags & HT_DEVCSPACE) == 0) ||
+ ((cstype_old <= pcl_cspace_CMY) && (cstype_new <= pcl_cspace_CMY)) ||
+ ((cstype_old > pcl_cspace_CMY) && (cstype_new > pcl_cspace_CMY)) )
+ return 0;
+
+ /* get a unique copy of the halftone object */
+ return unshare_pcl_ht(ppht);
+}
+
+/*
+ * Create the default halftone, releasing the current halftone if it exists.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int
+pcl_ht_build_default_ht(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ gs_memory_t * pmem
+)
+{
+ int code = 0;
+
+ if ((pcs->pdflt_ht == 0) && ((code = alloc_pcl_ht(&pcs->pdflt_ht, pmem)) < 0))
+ return code;
+ pcl_ht_copy_from(*ppht, pcs->pdflt_ht);
+ return 0;
+}
+
+/* Define a transfer function without gamma correction. */
+static float
+identity_transfer(floatp tint, const gx_transfer_map *ignore_map)
+{ return tint;
+}
+
+
+#ifdef DEVICE_HAS_CRD
+/*
+ * Get the rendering information corresponding to a given rendering method.
+ * This takes into account the restriction that certain rendering methods may
+ * not be used with device-independent color spaces. Also considers whether
+ * or not the rendering is processing PCL rasters (the for_image operand).
+ */
+static const pcl_rend_info_t *
+get_rendering_info(
+ pcl_state_t * pcs,
+ uint sel_method,
+ pcl_cspace_type_t cstype,
+ bool for_image
+)
+{
+ pcl_rend_info_t * pinfo = &(pcs->rendering_info[sel_method]);
+ uint flags = pinfo->flags;
+
+ /* check for methods that require device-dependent color spaces */
+ if ( (((flags & HT_DEVCSPACE) != 0) && (cstype > pcl_cspace_CMY)) ||
+ (((flags & HT_IMONLY) != 0) && !for_image) )
+ pinfo = &pcs->rendering_info[3];
+
+ return pinfo;
+}
+#endif /* DEVICE_HAS_CRD */
+
+/*
+ * Currently pcl always uses a fixed ordered dither if used with a
+ * device that requires halfoning.
+ */
+
+int
+pcl_ht_set_halftone(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht, /* NOT USED */
+ pcl_cspace_type_t cstype, /* NOT USED */
+ bool for_image /* NOT USED */
+)
+{
+ gs_string thresh;
+ int code;
+
+ if ( pcs->halftone_set )
+ return 0;
+
+ thresh.data = (byte *)ordered_dither_data;
+ thresh.size = 256;
+ code = pl_set_pcl_halftone(pcs->pgs, identity_transfer, 16, 16,
+ thresh, 0, 0);
+ if ( code >= 0 )
+ pcs->halftone_set = true;
+ return code;
+}
diff --git a/pcl/pcht.h b/pcl/pcht.h
new file mode 100644
index 000000000..91b9452e8
--- /dev/null
+++ b/pcl/pcht.h
@@ -0,0 +1,363 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcht.h - PCL halftone/rendering object */
+
+#ifndef pcht_INCLUDED
+#define pcht_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gsht1.h"
+#include "gshtx.h"
+#include "pcident.h"
+#include "pcstate.h"
+#include "pcommand.h"
+#include "pclookup.h"
+#include "pcdither.h"
+
+
+/*
+ * Structure for built-in dither methods. "built-in" in this case refers to
+ * items that cannot be modifiied by the user via the PCL interpreter; there
+ * are also "fixed" dithers that are defined in the interpreter itself and
+ * cannot be modified by either the output device or the user.
+ *
+ * Currently two types are recognized: threshold dithers (which have the
+ * monotinicity property), and table dithers. Others may be added subsequently,
+ * though this is a large task.
+ *
+ * As is the case for both PostScript and PCL, all dithers are set up for an
+ * additive color spaces. This is also the organization expected by the (now
+ * repaired) graphic library.
+ *
+ * For thresholds, data is organized as an array of bytes in (device-space)
+ * by row, column, and then color plane. Each byte represents a threshold
+ * level between 1 and 255. Hence, for a 3 (rgb) color 2 x 2 dither, the data
+ * should be provided as:
+ *
+ * red(0, 0), red(1, 0), red(0, 1), red(1, 1), green(0, 0), ..., blue(1, 1)
+ *
+ * For table dithers, data is organized by (device-space) row, then column,
+ * then level (the intensity level to which the given color plane corresponds),
+ * then color plane. Data is one bit per pixel, high-order-bit leftmost, and
+ * rows are rounded to byte boundaries. Any number of levels may be provided,
+ * but the zero-intensity level (which, for subtractive color space devices,
+ * is all 1's) should not be provided. Note also that some code in the graphic
+ * library assumes that full intensity colors are pure (all 0's or all 1's),
+ * so these may not be handled correctly if the full intensity dither has
+ * both 0's and 1's.
+ *
+ * Thus, for a 3 color (rgb) 11 x 3 dither with 32 levels, data would be
+ * organized as follows:
+ *
+ * red_level_1(0..7, 0), red_level_1(8..10, 0),
+ * red_level_1(0..7, 1), red_level_1(8..10, 1),
+ * red_level_1(0..7, 2), red_level_1(8..10, 2),
+ * red_level_2(0..7, 0), red_level_2(8..10, 0),
+ * ...
+ * red_level_32(0..7, 2), red_level_32(8..10, 2),
+ * green_level_1(0..7, 0), green_level_1(8..10, 0),
+ * ...
+ * green_level_32(0..7, 2), green_level_32(8..10, 2),
+ * blue_level_1(0..7, 0), blue_level_1(8..10, 0),
+ * ...
+ * blue_level_32(0..7, 2), blue_level_32(8..10, 2)
+ *
+ *
+ * Note that this module does NOT take ownership of built-in dither objects;
+ * that is the responsibility of the caller.
+ */
+typedef struct pcl_ht_builtin_threshold_s {
+ int nplanes; /* number of planes */
+ int height, width; /* in device pixels */
+ const byte * pdata;
+} pcl_ht_builtin_threshold_t;
+
+typedef struct pcl_ht_builtin_table_dither_s {
+ int nplanes; /* number of color planes */
+ int height, width; /* in device pixels */
+ int nlevels; /* number of levels in a plane; must be
+ the same for all planes */
+ const byte * pdata; /* width x height x num_levels x nplanes */
+} pcl_ht_builtin_table_dither_t;
+
+typedef enum {
+ pcl_halftone_Threshold = 0,
+ pcl_halftone_Table_Dither,
+ pcl_halftone_num
+} pcl_halftone_type_t;
+
+#ifndef pcl_ht_builtin_dither_DEFINED
+#define pcl_ht_builtin_dither_DEFINED
+typedef struct pcl_ht_builtin_dither_s {
+ pcl_halftone_type_t type;
+ union {
+ pcl_ht_builtin_threshold_t thresh;
+ pcl_ht_builtin_table_dither_t tdither;
+ } u;
+} pcl_ht_builtin_dither_t;
+#endif
+
+#define private_st_ht_builtin_dither_t() \
+ gs_private_st_composite( st_ht_builtin_dither_t, \
+ pcl_ht_builtin_dither_t, \
+ "pcl builtin dither object", \
+ ht_dither_enum_ptrs, \
+ ht_dither_reloc_ptrs \
+ )
+
+/*
+ * Array of dithers and devices to be used for different rendering methods.
+ *
+ * The HT_FIXED flag indicates which methods may not be changed by the output
+ * device. The ordered, clustered ordered, and user-defined dithers (both
+ * color and monochrome versions) are in this category, because they must
+ * have predictable matrices for the logical operations to produce predictable
+ * results.
+ *
+ * The HT_USERDEF flag indicates which methods make use of the user-defined
+ * dither matrix.
+ *
+ * The HT_DECSPACE flag indicates which methods may be used with device
+ * independent color spaces. If one of these methods is selected and a device
+ * independent color space is set, the default rendering method is used
+ * instead.
+ *
+ * The HT_IMONLY flag indicates that a rendering method applies only to
+ * images. ***This feature is currently not supported***
+ *
+ * For each rendering method there is an associated color mapping method, to
+ * be used with the devcmap color mapping device. A single device is used
+ * rather than one device for each different mapping, as the the graphic
+ * library provides no good technique for removing a device from a graphic
+ * state (this is typically done by grestore, as is the case for PostScript).
+ */
+
+#define HT_NONE 0x0
+#define HT_FIXED 0x1
+#define HT_USERDEF 0x2
+#define HT_DEVCSPACE 0x4
+#define HT_IMONLY 0x8
+
+typedef struct rend_info_s {
+ uint flags;
+ const pcl_ht_builtin_dither_t * pbidither;
+} pcl_rend_info_t;
+
+/*
+ * Client data structure for PCL halftones. This holds two pieces of
+ * information: the gamma correction factor, and a pointer to the lookup table
+ * for device specific color spaces. The former is used only if the latter is
+ * null. The gamma correction factor must be kept, however, as it may be
+ * inherited by newly created palettes, while the lookup table itself is
+ * cleared (see the comment in pclookup.h for some notes on not fully
+ * understood items in HP's documentation concerning these tables).
+ *
+ * The system maintains three of these objects, because a separate one is
+ * required for each component of the (base) color space. The different
+ * components are distinguished only by the comp_indx field.
+ */
+typedef struct pcl_ht_client_data_s {
+ int comp_indx;
+ float inv_gamma;
+ pcl_lookup_tbl_t * plktbl;
+} pcl_ht_client_data_t;
+
+/*
+ * Structure of the PCL halftone/render object.
+ *
+ * This structure contains a pair of halftone objects since, in principle,
+ * PCL can simultaneously support two separate halftone techniques: one for
+ * geometric objects (which use the foreground color), the other for images.
+ * For the time being these two will always be the same.
+ *
+ * As is the case with all PCL objects that access modifiable reference
+ * counted objects in gs, this must be kept in a one-to-one relationship with
+ * the graphic library halftone objects. Hence, two of these objects will never
+ * share a gs_ht structure. Unlike the colorspaces, however, there may be
+ * extended periods of time when this structure has no associated graphic
+ * library halftone structure.
+ *
+ * The id field is used to identify a specific halftone, and is updated whenever
+ * the halftone changes. This is used to indicate when structures that depend
+ * on the halftone must be updated.
+ */
+struct pcl_ht_s {
+ rc_header rc;
+ pcl_ht_client_data_t client_data[3];
+ pcl_udither_t * pdither;
+ gs_string thresholds[3];
+ uint render_method;
+ uint orig_render_method;
+ bool is_gray_render_method;
+ gs_ht * pfg_ht;
+ gs_ht * pim_ht;
+};
+
+#define private_st_ht_t() \
+ gs_private_st_composite( st_ht_t, \
+ pcl_ht_t, \
+ "pcl halftone object", \
+ ht_enum_ptrs, \
+ ht_reloc_ptrs \
+ )
+
+#ifndef pcl_ht_DEFINED
+#define pcl_ht_DEFINED
+typedef struct pcl_ht_s pcl_ht_t;
+#endif
+
+/*
+ * The usual init, copy,and release macros.
+ */
+#define pcl_ht_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_ht_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_ht_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_ht_release(pht) \
+ rc_decrement(pht, "pcl_ht_release")
+
+/*
+ * The following routine is intended to initialize the forwarding devices used
+ * for special render methods. Currently it only creates the built-in dither
+ * arrays.
+ */
+void pcl_ht_init_render_methods(
+ pcl_state_t * pcs,
+ gs_memory_t * pmem
+);
+
+/*
+ * Set up normal or monochrome print mode. The latter is accomplished by
+ * remapping each of the rendering algorithms to its monochrome equivalent.
+ * The handling of the snap-to-primaries rendering method (1) is almost
+ * certianly wrong, but it is the best that can be done with the current
+ * scheme.
+ *
+ * Note that the current rendering method must be set before this change
+ * will take effect.
+ */
+void pcl_ht_set_print_mode(pcl_state_t *pcs, bool monochrome);
+
+/*
+ * Set the render method.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_ht_set_render_method(pcl_state_t *pcs, pcl_ht_t ** ppht, uint render_method);
+
+
+/**
+ * Remap render method to a gray render method iff enabled && palette is all gray
+ *
+ * if the palette is gray remap the render_algorithm to a gray algo
+ * if the palette is color use the original "color" render_algorithm
+ * degenerates to NOP if ENABLE_AUTO_GRAY_RENDER_METHODS is false
+ */
+int pcl_ht_remap_render_method(pcl_state_t * pcs,
+ pcl_ht_t **ppht,
+ bool is_gray
+ );
+
+/**
+ * Checks if all palette entries are gray iff enabled.
+ *
+ * Returns true if all palette entries are gray
+ * Returns false if any entry is color
+ * checks the entire palette
+ * all gray palette ONLY has meaning if ENABLE_AUTO_GRAY_RENDER_METHODS is true
+ * otherwise this is a NOP that always returns false.
+ */
+bool pcl_ht_is_all_gray_palette(pcl_state_t *pcs);
+
+/*
+ * Update the gamma parameter.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_ht_set_gamma(pcl_ht_t ** ppht, float gamma);
+
+/*
+ * Update the color lookup table information. This takes action only for lookup
+ * tables associated with device-dependent color spaces; other lookup tables
+ * are handled via color spaces.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_ht_set_lookup_tbl(
+ pcl_ht_t ** ppht,
+ pcl_lookup_tbl_t * plktbl
+);
+
+/*
+ * Set the user-defined dither matrix for a halftone object.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_ht_set_udither(
+ pcl_ht_t ** ppht,
+ pcl_udither_t * pdither
+);
+
+/*
+ * Update the current halftone for a change in the color space.
+ *
+ * The color space usually does not affect the halftone, but it can in cases
+ * in which a device-independent color space is used with a rendering method
+ * that is not compatible with device-independent color spaces.
+ */
+int pcl_ht_update_cspace(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ pcl_cspace_type_t cstype_old,
+ pcl_cspace_type_t cstype_new
+);
+
+/*
+ * Create the default halftone, releasing the current halftone if it exists.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_ht_build_default_ht(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ gs_memory_t * pmem
+);
+
+/*
+ * Set the given halftone into the graphic state. If the halftone doesn't
+ * exist yet, create a default halftone and set it into the graphic state.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_ht_set_halftone(
+ pcl_state_t * pcs,
+ pcl_ht_t ** ppht,
+ pcl_cspace_type_t cstype,
+ bool for_image
+);
+
+#endif /* pcht_INCLUDED */
diff --git a/pcl/pcident.c b/pcl/pcident.c
new file mode 100644
index 000000000..e7da9024c
--- /dev/null
+++ b/pcl/pcident.c
@@ -0,0 +1,41 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcident.c - object identification mechanism for PCL */
+
+#include "gx.h"
+#include "gsuid.h"
+#include "pcident.h"
+#include "pcstate.h"
+
+/*
+ * Return the next unique identifier.
+ *
+ * Identifiers start at 8 to try to expose errors that might be masked by an
+ * identifier of 0. In the unlikely event that so many identifiers are created
+ * that the number wraps back to 0, the next assigned identifier will be
+ * 16 * 1024 * 1024. This avoids potential overlap with permanent objects that
+ * are assigned identifiers at initialization time.
+ *
+ * Special handling is also provided to avoid the no_UniqueID value used by
+ * the graphic library.
+ */
+ pcl_gsid_t
+pcl_next_id(pcl_state_t *pcs)
+{
+ if (pcs->next_id == 0)
+ pcs->next_id = 16 * 1024 * 1024;
+ else if (pcs->next_id == no_UniqueID)
+ ++(pcs->next_id);
+ return (pcs->next_id)++;
+}
diff --git a/pcl/pcident.h b/pcl/pcident.h
new file mode 100644
index 000000000..ea0c015ae
--- /dev/null
+++ b/pcl/pcident.h
@@ -0,0 +1,55 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcident.h - object identification mechanism for PCL */
+
+#ifndef pcident_INCLUDED
+#define pcident_INCLUDED
+
+#include "gx.h"
+
+/*
+ * Various "graphic attribute" objects created by PCL are used in the graphic
+ * state: patterns, color spaces, halftones, and rendering dictionaries. Unlike
+ * PostScript, these objects also have an existence outside of the graphic state.
+ * When graphic objects are rendered, it is necessary to determine the set of
+ * attribute objects they should use, and which of these is currently installed
+ * in the graphic state.
+ *
+ * There is no way to do this directly in the graphic library, as its attribute
+ * objects do not carry any identifiers (they provide no benefit in a PostScript
+ * setting). Hence, we pair the graphic library objects with PCL objects, and
+ * assign identifiers to the latter. So long as the two objects are kept in a
+ * one-to-one relationship, the identifiers can be used as identifiers of the
+ * graphic library objects as well.
+ *
+ * Though objects of different types can in principle be assigned the same
+ * identifier, for simplicity the current code assigns unique identifiers for
+ * all objects. These identifiers are unsigned longs. They are assigned
+ * consecutively beginning from 8 at boot time. In the unlikely event that
+ * they should reach 0 once more, they will restart at 16 * 1024 * 1024; this
+ * should prevent overlap with codes that are assigned to statically allocated
+ * objects at boot time.
+ */
+
+typedef ulong pcl_gsid_t;
+
+/* Define an opaque type for the PCL state. */
+#ifndef pcl_state_DEFINED
+# define pcl_state_DEFINED
+typedef struct pcl_state_s pcl_state_t;
+#endif
+
+pcl_gsid_t pcl_next_id(pcl_state_t *pcs);
+
+#endif /* pcident_INCLUDED */
diff --git a/pcl/pcimpl.c b/pcl/pcimpl.c
new file mode 100644
index 000000000..6f43868b9
--- /dev/null
+++ b/pcl/pcimpl.c
@@ -0,0 +1,28 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcimpl.c - PCL5c pl_interp_implementation_t descriptor */
+
+#include "memory_.h"
+#include "scommon.h"
+#include "gxdevice.h"
+#include "pltop.h"
+
+extern const pl_interp_implementation_t pcl_implementation;
+
+/* Zero-terminated list of pointers to implementations */
+pl_interp_implementation_t const * const pdl_implementation[] = {
+ &pcl_implementation,
+ 0
+};
+
diff --git a/pcl/pcindxed.c b/pcl/pcindxed.c
new file mode 100644
index 000000000..40cd643cd
--- /dev/null
+++ b/pcl/pcindxed.c
@@ -0,0 +1,1176 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcindexed.c - PCL indexed color space implementation */
+#include "math_.h"
+#include "string_.h"
+#include "gx.h"
+#include "pcmtx3.h"
+#include "pccid.h"
+#include "pccsbase.h"
+#include "pcpalet.h"
+
+/* default GL/2 pen width, in plotter units (1016 ploter units per inch) */
+static const float dflt_pen_width = 14.0;
+
+/* the image data configuration for the default color space */
+static const pcl_cid_hdr_t dflt_cid_hdr = {
+ pcl_cspace_RGB, /* color space type */
+ pcl_penc_indexed_by_plane, /* pixel encoding type */
+ 1, /* bits per index */
+ { 1, 1, 1 } /* bits per primary (3 components) */
+};
+
+/*
+ * GC routines
+ */
+ static
+ENUM_PTRS_BEGIN(pcl_cs_indexed_enum_ptrs)
+ return 0;
+ ENUM_PTR(0, pcl_cs_indexed_t, pbase);
+ ENUM_PTR(1, pcl_cs_indexed_t, pcspace);
+ ENUM_STRING_PTR(2, pcl_cs_indexed_t, palette);
+ENUM_PTRS_END
+
+ static
+RELOC_PTRS_BEGIN(pcl_cs_indexed_reloc_ptrs)
+ RELOC_PTR(pcl_cs_indexed_t, pbase);
+ RELOC_PTR(pcl_cs_indexed_t, pcspace);
+ RELOC_STRING_PTR(pcl_cs_indexed_t, palette);
+RELOC_PTRS_END
+
+private_st_cs_indexed_t();
+
+
+/*
+ * Find the smallest non-negative integral exponent of 2 larger than
+ * or equal to the given number; 8 => 2^3 12 => 2^4
+ * Note: in/out should be unsigned.
+ */
+ static int
+get_pow_2(
+ int num
+)
+{
+ int i;
+ unsigned power_2 = 1;
+
+ for (i = 0; (unsigned)num > power_2; ++i)
+ power_2 <<= 1;
+ return i;
+}
+
+/*
+ * Free a PCL indexed color space structure.
+ */
+ static void
+free_indexed_cspace(
+ gs_memory_t * pmem,
+ void * pvindexed,
+ client_name_t cname
+)
+{
+ pcl_cs_indexed_t * pindexed = (pcl_cs_indexed_t *)pvindexed;
+
+ pcl_cs_base_release(pindexed->pbase);
+ rc_decrement(pindexed->pcspace, "free_indexed_cspace");
+ if (pindexed->palette.data != 0)
+ gs_free_string( pmem,
+ pindexed->palette.data,
+ pindexed->palette.size,
+ cname
+ );
+ gs_free_object(pmem, pvindexed, cname);
+}
+
+/*
+ * Allocate a PCL indexed color space.
+ *
+ * Because a PCL indexed color space and the associated graphic library
+ * indexed color space must be kept in a one-to-one relationship, the latter
+ * color space is allocated here as well. This requires that the base color
+ * space be an operand.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+alloc_indexed_cspace(
+ pcl_cs_indexed_t ** ppindexed,
+ pcl_cs_base_t * pbase,
+ gs_memory_t * pmem
+)
+{
+ pcl_cs_indexed_t * pindexed = 0;
+ int code = 0;
+ byte * bp = 0;
+ rc_alloc_struct_1( pindexed,
+ pcl_cs_indexed_t,
+ &st_cs_indexed_t,
+ pmem,
+ return e_Memory,
+ "allocate pcl indexed color space"
+ );
+ pindexed->rc.free = free_indexed_cspace;
+ pindexed->pfixed = false;
+ pindexed->is_GL = false;
+ pcl_cs_base_init_from(pindexed->pbase, pbase);
+ pindexed->pcspace = 0;
+ pindexed->num_entries = 0;
+ pindexed->palette.data = 0;
+ pindexed->palette.size = 0;
+
+ bp = gs_alloc_string( pmem,
+ 3 * pcl_cs_indexed_palette_size,
+ "allocate pcl indexed color space"
+ );
+ if (bp == 0) {
+ free_indexed_cspace(pmem, pindexed, "allocate pcl indexed color space");
+ return e_Memory;
+ }
+ pindexed->palette.data = bp;
+ pindexed->palette.size = 3 * pcl_cs_indexed_palette_size;
+
+ code = gs_cspace_build_Indexed( &(pindexed->pcspace),
+ pbase->pcspace,
+ pcl_cs_indexed_palette_size,
+ (gs_const_string *)&(pindexed->palette),
+ pmem
+ );
+ if (code < 0) {
+ free_indexed_cspace(pmem, pindexed, "allocate pcl indexed color space");
+ return code;
+ }
+
+ *ppindexed = pindexed;
+ return 0;
+}
+
+/*
+ * Make a PCL indexed color space unique.
+ *
+ * Note that neither the palette nor the graphic state indexed color space can
+ * be shared between two PCL indexed color spaces. The two would need to be
+ * shared in tandem, which would require common reference counting between the
+ * pair, which would require yet another PCL object, and so on.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+unshare_indexed_cspace(
+ pcl_cs_indexed_t ** ppindexed
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ pcl_cs_indexed_t * pnew = 0;
+ int code = 0;
+ int num_entries = pindexed->num_entries;
+
+ /* check if there is anything to do */
+ if (pindexed->rc.ref_count == 1)
+ return 0;
+ rc_decrement(pindexed, "unshare PCL indexed color space");
+
+ /* allocate a new indexed color space */
+ code = alloc_indexed_cspace( ppindexed,
+ pindexed->pbase,
+ pindexed->rc.memory
+ );
+ if (code < 0)
+ return code;
+ pnew = *ppindexed;
+
+ /* copy fields various and sundry */
+ pnew->pfixed = pindexed->pfixed;
+ pnew->cid = pindexed->cid;
+ pnew->original_cspace = pindexed->original_cspace;
+ pnew->num_entries = pindexed->num_entries;
+ memcpy(pnew->palette.data, pindexed->palette.data, 3 * num_entries);
+ memcpy(pnew->pen_widths, pindexed->pen_widths, num_entries * sizeof(float));
+ memcpy(pnew->norm, pindexed->norm, 3 * sizeof(pindexed->norm[0]));
+ memcpy(pnew->Decode, pindexed->Decode, 6 * sizeof(float));
+
+ return 0;
+}
+
+
+/*
+ * Fill in the default entries in a color palette. This is handled separately
+ * for each color space type.
+ *
+ * The manner in which the default color palette is specified by HP is,
+ * unfortunately, completely dependent on their particular implementation.
+ * HP maintains palettes in device space, and initializes palettes with
+ * device space colors. Hence, these palettes are affected by gamma correction
+ * and the lookup tables for the device color space, but not by any lookup
+ * tables for device independent color spaces (even if the base color space is
+ * device independent), nor by range specifications in the color space
+ * parameters.
+ *
+ * Because this implementation of PCL 5c works strictly in source color space,
+ * it is not possible to achieve the same result. Instead, this implementation
+ * will give accurate default color space values only for the RGB and CMY
+ * color space values, and will give approximate results for the other color
+ * spaces. The default colors will be modified by all applicable color lookup
+ * tables, though some compensation is provided for component ranges.
+ *
+ * For applications, this should not matter: presumably an application does
+ * not select a device independent color space in order to achieve a device-
+ * specific color. For tests such as the PCL 5c FTS, it is more likely that
+ * a discrepancy will be visible, because these tests illustrate the default
+ * palette for each color space.
+ */
+
+/*
+ * Convert a device-independent color intensity value to the range [0, 255].
+ */
+ static int
+convert_comp_val(
+ floatp val,
+ floatp min_val,
+ floatp range
+)
+{
+ val = 255.0 * (val - min_val) / range;
+ return ( val < 0.0 ? 0 : (val > 255.0 ? 255 : (int)floor(val + 0.5)) );
+}
+
+/*
+ * Set the default palette for device specific color spaces.
+ */
+ static void
+set_dev_specific_default_palette(
+ pcl_cs_base_t * pbase, /* ignored in this case */
+ byte * palette,
+ const byte * porder,
+ int start,
+ int num
+)
+{
+ int i;
+ static const byte cmy_default[8 * 3] = {
+ 255, 255, 255, /* white */
+ 0, 255, 255, /* cyan */
+ 255, 0, 255, /* magenta */
+ 0, 0, 255, /* blue */
+ 255, 255, 0, /* yellow */
+ 0, 255, 0, /* green */
+ 255, 0, 0, /* red */
+ 0, 0, 0 /* black */
+ };
+
+ /* fill in the num_entries - 1 values from the RGB default */
+ for (i = start; i < num + start; i++) {
+ palette[3 * i] = cmy_default[3 * porder[i]];
+ palette[3 * i + 1] = cmy_default[3 * porder[i] + 1];
+ palette[3 * i + 2] = cmy_default[3 * porder[i] + 2];
+ }
+}
+
+/*
+ * Set the default palette for a colorimetric RGB space.
+ *
+ * The assumption used in this case is that if the user specified primaries,
+ * presumably they want those primaries. Further, it is assumed that the red
+ * primary is associated with red, the green with green, and so on. Should
+ * the user specify a "blue" color as the red primary, then the default
+ * palette will have blue where red is normally expected.
+ *
+ * An adjustment is made for the specified ranges.
+ */
+ static void
+set_colmet_default_palette(
+ pcl_cs_base_t * pbase,
+ byte * palette,
+ const byte * porder,
+ int start,
+ int num
+)
+{
+ float * pmin = pbase->client_data.min_val;
+ float * prange = pbase->client_data.range;
+ int i;
+ static const float colmet_default[8 * 3] = {
+ 1.0, 1.0, 1.0, /* white */
+ 0.0, 1.0, 1.0, /* cyan */
+ 1.0, 0.0, 1.0, /* magenta */
+ 0.0, 0.0, 1.0, /* blue */
+ 1.0, 1.0, 0.0, /* yellow */
+ 0.0, 1.0, 0.0, /* green */
+ 1.0, 0.0, 0.0, /* red */
+ 0.0, 0.0, 0.0 /* black */
+ };
+
+ /* fill in the num_entries - 1 values from the colorimetric default */
+ for (i = start; i < start + num; i++) {
+ int j;
+ byte * pb = palette + 3 * i;
+ const float * pdef = colmet_default + 3 * porder[i];
+
+ for (j = 0; j < 3; j++)
+ pb[j] = convert_comp_val(pdef[j], pmin[j], prange[j]);
+ }
+}
+
+/*
+ * Set the default palette for a CIE L*a*b* color space.
+ *
+ * The values provided will, for a sufficiently capable device, generate the
+ * SMPTE-C primaries (assuming that ranges and/or color lookup tables don't
+ * get in the way). Most printing devices cannot generate these colors, so
+ * a somewhat different output is produced, but this is as close as we can
+ * come to a "device independent" set of default entries.
+ *
+ * The code provides some compensation for range: if the desired value is
+ * within the permitted range, the palette entry intensity (always in the range
+ * [0, 1]) will be adjusted so as to achieve it; otherwise the intensity will
+ * be set to the appropriate bound. Obviously, none of this works if a
+ * color lookup table is subsequently installed, but it is as much as can be
+ * achieved under the current arrangement.
+ */
+ static void
+set_CIELab_default_palette(
+ pcl_cs_base_t * pbase,
+ byte * palette,
+ const byte * porder,
+ int start,
+ int num
+)
+{
+ float * pmin = pbase->client_data.min_val;
+ float * prange = pbase->client_data.range;
+ int i;
+ static const float lab_default[8 * 3] = {
+ 100.0, 0.0, 0.0, /* white */
+ 91.1, -43.4, -14.1, /* cyan */
+ 61.6, 91.0, -59.2, /* magenta */
+ 35.3, 72.0, -100.0, /* blue */
+ 96.6, -21.3, 95.4, /* yellow */
+ 87.0, -80.7, 84.0, /* green */
+ 53.2, 74.4, 67.7, /* red */
+ 0.0, 0.0, 0.0 /* black */
+ };
+
+ for (i = start; i < start + num; i++) {
+ int j;
+ byte * pb = palette + 3 * i;
+ const float * pdef = lab_default + 3 * porder[i];
+
+ for (j = 0; j < 3; j++)
+ pb[j] = convert_comp_val(pdef[j], pmin[j], prange[j]);
+ }
+}
+
+/*
+ * Set the default palette for a luminance-chrominance color space.
+ *
+ * The arrangement used for this color space is based on the one used for
+ * the colorimetric color space. The user specifies a set of primaries
+ * for the color space underlying the luminance-chrominance color space,
+ * and we provide those primaries in the default palette. Since the
+ * palette entries themselves are in the luminance-chrominance color space,
+ * the default values must be converted to that color space.
+ *
+ * An adjustment is made for the specified ranges.
+ */
+ static void
+set_lumchrom_default_palette(
+ pcl_cs_base_t * pbase,
+ byte * palette,
+ const byte * porder,
+ int start,
+ int num
+)
+{
+ gs_matrix3 * pxfm = gs_cie_abc_MatrixABC(pbase->pcspace);
+ float * pmin = pbase->client_data.min_val;
+ float * prange = pbase->client_data.range;
+ pcl_mtx3_t tmp_mtx;
+ int i;
+ static const pcl_vec3_t lumchrom_default[8] = {
+ { 1.0, 1.0, 1.0 }, /* white */
+ { 0.0, 1.0, 1.0 }, /* cyan */
+ { 1.0, 0.0, 1.0 }, /* magenta */
+ { 0.0, 0.0, 1.0 }, /* blue */
+ { 1.0, 1.0, 0.0 }, /* yellow */
+ { 0.0, 1.0, 0.0 }, /* green */
+ { 1.0, 0.0, 0.0 }, /* red */
+ { 0.0, 0.0, 0.0 } /* black */
+ };
+
+ /* form the primaries to component values matrix */
+ pcl_mtx3_convert_from_gs(&tmp_mtx, pxfm);
+ pcl_mtx3_invert(&tmp_mtx, &tmp_mtx);
+
+ for (i = start; i < start + num; i++) {
+ pcl_vec3_t compvec;
+ byte * pb = palette + 3 * i;
+ int j;
+
+ pcl_vec3_xform(&(lumchrom_default[porder[i]]), &compvec, &tmp_mtx);
+ for (j = 0; j < 3; j++)
+ pb[j] = convert_comp_val(compvec.va[j], pmin[j], prange[j]);
+ }
+}
+
+/*
+ * Set the default values for a specific range of an indexed PCL color space.
+ * The starting point is indicated by start; the number of subsequent entires
+ * to be set by num (for PCL, start is always 0 and num is always the number of
+ * entires in the palette, but that may not be the case for GL/2).
+ *
+ * If gl2 is true, this call is being made from GL/2, hence the GL/2 default
+ * palettes should be used.
+ *
+ * Returns 0 if successful, < 0 in case of an error.
+ */
+ static int
+set_default_entries(
+ pcl_cs_indexed_t * pindexed,
+ int start,
+ int num,
+ bool gl2
+)
+{
+ /* array of procedures to set the default palette entries */
+ static void (*const set_default_palette[(int)pcl_cspace_num])(
+ pcl_cs_base_t * pbase,
+ byte * palette,
+ const byte * porder,
+ int start,
+ int num
+ ) = {
+ set_dev_specific_default_palette, /* RGB */
+ set_dev_specific_default_palette, /* CMY */
+ set_colmet_default_palette, /* colorimetric RGB */
+ set_CIELab_default_palette, /* CIE L*a*b* */
+ set_lumchrom_default_palette /* luminance-
+ * chrominance */
+ };
+
+ /*
+ * For each color space, 8 palette entries are stored in the canonical
+ * CMY order; any palette entries beyond the first 8 always default to
+ * black. These arrays are incorporated into procedures that handle the
+ * generation of colors for each color space type. For the bits per index
+ * settings of 1, 2, or >= 3, an order array is provided, to indicate the
+ * order in which the default palette entries should be entered into the
+ * palette. Separate arrays are provided for the RGB and CMY color spaces,
+ * and for GL/2 default colors.
+ */
+ static const byte order_1[] = { 0, 7 };
+ static const byte cmy_order_2[] = { 0, 1, 2, 7 };
+ static const byte cmy_order_3[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
+ static const byte rgb_order_2[] = { 7, 6, 5, 0 };
+ static const byte rgb_order_3[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
+ static const byte gl2_order_2[] = { 0, 7, 6, 5 };
+ static const byte gl2_order_3[] = { 0, 7, 6, 5, 4, 3, 2, 1 };
+ static const byte * cmy_order[3] = {order_1, cmy_order_2, cmy_order_3};
+ static const byte * rgb_order[3] = {order_1, rgb_order_2, rgb_order_3};
+ static const byte * gl2_order[3] = {order_1, gl2_order_2, gl2_order_3};
+
+ int type = pindexed->cid.cspace;
+ int orig_type = pindexed->original_cspace;
+ int bits = pindexed->cid.bits_per_index - 1;
+ const byte * porder;
+ int cnt = (num + start > 8 ? 8 - start : num);
+ int i;
+
+ if (bits > 2)
+ bits = 2;
+ if (gl2)
+ porder = gl2_order[bits];
+ /* check for a rgb or colorimetric. If the colorimetric is being
+ substituted for device CMY use the cmy order */
+ else if (((type == pcl_cspace_RGB) || (type == pcl_cspace_Colorimetric)) && (orig_type != pcl_cspace_CMY) )
+ porder = rgb_order[bits];
+ else
+ porder = cmy_order[bits];
+
+ /* set the default colors for up to the first 8 entries */
+ set_default_palette[(int)type]( pindexed->pbase,
+ pindexed->palette.data,
+ porder,
+ start,
+ cnt
+ );
+
+ /* all other entries are black (always comp. value 0). For simplicity we reset all of the the remaining pallete data. */
+ if (num > cnt) {
+ int bytes_initialized = 3 * (start + cnt);
+ int bytes_left = (3 * pcl_cs_indexed_palette_size) - bytes_initialized;
+ memset(pindexed->palette.data + bytes_initialized, 0, bytes_left);
+ }
+
+ /* set the default widths */
+ for (i = start; i < num; i++)
+ pindexed->pen_widths[i] = dflt_pen_width;
+
+ return 0;
+}
+
+/*
+ * Generate the normalization and, if appropriate, Decode arrays that correspond
+ * to a pcl_cid_data structure.
+ *
+ * Normalization in PCL and GL/2 involves a modification of a component color
+ * setting prior to its being stored in the palette. This is set in PCL via
+ * the black and white reference points for device specific color spaces, and
+ * in GL/2 via the CR command. The latter provides the much more general
+ * interface, which in turn drives the implementation.
+ *
+ * In PCL, white and black reference points may be set only for the device-
+ * dependent color spaces, and may only be set once when a palette is created
+ * (via the configure image data command; the min/max ranges for the device
+ * independent color spaces have a different interpretation). The CR command,
+ * on the other hand, applies to all color spaces, and can used to modfiy the
+ * range without otherwise changing the current color palette.
+ *
+ * All color spaces in this implementation are set up so that, in the palette,
+ * 0 represents the minimum intensity, and 1 the maximum intensity. For a
+ * component that has black and white reference points of blk and wht,
+ * respectively, the normalization applied is:
+ *
+ * tmp_val = ((i_val - blk) / (wht - blk)
+ *
+ * o_val = (tmp_val < 0 ? 0 : (tmp_val > 1 ? 1 : tmp_val))
+ *
+ * Because palette entries are stored as integers in the range [0, 255], the
+ * actual form in which the normalization data are stored (and the modified
+ * normalization calculation) are:
+ *
+ * blkref = blk
+ *
+ * inv_range = 255.0 / (wht - blk)
+ *
+ * tmp_val = (i_val - blkref) * inv_range + 0.5;
+ *
+ * o_val = (tmp_val < 0 ? 0 : (tmp_val > 255 ? 255 : floor(tmp_val + 0.5)))
+ *
+ * For a primary that uses an n-bit representation, the default values for
+ * blk and wht are 0 and 2^n - 1, respectively. (For HP's implementation this
+ * only applies to device-dependent color spaces; wht for device-independent
+ * color spaces is always 255. There seems to be no reason for such a
+ * restriction, hence it is not used here. This is unlikely to cause difficulty
+ * in practice, as it is unlikely a device-independent color space will ever
+ * be used with anything other than 8-bits per primary.)
+ *
+ * Note that for the CMY color space, the white and black points are reversed.
+ * This is the only distinction between the RGB and CMY color spaces.
+ *
+ * The Decode array is used for images, and thus has different forms
+ * depending on the pixel encoding mode. For the "direct by" cases
+ * it incorporates normalization information; for the "indexed by"
+ * cases its contents are dictated by the size of the palette.
+ */
+ int
+pcl_cs_indexed_set_norm_and_Decode(
+ pcl_cs_indexed_t ** ppindexed,
+ floatp wht0,
+ floatp wht1,
+ floatp wht2,
+ floatp blk0,
+ floatp blk1,
+ floatp blk2
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ pcl_encoding_type_t enc = (pcl_encoding_type_t)pindexed->cid.encoding;
+ pcl_cs_indexed_norm_t * pnorm;
+ int code = 0;
+
+ /* ignore request if palette is fixed */
+ if (pindexed->pfixed)
+ return 0;
+
+ /* get a unique copy of the color space */
+ if ((code = unshare_indexed_cspace(ppindexed)) < 0)
+ return code;
+ pindexed = *ppindexed;
+ pnorm = pindexed->norm;
+
+ /* set up for the additive space */
+ pnorm[0].blkref = blk0;
+ pnorm[0].inv_range = (wht0 == blk0 ? 0.0 : 255.0 / (wht0 - blk0));
+ pnorm[1].blkref = blk1;
+ pnorm[1].inv_range = (wht1 == blk1 ? 0.0 : 255.0 / (wht1 - blk1));
+ pnorm[2].blkref = blk2;
+ pnorm[2].inv_range = (wht2 == blk2 ? 0.0 : 255.0 / (wht2 - blk2));
+
+ /*
+ * Build the Decode array to be used with images.
+ *
+ * If an "indexed by" pixel encoding scheme is being used, the color
+ * space for images is the same color space used for the foreground, and
+ * the Decode array is the canonical array for Indexed color spaces.
+ *
+ * If a "direct by" pixel encoding is being used, the Decode array must
+ * yield the same color component values as would be produced by use of
+ * the "color component" commands. Thus, for any color component intensity
+ * a, we must have
+ *
+ * (a - blkref) / range = Dmin + a * (Dmax - Dmin) / (2^n - 1)
+ *
+ * where blkref and range are the black reference point and range value for
+ * this component (computed above), Dmin and Dmax are the first and second
+ * elements of the Decode array for this component, and n is the number of
+ * bits per pixel. Setting a = 0, this yields:
+ *
+ * -blkref / range = Dmin
+ *
+ * Substituting this into the original equation yields:
+ *
+ * (a - blkref) / range = a * (Dmax + blkref/range) / (2^n - 1)
+ * - blkref / range;
+ *
+ * Adding blkref / range to both sides, and multiplying both sides by
+ * range * (2^n - 1) / a yields:
+ *
+ * 2^n - 1 = range * Dmax + blkref
+ *
+ * or
+ *
+ * (2^n - 1 - blkref) / range = Dmax
+ *
+ * Note that this arrangement requires the image/color space code to
+ * properly handle out of range values.
+ */
+ if (enc >= pcl_penc_direct_by_plane) {
+ int i;
+ float * pdecode = pindexed->Decode;
+
+ for (i = 0; i < 3; i++) {
+ int nbits = pindexed->cid.bits_per_primary[i];
+ floatp inv_range = pnorm[i].inv_range;
+
+ if (inv_range == 0.0)
+ inv_range = 254;
+ pdecode[2 * i] = -pnorm[i].blkref * inv_range / 255.0;
+ pdecode[2 * i + 1] = ((float)((1L << nbits) - 1) - pnorm[i].blkref)
+ * inv_range / 255.0;
+ }
+ } else {
+ pindexed->Decode[0] = 0.0;
+ pindexed->Decode[1] = 0.0; /* modified subsequently */
+ }
+ return 0;
+}
+
+/*
+ * Change the number of entries in an PCL indexed color space palette. For
+ * PCL itself, this occurs only when a palette is created, and is determined
+ * by the number of bits per index. The NP command in GL/2, on the other hand,
+ * can override the palette size for an existing palette.
+ *
+ * The gl2 boolean indicates if this call is being made from GL/2 (either the
+ * IN or NP command). The routine needs to know this so as to set the
+ * appropriate default colors.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_cs_indexed_set_num_entries(
+ pcl_cs_indexed_t ** ppindexed,
+ int new_num,
+ bool gl2
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ int bits = get_pow_2(new_num);
+ int old_num = pindexed->num_entries;
+ int code = 0;
+
+ /* ignore request if palette is fixed */
+ if (pindexed->pfixed)
+ return 0;
+
+ pindexed->is_GL = gl2;
+
+ /*
+ * Set new_num to the smallest larger power of 2 less than
+ * pcl_cs_indexed_palette_size.
+ */
+ bits = ( bits > pcl_cs_indexed_palette_size_log
+ ? pcl_cs_indexed_palette_size_log
+ : bits );
+ new_num = 1L << bits;
+
+ /* check if there is anything to do */
+ if (new_num == old_num)
+ return 0;
+
+ /* make sure the palette is unique */
+ if ((code = unshare_indexed_cspace(ppindexed)) < 0)
+ return code;
+ pindexed = *ppindexed;
+ pindexed->num_entries = new_num;
+ pindexed->cid.bits_per_index = bits;
+
+ /* check if the Decode array must be updated */
+ if (pindexed->cid.encoding < pcl_penc_direct_by_plane)
+ pindexed->Decode[1] = new_num - 1;
+
+ /* if the palette grew, write in default colors and widths */
+ if (new_num > old_num)
+ set_default_entries(pindexed, old_num, new_num, gl2);
+ return 0;
+}
+
+/*
+ * Update the lookup table information for an indexed color space.
+ *
+ * Because lookup tables can modify base color spaces, this operation is
+ * rather ugly. If the base color space is changed, it is necessary to release
+ * and re-build the graphic library indexed color space as well, as this will
+ * now have references to obsolete parts of the graphic library base color
+ * space.
+ *
+ * Fortunately, this operation does not happen very often.
+ *
+ * Returns 0 if successful, < 0 in the event of an error.
+ */
+ int
+pcl_cs_indexed_update_lookup_tbl(
+ pcl_cs_indexed_t ** ppindexed,
+ pcl_lookup_tbl_t * plktbl
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ pcl_cspace_type_t cstype = (pcl_cspace_type_t)pindexed->cid.cspace;
+ pcl_cspace_type_t lktype;
+ int code = 0;
+
+ /* make some simple checks for not-interesting color spaces */
+ if (plktbl != 0)
+ lktype = pcl_lookup_tbl_get_cspace(plktbl);
+ if ( (plktbl != 0) &&
+ ((cstype < lktype) || (lktype < pcl_cspace_Colorimetric)) )
+ return 0;
+
+ /* make a unique copy of the indexed color space */
+ if ((code = unshare_indexed_cspace(ppindexed)) < 0)
+ return code;
+ pindexed = *ppindexed;
+
+ /* update the base color space, if appropriate */
+ code = pcl_cs_base_update_lookup_tbl(&(pindexed->pbase), plktbl);
+ if (code <= 0)
+ return code;
+
+ rc_decrement(pindexed->pcspace, "pcl_cs_indexed_update_lookup_tbl");
+
+ return gs_cspace_build_Indexed( &(pindexed->pcspace),
+ pindexed->pbase->pcspace,
+ pcl_cs_indexed_palette_size,
+ (gs_const_string *)&(pindexed->palette),
+ pindexed->rc.memory
+ );
+
+}
+
+/*
+ * Update an entry in the palette of a PCL indexed color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_cs_indexed_set_palette_entry(
+ pcl_cs_indexed_t ** ppindexed,
+ int indx,
+ const float comps[3]
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ int code;
+ int i;
+
+ /* ignore request if palette is fixed */
+ if (pindexed->pfixed)
+ return 0;
+
+ /*
+ * Verify that the index is in range. This code obeys HP's documentation,
+ * and the implementation in the CLJ 5/5M. The DJ 1600C/CM behaves
+ * differently; it sets indx = indx % num_entries, but only if indx is
+ * non-negative.
+ */
+ if ((indx < 0) || (indx >= pindexed->num_entries))
+ return e_Range;
+
+ /* get a unique copy of the indexed color space */
+ if ((code = unshare_indexed_cspace(ppindexed)) < 0)
+ return code;
+ pindexed = *ppindexed;
+
+ /* normalize and store the entry */
+ indx *= 3;
+ for (i = 0; i < 3; i++) {
+ pcl_cs_indexed_norm_t * pn = &(pindexed->norm[i]);
+ floatp val = comps[i];
+
+ if (pn->inv_range == 0)
+ val = (val >= pn->blkref ? 255.0 : 0.0);
+ else {
+ val = (val - pn->blkref) * pn->inv_range;
+ val = (val < 0.0 ? 0.0 : (val > 255.0 ? 255.0 : val));
+ }
+ pindexed->palette.data[indx + i] = (byte)val;
+ }
+ return 0;
+}
+
+/*
+ * Default the contents of a palette entry.
+ *
+ * This request can only come from GL/2, hence there is no gl2 boolean.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_cs_indexed_set_default_palette_entry(
+ pcl_cs_indexed_t ** ppindexed,
+ int indx
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ int code;
+
+ /*
+ * Verify that the index is in range. This code obeys HP's documentation,
+ * and the implementation in the CLJ 5/5M. The DJ 1600C/CM behaves
+ * differently; it sets indx = indx % num_entries, but only if indx is
+ * non-negative.
+ */
+ if ((indx < 0) || (indx >= pindexed->num_entries))
+ return e_Range;
+
+ /* get a unique copy of the indexed color space */
+ if ((code = unshare_indexed_cspace(ppindexed)) < 0)
+ return code;
+ pindexed = *ppindexed;
+
+ return set_default_entries(*ppindexed, indx, 1, true);
+}
+
+/*
+ * Set a pen width in a palette. Units used are still TBD.
+ *
+ * Returns 0 if successful, < 0 in case of error.
+ */
+ int
+pcl_cs_indexed_set_pen_width(
+ pcl_cs_indexed_t ** ppindexed,
+ int pen,
+ floatp width
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ int code;
+
+ /* check for out-of-range pen */
+ if ((pen < 0) || (pen > pindexed->num_entries))
+ return e_Range; /* probably should be a different error */
+
+ if ((code = unshare_indexed_cspace(ppindexed)) < 0)
+ return code;
+ pindexed = *ppindexed;
+
+ pindexed->pen_widths[pen] = width;
+ return 0;
+}
+
+/*
+ * Build a PCL indexed color space.
+ *
+ * To maintain the one-to-one relationship between the PCL indexed color space
+ * and the graphic library indexed color space, the latter is created at the
+ * same time as the former. Hence, the base PCL color space must be created
+ * first (it is required to create the graphics library indexed color space),
+ * and released once it has been referenced by the (PCL) indexed color space.
+ *
+ * The boolean gl2 indicates if this request came from the GL/2 IN command.
+ *
+ * Returns 0 if successful, < 0 in case of error.
+ */
+
+ int
+pcl_cs_indexed_build_cspace(
+ pcl_state_t * pcs,
+ pcl_cs_indexed_t ** ppindexed,
+ const pcl_cid_data_t * pcid,
+ bool pfixed,
+ bool gl2,
+ gs_memory_t * pmem
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ pcl_cspace_type_t type = pcl_cid_get_cspace(pcid);
+ int bits = pcl_cid_get_bits_per_index(pcid);
+ floatp wht_ref[3];
+ floatp blk_ref[3];
+ pcl_cs_base_t * pbase = 0;
+ bool is_default = false;
+ int code = 0;
+ /*
+ * Check if the default color space is being requested. Since there are
+ * only three fixed spaces, it is sufficient to check that palette is
+ * fixed and has 1-bit per pixel.
+ */
+ if (pfixed && (pcid->u.hdr.bits_per_index == dflt_cid_hdr.bits_per_index)) {
+ is_default = true;
+ if (pcs->pdflt_cs_indexed != 0) {
+ pcl_cs_indexed_copy_from(*ppindexed, pcs->pdflt_cs_indexed);
+ return 0;
+ }
+ }
+
+ /* release the existing color space, if present */
+ if (pindexed != 0)
+ rc_decrement(pindexed, "build indexed color space");
+
+ /* build the base color space */
+ if ((code = pcl_cs_base_build_cspace(&pbase, pcid, pmem)) < 0)
+ return code;
+
+ /* build the indexed color space */
+ if ((code = alloc_indexed_cspace(ppindexed, pbase, pmem)) < 0) {
+ pcl_cs_base_release(pbase);
+ return code;
+ }
+ pindexed = *ppindexed;
+
+ /* release our extra reference of the base color space */
+ pcl_cs_base_release(pbase);
+ pbase = 0;
+
+ /* copy the header of the configure image data structure */
+ pindexed->cid = pcid->u.hdr;
+
+ /* copy in the original color space if there is a substitution in
+ effect. There will be the no color spaces type if no use cie
+ substitution is in effect */
+ pindexed->original_cspace = pcid->original_cspace;
+
+ /* set up the normalization information */
+ if ((pcid->len > 6) && (type < pcl_cspace_Colorimetric)) {
+ const pcl_cid_dev_long_t * pdev = &(pcid->u.dev);
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ wht_ref[i] = pdev->white_ref[i];
+ blk_ref[i] = pdev->black_ref[i];
+ }
+ } else {
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ wht_ref[i] = (1L << pcl_cid_get_bits_per_primary(pcid, i)) - 1;
+ blk_ref[i] = 0.0;
+ }
+
+ /* reverse for the CMY color space */
+ if ( (type == pcl_cspace_CMY) || (pcid->original_cspace == pcl_cspace_CMY) ) {
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ floatp ftmp = wht_ref[i];
+
+ wht_ref[i] = blk_ref[i];
+ blk_ref[i] = ftmp;
+ }
+ }
+ }
+ pcl_cs_indexed_set_norm_and_Decode( ppindexed,
+ wht_ref[0], wht_ref[1], wht_ref[2],
+ blk_ref[0], blk_ref[1], blk_ref[2]
+ );
+
+ /* set the palette size and the default palette entries */
+ pcl_cs_indexed_set_num_entries(ppindexed, 1L << bits, gl2);
+
+ /* now can indicate if the palette is fixed */
+ pindexed->pfixed = pfixed;
+
+ /* record if this is the default */
+ if (is_default)
+ pcl_cs_indexed_init_from(pcs->pdflt_cs_indexed, pindexed);
+
+ return 0;
+}
+
+/*
+ * Build the default indexed color space. This function is usually called only
+ * once, at initialization time.
+ *
+ * Returns 0 on success, < 0
+ */
+ int
+pcl_cs_indexed_build_default_cspace(
+ pcl_state_t * pcs,
+ pcl_cs_indexed_t ** ppindexed,
+ gs_memory_t * pmem
+)
+{
+ if (pcs->pdflt_cs_indexed == 0) {
+ pcs->dflt_cid_data.len = 6;
+ pcs->dflt_cid_data.u.hdr = dflt_cid_hdr;
+ pcs->dflt_cid_data.original_cspace = pcl_cspace_num;
+ return pcl_cs_indexed_build_cspace( pcs,
+ ppindexed,
+ &pcs->dflt_cid_data,
+ true,
+ false,
+ pmem
+ );
+ } else {
+ pcl_cs_indexed_copy_from(*ppindexed, pcs->pdflt_cs_indexed);
+ return 0;
+ }
+}
+
+/*
+ * Special indexed color space constructor, for building a 2 entry indexed color
+ * space based on an existing base color space. The first color is always set
+ * to white, while the second entry takes the value indicated by pcolor1.
+ *
+ * This reoutine is used to build the two-entry indexed color spaces required
+ * for creating opaque "uncolored" patterns.
+ */
+ int
+pcl_cs_indexed_build_special(
+ pcl_cs_indexed_t ** ppindexed,
+ pcl_cs_base_t * pbase,
+ const byte * pcolor1,
+ gs_memory_t * pmem
+)
+{
+ static const pcl_cid_hdr_t cid = { pcl_cspace_White, /* ignored */
+ pcl_penc_indexed_by_pixel,
+ 1,
+ { 8, 8, 8} /* ignored */ };
+ static const floatp wht_ref[3] = { 255.0, 255.0, 255.0 };
+ static const floatp blk_ref[3] = { 0.0, 0.0, 0.0 };
+
+ pcl_cs_indexed_t * pindexed;
+ int i, code = 0;
+
+ /* build the indexed color space */
+ if ((code = alloc_indexed_cspace(ppindexed, pbase, pmem)) < 0)
+ return code;
+ pindexed = *ppindexed;
+ pindexed->pfixed = false;
+ pindexed->cid = cid;
+ pindexed->num_entries = 2;
+
+ /* set up the normalization information - not strictly necessary */
+ pcl_cs_indexed_set_norm_and_Decode( ppindexed,
+ wht_ref[0], wht_ref[1], wht_ref[2],
+ blk_ref[0], blk_ref[1], blk_ref[2]
+ );
+ pindexed->Decode[1] = 1;
+
+ for (i = 0; i < 3; i++) {
+ pindexed->palette.data[i] = 255;
+ pindexed->palette.data[i + 3] = pcolor1[i];
+ }
+
+ /* the latter are not strictly necessary */
+ pindexed->pen_widths[0] = dflt_pen_width;
+ pindexed->pen_widths[1] = dflt_pen_width;
+
+ return 0;
+}
+
+/*
+ * Install an indexed color space into the graphic state. If no indexed color
+ * space exists yet, build a default color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_cs_indexed_install(
+ pcl_cs_indexed_t ** ppindexed,
+ pcl_state_t * pcs
+)
+{
+ pcl_cs_indexed_t * pindexed = *ppindexed;
+ int code = 0;
+
+ if (pindexed == 0) {
+ code = pcl_cs_indexed_build_default_cspace(pcs, ppindexed, pcs->memory);
+ if (code < 0)
+ return code;
+ pindexed = *ppindexed;
+ }
+
+ return gs_setcolorspace(pcs->pgs, pindexed->pcspace);
+}
+
+/*
+ * Return true if the given entry in the color palette represents white,
+ * false otherwise.
+ *
+ * As with many other parts of this code, the determination of what is "white"
+ * is done, for practical reasons, in source color space. HP's implementations
+ * make the same determination in device color space (but prior to dithering).
+ * In the absence of color lookup tables, the two will give the same result.
+ * An inverting color lookup table will, however, cause the two approaches to
+ * vary.
+ */
+ bool
+pcl_cs_indexed_is_white(
+ const pcl_cs_indexed_t * pindexed,
+ int indx
+)
+{
+ const byte * pb = 0;
+
+ if (pindexed == 0)
+ return true;
+ if ((indx < 0) || (indx >= pindexed->num_entries))
+ return false;
+ pb = pindexed->palette.data + 3 * indx;
+ return (pb[0] == 0xff) && (pb[1] == 0xff) && (pb[2] == 0xff);
+}
+
+/*
+ * Return true if the given entry in the color palette is black, false
+ * otherwise.
+ *
+ * The determination of "blackness" is made in source space, rather than in
+ * device space (prior to dither). The latter would be more correct, but is
+ * not as easily accomplished, and only in very unusual circumstances will the
+ * two produce different results.
+ */
+ bool
+pcl_cs_indexed_is_black(
+ const pcl_cs_indexed_t * pindexed,
+ int indx
+)
+{
+ const byte * pb = 0;
+
+ if ((pindexed == 0) || (indx < 0) || (indx >= pindexed->num_entries))
+ return false;
+ pb = pindexed->palette.data + 3 * indx;
+ return (pb[0] == 0) && (pb[1] == 0) && (pb[2] == 0);
+}
+
+/*
+ * One time initialization. This exists only because of the possibility that
+ * BSS may not be initialized.
+ */
+ void
+pcl_cs_indexed_init(pcl_state_t *pcs)
+{
+ pcs->pdflt_cs_indexed = 0;
+}
diff --git a/pcl/pcindxed.h b/pcl/pcindxed.h
new file mode 100644
index 000000000..d0639cd68
--- /dev/null
+++ b/pcl/pcindxed.h
@@ -0,0 +1,374 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcindxed.h - PCL indexed color space object */
+
+#ifndef pcindexed_INCLUDED
+#define pcindexed_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "gscspace.h"
+#include "pcident.h"
+#include "pcstate.h"
+#include "pccid.h"
+#include "pclookup.h"
+#include "pccsbase.h"
+
+
+/*
+ * Size of a PCL color palette. All palettes are allocated at this size, as
+ * GL/2 may change the size of a palette after it has been created.
+ *
+ * The overall size must be a power of 2, and for all practical purposes must
+ * be >= 8. The PCL documentation does not specify a value for this parameter,
+ * though in chapter 7 of the "PCL 5 Color Technical Reference Manual" it
+ * is indicated as being implementation specific. For all of the PCL 5c devices
+ * we have tested, the value is 8.
+ */
+#define pcl_cs_indexed_palette_size_log 8
+#define pcl_cs_indexed_palette_size (1 << pcl_cs_indexed_palette_size_log)
+
+
+/*
+ * Structure to hold the parameters that normalize raw color values to values
+ * usable for the base color space. The formula used is:
+ *
+ * out = 255 * (in - blkref) / (whtref - blkref)
+ *
+ * The black and white reference points can be set in PCL only for the device-
+ * dependent color spaces (the max/min parameters for device-independent color
+ * spaces have a different interpretation). The parameters may be set for all
+ * color spaces, however, via the CR command in GL/2.
+ *
+ * Note that for the CMY color space, the white and black reference points are
+ * reversed.
+ */
+typedef struct pcl_cs_indexed_norm_s {
+ float blkref;
+ float inv_range; /* 255 / (whtref - blkref) */
+} pcl_cs_indexed_norm_t;
+
+
+/*
+ * PCL indexed color space. This consists of:
+ *
+ * A copy of the configure image data header (short form) which was used
+ * to create this color space (only the header is necessary; all the
+ * other relevant information is captured in the normalization and
+ * graphic library color space structures)
+ *
+ * A PCL base color space, which in turn consists of a graphic library
+ * base color space and its associated client data (including lookup
+ * tables for device-independent color spaces)
+ *
+ * A graphic library indexed color space
+ *
+ * An indication of how many entries in the palette are currently
+ * "accessible" (this is required to support the GL/2 "NP" command)
+ *
+ * The palette used by the indexed color space. This is always the maximum
+ * size, as GL/2 can change the number of entries in a palette without
+ * changing the palette (via the NP command)
+ *
+ * In a reasonable world this palette would be a fixed size array of
+ * bytes in the (PCL) indexed color space structure. Unfortunately,
+ * the GhostScript graphic library is not a reasonable world in this
+ * respect. The table used by an indexed color space must be a string,
+ * which means it must be allocated separately. The gs_string structure
+ * kept in this structure is a pointer to this separately allocated
+ * string.
+ *
+ * The set of pen widths. This has nothing to do with colors, but since
+ * pens in GL/2 are associated with palette entries in PCL, this is
+ * the logical place to put this information; issues concerning which
+ * units to use are still TBD.
+ *
+ * Since there is no PostScript-centric library which must make use of
+ * these widths, they can be kept in a sensible array.
+ *
+ * A boolean to indicate if a palette is fixed (with respect to colors; all
+ * palettes have settable pen widths).
+ *
+ * A identifier, which is used to indicate when objects dependent on this
+ * color space must be regenerated. The identifier is incremented each
+ * time the color space is modified (but not when pen widths are
+ * modified, as the width information is not cached).
+ *
+ * A structure for normalizing raw input values to component values in
+ * the palette; this supports the black/white reference points for
+ * each color component
+ *
+ * A Decode array, to be used with images. This incorporates the same
+ * information as provided by the conversion parameters described in
+ * the previous item, but in a different form
+ *
+ * Note that the graphic state color space is referenced twice in this
+ * structure: once by the indexed color space and again by the PCL base color
+ * space. This arrangement is necessary because the graphic state base color
+ * space does not take ownership of its client data.
+ *
+ * Though the palette is stored as a separate object, it is not possible
+ * to share graphic library indexed color spaces between two PCL indexed color
+ * spaces. Given the current structure of graphic state color spaces, this
+ * problem is not easily remedied, as both the palette and the pcl base color
+ * space must be kept in a one-to-one relationship with the graphic library
+ * indexed color space.
+ */
+
+struct pcl_cs_indexed_s {
+ rc_header rc;
+ bool pfixed;
+ pcl_cid_hdr_t cid;
+ pcl_cs_base_t * pbase;
+ gs_color_space * pcspace;
+ int original_cspace;
+ int num_entries;
+ gs_string palette;
+ bool is_GL;
+ float pen_widths[pcl_cs_indexed_palette_size];
+ pcl_cs_indexed_norm_t norm[3];
+ float Decode[6];
+};
+
+#ifndef pcl_cs_indexed_DEFINED
+#define pcl_cs_indexed_DEFINED
+typedef pcl_cs_indexed_s pcl_cs_indexed_t;
+#endif
+
+#define private_st_cs_indexed_t() \
+ gs_private_st_composite( st_cs_indexed_t, \
+ pcl_cs_indexed_t, \
+ "pcl indexed color space", \
+ pcl_cs_indexed_enum_ptrs, \
+ pcl_cs_indexed_reloc_ptrs \
+ )
+
+/*
+ * The usual copy, init, and release macros.
+ */
+#define pcl_cs_indexed_init_from(pto, pfrom)\
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_cs_indexed_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_cs_indexed_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_cs_indexed_release(pindexed) \
+ rc_decrement(pindexed, "pcl_cs_indexed_release")
+
+/*
+ * Get the color space type for the base color space of an indexed color space.
+ */
+#define pcl_cs_indexed_get_cspace(pindexed) \
+ ((pcl_cspace_type_t)((pindexed)->cid.cspace))
+
+/*
+ * Get the pixel encoding mode from an indexed color space.
+ */
+#define pcl_cs_indexed_get_encoding(pindexed) \
+ ((pcl_encoding_type_t)((pindexed)->cid.encoding))
+
+/*
+ * Get the number of bits per index from an indexed color space
+ */
+#define pcl_cs_indexed_get_bits_per_index(pindexed) \
+ ((pindexed)->cid.bits_per_index)
+
+/*
+ * Get the number of bits per primary from an indexed color space.
+ */
+#define pcl_cs_indexed_get_bits_per_primary(pindexed, i) \
+ ((pindexed)->cid.bits_per_primary[i])
+
+/*
+ * Nacro to return the number of entries in the current color space.
+ */
+#define pcl_cs_indexed_get_num_entries(pindexed) ((pindexed)->num_entries)
+
+/*
+ * Macro to return a pointer to the array of pen widths. Note that the pointer
+ * is a const float.
+ */
+#define pcl_cs_indexed_get_pen_widths(pindexed) \
+ ((const float *)((pindexed)->pen_widths))
+
+/*
+ * Generate the normalization and, if appropriate, Decode array that correspond
+ * to a pcl_cid_data structure.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_indexed_set_norm_and_Decode(
+ pcl_cs_indexed_t ** ppindexed,
+ floatp wht0,
+ floatp wht1,
+ floatp wht2,
+ floatp blk0,
+ floatp blk1,
+ floatp blk2
+);
+
+/*
+ * Change the number of entries in an PCL indexed color space palette.
+ *
+ * The gl2 boolean indicates if this call is being made from GL/2 (either the
+ * IN or NP command).
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_indexed_set_num_entries(
+ pcl_cs_indexed_t ** ppindexed,
+ int new_num,
+ bool gl2
+);
+
+/*
+ * Update the lookup table information for an indexed color space.
+ *
+ * Returns 0 if successful, < 0 in the event of an error.
+ */
+int pcl_cs_indexed_update_lookup_tbl(
+ pcl_cs_indexed_t ** pindexed,
+ pcl_lookup_tbl_t * plktbl
+);
+
+/*
+ * Update an entry in the palette of a PCL indexed color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_indexed_set_palette_entry(
+ pcl_cs_indexed_t ** ppindexed,
+ int indx,
+ const float comps[3]
+);
+
+/*
+ * Default the contents of a palette entry.
+ *
+ * This request can only come from GL/2, hence there is no gl2 boolean.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_indexed_set_default_palette_entry(
+ pcl_cs_indexed_t ** ppindexed,
+ int indx
+);
+
+/*
+ * Set a pen width in a palette. Units used are still TBD.
+ *
+ * Returns 0 if successful, < 0 in case of error.
+ */
+int pcl_cs_indexed_set_pen_width(
+ pcl_cs_indexed_t ** ppindexed,
+ int pen,
+ floatp width
+);
+
+/*
+ * Build a PCL indexed color space.
+ *
+ * The boolean gl2 indicates if this request came from the GL/2 IN command.
+ *
+ * Returns 0 if successful, < 0 in case of error.
+ */
+int pcl_cs_indexed_build_cspace(
+ pcl_state_t * pcs,
+ pcl_cs_indexed_t ** ppindexed,
+ const pcl_cid_data_t * pcid,
+ bool fixed,
+ bool gl2,
+ gs_memory_t * pmem
+);
+
+/*
+ * Build the default indexed color space. This function is usually called only
+ * once, at initialization time.
+ *
+ * Returns 0 on success, < 0
+ */
+int pcl_cs_indexed_build_default_cspace(
+ pcl_state_t * pcs,
+ pcl_cs_indexed_t ** ppindexed,
+ gs_memory_t * pmem
+);
+
+/*
+ * Special indexed color space constructor, for building a 2 entry indexed color
+ * space based on an existing base color space. The first color is always set
+ * to white, while the second entry takes the value indicated by pcolor1.
+ *
+ * This reoutine is used to build the two-entry indexed color spaces required
+ * for creating opaque "uncolored" patterns.
+ */
+int pcl_cs_indexed_build_special(
+ pcl_cs_indexed_t ** ppindexed,
+ pcl_cs_base_t * pbase,
+ const byte * pcolor1,
+ gs_memory_t * pmem
+);
+
+/*
+ * Install an indexed color space into the graphic state. If not indexed
+ * color space exists yet, build a default color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_cs_indexed_install(
+ pcl_cs_indexed_t ** ppindexed,
+ pcl_state_t * pcs
+);
+
+/*
+ * Two routines to determine if an entry of a color palette is either white
+ * or black, and two macros to specialize these to the first entry (index 0).
+ *
+ * The determination of "whiteness" and "blackness" is made in source space.
+ * This is not fully legitimate, as the HP's implementations make this
+ * determination in device space. However, only in unusual circumnstances will
+ * the two give different results, and the former is much simpler to implement
+ * in the current system.
+ */
+bool pcl_cs_indexed_is_white(
+ const pcl_cs_indexed_t * pindexed,
+ int indx
+);
+
+bool pcl_cs_indexed_is_black(
+ const pcl_cs_indexed_t * pindexed,
+ int indx
+);
+
+#define pcl_cs_indexed_0_is_white(pindexed) \
+ pcl_cs_indexed_is_white(pindexed, 0)
+#define pcl_cs_indexed_0_is_black(pindexed) \
+ pcl_cs_indexed_is_black(pindexed, 0)
+
+/*
+ * One time initialization. This exists only because of the possibility that
+ * BSS may not be initialized.
+ */
+void pcl_cs_indexed_init(pcl_state_t *pcs);
+
+#endif /* pcindexed_INCLUDED */
diff --git a/pcl/pcjob.c b/pcl/pcjob.c
new file mode 100644
index 000000000..1304bf212
--- /dev/null
+++ b/pcl/pcjob.c
@@ -0,0 +1,259 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcjob.c - PCL5 job control commands */
+#include "std.h"
+#include "gx.h"
+#include "gsmemory.h"
+#include "gsmatrix.h" /* for gsdevice.h */
+#include "gsdevice.h"
+#include "pcommand.h"
+#include "pcursor.h" /* for pcl_home_cursor() */
+#include "pcstate.h"
+#include "pcparam.h"
+#include "pcdraw.h"
+#include "pcpage.h"
+#include "pjtop.h"
+
+/* Commands */
+
+int
+pcl_do_printer_reset(pcl_state_t *pcs)
+{
+ if ( pcs->macro_level )
+ return e_Range; /* not allowed inside macro */
+
+ /* reset the other parser in case we have gotten the
+ pcl_printer_reset while in gl/2 mode. */
+ pcl_implicit_gl2_finish(pcs);
+ /* Print any partial page if not pclxl snippet mode. */
+ if (pcs->end_page == pcl_end_page_top) {
+ int code = pcl_end_page_if_marked(pcs);
+ if ( code < 0 )
+ return code;
+ /* if duplex start on the front side of the paper */
+ if ( pcs->duplex )
+ put_param1_bool(pcs, "FirstSide", true);
+ }
+ /* unload fonts */
+
+ /* Reset to user default state. */
+ return pcl_do_resets(pcs, pcl_reset_printer);
+}
+
+static int /* ESC E */
+pcl_printer_reset(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ return pcl_do_printer_reset(pcs);
+}
+
+static int /* ESC % -12345 X */
+pcl_exit_language(pcl_args_t *pargs, pcl_state_t *pcs)
+{ if ( int_arg(pargs) != -12345 )
+ return e_Range;
+ { int code = pcl_printer_reset(pargs, pcs);
+ return (code < 0 ? code : e_ExitLanguage);
+ }
+}
+
+static int /* ESC & l <num_copies> X */
+pcl_number_of_copies(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int i = int_arg(pargs);
+ if ( i < 1 )
+ return 0;
+ pcs->num_copies = i;
+ return put_param1_int(pcs, "NumCopies", i);
+}
+
+static int /* ESC & l <sd_enum> S */
+pcl_simplex_duplex_print(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int code;
+ bool reopen = false;
+
+ /* oddly the command goes to the next page irrespective of
+ arguments */
+ code = pcl_end_page_if_marked(pcs);
+ if ( code < 0 )
+ return code;
+ pcl_home_cursor(pcs);
+ switch ( int_arg(pargs) )
+ {
+ case 0:
+ pcs->duplex = false;
+ break;
+ case 1:
+ pcs->duplex = true;
+ pcs->bind_short_edge = false;
+ break;
+ case 2:
+ pcs->duplex = true;
+ pcs->bind_short_edge = true;
+ break;
+ default:
+ return 0;
+ }
+ code = put_param1_bool(pcs, "Duplex", pcs->duplex);
+ switch ( code )
+ {
+ case 1: /* reopen device */
+ reopen = true;
+ case 0:
+ break;
+ case gs_error_undefined:
+ return 0;
+ default: /* error */
+ if ( code < 0 )
+ return code;
+ }
+ code = put_param1_bool(pcs, "BindShortEdge", pcs->bind_short_edge);
+ switch ( code )
+ {
+ case 1: /* reopen device */
+ reopen = true;
+ case 0:
+ case gs_error_undefined:
+ break;
+ default: /* error */
+ if ( code < 0 )
+ return code;
+ }
+ return (reopen ? gs_setdevice_no_erase(pcs->pgs,
+ gs_currentdevice(pcs->pgs)) :
+ 0);
+}
+
+static int /* ESC & a <side_enum> G */
+pcl_duplex_page_side_select(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint i = uint_arg(pargs);
+ int code;
+
+ /* oddly the command goes to the next page irrespective of
+ arguments */
+ code = pcl_end_page_if_marked(pcs);
+ if ( code < 0 )
+ return code;
+ pcl_home_cursor(pcs);
+
+ if ( i > 2 )
+ return 0;
+
+ if ( i > 0 && pcs->duplex )
+ put_param1_bool(pcs, "FirstSide", i == 1);
+ return 0;
+}
+
+static int /* ESC & l 1 T */
+pcl_job_separation(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int i = int_arg(pargs);
+ if ( i != 1 )
+ return 0;
+ /**** NEED A DRIVER PROCEDURE FOR END-OF-JOB ****/
+ return 0;
+}
+
+static int /* ESC & l <bin_enum> G */
+pcl_output_bin_selection(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint i = uint_arg(pargs);
+ if ( i < 1 || i > 2 )
+ return e_Range;
+ return put_param1_int(pcs, "OutputBin", i);
+}
+
+static int /* ESC & u <upi> B */
+pcl_set_unit_of_measure(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int num = int_arg(pargs);
+
+ if ( num <= 96 )
+ num = 96;
+ else if ( num >= 7200 )
+ num = 7200;
+ else if ( 7200 % num != 0 )
+ { /* Pick the exact divisor of 7200 with the smallest */
+ /* relative error. */
+ static const int values[] = {
+ 96, 100, 120, 144, 150, 160, 180, 200, 225, 240, 288,
+ 300, 360, 400, 450, 480, 600, 720, 800, 900,
+ 1200, 1440, 1800, 2400, 3600, 7200
+ };
+ const int *p = values;
+
+ while ( num > p[1] ) p++;
+ /* Now *p < num < p[1]. */
+ if ( (p[1] - (float)num) / p[1] < ((float)num - *p) / *p )
+ p++;
+ num = *p;
+ }
+ pcs->uom_cp = pcl_coord_scale / num;
+ return 0;
+}
+
+/* Initialization */
+static int
+pcjob_do_registration(pcl_parser_state_t *pcl_parser_state, gs_memory_t *mem)
+{ /* Register commands */
+ DEFINE_ESCAPE_ARGS('E', "Printer Reset", pcl_printer_reset, pca_in_rtl)
+ DEFINE_CLASS('%')
+ {0, 'X', {pcl_exit_language, pca_neg_ok|pca_big_error|pca_in_rtl}},
+ END_CLASS
+ DEFINE_CLASS('&')
+ {'l', 'X',
+ PCL_COMMAND("Number of Copies", pcl_number_of_copies,
+ pca_neg_ignore|pca_big_clamp)},
+ {'l', 'S',
+ PCL_COMMAND("Simplex/Duplex Print", pcl_simplex_duplex_print,
+ pca_neg_ignore|pca_big_ignore)},
+ {'a', 'G',
+ PCL_COMMAND("Duplex Page Side Select",
+ pcl_duplex_page_side_select,
+ pca_neg_ignore|pca_big_ignore)},
+ {'l', 'T',
+ PCL_COMMAND("Job Separation", pcl_job_separation,
+ pca_neg_error|pca_big_error)},
+ {'l', 'G',
+ PCL_COMMAND("Output Bin Selection", pcl_output_bin_selection,
+ pca_neg_error|pca_big_error)},
+ {'u', 'D',
+ PCL_COMMAND("Set Unit of Measure", pcl_set_unit_of_measure,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ return 0;
+}
+static void
+pcjob_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{
+ if ( type & (pcl_reset_initial | pcl_reset_printer) ) {
+ pcs->num_copies = pjl_proc_vartoi(pcs->pjls,
+ pjl_proc_get_envvar(pcs->pjls, "copies"));
+ pcs->duplex = !pjl_proc_compare(pcs->pjls,
+ pjl_proc_get_envvar(pcs->pjls, "duplex"), "off") ? false : true;
+ pcs->bind_short_edge = !pjl_proc_compare(pcs->pjls,
+ pjl_proc_get_envvar(pcs->pjls, "binding"), "longedge") ? false : true;
+ pcs->back_side = false;
+ pcs->output_bin = 1;
+ }
+ if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay) ) {
+ /* rtl always uses native units for user units. The hp
+ documentation does not say what to do if the resolution is
+ assymetric... */
+ pcl_args_t args;
+ if ( pcs->personality == rtl )
+ arg_set_uint(&args,
+ gs_currentdevice(pcs->pgs)->HWResolution[0]);
+ else
+ arg_set_uint(&args, 300);
+ pcl_set_unit_of_measure(&args, pcs);
+ }
+}
+const pcl_init_t pcjob_init = {
+ pcjob_do_registration, pcjob_do_reset, 0
+};
diff --git a/pcl/pcl.mak b/pcl/pcl.mak
new file mode 100644
index 000000000..3ad9837da
--- /dev/null
+++ b/pcl/pcl.mak
@@ -0,0 +1,1233 @@
+# Copyright (C) 1996, 1997, 1998 Aladdin Enterprises.
+# All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# makefile for PCL5*, HP RTL, and HP-GL/2 interpreters
+# Users of this makefile must define the following:
+# GSSRCDIR - the GS library source directory
+# PLSRCDIR - the PCL* support library source directory
+# PLOBJDIR - the object directory for the PCL support library
+# PCLSRCDIR - the source directory
+# PCLGENDIR - the directory for source files generated during building
+# PCLOBJDIR - the object / executable directory
+# PLOBJ = $(PLOBJDIR)$(D)
+
+PCLSRC = $(PCLSRCDIR)$(D)
+PCLGEN = $(PCLGENDIR)$(D)
+PCLOBJ = $(PCLOBJDIR)$(D)
+PCLO_ = $(O_)$(PCLOBJ)
+
+PCLCCC = $(CC_) $(I_)$(PCLSRCDIR)$(_I) $(I_)$(PCLGENDIR)$(_I) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(C_)
+
+# Define the name of this makefile.
+PCL_MAK = $(PCLSRC)pcl.mak
+
+pcl.clean: pcl.config-clean pcl.clean-not-config-clean
+
+pcl.clean-not-config-clean:
+ $(RM_) $(PCLOBJ)*.$(OBJ)
+
+pcl.config-clean: clean_gs
+ $(RM_) $(PCLOBJ)*.dev
+ $(RM_) $(PCLOBJ)devs.tr5
+
+# pgstate.h is out of order because pcstate.h includes it.
+pgstate_h = $(PCLSRC)pgstate.h \
+ $(gx_h) \
+ $(gxfixed_h) \
+ $(gslparam_h) \
+ $(gzpath_h)
+
+pccoord_h = $(PCLSRC)pccoord.h
+
+pcxfmst_h = $(PCLSRC)pcxfmst.h \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gxfixed_h) \
+ $(pccoord_h)
+
+pcfontst_h = $(PCLSRC)pcfontst.h \
+ $(gx_h) \
+ $(plfont_h)
+
+pctpm_h = $(PCLSRC)pctpm.h \
+ $(gx_h)
+
+pcident_h = $(PCLSRC)pcident.h \
+ $(gx_h)
+
+pcpattyp_h = $(PCLSRC)pcpattyp.h
+
+pcdict_h = $(PCLSRC)pcdict.h \
+ $(gx_h)
+
+rtrstst_h = $(PCLSRC)rtrstst.h \
+ $(gx_h) \
+ $(gsimage_h) \
+ $(pccoord_h)
+
+pcmtx3_h = $(PCLSRC)pcmtx3.h \
+ $(math__h) \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gscspace_h) \
+ $(gscolor2_h) \
+ $(gscie_h)
+
+pcommand_h = $(PCLSRC)pcommand.h \
+ $(memory__h) \
+ $(gx_h) \
+ $(gserrors_h)
+
+pcstate_h = $(PCLSRC)pcstate.h \
+ $(gx_h) \
+ $(gxdevice_h) \
+ $(scommon_h) \
+ $(gscspace_h) \
+ $(gscolor2_h) \
+ $(gscrd_h) \
+ $(gsdcolor_h) \
+ $(gschar_h) \
+ $(pldict_h) \
+ $(plfont_h) \
+ $(pccoord_h) \
+ $(pcxfmst_h) \
+ $(pcfontst_h) \
+ $(pctpm_h) \
+ $(pcpattyp_h) \
+ $(pcdict_h) \
+ $(rtrstst_h) \
+ $(pcht_h) \
+ $(pcident_h) \
+ $(pccsbase_h) \
+ $(pjtop_h) \
+ $(pgstate_h)
+
+# the next two are out of place because pginit_h is needed by pcl,
+# pginit_h in turn requires pgmand_h
+
+pgmand_h = $(PCLSRC)pgmand.h \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(pcommand_h) \
+ $(pcstate_h)
+
+pginit_h = $(PCLSRC)pginit.h \
+ $(gx_h) \
+ $(pcstate_h) \
+ $(pcommand_h) \
+ $(pgmand_h)
+
+
+pccid_h = $(PCLSRC)pccid.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(pcommand_h)
+
+pccrd_h = $(PCLSRC)pccrd.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gsmatrix_h) \
+ $(gscspace_h) \
+ $(gscolor2_h) \
+ $(gscie_h) \
+ $(gscrd_h) \
+ $(pcident_h) \
+ $(pcstate_h)
+
+pcdither_h = $(PCLSRC)pcdither.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(pcommand_h)
+
+pcdraw_h = $(PCLSRC)pcdraw.h \
+ $(pcstate_h)
+
+pcfont_h = $(PCLSRC)pcfont.h \
+ $(pcstate_h) \
+ $(plfont_h)
+
+pclookup_h = $(PCLSRC)pclookup.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(pcommand_h) \
+ $(pccid_h)
+
+pccsbase_h = $(PCLSRC)pccsbase.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gscspace_h) \
+ $(pcident_h) \
+ $(pcommand_h) \
+ $(pccid_h) \
+ $(pclookup_h)
+
+pcht_h = $(PCLSRC)pcht.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gsht1_h) \
+ $(gshtx_h) \
+ $(pcident_h) \
+ $(pcommand_h) \
+ $(pclookup_h) \
+ $(pcdither_h)
+
+pcindxed_h = $(PCLSRC)pcindxed.h\
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gscspace_h) \
+ $(pcident_h) \
+ $(pcstate_h) \
+ $(pccid_h) \
+ $(pclookup_h) \
+ $(pccsbase_h)
+
+pcpalet_h = $(PCLSRC)pcpalet.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(pcident_h) \
+ $(pcstate_h) \
+ $(pcommand_h) \
+ $(pclookup_h) \
+ $(pcdither_h) \
+ $(pccid_h) \
+ $(pcindxed_h) \
+ $(pcht_h) \
+ $(pccrd_h)
+
+pcfrgrnd_h = $(PCLSRC)pcfrgrnd.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(pcstate_h) \
+ $(pcommand_h) \
+ $(pccsbase_h) \
+ $(pcht_h) \
+ $(pccrd_h) \
+ $(pcpalet_h)
+
+pcpage_h = $(PCLSRC)pcpage.h \
+ $(pcstate_h) \
+ $(pcommand_h)
+
+pcparam_h = $(PCLSRC)pcparam.h \
+ $(gsparam_h)
+
+pcparse_h = $(PCLSRC)pcparse.h \
+ $(gsmemory_h) \
+ $(scommon_h) \
+ $(pcommand_h)
+
+pcpatrn_h = $(PCLSRC)pcpatrn.h \
+ $(gx_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(pcindxed_h) \
+ $(pccsbase_h)
+
+pcbiptrn_h = $(PCLSRC)pcbiptrn.h \
+ $(pcpatrn_h)
+
+pcpatxfm_h = $(PCLSRC)pcpatxfm.h \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gscoord_h) \
+ $(pcstate_h) \
+ $(pcommand_h) \
+ $(pcpatrn_h)
+
+pctop_h = $(PCLSRC)pctop.h
+
+pcuptrn_h = $(PCLSRC)pcuptrn.h \
+ $(gx_h) \
+ $(pcommand_h) \
+ $(pcpatrn_h)
+
+pcursor_h = $(PCLSRC)pcursor.h \
+ $(gx_h) \
+ $(pcstate_h) \
+ $(pcommand_h)
+
+pcwhtidx_h = $(PCLSRC)pcwhtidx.h\
+ $(gx_h) \
+ $(gsbitmap_h) \
+ $(pcindxed_h)
+
+rtgmode_h = $(PCLSRC)rtgmode.h \
+ $(rtrstst_h) \
+ $(pcstate_h) \
+ $(pcommand_h)
+
+rtraster_h = $(PCLSRC)rtraster.h \
+ $(pcstate_h) \
+ $(pcommand_h)
+
+rtrstcmp_h = $(PCLSRC)rtrstcmp.h \
+ $(gx_h) \
+ $(gsstruct_h)
+
+
+$(PCLOBJ)pcommand.$(OBJ): $(PCLSRC)pcommand.c \
+ $(std_h) \
+ $(memory__h) \
+ $(gstypes_h) \
+ $(gsmemory_h) \
+ $(gsmatrix_h) \
+ $(gxstate_h) \
+ $(gsdevice_h) \
+ $(pcommand_h) \
+ $(pcparse_h) \
+ $(pcstate_h) \
+ $(pcparam_h) \
+ $(pcident_h) \
+ $(pgmand_h)
+ $(PCLCCC) $(PCLSRC)pcommand.c $(PCLO_)pcommand.$(OBJ)
+
+$(PCLOBJ)pcdraw.$(OBJ): $(PCLSRC)pcdraw.c \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gscoord_h) \
+ $(gsstate_h) \
+ $(gsrop_h) \
+ $(gxfixed_h) \
+ $(pcstate_h) \
+ $(pcht_h) \
+ $(pccrd_h) \
+ $(pcpatrn_h) \
+ $(pcdraw_h)
+ $(PCLCCC) $(PCLSRC)pcdraw.c $(PCLO_)pcdraw.$(OBJ)
+
+#### PCL5 parsing
+
+$(PCLOBJ)pcparse.$(OBJ): $(PCLSRC)pcparse.c \
+ $(AK) \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(gstypes_h) \
+ $(scommon_h) \
+ $(pcparse_h) \
+ $(pcstate_h) \
+ $(pcursor_h) \
+ $(rtgmode_h)
+ $(PCLCCC) $(PCLSRC)pcparse.c $(PCLO_)pcparse.$(OBJ)
+
+PCL5_PARSE = $(PCLOBJ)pcommand.$(OBJ) $(PCLOBJ)pcparse.$(OBJ)
+
+# PCL5_OTHER should include $(GD)stream.$(OBJ), but that is included
+# automatically anyway.
+PCL5_OTHER = $(PCL5_PARSE) $(PCLOBJ)pcdraw.$(OBJ)
+
+$(PCLOBJ)pcl5base.dev: $(PCL_MAK) $(ECHOGS_XE) $(PCL5_OTHER) \
+ $(PLOBJ)pl.dev $(PLOBJ)pjl.dev $(PLOBJ)$(PCL_FONT_SCALER).dev
+ $(SETMOD) $(PCLOBJ)pcl5base $(PCL5_OTHER)
+ $(ADDMOD) $(PCLOBJ)pcl5base -include $(PLOBJ)pl $(PLOBJ)pjl $(PLOBJ)$(PCL_FONT_SCALER)
+ $(ADDMOD) $(PCLOBJ)pcl5base -init pcparse
+
+################ Raster graphics base ################
+
+# This is the intersection of HP RTL and PCL5e/5C.
+# We separate this out because HP RTL isn't *quite* a subset of PCL5.
+
+
+#### Monochrome commands
+# These are organized by chapter # in the PCL 5 Technical Reference Manual.
+
+rtraster_h = $(PCLSRC)rtraster.h \
+ $(pcstate_h) \
+ $(pcommand_h)
+
+# out of place because these are needed by rtmisc.h
+pgmisc_h = $(PCLSRC)pgmisc.h
+pgdraw_h = $(PCLSRC)pgdraw.h
+
+
+# Chapters 4, 13, 18, and Comparison Guide
+$(PCLOBJ)rtmisc.$(OBJ): $(PCLSRC)rtmisc.c \
+ $(math__h) \
+ $(pgmand_h) \
+ $(pgdraw_h) \
+ $(pgmisc_h) \
+ $(gsmemory_h) \
+ $(gsrop_h) \
+ $(gscoord_h) \
+ $(pcpatxfm_h) \
+ $(pcpage_h) \
+ $(pcdraw_h)
+ $(PCLCCC) $(PCLSRC)rtmisc.c $(PCLO_)rtmisc.$(OBJ)
+
+# Chapter 15
+$(PCLOBJ)rtraster.$(OBJ): $(PCLSRC)rtraster.c \
+ $(memory__h) \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gscoord_h) \
+ $(gspath_h) \
+ $(gspath2_h) \
+ $(gsimage_h) \
+ $(gsiparam_h) \
+ $(gsiparm4_h) \
+ $(gsdevice_h) \
+ $(gsrop_h) \
+ $(pcstate_h) \
+ $(pcpalet_h) \
+ $(pcpage_h) \
+ $(pcindxed_h) \
+ $(pcwhtidx_h) \
+ $(pcdraw_h) \
+ $(rtgmode_h) \
+ $(rtrstcmp_h) \
+ $(rtraster_h)
+ $(PCLCCC) $(PCLSRC)rtraster.c $(PCLO_)rtraster.$(OBJ)
+
+rtlbase_ = $(PCLOBJ)rtmisc.$(OBJ) $(PCLOBJ)rtraster.$(OBJ)
+
+$(PCLOBJ)rtlbase.dev: $(PCL_MAK) $(ECHOGS_XE) $(rtlbase_) $(PCLOBJ)pcl5base.dev
+ $(SETMOD) $(PCLOBJ)rtlbase $(rtlbase_)
+ $(ADDMOD) $(PCLOBJ)rtlbase -include $(PCLOBJ)pcl5base
+ $(ADDMOD) $(PCLOBJ)rtlbase -init rtmisc rtraster
+
+#### Color commands
+# These are organized by chapter # in the PCL 5 Color Technical Reference
+# Manual. (These are no longer separable from the base PCL set)
+
+# Chapter 2, 3, 4, 5
+$(PCLOBJ)pcbiptrn.$(OBJ): $(PCLSRC)pcbiptrn.c \
+ $(math__h) \
+ $(string__h) \
+ $(gstypes_h) \
+ $(gsmatrix_h) \
+ $(gsmemory_h) \
+ $(gsstate_h) \
+ $(gscoord_h) \
+ $(pcpatrn_h) \
+ $(pcstate_h) \
+ $(pcuptrn_h) \
+ $(pcbiptrn_h)
+ $(PCLCCC) $(PCLSRC)pcbiptrn.c $(PCLO_)pcbiptrn.$(OBJ)
+
+$(PCLOBJ)pccid.$(OBJ): $(PCLSRC)pccid.c \
+ $(gx_h) \
+ $(gsmemory_h) \
+ $(gsstruct_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcpalet_h) \
+ $(pccid_h)
+ $(PCLCCC) $(PCLSRC)pccid.c $(PCLO_)pccid.$(OBJ)
+
+$(PCLOBJ)pccolor.$(OBJ): $(PCLSRC)pccolor.c \
+ $(std_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcpalet_h)
+ $(PCLCCC) $(PCLSRC)pccolor.c $(PCLO_)pccolor.$(OBJ)
+
+$(PCLOBJ)pccrd.$(OBJ): $(PCLSRC)pccrd.c \
+ $(string__h) \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gsmemory_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gsparam_h) \
+ $(gsdevice_h) \
+ $(gscspace_h) \
+ $(gscolor2_h) \
+ $(gscie_h) \
+ $(gscrd_h) \
+ $(gscrdp_h) \
+ $(pcommand_h) \
+ $(pccrd_h)
+ $(PCLCCC) $(PCLSRC)pccrd.c $(PCLO_)pccrd.$(OBJ)
+
+$(PCLOBJ)pccsbase.$(OBJ): $(PCLSRC)pccsbase.c \
+ $(gx_h) \
+ $(math__h) \
+ $(gstypes_h) \
+ $(gsmatrix_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gscspace_h) \
+ $(gscolor2_h) \
+ $(gscie_h) \
+ $(pcmtx3_h) \
+ $(pccsbase_h) \
+ $(pcstate_h)
+ $(PCLCCC) $(PCLSRC)pccsbase.c $(PCLO_)pccsbase.$(OBJ)
+
+$(PCLOBJ)pcdither.$(OBJ): $(PCLSRC)pcdither.c \
+ $(pcommand_h) \
+ $(pcpalet_h) \
+ $(pcdither_h)
+ $(PCLCCC) $(PCLSRC)pcdither.c $(PCLO_)pcdither.$(OBJ)
+
+$(PCLOBJ)pcfrgrnd.$(OBJ): $(PCLSRC)pcfrgrnd.c \
+ $(gx_h) \
+ $(pcommand_h) \
+ $(pcfont_h) \
+ $(pcfrgrnd_h)
+ $(PCLCCC) $(PCLSRC)pcfrgrnd.c $(PCLO_)pcfrgrnd.$(OBJ)
+
+$(PCLOBJ)pcht.$(OBJ): $(PCLSRC)pcht.c \
+ $(gx_h) \
+ $(math__h) \
+ $(gsmemory_h) \
+ $(gsstruct_h) \
+ $(gsrefct_h) \
+ $(gsdevice_h) \
+ $(gsparam_h) \
+ $(gxdevice_h) \
+ $(pcommand_h) \
+ $(pcpalet_h) \
+ $(pcstate_h) \
+ $(pcdither_h) \
+ $(pcht_h) \
+ $(pcindxed_h)
+ $(PCLCCC) $(PCLSRC)pcht.c $(PCLO_)pcht.$(OBJ)
+
+$(PCLOBJ)pcident.$(OBJ): $(PCLSRC)pcident.c \
+ $(gx_h) \
+ $(gsuid_h) \
+ $(pcident_h) \
+ $(pcstate_h)
+ $(PCLCCC) $(PCLSRC)pcident.c $(PCLO_)pcident.$(OBJ)
+
+$(PCLOBJ)pcindxed.$(OBJ): $(PCLSRC)pcindxed.c \
+ $(gx_h) \
+ $(math__h) \
+ $(string__h) \
+ $(pcmtx3_h) \
+ $(pccid_h) \
+ $(pccsbase_h) \
+ $(pcpalet_h)
+ $(PCLCCC) $(PCLSRC)pcindxed.c $(PCLO_)pcindxed.$(OBJ)
+
+$(PCLOBJ)pclookup.$(OBJ): $(PCLSRC)pclookup.c \
+ $(pcpalet_h) \
+ $(pclookup_h)
+ $(PCLCCC) $(PCLSRC)pclookup.c $(PCLO_)pclookup.$(OBJ)
+
+$(PCLOBJ)pcmtx3.$(OBJ): $(PCLSRC)pcmtx3.c \
+ $(gx_h) \
+ $(string__h) \
+ $(math__h) \
+ $(gstypes_h) \
+ $(pcommand_h) \
+ $(pcmtx3_h)
+ $(PCLCCC) $(PCLSRC)pcmtx3.c $(PCLO_)pcmtx3.$(OBJ)
+
+$(PCLOBJ)pcpalet.$(OBJ): $(PCLSRC)pcpalet.c \
+ $(gsparam_h) \
+ $(gsdevice_h) \
+ $(gx_h) \
+ $(gxcmap_h) \
+ $(pldict_h) \
+ $(pcdraw_h) \
+ $(pcpage_h) \
+ $(pcursor_h) \
+ $(pcpalet_h) \
+ $(pcfrgrnd_h)
+ $(PCLCCC) $(PCLSRC)pcpalet.c $(PCLO_)pcpalet.$(OBJ)
+
+$(PCLOBJ)pcpatrn.$(OBJ): $(PCLSRC)pcpatrn.c \
+ $(gx_h) \
+ $(gsuid_h) \
+ $(gsmatrix_h) \
+ $(gspcolor_h) \
+ $(gxdcolor_h) \
+ $(gxpcolor_h) \
+ $(gxstate_h) \
+ $(pccid_h) \
+ $(pcfont_h) \
+ $(pcpalet_h) \
+ $(pcfrgrnd_h) \
+ $(pcht_h) \
+ $(pcwhtidx_h) \
+ $(pcpatrn_h) \
+ $(pcbiptrn_h) \
+ $(pcuptrn_h) \
+ $(pcpatxfm_h)
+ $(PCLCCC) $(PCLSRC)pcpatrn.c $(PCLO_)pcpatrn.$(OBJ)
+
+$(PCLOBJ)pcpatxfm.$(OBJ): $(PCLSRC)pcpatxfm.c \
+ $(gx_h) \
+ $(math__h) \
+ $(pcpatrn_h) \
+ $(pcfont_h) \
+ $(pcpatxfm_h)
+ $(PCLCCC) $(PCLSRC)pcpatxfm.c $(PCLO_)pcpatxfm.$(OBJ)
+
+$(PCLOBJ)pcuptrn.$(OBJ): $(PCLSRC)pcuptrn.c \
+ $(string__h) \
+ $(gx_h) \
+ $(gsuid_h) \
+ $(gscsel_h) \
+ $(gsdevice_h) \
+ $(gxdevice_h) \
+ $(gscspace_h) \
+ $(gxdcolor_h) \
+ $(gxcolor2_h) \
+ $(gxpcolor_h) \
+ $(pldict_h) \
+ $(pcindxed_h) \
+ $(pcpatrn_h) \
+ $(pcbiptrn_h) \
+ $(pcuptrn_h)
+ $(PCLCCC) $(PCLSRC)pcuptrn.c $(PCLO_)pcuptrn.$(OBJ)
+
+$(PCLOBJ)pcwhtidx.$(OBJ): $(PCLSRC)pcwhtidx.c \
+ $(pcstate_h) \
+ $(pcpalet_h) \
+ $(pcindxed_h) \
+ $(pcwhtidx_h)
+ $(PCLCCC) $(PCLSRC)pcwhtidx.c $(PCLO_)pcwhtidx.$(OBJ)
+
+# Chapter 6
+$(PCLOBJ)rtgmode.$(OBJ): $(PCLSRC)rtgmode.c \
+ $(gx_h) \
+ $(math__h) \
+ $(gsmatrix_h) \
+ $(gscoord_h) \
+ $(gsrect_h) \
+ $(gsstate_h) \
+ $(pcstate_h) \
+ $(pcpatxfm_h) \
+ $(pcpage_h) \
+ $(pcindxed_h) \
+ $(pcpalet_h) \
+ $(pcursor_h) \
+ $(pcdraw_h) \
+ $(rtraster_h) \
+ $(rtrstcmp_h) \
+ $(rtgmode_h)
+ $(PCLCCC) $(PCLSRC)rtgmode.c $(PCLO_)rtgmode.$(OBJ)
+
+$(PCLOBJ)rtrstcmp.$(OBJ): $(PCLSRC)rtrstcmp.c \
+ $(string__h) \
+ $(pcstate_h) \
+ $(rtrstcmp_h)
+ $(PCLCCC) $(PCLSRC)rtrstcmp.c $(PCLO_)rtrstcmp.$(OBJ)
+
+
+rtlbasec_ = $(PCLOBJ)pcbiptrn.$(OBJ) $(PCLOBJ)pccid.$(OBJ) \
+ $(PCLOBJ)pccolor.$(OBJ) $(PCLOBJ)pccrd.$(OBJ) \
+ $(PCLOBJ)pccsbase.$(OBJ) $(PCLOBJ)pcdither.$(OBJ) \
+ $(PCLOBJ)pcfrgrnd.$(OBJ) $(PCLOBJ)pcht.$(OBJ) \
+ $(PCLOBJ)pcident.$(OBJ) $(PCLOBJ)pcindxed.$(OBJ) \
+ $(PCLOBJ)pclookup.$(OBJ) $(PCLOBJ)pcmtx3.$(OBJ) \
+ $(PCLOBJ)pcpalet.$(OBJ) $(PCLOBJ)pcpatrn.$(OBJ) \
+ $(PCLOBJ)pcpatxfm.$(OBJ) $(PCLOBJ)pcuptrn.$(OBJ) \
+ $(PCLOBJ)pcwhtidx.$(OBJ) $(PCLOBJ)rtgmode.$(OBJ) \
+ $(PCLOBJ)rtrstcmp.$(OBJ)
+
+$(PCLOBJ)rtlbasec.dev: $(PCL_MAK) $(ECHOGS_XE) $(rtlbasec_) $(PCLOBJ)rtlbase.dev
+ $(SETMOD) $(PCLOBJ)rtlbasec $(rtlbasec_)
+ $(ADDMOD) $(PCLOBJ)rtlbasec -include $(PCLOBJ)rtlbase
+ $(ADDMOD) $(PCLOBJ)rtlbasec -init pcl_cid pcl_color pcl_udither
+ $(ADDMOD) $(PCLOBJ)rtlbasec -init pcl_frgrnd pcl_lookup_tbl
+ $(ADDMOD) $(PCLOBJ)rtlbasec -init pcl_palette pcl_pattern
+ $(ADDMOD) $(PCLOBJ)rtlbasec -init pcl_xfm pcl_upattern
+ $(ADDMOD) $(PCLOBJ)rtlbasec -init rtgmode
+
+################ PCL 5e/5c ################
+
+#### Shared support
+
+pcfsel_h = $(PCLSRC)pcfsel.h \
+ $(pcstate_h)
+
+pcsymbol_h = $(PCLSRC)pcsymbol.h \
+ $(plsymbol_h)
+
+# Font selection is essentially identical in PCL and HP-GL/2.
+$(PCLOBJ)pcfsel.$(OBJ): $(PCLSRC)pcfsel.c \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcfont_h) \
+ $(pcfsel_h) \
+ $(pcsymbol_h)
+ $(PCLCCC) $(PCLSRC)pcfsel.c $(PCLO_)pcfsel.$(OBJ)
+
+$(PCL_TOP_OBJ): $(PCLSRC)pctop.c \
+ $(AK) \
+ $(malloc__h) \
+ $(math__h) \
+ $(memory__h) \
+ $(stdio__h) \
+ $(scommon_h) \
+ $(pcparse_h) \
+ $(pcpage_h) \
+ $(pcstate_h) \
+ $(pldebug_h) \
+ $(gdebug_h) \
+ $(gsmatrix_h) \
+ $(gsstate_h) \
+ $(gxalloc_h) \
+ $(gxdevice_h) \
+ $(gxstate_h) \
+ $(pjparse_h) \
+ $(pltop_h) \
+ $(pctop_h) \
+ $(PCLGEN)pconf.h
+ $(CP_) $(PCLGEN)pconf.h $(PCLGEN)pconfig.h
+ $(PCLCCC) $(PCLSRC)pctop.c $(PCLO_)pctop.$(OBJ)
+
+PCL_COMMON = $(PCLOBJ)pcfsel.$(OBJ)
+
+#### PCL5(e) commands
+# These are organized by chapter # in the PCL 5 Technical Reference Manual.
+
+# Chapter 4
+# Some of these replace implementations in rtmisc.c.
+$(PCLOBJ)pcjob.$(OBJ): $(PCLSRC)pcjob.c \
+ $(std_h) \
+ $(gx_h) \
+ $(gsmemory_h) \
+ $(gsmatrix_h) \
+ $(gsdevice_h) \
+ $(pcommand_h) \
+ $(pcursor_h) \
+ $(pcstate_h) \
+ $(pcparam_h) \
+ $(pcdraw_h) \
+ $(pcpage_h) \
+ $(pjtop_h)
+ $(PCLCCC) $(PCLSRC)pcjob.c $(PCLO_)pcjob.$(OBJ)
+
+# Chapter 5
+$(PCLOBJ)pcpage.$(OBJ): $(PCLSRC)pcpage.c \
+ $(math__h) \
+ $(std_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcdraw_h) \
+ $(pcparam_h) \
+ $(pcparse_h) \
+ $(pcfont_h) \
+ $(pcpatxfm_h) \
+ $(pcursor_h) \
+ $(pcpage_h) \
+ $(pgmand_h) \
+ $(pginit_h) \
+ $(plmain_h) \
+ $(gsmatrix_h) \
+ $(gsnogc_h) \
+ $(gscoord_h) \
+ $(gsdevice_h) \
+ $(gspaint_h) \
+ $(gspath_h) \
+ $(gxdevice_h) \
+ $(pjtop_h)
+ $(PCLCCC) $(PCLSRC)pcpage.c $(PCLO_)pcpage.$(OBJ)
+
+# Chapter 6
+$(PCLOBJ)pcursor.$(OBJ): $(PCLSRC)pcursor.c \
+ $(std_h) \
+ $(math__h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcdraw_h) \
+ $(pcpatxfm_h) \
+ $(pcfont_h) \
+ $(pcursor_h) \
+ $(pcpage_h) \
+ $(gscoord_h) \
+ $(pjtop_h)
+ $(PCLCCC) $(PCLSRC)pcursor.c $(PCLO_)pcursor.$(OBJ)
+
+# Chapter 8
+$(PCLOBJ)pcfont.$(OBJ): $(PCLSRC)pcfont.c \
+ $(std_h) \
+ $(memory__h) \
+ $(gx_h) \
+ $(gsccode_h) \
+ $(gsmatrix_h) \
+ $(gxfcache_h) \
+ $(gxfixed_h) \
+ $(gxchar_h) \
+ $(gxfont_h) \
+ $(gxfont42_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcursor_h) \
+ $(pcfont_h) \
+ $(pcfsel_h) \
+ $(pjtop_h) \
+ $(pllfont_h)
+ $(PCLCCC) $(PCLSRC)pcfont.c $(PCLO_)pcfont.$(OBJ)
+
+$(PCLOBJ)pctext.$(OBJ): $(PCLSRC)pctext.c \
+ $(math__h) \
+ $(gx_h) \
+ $(gsimage_h) \
+ $(plvalue_h) \
+ $(plvocab_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcdraw_h) \
+ $(pcfont_h) \
+ $(pcursor_h) \
+ $(pcpage_h) \
+ $(pcfrgrnd_h) \
+ $(gdebug_h) \
+ $(gscoord_h) \
+ $(gsline_h) \
+ $(gspaint_h) \
+ $(gspath_h) \
+ $(gspath2_h) \
+ $(gsrop_h) \
+ $(gsstate_h) \
+ $(gxchar_h) \
+ $(gxfont_h) \
+ $(gxstate_h)
+ $(PCLCCC) $(PCLSRC)pctext.c $(PCLO_)pctext.$(OBJ)
+
+# Chapter 10
+$(PCLOBJ)pcsymbol.$(OBJ): $(PCLSRC)pcsymbol.c \
+ $(stdio__h) \
+ $(plvalue_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcfont_h) \
+ $(pcsymbol_h)
+ $(PCLCCC) $(PCLSRC)pcsymbol.c $(PCLO_)pcsymbol.$(OBJ)
+
+$(PCLOBJ)pcsfont.$(OBJ): $(PCLSRC)pcsfont.c \
+ $(memory__h) \
+ $(stdio__h) \
+ $(math__h) \
+ $(gdebug_h) \
+ $(pcommand_h) \
+ $(pcfont_h) \
+ $(pcpage_h) \
+ $(pcparse_h) \
+ $(pcstate_h) \
+ $(pcfsel_h) \
+ $(pjparse_h) \
+ $(pldict_h) \
+ $(plvalue_h) \
+ $(plmain_h) \
+ $(gsbitops_h) \
+ $(gsccode_h) \
+ $(gsmatrix_h) \
+ $(gsutil_h) \
+ $(gxfont_h) \
+ $(gxfont42_h)
+ $(PCLCCC) $(PCLSRC)pcsfont.c $(PCLO_)pcsfont.$(OBJ)
+
+# Chapter 12
+$(PCLOBJ)pcmacros.$(OBJ): $(PCLSRC)pcmacros.c \
+ $(stdio__h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcparse_h) \
+ $(pgmand_h)
+ $(PCLCCC) $(PCLSRC)pcmacros.c $(PCLO_)pcmacros.$(OBJ)
+
+# Chapter 14
+$(PCLOBJ)pcrect.$(OBJ): $(PCLSRC)pcrect.c \
+ $(math__h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcdraw_h) \
+ $(pcpatrn_h) \
+ $(pcbiptrn_h) \
+ $(pcuptrn_h) \
+ $(gspath_h) \
+ $(gspath2_h) \
+ $(gsmatrix_h) \
+ $(gscoord_h) \
+ $(gspaint_h) \
+ $(gsrop_h)
+ $(PCLCCC) $(PCLSRC)pcrect.c $(PCLO_)pcrect.$(OBJ)
+
+# Chapter 15
+# All of these are in rtraster.c, but some of them are only registered
+# in PCL5 mode.
+
+# Chapter 16
+$(PCLOBJ)pcstatus.$(OBJ): $(PCLSRC)pcstatus.c \
+ $(memory__h) \
+ $(stdio__h) \
+ $(string__h) \
+ $(gsmemory_h) \
+ $(gsmalloc_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcfont_h) \
+ $(pcsymbol_h) \
+ $(pcparse_h) \
+ $(pcpatrn_h) \
+ $(pcuptrn_h) \
+ $(pcpage_h) \
+ $(pcursor_h) \
+ $(stream_h)
+ $(PCLCCC) $(PCLSRC)pcstatus.c $(PCLO_)pcstatus.$(OBJ)
+
+# Chapter 24
+$(PCLOBJ)pcmisc.$(OBJ): $(PCLSRC)pcmisc.c \
+ $(std_h) \
+ $(pcommand_h) \
+ $(pcstate_h)
+ $(PCLCCC) $(PCLSRC)pcmisc.c $(PCLO_)pcmisc.$(OBJ)
+
+# font page
+# Chapter 24
+$(PCLOBJ)pcfontpg.$(OBJ): $(PCLSRC)pcfontpg.c \
+ $(std_h) \
+ $(gstypes_h) \
+ $(pldict_h) \
+ $(pcfont_h) \
+ $(pcstate_h) \
+ $(pcursor_h) \
+ $(pcommand_h)
+ $(PCLCCC) $(PCLSRC)pcfontpg.c $(PCLO_)pcfontpg.$(OBJ)
+
+PCL5_OPS1 = $(PCLOBJ)pcjob.$(OBJ) $(PCLOBJ)pcpage.$(OBJ) \
+ $(PCLOBJ)pcursor.$(OBJ)
+
+PCL5_OPS2 = $(PCLOBJ)pcfont.$(OBJ) $(PCLOBJ)pctext.$(OBJ)
+
+PCL5_OPS3 = $(PCLOBJ)pcsymbol.$(OBJ)
+
+PCL5_OPS4 = $(PCLOBJ)pcsfont.$(OBJ) $(PCLOBJ)pcmacros.$(OBJ)
+
+PCL5_OPS5 = $(PCLOBJ)pcrect.$(OBJ) $(PCLOBJ)pcstatus.$(OBJ) \
+ $(PCLOBJ)pcmisc.$(OBJ) $(PCLOBJ)pcfontpg.$(OBJ)
+
+PCL5_OPS = $(PCL5_OPS1) $(PCL5_OPS2) $(PCL5_OPS3) $(PCL5_OPS4) $(PCL5_OPS5)
+
+# Note: we have to initialize the cursor after initializing the logical
+# page dimensions, so we do it last. This is a hack.
+$(PCLOBJ)pcl5.dev: $(PCL_MAK) $(ECHOGS_XE) $(PCL_COMMON) $(PCL5_OPS) \
+ $(PCLOBJ)pcl5base.dev $(PCLOBJ)rtlbase.dev
+ $(SETMOD) $(PCLOBJ)pcl5 $(PCL_COMMON)
+ $(ADDMOD) $(PCLOBJ)pcl5 $(PCL5_OPS1)
+ $(ADDMOD) $(PCLOBJ)pcl5 $(PCL5_OPS2)
+ $(ADDMOD) $(PCLOBJ)pcl5 $(PCL5_OPS3)
+ $(ADDMOD) $(PCLOBJ)pcl5 $(PCL5_OPS4)
+ $(ADDMOD) $(PCLOBJ)pcl5 $(PCL5_OPS5)
+ $(ADDMOD) $(PCLOBJ)pcl5 -include $(PCLOBJ)rtlbase
+ $(ADDMOD) $(PCLOBJ)pcl5 -init pcjob pcpage pcfont pctext
+ $(ADDMOD) $(PCLOBJ)pcl5 -init pcsymbol pcsfont pcmacros
+ $(ADDMOD) $(PCLOBJ)pcl5 -init pcrect rtraster pcstatus
+ $(ADDMOD) $(PCLOBJ)pcl5 -init pcmisc
+ $(ADDMOD) $(PCLOBJ)pcl5 -init pcursor
+
+#### PCL5c commands
+# These are organized by chapter # in the PCL 5 Color Technical Reference
+# Manual.
+
+# Chapter 5
+$(PCLOBJ)pccprint.$(OBJ): $(PCLSRC)pccprint.c \
+ $(std_h) \
+ $(pcommand_h) \
+ $(pcstate_h) \
+ $(pcfont_h) \
+ $(gsmatrix_h) \
+ $(gsstate_h) \
+ $(gsrop_h)
+ $(PCLCCC) $(PCLSRC)pccprint.c $(PCLO_)pccprint.$(OBJ)
+
+# Chapter 6
+# All of these are in rtgmode.c, but some of them are only registered
+# in PCL5 mode.
+
+PCL5C_OPS = $(PCLOBJ)pccprint.$(OBJ)
+
+$(PCLOBJ)pcl5c.dev: $(PCL_MAK) $(ECHOGS_XE) $(PCL5C_OPS) \
+ $(PCLOBJ)pcl5.dev $(PCLOBJ)rtlbasec.dev
+ $(SETMOD) $(PCLOBJ)pcl5c $(PCL5C_OPS)
+ $(ADDMOD) $(PCLOBJ)pcl5c -include $(PCLOBJ)pcl5 $(PCLOBJ)rtlbasec
+ $(ADDMOD) $(PCLOBJ)pcl5c -init pccprint rtgmode
+
+################ HP-GL/2 ################
+
+pgfdata_h = $(PCLSRC)pgfdata.h
+
+pgfont_h = $(PCLSRC)pgfont.h
+
+pggeom_h = $(PCLSRC)pggeom.h \
+ $(math__h) \
+ $(gstypes_h)
+
+#### HP-GL/2 non-commands
+
+# Utilities
+
+$(PCLOBJ)pgdraw.$(OBJ): $(PCLSRC)pgdraw.c \
+ $(stdio__h) \
+ $(math__h) \
+ $(gdebug_h) \
+ $(gstypes_h) \
+ $(gsmatrix_h) \
+ $(gsmemory_h) \
+ $(gsstate_h) \
+ $(gscoord_h) \
+ $(gspath_h) \
+ $(gspaint_h) \
+ $(gsrop_h) \
+ $(gxfarith_h) \
+ $(gxfixed_h) \
+ $(pgmand_h) \
+ $(pgdraw_h) \
+ $(pggeom_h) \
+ $(pgmisc_h) \
+ $(pcdraw_h) \
+ $(pcpage_h) \
+ $(pcpalet_h) \
+ $(pcpatrn_h)
+ $(PCLCCC) $(PCLSRC)pgdraw.c $(PCLO_)pgdraw.$(OBJ)
+
+$(PCLOBJ)pggeom.$(OBJ): $(PCLSRC)pggeom.c \
+ $(stdio__h) \
+ $(pggeom_h) \
+ $(gxfarith_h)
+ $(PCLCCC) $(PCLSRC)pggeom.c $(PCLO_)pggeom.$(OBJ)
+
+$(PCLOBJ)pgmisc.$(OBJ): $(PCLSRC)pgmisc.c \
+ $(pgmand_h) \
+ $(pgmisc_h)
+ $(PCLCCC) $(PCLSRC)pgmisc.c $(PCLO_)pgmisc.$(OBJ)
+
+# Initialize/reset. We break this out simply because it's easier to keep
+# track of it this way.
+
+$(PCLOBJ)pginit.$(OBJ): $(PCLSRC)pginit.c \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gsmemory_h) \
+ $(gsstate_h) \
+ $(pgmand_h) \
+ $(pginit_h) \
+ $(pgdraw_h) \
+ $(pgmisc_h) \
+ $(pcpatrn_h)
+ $(PCLCCC) $(PCLSRC)pginit.c $(PCLO_)pginit.$(OBJ)
+
+# Parsing and utilities
+
+$(PCLOBJ)pgparse.$(OBJ): $(PCLSRC)pgparse.c \
+ $(AK) \
+ $(math__h) \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(gstypes_h) \
+ $(scommon_h) \
+ $(pgmand_h)
+ $(PCLCCC) $(PCLSRC)pgparse.c $(PCLO_)pgparse.$(OBJ)
+
+HPGL2_OTHER1 = $(PCLOBJ)pgdraw.$(OBJ) $(PCLOBJ)pggeom.$(OBJ) \
+ $(PCLOBJ)pginit.$(OBJ)
+HPGL2_OTHER2 = $(PCLOBJ)pgparse.$(OBJ) $(PCLOBJ)pgmisc.$(OBJ)
+HPGL2_OTHER = $(HPGL2_OTHER1) $(HPGL2_OTHER2)
+
+#### HP-GL/2 commands
+# These are organized by chapter # in the PCL 5 Technical Reference Manual.
+
+# Chapter 18
+# These are PCL commands, but are only relevant to HP RTL and/or HP-GL/2.
+# Some of these are in rtmisc.c.
+$(PCLOBJ)pgframe.$(OBJ): $(PCLSRC)pgframe.c \
+ $(math__h) \
+ $(pgmand_h) \
+ $(pgdraw_h) \
+ $(pgmisc_h) \
+ $(gstypes_h) \
+ $(gsmatrix_h) \
+ $(gsmemory_h) \
+ $(gsstate_h) \
+ $(pcdraw_h) \
+ $(pcfont_h) \
+ $(pcstate_h)
+ $(PCLCCC) $(PCLSRC)pgframe.c $(PCLO_)pgframe.$(OBJ)
+
+# Chapter 19
+$(PCLOBJ)pgconfig.$(OBJ): $(PCLSRC)pgconfig.c \
+ $(gx_h) \
+ $(gsmatrix_h) \
+ $(gsmemory_h) \
+ $(gsstate_h) \
+ $(gscoord_h) \
+ $(pgmand_h) \
+ $(pgdraw_h) \
+ $(pginit_h) \
+ $(pggeom_h) \
+ $(pgmisc_h) \
+ $(pcursor_h) \
+ $(pcpage_h) \
+ $(pcpalet_h) \
+ $(pcdraw_h) \
+ $(pcparse_h)
+ $(PCLCCC) $(PCLSRC)pgconfig.c $(PCLO_)pgconfig.$(OBJ)
+
+# Chapter 20
+$(PCLOBJ)pgvector.$(OBJ): $(PCLSRC)pgvector.c \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(pcparse_h) \
+ $(pgmand_h) \
+ $(pggeom_h) \
+ $(pgdraw_h) \
+ $(pgmisc_h) \
+ $(gspath_h) \
+ $(gscoord_h) \
+ $(math__h)
+ $(PCLCCC) $(PCLSRC)pgvector.c $(PCLO_)pgvector.$(OBJ)
+
+# Chapter 21
+$(PCLOBJ)pgpoly.$(OBJ): $(PCLSRC)pgpoly.c \
+ $(std_h) \
+ $(pcparse_h) \
+ $(pgmand_h) \
+ $(pgdraw_h) \
+ $(pggeom_h) \
+ $(pgmisc_h) \
+ $(pcpatrn_h) \
+ $(gscoord_h) \
+ $(gspath_h)
+ $(PCLCCC) $(PCLSRC)pgpoly.c $(PCLO_)pgpoly.$(OBJ)
+
+# Chapter 22
+$(PCLOBJ)pglfill.$(OBJ): $(PCLSRC)pglfill.c \
+ $(memory__h) \
+ $(pcparse_h) \
+ $(pgmand_h) \
+ $(pginit_h) \
+ $(pggeom_h) \
+ $(pgdraw_h) \
+ $(pgmisc_h) \
+ $(pcdraw_h) \
+ $(gsuid_h) \
+ $(gstypes_h) \
+ $(gsstate_h) \
+ $(gsrop_h) \
+ $(gxbitmap_h) \
+ $(pcpalet_h) \
+ $(pcpatrn_h)
+ $(PCLCCC) $(PCLSRC)pglfill.c $(PCLO_)pglfill.$(OBJ)
+
+# Chapter 23
+$(PCLOBJ)pgchar.$(OBJ): $(PCLSRC)pgchar.c \
+ $(math__h) \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(pcparse_h) \
+ $(pgmand_h) \
+ $(pgdraw_h) \
+ $(pginit_h) \
+ $(pggeom_h) \
+ $(pgmisc_h) \
+ $(pcfsel_h) \
+ $(pcpalet_h)
+ $(PCLCCC) $(PCLSRC)pgchar.c $(PCLO_)pgchar.$(OBJ)
+
+$(PCLOBJ)pglabel.$(OBJ): $(PCLSRC)pglabel.c \
+ $(math__h) \
+ $(memory__h) \
+ $(ctype__h) \
+ $(stdio__h) \
+ $(gdebug_h) \
+ $(plvalue_h) \
+ $(pgmand_h) \
+ $(pginit_h) \
+ $(pgfont_h) \
+ $(pgdraw_h) \
+ $(pggeom_h) \
+ $(pgmisc_h) \
+ $(pcpage_h) \
+ $(pcfsel_h) \
+ $(pcsymbol_h) \
+ $(pcpalet_h) \
+ $(pcparse_h) \
+ $(pcdraw_h) \
+ $(gscoord_h) \
+ $(gsline_h) \
+ $(gspath_h) \
+ $(gsutil_h) \
+ $(gxchar_h) \
+ $(gxfont_h) \
+ $(gxstate_h)
+ $(PCLCCC) $(PCLSRC)pglabel.c $(PCLO_)pglabel.$(OBJ)
+
+$(PCLOBJ)pgfdata.$(OBJ): $(PCLSRC)pgfdata.c \
+ $(std_h) \
+ $(gstypes_h) \
+ $(gsccode_h) \
+ $(gsstate_h) \
+ $(gspath_h) \
+ $(gserror_h) \
+ $(gserrors_h) \
+ $(gxarith_h) \
+ $(pgfdata_h)
+ $(PCLCCC) $(PCLSRC)pgfdata.c $(PCLO_)pgfdata.$(OBJ)
+
+$(PCLOBJ)pgfont.$(OBJ): $(PCLSRC)pgfont.c \
+ $(math__h) \
+ $(gstypes_h) \
+ $(gsccode_h) \
+ $(gsmemory_h) \
+ $(gsstate_h) \
+ $(gsmatrix_h) \
+ $(gscoord_h) \
+ $(gspaint_h) \
+ $(gspath_h) \
+ $(gxfixed_h) \
+ $(gxchar_h) \
+ $(gxfarith_h) \
+ $(gxfont_h) \
+ $(plfont_h) \
+ $(pgfdata_h) \
+ $(pgfont_h)
+ $(PCLCCC) $(PCLSRC)pgfont.c $(PCLO_)pgfont.$(OBJ)
+
+HPGL2_OPS1 = $(PCLOBJ)pgframe.$(OBJ) $(PCLOBJ)pgconfig.$(OBJ) \
+ $(PCLOBJ)pgvector.$(OBJ)
+HPGL2_OPS2 = $(PCLOBJ)pgpoly.$(OBJ) $(PCLOBJ)pglfill.$(OBJ) \
+ $(PCLOBJ)pgchar.$(OBJ)
+HPGL2_OPS3 = $(PCLOBJ)pglabel.$(OBJ) $(PCLOBJ)pgfdata.$(OBJ) \
+ $(PCLOBJ)pgfont.$(OBJ)
+HPGL2_OPS = $(HPGL2_OPS1) $(HPGL2_OPS2) $(HPGL2_OPS3)
+
+$(PCLOBJ)hpgl2.dev: $(PCL_MAK) $(ECHOGS_XE) $(PCL_COMMON) \
+ $(HPGL2_OTHER) $(HPGL2_OPS)
+ $(SETMOD) $(PCLOBJ)hpgl2 $(PCL_COMMON)
+ $(ADDMOD) $(PCLOBJ)hpgl2 $(HPGL2_OTHER1)
+ $(ADDMOD) $(PCLOBJ)hpgl2 $(HPGL2_OTHER2)
+ $(ADDMOD) $(PCLOBJ)hpgl2 $(HPGL2_OPS1)
+ $(ADDMOD) $(PCLOBJ)hpgl2 $(HPGL2_OPS2)
+ $(ADDMOD) $(PCLOBJ)hpgl2 $(HPGL2_OPS3)
+ $(ADDMOD) $(PCLOBJ)hpgl2 -init pginit pgframe pgconfig pgvector
+ $(ADDMOD) $(PCLOBJ)hpgl2 -init pgpoly pglfill pgchar pglabel
+
+#### Color HP-GL/2 commands
+# These correspond to chapter 7 in the PCL 5 Color Technical Reference
+# Manual.
+
+$(PCLOBJ)pgcolor.$(OBJ): $(PCLSRC)pgcolor.c \
+ $(std_h) \
+ $(pcparse_h) \
+ $(pgmand_h) \
+ $(pginit_h) \
+ $(pgmisc_h) \
+ $(pgdraw_h) \
+ $(gsstate_h) \
+ $(pcpalet_h)
+ $(PCLCCC) $(PCLSRC)pgcolor.c $(PCLO_)pgcolor.$(OBJ)
+
+HPGL2C_OPS = $(PCLOBJ)pgcolor.$(OBJ)
+
+$(PCLOBJ)hpgl2c.dev: $(PCL_MAK) $(ECHOGS_XE) $(HPGL2C_OPS) $(PCLOBJ)hpgl2.dev
+ $(SETMOD) $(PCLOBJ)hpgl2c $(HPGL2C_OPS)
+ $(ADDMOD) $(PCLOBJ)hpgl2c -include $(PCLOBJ)hpgl2
+ $(ADDMOD) $(PCLOBJ)hpgl2c -init pgcolor
+
diff --git a/pcl/pcl_top.mak b/pcl/pcl_top.mak
new file mode 100644
index 000000000..bfb3d6aab
--- /dev/null
+++ b/pcl/pcl_top.mak
@@ -0,0 +1,29 @@
+# Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# pcl_top.mak
+# Top-level platform-independent makefile for PCL5* et al
+
+# This file must be preceded by pcl.mak.
+
+default: $(TARGET_XE)$(XE)
+ @echo Done.
+
+clean: config-clean clean-not-config-clean
+
+clean-not-config-clean: pl.clean-not-config-clean pcl.clean-not-config-clean
+ $(RM_) $(TARGET_XE)$(XE)
+
+config-clean: pl.config-clean pcl.config-clean
+ $(RMN_) *.tr $(GD)devs.tr $(GD)ld.tr
+ $(RMN_) $(PCLGEN)pconf.h $(PCLGEN)pconfig.h
+
+#### Implementation stub
+
+$(PCLOBJ)pcimpl.$(OBJ): $(PCLSRC)pcimpl.c \
+ $(AK) \
+ $(memory__h) \
+ $(scommon_h) \
+ $(gxdevice_h) \
+ $(pltop_h)
+ $(PCLCCC) $(PCLSRC)pcimpl.c $(PCLO_)pcimpl.$(OBJ)
diff --git a/pcl/pclookup.c b/pcl/pclookup.c
new file mode 100644
index 000000000..7ac39166c
--- /dev/null
+++ b/pcl/pclookup.c
@@ -0,0 +1,158 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pclookup.c - color lookup table implementation for PCL 5c */
+
+#include "pcpalet.h"
+#include "pclookup.h"
+
+/* GC routines */
+private_st_lookup_tbl_t();
+
+/*
+ * Free lookup table.
+ */
+ static void
+free_lookup_tbl(
+ gs_memory_t * pmem,
+ void * pvlktbl,
+ client_name_t cname
+)
+{
+ pcl_lookup_tbl_t * plktbl = (pcl_lookup_tbl_t *)pvlktbl;
+
+ if (plktbl->ptbl != 0)
+ gs_free_object(pmem, (void *)plktbl->ptbl, cname);
+ gs_free_object(pmem, pvlktbl, cname);
+}
+
+/*
+ * ESC * l <nbytes> W
+ *
+ * Set color lookup table.
+ */
+ static int
+set_lookup_tbl(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint len = uint_arg(pargs);
+ pcl_lookup_tbl_t * plktbl = 0;
+ pcl__lookup_tbl_t * ptbl = 0;
+ int code = 0;
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ /* check for clearing of lookup tables, and for incorrect size */
+ if (len == 0)
+ return pcl_palette_set_lookup_tbl(pcs, NULL);
+ else if (len != sizeof(pcl__lookup_tbl_t))
+ return e_Range;
+
+ rc_alloc_struct_1( plktbl,
+ pcl_lookup_tbl_t,
+ &st_lookup_tbl_t,
+ pcs->memory,
+ return e_Memory,
+ "set color lookup table"
+ );
+ plktbl->rc.free = free_lookup_tbl;
+ plktbl->ptbl = 0;
+
+ /* either take possession of buffer, or allocate a new one */
+ if (pargs->data_on_heap) {
+ ptbl = (pcl__lookup_tbl_t *)arg_data(pargs);
+ arg_data(pargs) = 0;
+ } else {
+ ptbl = (pcl__lookup_tbl_t *)gs_alloc_bytes( pcs->memory,
+ sizeof(pcl__lookup_tbl_t),
+ "set color lookup table"
+ );
+ if (ptbl == 0) {
+ free_lookup_tbl(plktbl->rc.memory, plktbl, "set color lookup table");
+ return e_Memory;
+ }
+ memcpy(ptbl, arg_data(pargs), sizeof(pcl__lookup_tbl_t));
+ }
+ plktbl->ptbl = ptbl;
+
+ /* for the CMY color space, convert to RGB color space */
+ if (pcl_lookup_tbl_get_cspace(plktbl) == pcl_cspace_CMY) {
+ int i;
+
+ for (i = 0; i < 128; i++) {
+ byte b1 = ptbl->data[i];
+ byte b2 = ptbl->data[255 - i];
+
+ ptbl->data[i] = 255 - b2;
+ ptbl->data[255 - i] = 255 - b1;
+ }
+ ptbl->cspace = (byte)pcl_cspace_RGB;
+ }
+
+ /* update the current palette; release our reference to the lookup table */
+ code = pcl_palette_set_lookup_tbl(pcs, plktbl);
+ pcl_lookup_tbl_release(plktbl);
+ return code;
+}
+
+/*
+ * ESC * t # I
+ *
+ * Set gamma correction
+ */
+ static int
+set_gamma_correction(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ float gamma = float_arg(pargs);
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+ if ((gamma < 0.0) || (gamma > (float)((1L << 15) - 1)))
+ return 0;
+ else
+ return pcl_palette_set_gamma(pcs, gamma);
+}
+
+/*
+ * There is no copy or reset code for this module, as both copying and reset
+ * are handled by the PCL palette module (using macros defined in pclookup.h).
+ */
+ static int
+lookup_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'l', 'W',
+ PCL_COMMAND("Color Lookup Tables", set_lookup_tbl, pca_bytes | pca_raster_graphics)
+ },
+ {
+ 't', 'I',
+ PCL_COMMAND( "Gamma Correction",
+ set_gamma_correction,
+ pca_neg_ignore | pca_big_ignore | pca_raster_graphics
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+const pcl_init_t pcl_lookup_tbl_init = { lookup_do_registration, 0, 0 };
diff --git a/pcl/pclookup.h b/pcl/pclookup.h
new file mode 100644
index 000000000..8ba5c2434
--- /dev/null
+++ b/pcl/pclookup.h
@@ -0,0 +1,216 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pclookup.h - color lookup table structure for PCL 5c */
+
+#ifndef pclookup_INCLUDED
+#define pclookup_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "pcommand.h"
+#include "pccid.h"
+
+/*
+ * Though straightforward in principle, the color lookup table feature in
+ * PCL 5c is made complicated due to its development history. Specifically,
+ * while all PCL color lookup tables are involved in color mapping, the
+ * nature of the mapping desired varies with each color space.
+ *
+ * 1. For the device specific color spaces (RGB and CMY), the color lookup
+ * table is a generalization of the gamma correction feature. Thus:
+ *
+ * RGB and CMY color lookup tables override gamma correction,
+ * and vice-versa.
+ *
+ * The index value to an RGB or CMY lookup table is formed from the
+ * post-normalization input intensity. In the 4-bit/pixel case with
+ * the canonical white and black points, the input value 7 would
+ * select the color rendering table entry with index in the range
+ * [119, 136], not the entry with index 7.
+ *
+ * In addition, the RGB and CMY color spaces in PCL are not really
+ * different spaces, but the same space with white and black points
+ * reversed. Hence, the two lookup tables are also the same, but the
+ * latter is modified to work in an additive space:
+ *
+ * tbl_rgb[i] = 255 - tbl_cmy[255 - i]
+ *
+ * Note also that the gamma correction parameter is always interpreted
+ * in an additive space: gamma1 > gamma2 implies all colors rendered
+ * using gamma1 will be lighter (or possibly the same as) the
+ * corresponding color rendered with gamma2.
+ *
+ * 2. The lookup tables for the device independent color spaces are not
+ * generalizations for gamma correction and are intended to be used
+ * with gamma correction, and thus with the device-specific color
+ * space lookup functions.
+ *
+ * The canonical ranges for the device independent color space components
+ * do not fit neatly into the [0, 255] range used by lookup tables, the
+ * image encoding, etc. PCL handles this problem by requiring that device
+ * independent color components be normalized by the application. Exactly
+ * what HP expects in these circumstances is not known, and does not
+ * seem to be implemented correctly on the CLJ 5/5M; this implementation
+ * will always assume that 0 corresponds to the minimum value and 255 to
+ * the maximum (for device independent color space components only; device
+ * dependent color space components are handled differently).
+ *
+ * For the purposes of color lookup tables, this arrangement implies that
+ * for device independent color spaces, the raw input value (rounded
+ * to an integer) is used as an index to the color rendering table,
+ * without applying any normalization.
+ *
+ * 3. PCL allows a given palette to have multiple color lookup tables, as
+ * many as 4. Each color lookup table is associated with a color space,
+ * selected from the five supported color spaces.
+ *
+ * There are more color spaces than color lookup tables that may be
+ * attached to a palette because the two device specific color spaces
+ * use the same color lookup table (which is also used by gamma correction).
+ * Associating a color lookup table with the RGB color space as opposed
+ * to the CMY color space only alters the way its entries are interpreted,
+ * using the equation given in Item (1) above.
+ *
+ * HP's documentation implies that multiple device independent color lookup
+ * tables may be used for the same device independent color space.
+ * Unfortunately, while testing shows that multiple such tables are used,
+ * there is no consistency in their use. Furthermore, it is not entirely
+ * obvious how to use a CIE L*a*b* lookup table with a luminance-chrominance
+ * color space.
+ *
+ * This implementation tries to achieve the most reasonable interpretation
+ * of device independent color spaces that might actually be useful:
+ *
+ * The colorimetric RGB color space uses only the colorimetric
+ * lookup table
+ *
+ * The CIE L*a*b* color space uses only the L*a*b* lookup table
+ *
+ * The luminance-chrominance color space uses both the luminance-
+ * chrominance color lookup table and the colorimetric RGB
+ * color lookup table.
+ *
+ * All of these spaces also use the device-dependent color lookup table.
+ *
+ * 4. A color lookup table applies when a color is USED, not when it is
+ * entered into the palette. This is a critical consideration from the
+ * point of view of an implementation, as it requires that the client-
+ * provided color values must be stored in the palette (possibly normalized
+ * in the case of device-specific color spaces).
+ *
+ * 5. Though gamma correction and color lookup tables for device specific
+ * color spaces overwrite each other, the former is inherited by a new
+ * palette from the current active palette, but the latter is not (all
+ * color lookup tables are cleared by the configure image data command).
+ *
+ * The following text appears in HP's "PCL 5 Color Technical Reference
+ * Manual" (May, 1996 edition (part no. 5961-0940), p. 4-16:
+ *
+ * Gamma correction is referred to in terms of device-dependent
+ * RGB. This command does not destroy the contents of the device-
+ * dependent color lookup tables, but setting a gamma value
+ * supercedes any lookup table input in either Device CMY or
+ * Device RGB
+ *
+ * The significance of the statement "does not destroy" is difficult
+ * to determine, as color lookup tables are not inherited and there is
+ * no way to "turn-off" gamma correction (setting the gamma value to
+ * 0 is equivalent to setting it to 1.0, and results in the unity
+ * map being used). Consequently, in this implementation setting a
+ * gamma correction discards the current device-specific color lookup
+ * table (if one is present).
+ */
+
+/*
+ * Raw color lookup tables. Though color lookup tables exist for each color
+ * space, the one for the two device-dependent color spaces is the same, and
+ * is also the lookup table used for gamma correction. This lookup table is
+ * implemented via transfer functions.
+ *
+ * This structure should only be accessed via the pcl_lookup_t structure.
+ *
+ * Note: this structure is defined by HP.
+ */
+typedef struct pcl__lookup_tbl_s {
+ byte cspace; /* actually pcl_cspace_type_t */
+ byte dummy;
+ byte data[3 * 256];
+} pcl__lookup_tbl_t;
+
+/*
+ * The pcl_lookup_t structure provides a reference-count header for a lookup
+ * table. This is necessary because there is a way that lookup tables can
+ * shared between PCL base color spaces (this could occur in the case of a
+ * luminance-chrominance color space, which might have an instantiation with
+ * two color tables that shares one of these color tables with another
+ * instantiation).
+ */
+typedef struct pcl_lookup_tbl_s {
+ rc_header rc;
+ const pcl__lookup_tbl_t * ptbl;
+} pcl_lookup_tbl_t;
+
+#define private_st_lookup_tbl_t() \
+ gs_private_st_ptrs1( st_lookup_tbl_t, \
+ pcl_lookup_tbl_t, \
+ "pcl color lookup table", \
+ lookup_enum_ptr, \
+ lookup_reloc_ptr, \
+ ptbl \
+ )
+
+/*
+ * Copy, init, and release macros.
+ */
+#define pcl_lookup_tbl_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_lookup_tbl_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_lookup_tbl_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_lookup_tbl_release(plktbl) \
+ rc_decrement(plktbl, "pcl_lookup_tbl_release")
+
+/*
+ * Get the color space type of a lookup table.
+ */
+#define pcl_lookup_tbl_get_cspace(plktbl) \
+ ((pcl_cspace_type_t)((plktbl)->ptbl->cspace))
+
+/*
+ * Macro to retrieve a single-component color table pointer from a
+ * pcl_lookup_hdr_t pointer.
+ *
+ * This macro is provided in preference to a conversion macro because the
+ * transfer function objects require a table.
+ */
+#define pcl_lookup_tbl_get_tbl(plktbl, indx) \
+ ( (plktbl) != 0 ? (plktbl)->ptbl->data + (indx) * 256 : 0 )
+
+/*
+ * External access to the color lookup table/gamma correction code.
+ */
+extern const pcl_init_t pcl_lookup_tbl_init;
+
+#endif /* pclookup_INCLUDED */
diff --git a/pcl/pcmacros.c b/pcl/pcmacros.c
new file mode 100644
index 000000000..be95b444e
--- /dev/null
+++ b/pcl/pcmacros.c
@@ -0,0 +1,267 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcmacros.c */
+/* PCL5 macro commands */
+#include "stdio_.h" /* std.h + NULL */
+#include "pcommand.h"
+#include "pgmand.h"
+#include "pcstate.h"
+#include "pcparse.h"
+
+/* ---------------- Macro execution ---------------- */
+
+/* Execute a macro. We're willing to use C recursion for this because */
+/* the PCL5 specification only allows 2 levels of call. */
+static int
+do_copies(pcl_state_t *psaved, pcl_state_t *pcs,
+ pcl_copy_operation_t copy)
+{ const pcl_init_t **init = pcl_init_table;
+ int code = 0;
+
+ for ( ; *init && code >= 0; ++init )
+ if ( (*init)->do_copy )
+ code = (*(*init)->do_copy)(psaved, pcs, copy);
+ return code;
+}
+int
+pcl_execute_macro(const pcl_macro_t *pmac, pcl_state_t *pcs,
+ pcl_copy_operation_t before, pcl_reset_type_t reset,
+ pcl_copy_operation_t after)
+{
+ pcl_parser_state_t state;
+ hpgl_parser_state_t gstate;
+ pcl_state_t saved;
+ stream_cursor_read r;
+ int code;
+
+ if ( before ) {
+ memcpy(&saved, pcs, sizeof(*pcs));
+ do_copies(&saved, pcs, before);
+ pcs->saved = &saved;
+ }
+ if ( reset )
+ pcl_do_resets(pcs, reset);
+ state.definitions = pcs->pcl_commands;
+ state.hpgl_parser_state=&gstate;
+ pcl_process_init(&state);
+ r.ptr = (const byte *)(pmac + 1) - 1;
+ r.limit =
+ (const byte *)pmac + (gs_object_size(pcs->memory, pmac) - 1);
+ pcs->macro_level++;
+ code = pcl_process(&state, pcs, &r);
+ pcs->macro_level--;
+ if ( after ) {
+ do_copies(&saved, pcs, after);
+ memcpy(pcs, &saved, sizeof(*pcs));
+ }
+ return code;
+}
+
+/* ---------------- Commands ---------------- */
+
+/* Define the macro control operations. */
+enum {
+ macro_end_definition = 1,
+ macro_execute = 2,
+ macro_call = 3,
+ macro_delete_temporary = 7
+};
+
+static int /* ESC & f <mc_enum> X */
+pcl_macro_control(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int i = int_arg(pargs);
+ gs_const_string key;
+ void *value;
+ pl_dict_enum_t denum;
+
+ if ( i == macro_end_definition )
+ { if ( pcs->defining_macro )
+ { /* The parser has included everything through this command */
+ /* in the macro_definition, so we can finish things up. */
+ int code;
+ code = pl_dict_put(&pcs->macros, current_macro_id,
+ current_macro_id_size, pcs->macro_definition);
+ pcs->defining_macro = false;
+ pcs->macro_definition = 0;
+ return code;
+ }
+ }
+ else if ( pcs->defining_macro )
+ return 0; /* don't execute other macro operations */
+ else if ( i == macro_execute || i == macro_call )
+ { /*
+ * TRM 12-9 says that "two levels of nesting are allowed",
+ * which means 3 levels of macros (1 non-nested, 2 nested).
+ */
+ if ( pcs->macro_level > 2 )
+ return 0;
+ }
+ else if ( pcs->macro_level )
+ return e_Range; /* macro operations not allowed inside macro */
+ switch ( i )
+ {
+ case 0:
+ { /* Start defining <macro_id>. */
+ pcl_macro_t *pmac;
+
+ pl_dict_undef_purge_synonyms(&pcs->macros, current_macro_id, current_macro_id_size);
+ pmac = (pcl_macro_t *)
+ gs_alloc_bytes(pcs->memory, sizeof(pcl_macro_t),
+ "begin macro definition");
+ if ( pmac == 0 )
+ return_error(e_Memory);
+ pmac->storage = pcds_temporary;
+ pcs->macro_definition = (byte *)pmac;
+ pcs->defining_macro = true;
+ return 0;
+ }
+ case macro_end_definition: /* 1 */
+ { /* Stop defining macro. Outside a macro, this is an error. */
+ return e_Range;
+ }
+ case macro_execute: /* 2 */
+ { /* Execute <macro_id>. */
+ void *value;
+ if ( !pl_dict_find(&pcs->macros, current_macro_id, current_macro_id_size,
+ &value)
+ )
+ return 0;
+ return pcl_execute_macro((const pcl_macro_t *)value, pcs,
+ pcl_copy_none, pcl_reset_none, pcl_copy_none);
+ }
+ case macro_call: /* 3 */
+ { /* Call <macro_id>, saving and restoring environment. */
+ void *value;
+ if ( !pl_dict_find(&pcs->macros, current_macro_id, current_macro_id_size,
+ &value)
+ )
+ return 0;
+ return pcl_execute_macro((const pcl_macro_t *)value, pcs,
+ pcl_copy_before_call, pcl_reset_none,
+ pcl_copy_after_call);
+ }
+ case 4:
+ { /* Define <macro_id> as automatic overlay. */
+ pcs->overlay_macro_id = pcs->macro_id;
+ pcs->overlay_enabled = true;
+ return 0;
+ }
+ case 5:
+ { /* Cancel automatic overlay. */
+ pcs->overlay_enabled = false;
+ return 0;
+ }
+ case 6:
+ { /* Delete all macros. */
+ pl_dict_release(&pcs->macros);
+ return 0;
+ }
+ case macro_delete_temporary: /* 7 */
+ { /* Delete temporary macros. */
+ pl_dict_enum_stack_begin(&pcs->macros, &denum, false);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ if ( ((pcl_macro_t *)value)->storage == pcds_temporary )
+ pl_dict_undef_purge_synonyms(&pcs->macros, key.data, key.size);
+ return 0;
+ }
+ case 8:
+ { /* Delete <macro_id>. */
+ pl_dict_undef_purge_synonyms(&pcs->macros, current_macro_id, current_macro_id_size);
+ return 0;
+ }
+ case 9:
+ { /* Make <macro_id> temporary. */
+ if ( pl_dict_find(&pcs->macros, current_macro_id, current_macro_id_size, &value) )
+ ((pcl_macro_t *)value)->storage = pcds_temporary;
+ return 0;
+ }
+ case 10:
+ { /* Make <macro_id> permanent. */
+ if ( pl_dict_find(&pcs->macros, current_macro_id, current_macro_id_size, &value) )
+ ((pcl_macro_t *)value)->storage = pcds_permanent;
+ return 0;
+ }
+ default:
+ return e_Range;
+ }
+}
+
+static int /* ESC & f <id> Y */
+pcl_assign_macro_id(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint id = uint_arg(pargs);
+ id_set_value(pcs->macro_id, id);
+ pcs->macro_id_type = numeric_id;
+ return 0;
+}
+
+/* Initialization */
+static int
+pcmacros_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem)
+{ /* Register commands */
+ DEFINE_CLASS('&')
+ {'f', 'X',
+ PCL_COMMAND("Macro Control", pcl_macro_control,
+ pca_neg_error|pca_big_error|pca_in_macro)},
+ {'f', 'Y',
+ PCL_COMMAND("Assign Macro ID", pcl_assign_macro_id,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ return 0;
+}
+static void
+pcmacros_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{ if ( type & (pcl_reset_initial | pcl_reset_printer) )
+ { pcs->overlay_enabled = false;
+ pcs->macro_level = 0;
+ pcs->defining_macro = false;
+ pcs->saved = 0;
+ pcs->macro_definition = 0;
+
+ if ( type & pcl_reset_initial )
+ pl_dict_init(&pcs->macros, pcs->memory, NULL);
+ else
+ { pcl_args_t args;
+ arg_set_uint(&args, macro_delete_temporary);
+ pcl_macro_control(&args, pcs);
+ if ( pcs->alpha_macro_id.id != 0 )
+ gs_free_object(pcs->memory,
+ pcs->alpha_macro_id.id,
+ "pcmacros_do_reset");
+ }
+ }
+
+ if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay | pcl_reset_permanent) )
+ {
+ pcs->alpha_macro_id.size = 0;
+ pcs->macro_id_type = numeric_id;
+ id_set_value(pcs->macro_id, 0);
+ pcs->alpha_macro_id.id = 0;
+ }
+ if ( type & pcl_reset_permanent )
+ pl_dict_release(&pcs->macros);
+}
+static int
+pcmacros_do_copy(pcl_state_t *psaved, const pcl_state_t *pcs,
+ pcl_copy_operation_t operation)
+{ if ( operation & pcl_copy_after )
+ { /* Don't restore the macro dictionary. */
+ psaved->macros = pcs->macros;
+ }
+ return 0;
+}
+const pcl_init_t pcmacros_init = {
+ pcmacros_do_registration, pcmacros_do_reset, pcmacros_do_copy
+};
diff --git a/pcl/pcmisc.c b/pcl/pcmisc.c
new file mode 100644
index 000000000..bb2b2796b
--- /dev/null
+++ b/pcl/pcmisc.c
@@ -0,0 +1,67 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcmisc.c */
+/* PCL5 miscellaneous and debugging commands */
+#include "std.h"
+#include "pcommand.h"
+#include "pcstate.h"
+
+static int /* ESC & s <bool> C */
+pcl_end_of_line_wrap(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint i = uint_arg(pargs);
+
+ if ( i > 1 )
+ return e_Range;
+ pcs->end_of_line_wrap = i == 0;
+ return 0;
+}
+
+static int /* ESC Y */
+pcl_enable_display_functions(pcl_args_t *pargs, pcl_state_t *pcs)
+{ pcs->display_functions = true;
+ return 0;
+}
+
+/* We export this procedure so we can detect the end of display fns mode. */
+int /* ESC Z */
+pcl_disable_display_functions(pcl_args_t *pargs, pcl_state_t *pcs)
+{ pcs->display_functions = false;
+ return 0;
+}
+
+/* Initialization */
+static int
+pcmisc_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem)
+{ /* Register commands */
+ DEFINE_CLASS_COMMAND_ARGS('&', 's', 'C', "End of Line Wrap",
+ pcl_end_of_line_wrap,
+ pca_neg_error|pca_big_error)
+ DEFINE_ESCAPE_ARGS('Y', "Enable Display Functions",
+ pcl_enable_display_functions, pca_in_macro)
+ DEFINE_ESCAPE_ARGS('Z', "Disable Display Functions",
+ pcl_disable_display_functions, pca_in_macro)
+ return 0;
+}
+static void
+pcmisc_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{ if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay) )
+ { pcs->end_of_line_wrap = false;
+ pcs->display_functions = false;
+ }
+}
+const pcl_init_t pcmisc_init = {
+ pcmisc_do_registration, pcmisc_do_reset
+};
diff --git a/pcl/pcmtx3.c b/pcl/pcmtx3.c
new file mode 100644
index 000000000..e857dab20
--- /dev/null
+++ b/pcl/pcmtx3.c
@@ -0,0 +1,264 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcmtx3.c - 3 x 3 matrix utilities for PCL device independent color spaces */
+#include "string_.h"
+#include "math_.h"
+#include "gx.h"
+#include "gstypes.h"
+#include "pcommand.h"
+#include "pcmtx3.h"
+
+
+/*
+ * Calculate the co-factor for the (i, j) component of a 3 x 3 matrix,
+ * including the sign. Note that i and j range from 0 to 2.
+ *
+ * The cofactor of the (i, j) entry in an n-dimensional matrix is the
+ * determinant of the (n - 1) dimensional matrix formed by dropping the
+ * ith row and jth column of the given matrix, multiplied by -1 if
+ * (i + j) is odd.
+ */
+ static floatp
+calc_cofactor(
+ int i,
+ int j,
+ const pcl_mtx3_t * pmtx
+)
+{
+ int i1 = (i == 0 ? 1 : 0);
+ int i2 = (i == 2 ? 1 : 2);
+ int j1 = (j == 0 ? 1 : 0);
+ int j2 = (j == 2 ? 1 : 2);
+ floatp cf = pmtx->a[3 * i1 + j1] * pmtx->a[3 * i2 + j2]
+ - pmtx->a[3 * i1 + j2] * pmtx->a[3 * i2 + j1];
+
+ return (((i + j) & 0x1) != 0) ? -cf : cf;
+}
+
+/*
+ * Form the "cofactor matrix" corresponding to the given matrix.
+ *
+ * For this routine, pinmtx and poutmtx must be different.
+ */
+ static void
+make_cofactor_mtx(
+ const pcl_mtx3_t * pinmtx,
+ pcl_mtx3_t * poutmtx
+)
+{
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ int j;
+
+ for (j = 0; j < 3; j++)
+ poutmtx->a[3 * i + j] = calc_cofactor(i, j, pinmtx);
+ }
+}
+
+
+/*
+ * Add and subtract 3 dimensional vectors. These are not currently needed,
+ * but are included for completeness. No inner-product is provided because
+ * color spaces do not, in general, have geometric or even metric properties
+ * (the CID L*a*b* space is an exception, and then only approximately).
+ *
+ * Any of the three pointer operands may be the same.
+ */
+ void
+pcl_vec3_add(
+ const pcl_vec3_t * pivec1,
+ const pcl_vec3_t * pivec2,
+ pcl_vec3_t * poutvec
+)
+{
+ poutvec->vc.v1 = pivec1->vc.v1 + pivec2->vc.v1;
+ poutvec->vc.v2 = pivec1->vc.v2 + pivec2->vc.v2;
+ poutvec->vc.v3 = pivec1->vc.v3 + pivec2->vc.v3;
+}
+
+ void
+pcl_vec3_sub(
+ const pcl_vec3_t * pivec1,
+ const pcl_vec3_t * pivec2,
+ pcl_vec3_t * poutvec
+)
+{
+ poutvec->vc.v1 = pivec1->vc.v1 - pivec2->vc.v1;
+ poutvec->vc.v2 = pivec1->vc.v2 - pivec2->vc.v2;
+ poutvec->vc.v3 = pivec1->vc.v3 - pivec2->vc.v3;
+}
+
+/*
+ * Apply a matrix to a color component vector. Note that vectors are inter-
+ * preted as row vectors, and matrices are specified in a row-first order.
+ *
+ * The code will properly handle the case pinvec == poutvec.
+ */
+ void
+pcl_vec3_xform(
+ const pcl_vec3_t * pinvec,
+ pcl_vec3_t * poutvec,
+ const pcl_mtx3_t * pmtx
+)
+{
+ pcl_vec3_t tmp_vec;
+ int i;
+
+ for (i = 0; i < 3; i++)
+ tmp_vec.va[i] = pinvec->vc.v1 * pmtx->a[i]
+ + pinvec->vc.v2 * pmtx->a[i + 3]
+ + pinvec->vc.v3 * pmtx->a[i + 6];
+ poutvec->vc = tmp_vec.vc;
+}
+
+/*
+ * Invert a 3 x 3 matrix.
+ *
+ * This will properly handle the case of pinmtx == poutmtx.
+ *
+ * Returns 0 on success, e_Range if the matrix provided is singular.
+ */
+ int
+pcl_mtx3_invert(
+ const pcl_mtx3_t * pinmtx,
+ pcl_mtx3_t * poutmtx
+)
+{
+ pcl_mtx3_t cf_mtx;
+ floatp det;
+ int i;
+
+ make_cofactor_mtx(pinmtx, &cf_mtx);
+ det = pinmtx->c.a11 * cf_mtx.c.a11
+ + pinmtx->c.a12 * cf_mtx.c.a12
+ + pinmtx->c.a13 * cf_mtx.c.a13;
+ if (det == 0.0)
+ return e_Range;
+ for (i = 0; i < 3; i++) {
+ int j;
+
+ for (j = 0; j < 3; j++)
+ poutmtx->a[3 * i + j] = cf_mtx.a[3 * j + i] / det;
+ }
+
+ return 0;
+}
+
+/*
+ * Add, subtract, and multiply two 3 x 3 matrices. These are not currently
+ * needed, but are included for completenese.
+ *
+ * In all cases, any of the three pointers provided may be identical.
+ */
+ void
+pcl_mtx3_add(
+ const pcl_mtx3_t * pinmtx1,
+ const pcl_mtx3_t * pinmtx2,
+ pcl_mtx3_t * poutmtx
+)
+{
+ int i;
+
+ for (i = 0; i < 9; i++)
+ poutmtx->a[i] = pinmtx1->a[i] + pinmtx2->a[i];
+}
+
+ void
+pcl_mtx3_sub(
+ const pcl_mtx3_t * pinmtx1,
+ const pcl_mtx3_t * pinmtx2,
+ pcl_mtx3_t * poutmtx
+)
+{
+ int i;
+
+ for (i = 0; i < 9; i++)
+ poutmtx->a[i] = pinmtx1->a[i] - pinmtx2->a[i];
+}
+
+ void
+pcl_mtx3_mul(
+ const pcl_mtx3_t * pinmtx1,
+ const pcl_mtx3_t * pinmtx2,
+ pcl_mtx3_t * poutmtx
+)
+{
+ pcl_mtx3_t tmp_mtx;
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ int j;
+
+ for (j = 0; j < 3; j++) {
+ int k;
+ floatp val = 0.0;
+
+ for (k = 0; k < 3; k++)
+ val += pinmtx1->a[3 * i + k] * pinmtx2->a[3 * k + j];
+ tmp_mtx.a[3 * i + j] = val;
+ }
+ }
+ *poutmtx = tmp_mtx;
+}
+
+/*
+ * Convert a pcl_mtx3_t structure to and from a gs_matrix3 struct. Identity
+ * transformations are rare in PCL, so no attempt is made to identify them.
+ *
+ * Note that the conversion transposes the matrix in interpretation, though
+ * physically entries remain in the same order. This is due to the use of
+ * a "column vector" interpretation of color components in the graphic library.
+ */
+ void
+pcl_mtx3_convert_to_gs(
+ const pcl_mtx3_t * pinmtx,
+ gs_matrix3 * pgsmtx
+)
+{
+ pgsmtx->cu.u = pinmtx->c.a11;
+ pgsmtx->cu.v = pinmtx->c.a12;
+ pgsmtx->cu.w = pinmtx->c.a13;
+ pgsmtx->cv.u = pinmtx->c.a21;
+ pgsmtx->cv.v = pinmtx->c.a22;
+ pgsmtx->cv.w = pinmtx->c.a23;
+ pgsmtx->cw.u = pinmtx->c.a31;
+ pgsmtx->cw.v = pinmtx->c.a32;
+ pgsmtx->cw.w = pinmtx->c.a33;
+ pgsmtx->is_identity = false;
+}
+
+ void
+pcl_mtx3_convert_from_gs(
+ pcl_mtx3_t * poutmtx,
+ const gs_matrix3 * pgsmtx
+)
+{
+ if (pgsmtx->is_identity) {
+ memset(poutmtx, 0, sizeof(pcl_mtx3_t));
+ poutmtx->c.a11 = 1.0;
+ poutmtx->c.a22 = 1.0;
+ poutmtx->c.a22 = 1.0;
+ } else {
+ poutmtx->c.a11 = pgsmtx->cu.u;
+ poutmtx->c.a12 = pgsmtx->cu.v;
+ poutmtx->c.a13 = pgsmtx->cu.w;
+ poutmtx->c.a21 = pgsmtx->cv.u;
+ poutmtx->c.a22 = pgsmtx->cv.v;
+ poutmtx->c.a23 = pgsmtx->cw.v;
+ poutmtx->c.a31 = pgsmtx->cw.u;
+ poutmtx->c.a32 = pgsmtx->cw.v;
+ poutmtx->c.a33 = pgsmtx->cw.w;
+ }
+}
diff --git a/pcl/pcmtx3.h b/pcl/pcmtx3.h
new file mode 100644
index 000000000..264b6148a
--- /dev/null
+++ b/pcl/pcmtx3.h
@@ -0,0 +1,158 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcmtx3.h - 3 x 3 matrix utilities for PCL device independent color spaces */
+
+#ifndef pcmtx3_INCLUDED
+#define pcmtx3_INCLUDED
+
+#include "math_.h"
+#include "gx.h"
+#include "gsmatrix.h"
+#include "gscspace.h"
+#include "gscolor2.h"
+#include "gscie.h"
+
+
+/*
+ * To support device independent color spaces, PCL performs a number of
+ * calculations with 3 x 3 matrices. The CIE color space code in the graphic
+ * library provides a format for 3 x 3 matrices, but the format is a bit
+ * unusual and no corresponding utilities are provided. Hence, a separate
+ * (though logically identical) format is provided here.
+ *
+ * Essentially all of the literature on color spaces deals with column
+ * vectors, EXCEPT that specific to PostScript. The latter deals with row
+ * vectors to remain consistent with the use of matrices for geometric
+ * transformations. The graphics library code, being based on PostScript,
+ * uses the latter arrangement of components. The CIE code in the library is
+ * documented for column vectors, but specifies matrices in the less usual
+ * column-first order. The current code takes the logically equivalent and
+ * no less intuitive approach of using row vectors, and specifying
+ * matrices in the more normal row-first order.
+ *
+ * There is actually some reason for these alternate approaches. The CIE code
+ * is primarily concerned with transformation of color vectors, and performs
+ * relatively few other matrix operations. The current code infrequently
+ * transforms color vectors, but does perform other matrix operations.
+ * Each code module uses the format that is more intuitive for its more
+ * common operation.
+ */
+typedef union {
+ struct {
+ floatp v1, v2, v3;
+ } vc;
+ floatp va[3];
+} pcl_vec3_t;
+
+typedef union {
+ struct {
+ floatp a11, a12, a13,
+ a21, a22, a23,
+ a31, a32, a33;
+ } c;
+ floatp a[9];
+} pcl_mtx3_t;
+
+/*
+ * Vectors in PCL and the graphic library are physically the same structure,
+ * but the former are thought of as row vectors and the latter as column
+ * vectors, so two different C-language structures are used. The following
+ * macros are used for conversion.
+ */
+#define pcl_vec3_to_gs_vector3(gsv3, pcv3) \
+ ((gsv3).u = (pcv3).vc.v1, (gsv3).v = (pcv3).vc.v2, (gsv3).w = (pcv3).vc.v3)
+
+#define pcl_vec3_from_gs_vector3(pcv3, gsv3) \
+ ((pcv3).vc.v1 = (gsv3).u, (pcv3).vc.v2 = (gsv3).v, (pcv3).vc.v3 = (gsv3).w)
+
+/*
+ * Add and subtract 3 dimensional vectors. These are not currently needed,
+ * but are included for completeness.
+ *
+ * Any of the three pointer operands may be the same.
+ */
+void pcl_vec3_add(
+ const pcl_vec3_t * pivec1,
+ const pcl_vec3_t * pivec2,
+ pcl_vec3_t * poutvec
+);
+
+void pcl_vec3_sub(
+ const pcl_vec3_t * pivec1,
+ const pcl_vec3_t * pivec2,
+ pcl_vec3_t * poutvec
+);
+
+/*
+ * Apply a matrix to a 3-dimensional row vector.
+ *
+ * The code will properly handle the case pinvec == poutvec.
+ */
+void pcl_vec3_xform(
+ const pcl_vec3_t * pinvec,
+ pcl_vec3_t * poutvec,
+ const pcl_mtx3_t * pmtx
+);
+
+/*
+ * Invert a 3 x 3 matrix.
+ *
+ * This will properly handle the case of pinmtx == poutmtx.
+ *
+ * Returns 0 on success, e_Range if the matrix provided is singular.
+ */
+int pcl_mtx3_invert(
+ const pcl_mtx3_t * pinmtx,
+ pcl_mtx3_t * poutmtx
+);
+
+/*
+ * Add, subtract, and multiply two 3 x 3 matrices. These are not currently
+ * needed, but are included for completenese.
+ *
+ * In all cases, any of the three pointers provided may be identical.
+ */
+void pcl_mtx3_add(
+ const pcl_mtx3_t * pinmtx1,
+ const pcl_mtx3_t * pinmtx2,
+ pcl_mtx3_t * poutmtx
+);
+
+void pcl_mtx3_sub(
+ const pcl_mtx3_t * pinmtx1,
+ const pcl_mtx3_t * pinmtx2,
+ pcl_mtx3_t * poutmtx
+);
+
+void pcl_mtx3_mul(
+ const pcl_mtx3_t * pinmtx1,
+ const pcl_mtx3_t * pinmtx2,
+ pcl_mtx3_t * poutmtx
+);
+
+/*
+ * Convert a pcl_mtx3_t structure to and from a gs_matrix3 struct. Identity
+ * transformations are rare in PCL, so no attempt is made to identify them.
+ */
+void pcl_mtx3_convert_to_gs(
+ const pcl_mtx3_t * pinmtx,
+ gs_matrix3 * pgsmtx
+);
+
+void pcl_mtx3_convert_from_gs(
+ pcl_mtx3_t * poutmtx,
+ const gs_matrix3 * pgsmtx
+);
+
+#endif /* pcmtx3_INCLUDED */
diff --git a/pcl/pcommand.c b/pcl/pcommand.c
new file mode 100644
index 000000000..5f2f3de74
--- /dev/null
+++ b/pcl/pcommand.c
@@ -0,0 +1,254 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcommand.c - Utilities for PCL 5 commands */
+
+#include "std.h"
+#include "memory_.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsmatrix.h"
+#include "gxstate.h"
+#include "gsdevice.h"
+#include "pcindxed.h"
+#include "pcommand.h"
+#include "pcparse.h"
+#include "pcstate.h"
+#include "pcparam.h"
+#include "pcident.h"
+#include "pgmand.h" /* temporary */
+/*
+ * Get the command argument as an int, uint, or float.
+ */
+ int
+int_value(
+ const pcl_value_t * pv
+)
+{
+ return (int)(value_is_neg(pv) ? -(int)pv->i : pv->i);
+}
+
+ uint
+uint_value(
+ const pcl_value_t * pv
+)
+{
+ return pv->i;
+}
+
+ float
+float_value(
+ const pcl_value_t * pv
+)
+{
+ return ( value_is_float(pv) ?
+ (float)(value_is_neg(pv) ? -(int)pv->i - pv->fraction
+ : pv->i + pv->fraction)
+ : (float)int_value(pv) );
+}
+
+
+/*
+ * "put" parameters to the device.
+ */
+ static int
+end_param1(
+ gs_c_param_list * alist,
+ pcl_state_t * pcs
+)
+{
+ int code;
+ gs_c_param_list_read(alist);
+ code = gs_state_putdeviceparams(pcs->pgs, (gs_param_list *)alist);
+ gs_c_param_list_release(alist);
+ return code;
+}
+
+/*
+ * Set a Boolean parameter.
+ */
+ int
+put_param1_bool(
+ pcl_state_t * pcs,
+ gs_param_name pkey,
+ bool value
+)
+{
+ gs_c_param_list list;
+
+ gs_c_param_list_write(&list, pcs->memory);
+ /*code =*/ param_write_bool((gs_param_list *)&list, pkey, &value);
+ return end_param1(&list, pcs);
+}
+
+/*
+ * Set a float parameter.
+ */
+ int
+put_param1_float(
+ pcl_state_t * pcs,
+ gs_param_name pkey,
+ floatp value
+)
+{
+ gs_c_param_list list;
+ float fval = value;
+
+ gs_c_param_list_write(&list, pcs->memory);
+ /*code =*/ param_write_float((gs_param_list *)&list, pkey, &fval);
+ return end_param1(&list, pcs);
+}
+
+/*
+ * Set an integer parameter.
+ */
+ int
+put_param1_int(
+ pcl_state_t * pcs,
+ gs_param_name pkey,
+ int value
+)
+{
+ gs_c_param_list list;
+
+ gs_c_param_list_write(&list, pcs->memory);
+ /*code =*/ param_write_int((gs_param_list *)&list, pkey, &value);
+ return end_param1(&list, pcs);
+}
+
+/*
+ * Set a parameter consisting of an array of two floats. This is used to pass
+ * the paper size parameter to the device.
+ */
+ int
+put_param1_float_array(
+ pcl_state_t * pcs,
+ gs_param_name pkey,
+ float pf[2]
+)
+{
+ gs_c_param_list list;
+ gs_param_float_array pf_array;
+
+ pf_array.data = pf;
+ pf_array.size = 2;
+ pf_array.persistent = false;
+
+ gs_c_param_list_write(&list, pcs->memory);
+ /* code = */param_write_float_array((gs_param_list *)&list, pkey, &pf_array);
+ return end_param1(&list, pcs);
+}
+
+int
+put_param1_string(pcl_state_t *pcs, gs_param_name pkey, const char *str)
+{
+ gs_c_param_list list;
+ gs_param_string paramstr;
+ gs_c_param_list_write(&list, pcs->memory);
+ param_string_from_string(paramstr, str);
+ /* code = */param_write_string((gs_param_list *)&list, pkey, &paramstr);
+ return end_param1(&list, pcs);
+}
+
+/* initilialize the parser states */
+ int
+pcl_do_registrations(
+ pcl_state_t *pcs,
+ pcl_parser_state_t *pst
+)
+{
+ const pcl_init_t ** init;
+ int code;
+ /* initialize gl/2 command counter */
+ hpgl_init_command_index(&pst->hpgl_parser_state, pcs->memory);
+ pcs->parse_data = pst->hpgl_parser_state;
+ /* initialize pcl's command counter */
+ code = pcl_init_command_index(pst, pcs);
+ if ( code < 0 )
+ return code;
+ for (init = pcl_init_table; *init; ++init) {
+ if ( (*init)->do_registration ) {
+ code = (*(*init)->do_registration)(pst, pcs->memory);
+ if (code < 0) {
+ lprintf1("Error %d during initialization!\n", code);
+ return code;
+ }
+ }
+ }
+ return 0;
+}
+/*
+ * Run the reset code of all the modules.
+ */
+ int
+pcl_do_resets(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ const pcl_init_t ** init = pcl_init_table;
+ int code = 0;
+
+ for ( ; *init && code >= 0; ++init) {
+ if ((*init)->do_reset)
+ (*(*init)->do_reset)(pcs, type);
+ }
+ return code;
+}
+
+/*
+ * "Cold start" initialization of the graphic state. This is provided as a
+ * special routine to avoid (as much as possible) order depedencies in the
+ * various reset routines used by individual modules. Some of the values
+ * selected may be subsequently overridden by the reset routines; this code
+ * just attempts to set them to reasonable values.
+ */
+ void
+pcl_init_state(
+ pcl_state_t * pcs,
+ gs_memory_t * pmem
+)
+{
+ /* some elementary fields */
+ pcs->memory = pmem;
+ pcs->num_copies = 1;
+ pcs->output_bin = 1;
+ pcs->perforation_skip = 1;
+
+ pcs->font_id_type = numeric_id;
+ pcs->macro_id_type = numeric_id;
+
+ pcs->rotate_patterns = true;
+ pcs->source_transparent = true;
+ pcs->pattern_transparent = true;
+
+ pcs->logical_op = 252;
+
+ pcs->monochrome_mode = 0;
+ pcs->render_mode = 3;
+
+ pcs->next_id = 8UL;
+ pcl_init_gstate_stk(pcs);
+ pcs->configure_appletalk = 0;
+ pcs->uom_cp = 7200L / 300L;
+ pcs->palette_stack = 0;
+ pcs->pcl_default_crd = 0;
+ pcs->pdflt_palette = 0;
+ pcs->pdflt_frgrnd = 0;
+ pcs->pdflt_ht = 0;
+ pcs->page_marked = false;
+ pcl_cs_base_init(pcs);
+ pcl_cs_indexed_init(pcs);
+
+ pcs->halftone_set = false;
+}
diff --git a/pcl/pcommand.h b/pcl/pcommand.h
new file mode 100644
index 000000000..fe2d3e7e3
--- /dev/null
+++ b/pcl/pcommand.h
@@ -0,0 +1,285 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcommand.h */
+/* Definitions for PCL5 commands */
+
+#ifndef pcommand_INCLUDED
+# define pcommand_INCLUDED
+
+#include "memory_.h"
+#include "gx.h"
+#include "gserrors.h"
+
+/* Define a PCL value (PCL command parameter). */
+/* The 16+16 representation is required to match the PCL5 documentation. */
+#if arch_sizeof_int == 4
+typedef int int32;
+typedef uint uint32;
+#else
+# if arch_sizeof_long == 4
+typedef long int32;
+typedef ulong uint32;
+# endif
+#endif
+
+typedef enum {
+ pcv_none = 0,
+ /* The following masks merge together: */
+ pcv_int = 1,
+ pcv_float = 2,
+ pcv_neg = 4,
+ pcv_pos = 8
+} pcl_value_type_t;
+#define value_is_present(pv)\
+ ((pv)->type != pcv_none)
+#define value_is_float(pv)\
+ ((pv)->type & pcv_float)
+#define value_is_neg(pv)\
+ ((pv)->type & pcv_neg)
+#define value_is_signed(pv)\
+ ((pv)->type & (pcv_neg | pcv_pos))
+typedef struct pcl_value_s {
+ pcl_value_type_t type;
+ uint i; /* integer part */
+ float fraction;
+} pcl_value_t;
+#define value_set_uint(pv, ui)\
+ ((pv)->type = pcv_int, (pv)->i = (ui))
+#define value_set_float(pv, in, fr)\
+ ((pv)->type = pcv_float, (pv)->i = (in), (pv)->fraction = (fr))
+#define _vshift 16
+typedef int32 pcl_fixed; /* sign + 15 int + 16 fraction */
+typedef uint32 pcl_ufixed; /* 16 int + 16 fraction */
+/* Get a command argument as an int, uint, or float. */
+int int_value(const pcl_value_t *);
+uint uint_value(const pcl_value_t *);
+float float_value(const pcl_value_t *);
+
+/* Convert a 32-bit IEEE float to the local representation. */
+float word2float(uint32 word);
+
+/* Define the argument passed to PCL commands. */
+typedef struct pcl_args_s {
+ pcl_value_t value; /* PCL5 command argument */
+ byte *data; /* data following the command */
+ bool data_on_heap; /* if true, data is allocated on heap */
+ char command; /* (last) command character */
+} pcl_args_t;
+#define int_arg(pargs) int_value(&(pargs)->value)
+#define uint_arg(pargs) uint_value(&(pargs)->value)
+#define float_arg(pargs) float_value(&(pargs)->value)
+#define arg_data(pargs) ((pargs)->data)
+#define arg_data_size(pargs) uint_arg(pargs) /* data size */
+#define arg_is_present(pargs) value_is_present(&(pargs)->value)
+#define arg_is_signed(pargs) value_is_signed(&(pargs)->value)
+#define arg_set_uint(pargs, ui) value_set_uint(&(pargs)->value, ui)
+#define arg_set_float(pargs, in, fr) value_set_float(&(pargs)->value, in, fr)
+/* Define an opaque type for the PCL state. */
+#ifndef pcl_state_DEFINED
+# define pcl_state_DEFINED
+typedef struct pcl_state_s pcl_state_t;
+#endif
+
+#ifndef pcl_parser_state_DEFINED
+# define pcl_parser_state_DEFINED
+typedef struct pcl_parser_state_s pcl_parser_state_t;
+#endif
+
+#ifndef hpgl_parser_state_DEFINED
+# define hpgl_parser_state_DEFINED
+typedef struct hpgl_args_s hpgl_parser_state_t;
+#endif
+
+/* Define a command processing procedure. */
+#define pcl_command_proc(proc)\
+ int proc(pcl_args_t *, pcl_state_t *)
+typedef pcl_command_proc((*pcl_command_proc_t));
+
+/* Define a few exported processing procedures. */
+pcl_command_proc(pcl_disable_display_functions);
+uint pcl_status_read(byte *data, uint max_data, pcl_state_t *pcs);
+/* Process a string of plain (printable) text. */
+int pcl_text(const byte *str, uint size, pcl_state_t *pcs, bool literal);
+/* Process a single text character. This is almost never called. */
+pcl_command_proc(pcl_plain_char);
+
+/* Define error returns. */
+#define e_Range (0) /* ignore range errors */
+#define e_Syntax (-18) /* gs_error_syntaxerror */
+#define e_Memory gs_error_VMerror
+#define e_Unimplemented (105) /* ignore unimplemented commands */
+#define e_ExitLanguage (-102) /* e_InterpreterExit */
+
+/* Define a command definition. */
+typedef struct {
+ pcl_command_proc_t proc;
+ byte/*pcl_command_action_t*/ actions;
+#ifdef DEBUG
+ const char *cname;
+# define PCL_COMMAND(cname, proc, actions) { proc, actions, cname }
+#else
+# define PCL_COMMAND(cname, proc, actions) { proc, actions }
+#endif
+} pcl_command_definition_t;
+/* Define actions associated with a command. */
+typedef enum {
+ /* Negative arguments may be clamped to 0, give an error, cause the */
+ /* command to be ignored, or be passed to the command. */
+ pca_neg_action = 3,
+ pca_neg_clamp = 0,
+ pca_neg_error = 1,
+ pca_neg_ignore = 2,
+ pca_neg_ok = 3,
+ /* Arguments in the range 32K to 64K-1 may be clamped, give an error, */
+ /* cause the command to be ignored, or be passed to the command. */
+ pca_big_action = 0xc,
+ pca_big_clamp = 0,
+ pca_big_error = 4,
+ pca_big_ignore = 8,
+ pca_big_ok = 0xc,
+ /* Indicate whether the command is followed by data bytes. */
+ pca_byte_data = 0x10,
+ pca_bytes = pca_neg_error | pca_big_ok | pca_byte_data,
+ /* Indicate whether the command is allowed in raster graphics mode. */
+ pca_raster_graphics = 0x20,
+ /* Indicate whether the command should be called while defining a macro. */
+ pca_in_macro = 0x40,
+ /* Indicate whether the command is allowed in rtl mode */
+ pca_in_rtl = 0x80
+} pcl_command_action_t;
+
+/* Define a table of command definitions. */
+typedef struct {
+ char group;
+ char command;
+ pcl_command_definition_t defn;
+} pcl_grouped_command_definition_t;
+
+/* Register (a) command definition(s). */
+void pcl_define_control_command(int/*char*/,
+ const pcl_command_definition_t *, pcl_parser_state_t *);
+#define DEFINE_CONTROL(chr, cname, proc)\
+{ static const pcl_command_definition_t defn_ = PCL_COMMAND(cname, proc, 0);\
+ pcl_define_control_command(chr, &defn_, pcl_parser_state);\
+}
+void pcl_define_escape_command(int/*char*/,
+ const pcl_command_definition_t *, pcl_parser_state_t *);
+#define DEFINE_ESCAPE_ARGS(chr, cname, proc, acts)\
+{ static const pcl_command_definition_t defn_ = PCL_COMMAND(cname, proc, acts);\
+ pcl_define_escape_command(chr, &defn_, pcl_parser_state);\
+}
+#define DEFINE_ESCAPE(chr, cname, proc)\
+ DEFINE_ESCAPE_ARGS(chr, cname, proc, 0)
+void pcl_define_class_command(int/*char*/, int/*char*/, int/*char*/,
+ const pcl_command_definition_t *, pcl_parser_state_t *);
+#define DEFINE_CLASS_COMMAND_ARGS(cls, group, chr, cname, proc, acts)\
+{ static const pcl_command_definition_t defn_ = PCL_COMMAND(cname, proc, acts);\
+ pcl_define_class_command(cls, group, chr, &defn_, pcl_parser_state);\
+}
+#define DEFINE_CLASS_COMMAND(cls, group, chr, cname, proc)\
+ DEFINE_CLASS_COMMAND_ARGS(cls, group, chr, cname, proc, 0)
+void pcl_define_class_commands(int/*char*/,
+ const pcl_grouped_command_definition_t *,
+ pcl_parser_state_t *);
+#define DEFINE_CLASS(cls)\
+{ const byte class_ = cls;\
+ static const pcl_grouped_command_definition_t defs_[] = {
+#define END_CLASS\
+ {0, 0}\
+ };\
+ pcl_define_class_commands(class_, defs_, pcl_parser_state);\
+}
+
+/*
+ * Define the different kinds of reset that may occur during execution.
+ * Some of them are only of interest to HPGL. We define them as bit masks
+ * rather than as ordinals so that if it turns out to be useful, we can
+ * defer HPGL resets until we enter HPGL mode.
+ */
+typedef enum {
+ pcl_reset_none = 0,
+ pcl_reset_initial = 1,
+ pcl_reset_cold = 2,
+ pcl_reset_printer = 4,
+ pcl_reset_overlay = 8,
+ pcl_reset_page_params = 0x10,
+ pcl_reset_picture_frame = 0x20,
+ pcl_reset_anchor_point = 0x40,
+ pcl_reset_plot_size = 0x80,
+ /* define a special reset to be used to free permanent and internal
+ objects: fonts, symbol sets and macros */
+ pcl_reset_permanent = 0x100
+} pcl_reset_type_t;
+/*
+ * Define the different kinds of state copying operation that are required
+ * for macro call and overlay.
+ */
+typedef enum {
+ pcl_copy_none = 0,
+ pcl_copy_before_call = 1,
+ pcl_copy_after_call = 2,
+ pcl_copy_before_overlay = 4,
+ pcl_copy_after_overlay = 8,
+ pcl_copy_after = pcl_copy_after_call | pcl_copy_after_overlay
+} pcl_copy_operation_t;
+/* Define the structure for per-module implementation procedures. */
+typedef struct pcl_init_s {
+ /* Register commands */
+ int (*do_registration)(pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem);
+ /* Initialize state at startup, printer reset, and other times. */
+ void (*do_reset)(pcl_state_t *pcs, pcl_reset_type_t type);
+ /* Partially copy the state for macro call, overlay, and exit. */
+ int (*do_copy)(pcl_state_t *psaved, const pcl_state_t *pcs,
+ pcl_copy_operation_t operation);
+} pcl_init_t;
+/* Define the table of pointers to init structures (in pcjob.c). */
+extern const pcl_init_t *pcl_init_table[];
+
+/* run the init code */
+int pcl_do_registrations(pcl_state_t *pcs, pcl_parser_state_t *pst);
+
+/* Run the reset code of all the modules. */
+int pcl_do_resets(pcl_state_t *pcs, pcl_reset_type_t type);
+
+/* Define stored entity storage status. */
+/* Note that this is a mask, not an ordinal. */
+typedef enum {
+ pcds_temporary = 1,
+ pcds_permanent = 2,
+ pcds_downloaded = pcds_temporary | pcds_permanent,
+ pcds_internal = 4
+#define pcds_cartridge_shift 3
+#define pcds_cartridge_max 8
+#define pcds_all_cartridges\
+ ( ((1 << pcds_cartridge_max) - 1) << pcds_cartridge_shift )
+#define pcds_simm_shift (pcds_cartridge_shift + pcds_cartridge_max)
+#define pcds_simm_max 8
+#define pcds_all_simms\
+ ( ((1 << pcds_simm_max) - 1) << pcds_simm_shift )
+} pcl_data_storage_t;
+
+/* Define the control characters. */
+#define BS 0x8
+#define HT 0x9
+#define LF 0xa
+#define VERT_TAB 0xb
+#define FF 0xc
+#define CR 0xd
+#define SO 0xe
+#define SI 0xf
+#define ESC 0x1b
+#define SP 0x20
+
+#endif /* pcommand_INCLUDED */
diff --git a/pcl/pcpage.c b/pcl/pcpage.c
new file mode 100644
index 000000000..44cf0afdc
--- /dev/null
+++ b/pcl/pcpage.c
@@ -0,0 +1,1152 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpage.c - PCL5 page and transformation control commands */
+
+#include "math_.h"
+#include "std.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcdraw.h"
+#include "pcparam.h"
+#include "pcparse.h" /* for pcl_execute_macro */
+#include "pcfont.h" /* for underline interface */
+#include "pcpatxfm.h"
+#include "pcursor.h"
+#include "pcpage.h"
+#include "pgmand.h"
+#include "pginit.h"
+#include "plmain.h" /* for finish page */
+#include "gsmatrix.h" /* for gsdevice.h */
+#include "gsnogc.h"
+#include "gscoord.h"
+#include "gsdevice.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gxdevice.h"
+#include "pjtop.h"
+
+/*
+ * The PCL printable region. HP always sets the boundary of this region to be
+ * 1/6" in from the edge of the paper, irrespecitve of the paper size or the
+ * device. Since this dimension affects some default values related to rasters,
+ * it is important that it be assigned this value.
+ */
+#define PRINTABLE_MARGIN_CP inch2coord(1.0 / 6.0)
+
+#define round(x) (((x) < 0.0) ? (ceil ((x) - 0.5)) : (floor ((x) + 0.5)))
+
+
+/* Procedures */
+
+/*
+ * Preserve the current point and text margin set by transfroming them into
+ * logical page space.
+ */
+ static void
+preserve_cap_and_margins(
+ const pcl_state_t * pcs,
+ gs_point * pcur_pt,
+ gs_rect * ptext_rect
+)
+{
+ pcur_pt->x = (double)pcs->cap.x;
+ pcur_pt->y = (double)pcs->cap.y;
+ gs_point_transform( pcur_pt->x,
+ pcur_pt->y,
+ &(pcs->xfm_state.pd2lp_mtx),
+ pcur_pt
+ );
+ ptext_rect->p.x = (double)pcs->margins.left;
+ ptext_rect->p.y = (double)pcs->margins.top;
+ ptext_rect->q.x = (double)pcs->margins.right;
+ ptext_rect->q.y = (double)(pcs->margins.top + pcs->margins.length);
+ pcl_transform_rect(pcs->memory, ptext_rect, ptext_rect, &(pcs->xfm_state.pd2lp_mtx));
+}
+
+/*
+ * Convert the current point and text margin set back into "pseudo print
+ * direction" space.
+ */
+ static void
+restore_cap_and_margins(
+ pcl_state_t * pcs,
+ const gs_point * pcur_pt,
+ const gs_rect * ptext_rect
+)
+{
+ gs_matrix lp2pd;
+ gs_point tmp_pt;
+ gs_rect tmp_rect;
+
+ pcl_invert_mtx(&(pcs->xfm_state.pd2lp_mtx), &lp2pd);
+ gs_point_transform(pcur_pt->x, pcur_pt->y, &lp2pd, &tmp_pt);
+ pcs->cap.x = (coord)tmp_pt.x;
+ pcs->cap.y = (coord)tmp_pt.y;
+ pcl_transform_rect(pcs->memory, ptext_rect, &tmp_rect, &lp2pd);
+ pcs->margins.left = (coord)tmp_rect.p.x;
+ pcs->margins.top = (coord)tmp_rect.p.y;
+ pcs->margins.right = (coord)tmp_rect.q.x;
+ pcs->margins.length = (coord)tmp_rect.q.y - pcs->margins.top;
+}
+
+/*
+ * Update the transformations stored in the PCL state. This will also update
+ * the device clipping region information in device and logical page space.
+ * The text region margins are preserved.
+ *
+ * This routine should be called for:
+ *
+ * changes in the paper size
+ * transition from page front to page back for duplexing
+ * (this facility is not currently implemented)
+ * change of left or top offset registration
+ * change of logical page orientation
+ * change of print direction
+ *
+ * The paper size, left/top offsets, logical page orientation, and print
+ * direction should be set before this procedure is called.
+ */
+ static void
+update_xfm_state(
+ pcl_state_t * pcs,
+ bool reset_initial
+)
+{
+ pcl_xfm_state_t * pxfmst = &(pcs->xfm_state);
+ const pcl_paper_size_t * psize = pxfmst->paper_size;
+ coord offset;
+ gs_matrix pg2dev, pg2lp;
+ gs_rect print_rect, dev_rect, text_rect;
+ gs_point cur_pt;
+ floatp loff = pxfmst->left_offset_cp;
+ floatp toff = pxfmst->top_offset_cp;
+
+ /* preserve the current point and text rectangle in logical page space */
+ if ( !reset_initial )
+ preserve_cap_and_margins(pcs, &cur_pt, &text_rect);
+
+ /* get the page to device transformation */
+ gs_defaultmatrix(pcs->pgs, &pg2dev);
+
+ /*
+ * Get the logical to page space transformation, and the dimensions of the
+ * logical page.
+ *
+ * NOT YET IMPLEMENT - if on back of a duplex page, change size of offsets
+ *
+ * if (duplex_back(pcs)) {
+ * loff = -loff;
+ * toff = -toff;
+ * }
+ */
+ pcl_make_rotation( pxfmst->lp_orient,
+ (floatp)(psize->width),
+ (floatp)(psize->height),
+ &(pxfmst->lp2pg_mtx)
+ );
+ pxfmst->lp2pg_mtx.tx += loff;
+ pxfmst->lp2pg_mtx.ty += toff;
+ if ( pcs->personality == rtl )
+ offset = 0;
+ else
+ offset = ( (pxfmst->lp_orient & 0x1) != 0 ? psize->offset_landscape
+ : psize->offset_portrait );
+
+ /* we need an extra 1/10 inch on each side to support 80
+ characters vs. 78 at 10 cpi. Only apply to A4. */
+ if ( ( pcs->wide_a4 ) &&
+ (psize->width == 59520) &&
+ (psize->height == 84168) )
+ offset -= inch2coord(1.0/10.0);
+
+ gs_matrix_translate( &(pxfmst->lp2pg_mtx),
+ (floatp)offset,
+ 0.0,
+ &(pxfmst->lp2pg_mtx)
+ );
+ if ((pxfmst->lp_orient & 0x1) != 0) {
+ pxfmst->lp_size.x = psize->height - 2 * offset;
+ pxfmst->lp_size.y = psize->width;
+ } else {
+ pxfmst->lp_size.x = psize->width - 2 * offset;
+ pxfmst->lp_size.y = psize->height;
+ }
+
+ /* then the logical page to device transformation */
+ gs_matrix_multiply(&(pxfmst->lp2pg_mtx), &pg2dev, &(pxfmst->lp2dev_mtx));
+ pg2dev.ty = round(pg2dev.ty); pg2dev.tx = round(pg2dev.tx);
+ pxfmst->lp2dev_mtx.tx = round(pxfmst->lp2dev_mtx.tx);
+ pxfmst->lp2dev_mtx.ty = round(pxfmst->lp2dev_mtx.ty);
+ /* the "pseudo page direction to logical page/device transformations */
+ pcl_make_rotation( pxfmst->print_dir,
+ (floatp)pxfmst->lp_size.x,
+ (floatp)pxfmst->lp_size.y,
+ &(pxfmst->pd2lp_mtx)
+ );
+ gs_matrix_multiply( &(pxfmst->pd2lp_mtx),
+ &(pxfmst->lp2dev_mtx),
+ &(pxfmst->pd2dev_mtx)
+ );
+
+ /* calculate the print direction page size */
+ if ((pxfmst->print_dir) & 0x1) {
+ pxfmst->pd_size.x = pxfmst->lp_size.y;
+ pxfmst->pd_size.y = pxfmst->lp_size.x;
+ } else
+ pxfmst->pd_size = pxfmst->lp_size;
+
+ {
+ gx_device *pdev = gs_currentdevice(pcs->pgs);
+ /* We must not set up a clipping region beyond the hardware margins of
+ the device, but the pcl language definition requires hardware
+ margins to be 1/6". We set all margins to the the maximum of the
+ PCL language defined 1/6" and the actual hardware margin. If 1/6"
+ is not available pcl will not work correctly all of the time. */
+ if ( pcs->personality == rtl ) {
+ print_rect.p.x = inch2coord(pdev->HWMargins[0] / 72.0);
+ print_rect.p.y = inch2coord(pdev->HWMargins[1]) / 72.0;
+ print_rect.q.x = psize->width - inch2coord(pdev->HWMargins[2] / 72.0);
+ print_rect.q.y = psize->height - inch2coord(pdev->HWMargins[3] / 72.0);
+ } else {
+ print_rect.p.x = max(PRINTABLE_MARGIN_CP, inch2coord(pdev->HWMargins[0] / 72.0));
+ print_rect.p.y = max(PRINTABLE_MARGIN_CP, inch2coord(pdev->HWMargins[1]) / 72.0);
+ print_rect.q.x = psize->width - max(PRINTABLE_MARGIN_CP, inch2coord(pdev->HWMargins[2] / 72.0));
+ print_rect.q.y = psize->height - max(PRINTABLE_MARGIN_CP, inch2coord(pdev->HWMargins[3] / 72.0));
+ }
+ pcl_transform_rect(pcs->memory, &print_rect, &dev_rect, &pg2dev);
+ pxfmst->dev_print_rect.p.x = float2fixed(round(dev_rect.p.x));
+ pxfmst->dev_print_rect.p.y = float2fixed(round(dev_rect.p.y));
+ pxfmst->dev_print_rect.q.x = float2fixed(round(dev_rect.q.x));
+ pxfmst->dev_print_rect.q.y = float2fixed(round(dev_rect.q.y));
+ }
+ pcl_invert_mtx(&(pxfmst->lp2pg_mtx), &pg2lp);
+ pcl_transform_rect(pcs->memory, &print_rect, &(pxfmst->lp_print_rect), &pg2lp);
+
+ /* restablish the current point and text region */
+ if ( !reset_initial )
+ restore_cap_and_margins(pcs, &cur_pt, &text_rect);
+
+ /*
+ * No need to worry about pat_orient or pat_ref_pt; these will always
+ * be recalculated just prior to use.
+ */
+}
+
+
+/* default margins, relative to the logical page boundaries */
+#define DFLT_TOP_MARGIN inch2coord(0.5)
+#define DFLT_LEFT_MARGIN inch2coord(0.0)
+#define DFLT_RIGHT_MARGIN inch2coord(0.0)
+#define DFLT_BOTTOM_MARGIN inch2coord(0.5)
+
+#define DFLT_TOP_MARGIN_PASSTHROUGH inch2coord(1.0/6.0)
+#define DFLT_BOTOM_MARGIN_PASSTHROUGH inch2coord(1.0/6.0)
+
+#define TOP_MARGIN(hgt, tmarg) ((hgt) > (tmarg) ? (tmarg) : 0)
+#define PAGE_LENGTH(hgt, bmarg) ((hgt) > (bmarg) ? (hgt) - (bmarg) : (hgt))
+
+/*
+ * Reset the top margin an text length.
+ *
+ * Note that, even though changing the print direction merely relabels (but does
+ * not relocate) the margins, the preint direction does change the location of
+ * the default margins.
+ */
+ static void
+reset_vertical_margins(
+ pcl_state_t * pcs,
+ bool for_passthrough
+)
+{
+ pcl_margins_t * pmar = &(pcs->margins);
+ coord hgt = pcs->xfm_state.pd_size.y;
+ coord tm = (for_passthrough ?
+ DFLT_TOP_MARGIN_PASSTHROUGH : DFLT_TOP_MARGIN);
+ coord bm = (for_passthrough ?
+ DFLT_BOTOM_MARGIN_PASSTHROUGH : DFLT_BOTTOM_MARGIN);
+
+ pmar->top = TOP_MARGIN(hgt, tm);
+ pmar->length = PAGE_LENGTH(hgt - pmar->top, bm);
+}
+
+/*
+ * Reset horizontal margins
+ *
+ * Note that, even though changing the print direction merely relabels (but does
+ * not relocate) the margins, the preint direction does change the location of
+ * the default margins.
+ */
+ static void
+reset_horizontal_margins(
+ pcl_state_t * pcs
+)
+{
+ pcl_margins_t * pmar = &(pcs->margins);
+
+ pmar->left = DFLT_LEFT_MARGIN;
+ pmar->right = pcs->xfm_state.pd_size.x - DFLT_RIGHT_MARGIN;
+}
+
+/*
+ * Reset both the horizontal and vertical margins
+ */
+static void
+reset_margins(
+ pcl_state_t * pcs,
+ bool for_passthrough
+)
+{
+ reset_horizontal_margins(pcs);
+ reset_vertical_margins(pcs, for_passthrough);
+}
+
+/*
+ * Reset all parameters which must be reset whenever the page size changes.
+ *
+ * The third operand indicates if this routine is being called as part of
+ * an initial reset. In that case, done't call HPGL's reset - the reset
+ * will do that later.
+ */
+ void
+new_page_size(
+ pcl_state_t * pcs,
+ const pcl_paper_size_t * psize,
+ bool reset_initial,
+ bool for_passthrough
+)
+{
+ floatp width_pts = psize->width * 0.01;
+ floatp height_pts = psize->height * 0.01;
+ float page_size[2];
+ static float old_page_size[2] = { 0, 0 };
+ gs_state * pgs = pcs->pgs;
+ gs_matrix mat;
+
+ page_size[0] = width_pts;
+ page_size[1] = height_pts;
+
+ /* NB: save off the page size for the case where set device page size
+ * doesn't match the PJL page size and no escE reset occurs, and we are not coming from PXL.
+ * A direct query, reset initial erasepage or a erasepage with notmarked don't do it
+ * would all be preferable...
+ */
+ old_page_size[0] = pcs->xfm_state.paper_size ? pcs->xfm_state.paper_size->width : 0;
+ old_page_size[1] = pcs->xfm_state.paper_size ? pcs->xfm_state.paper_size->height : 0;
+
+ put_param1_float_array(pcs, "PageSize", page_size);
+
+ /*
+ * Reset the default transformation.
+ *
+ * The graphic library provides a coordinate system in points, with the
+ * origin at the lower left corner of the page. The PCL code uses a
+ * coordinate system in centi-points, with the origin at the upper left
+ * corner of the page.
+ */
+ gs_setdefaultmatrix(pgs, NULL);
+ gs_initmatrix(pgs);
+ gs_currentmatrix(pgs, &mat);
+ gs_matrix_translate(&mat, 0.0, height_pts, &mat);
+ gs_matrix_scale(&mat, 0.01, -0.01, &mat);
+ gs_setdefaultmatrix(pgs, &mat);
+
+ pcs->xfm_state.paper_size = psize;
+ pcs->overlay_enabled = false;
+ update_xfm_state(pcs, reset_initial);
+ reset_margins(pcs, for_passthrough);
+
+ /*
+ * If this is an initial reset, make sure underlining is disabled (homing
+ * the cursor may cause an underline to be put out.
+ */
+ if (reset_initial)
+ pcs->underline_enabled = false;
+ else
+ pcl_home_cursor(pcs);
+
+ pcl_xfm_reset_pcl_pat_ref_pt(pcs);
+
+ if (!reset_initial) {
+ hpgl_do_reset(pcs, pcl_reset_page_params);
+ if ( pcs->end_page == pcl_end_page_top ) /* don't erase in snippet mode */
+ gs_erasepage(pcs->pgs);
+ pcs->page_marked = false;
+ }
+ else if ( pcs->end_page == pcl_end_page_top &&
+ !(old_page_size[0] == pcs->xfm_state.paper_size->width &&
+ old_page_size[1] == pcs->xfm_state.paper_size->height)) {
+ /* PJL paper size change without escE case. */
+ gs_erasepage(pcs->pgs);
+ pcs->page_marked = false;
+ }
+}
+
+/*
+ * Define the known paper sizes.
+ *
+ * The values are taken from the H-P manual and are in 1/300" units,
+ * but the structure values are in centipoints (1/7200").
+ */
+#define p_size(t, n, w, h, offp, offl) \
+ { (t), (n), { (w) * 24L, (h) * 24L, (offp) * 24L, (offl) * 24L } }
+
+static struct {
+ uint tag;
+ const char * pname;
+ pcl_paper_size_t psize;
+} paper_sizes[] = {
+ p_size( 1, "executive", 2175, 3150, 75, 60),
+ p_size( 2, "letter", 2550, 3300, 75, 60),
+ p_size( 3, "legal", 2550, 4200, 75, 60),
+ p_size( 6, "ledger", 3300, 5100, 75, 60),
+ p_size( 26, "a4", 2480, 3507, 71, 59),
+ p_size( 27, "a3", 3507, 4960, 71, 59),
+ p_size( 80, "monarch", 1162, 2250, 75, 60),
+ p_size( 81, "com_10", 1237, 2850, 75, 60),
+ p_size( 90, "dl", 1299, 2598, 71, 59),
+ p_size( 91, "c5", 1913, 2704, 71, 59),
+ p_size(100, "b5", 2078, 2952, 71, 59)
+};
+
+/*
+ * Reset all parameters which must be reset whenever the logical page
+ * orientation changes.
+ *
+ * The last operand indicates if this routine is being called as part of
+ * an initial resete.
+ */
+ void
+new_logical_page(
+ pcl_state_t * pcs,
+ int lp_orient,
+ const pcl_paper_size_t * psize,
+ bool reset_initial,
+ bool for_passthrough
+)
+{
+ pcl_xfm_state_t * pxfmst = &(pcs->xfm_state);
+
+ pcs->hmi_cp = HMI_DEFAULT;
+ pcs->vmi_cp = VMI_DEFAULT;
+ pxfmst->lp_orient = lp_orient;
+ pxfmst->print_dir = 0;
+ new_page_size(pcs, psize, reset_initial, for_passthrough);
+}
+
+int
+pcl_new_logical_page_for_passthrough(pcl_state_t *pcs, int orient, int tag)
+{
+ int i;
+ pcl_paper_size_t *psize;
+
+ for (i = 0; i < countof(paper_sizes); i++) {
+ if (tag == paper_sizes[i].tag) {
+ psize = &(paper_sizes[i].psize);
+ break;
+ }
+ }
+ if (psize == 0)
+ return -1;
+ new_logical_page(pcs, orient, psize, false, true);
+ return 0;
+
+}
+
+
+
+/* page marking routines */
+
+/* set page marked for path drawing commands. NB doesn't handle 0 width - lenghth */
+void
+pcl_mark_page_for_path(pcl_state_t *pcs)
+{
+ if ( pcs->page_marked )
+ return;
+ {
+ gs_rect bbox;
+ bbox.p.x = bbox.p.y = bbox.q.x = bbox.q.y = 0;
+ gs_pathbbox(pcs->pgs, &bbox);
+ if ((bbox.p.x < bbox.q.x) && (bbox.p.y < bbox.q.y))
+ pcs->page_marked = true;
+ return;
+ }
+}
+
+void
+pcl_mark_page_for_current_pos(pcl_state_t *pcs)
+{
+ /* nothing to do */
+ if ( pcs->page_marked )
+ return;
+
+ /* convert current point to device space and check if it is inside
+ device rectangle for the page */
+ {
+ gs_fixed_rect page_bbox_fixed = pcs->xfm_state.dev_print_rect;
+ gs_rect page_bbox_float;
+ gs_point current_pt, dev_pt;
+
+ page_bbox_float.p.x = fixed2float(page_bbox_fixed.p.x);
+ page_bbox_float.p.y = fixed2float(page_bbox_fixed.p.y);
+ page_bbox_float.q.x = fixed2float(page_bbox_fixed.q.x);
+ page_bbox_float.q.y = fixed2float(page_bbox_fixed.q.y);
+
+ if ( gs_currentpoint(pcs->pgs, &current_pt) < 0 ) {
+ dprintf("Not expected to fail\n" );
+ return;
+ }
+
+ if ( gs_transform(pcs->pgs, current_pt.x, current_pt.y, &dev_pt) ) {
+ dprintf("Not expected to fail\n" );
+ return;
+ }
+
+ /* half-open lower - not sure this is correct */
+ if ( dev_pt.x >= page_bbox_float.p.x &&
+ dev_pt.y >= page_bbox_float.p.y &&
+ dev_pt.x < page_bbox_float.q.x &&
+ dev_pt.y < page_bbox_float.q.y )
+ pcs->page_marked = true;
+
+ }
+}
+
+/* returns the bounding box coordinates for the current device and a
+ boolean to indicate marked status. 0 - unmarked 1 - marked -1 error */
+ int
+pcl_page_marked(
+ pcl_state_t * pcs
+)
+{
+ return pcs->page_marked;
+}
+
+/*
+ * End a page, either unconditionally or only if there are marks on it.
+ * Return 1 if the page was actually printed and erased.
+ */
+ int
+pcl_end_page(
+ pcl_state_t * pcs,
+ pcl_print_condition_t condition
+)
+{
+ int code = 0;
+
+ pcl_break_underline(pcs); /* (could mark page) */
+
+ /* If we are conditionally printing (normal case) check if the
+ page is marked */
+ if (condition != pcl_print_always) {
+ if ( !pcl_page_marked(pcs) )
+ return 0;
+ }
+
+ /* If there's an overlay macro, execute it now. */
+ if (pcs->overlay_enabled) {
+ void * value;
+
+ if ( pl_dict_find( &pcs->macros,
+ id_key(pcs->overlay_macro_id),
+ 2,
+ &value
+ ) ) {
+ pcs->overlay_enabled = false; /**** IN reset_overlay ****/
+ code = pcl_execute_macro( (const pcl_macro_t *)value,
+ pcs,
+ pcl_copy_before_overlay,
+ pcl_reset_overlay,
+ pcl_copy_after_overlay
+ );
+ pcs->overlay_enabled = true; /**** IN copy_after ****/
+ }
+ }
+ /* output the page */
+ code = (*pcs->end_page)(pcs, pcs->num_copies, true);
+ if ( code < 0 )
+ return code;
+ /* allow the logical orientation command to be used again */
+ pcs->orientation_set = false;
+
+ if ( pcs->end_page == pcl_end_page_top )
+ code = gs_erasepage(pcs->pgs);
+ pcs->page_marked = false;
+ /* force new logical page, allows external resolution changes.
+ * see -dFirstPage -dLastPage
+ * NB would be faster if we didn't do this every page.
+ *
+ * NB setting a new logical page defaults settings
+ * that should carry over from the previous page
+ * this error occurs only on documents that don't do any initilizations per page
+ * hence only the viewer applications will see the speedup and the error
+ */
+ if (!pjl_proc_compare(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "viewer"), "on")) {
+ new_logical_page(pcs, pcs->xfm_state.lp_orient,
+ pcs->xfm_state.paper_size, false, false);
+ }
+
+ /*
+ * Advance of a page may move from a page front to a page back. This may
+ * change the applicable transformations.
+ */
+ update_xfm_state(pcs, 0);
+
+ pcl_continue_underline(pcs);
+ return (code < 0 ? code : 1);
+}
+
+
+/* Commands */
+
+/*
+ * ESC & l <psize_enum> A
+ *
+ * Select paper size
+ */
+ static int
+set_page_size(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ /* Note: not all values are implemented on all printers. */
+ uint tag = uint_arg(pargs);
+ int i;
+ int code = 0;
+ const pcl_paper_size_t * psize = 0;
+
+ /* oddly the command goes to the next page irrespective of
+ arguments */
+ code = pcl_end_page_if_marked(pcs);
+ if ( code < 0 )
+ return code;
+ pcl_home_cursor(pcs);
+
+ for (i = 0; i < countof(paper_sizes); i++) {
+ if (tag == paper_sizes[i].tag) {
+ psize = &(paper_sizes[i].psize);
+ break;
+ }
+ }
+ if ((psize != 0) && ((code = pcl_end_page_if_marked(pcs)) >= 0)) {
+ /* if the orientation flag is not set for this page we select
+ a portrait page using the set paper size. Otherwise select
+ the paper using the current orientation. */
+ if ( pcs->orientation_set == false )
+ new_logical_page(pcs, 0, psize, false, false);
+ else
+ new_page_size(pcs, psize, false, false);
+ }
+ return code;
+}
+
+/*
+ * ESC & l <feed_enum> H
+ *
+ * Set paper source
+ */
+ static int
+set_paper_source(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ /* oddly the command goes to the next page irrespective of
+ arguments */
+ int code = pcl_end_page_if_marked(pcs);
+ if ( code < 0 )
+ return code;
+ pcl_home_cursor(pcs);
+
+ /* Note: not all printers support all possible values. */
+ if (i <= 6) {
+ code = 0;
+ if (i > 0)
+ code = put_param1_int(pcs, "%MediaSource", i);
+ return (code < 0 ? code : 0);
+ } else
+ return e_Range;
+}
+
+/*
+ * ESC & l <xoff_dp> U
+ *
+ * Note that this shifts the logical page, but does NOT change its size nor
+ * does it reset any logical-page related parameters.
+ */
+ static int
+set_left_offset_registration(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->xfm_state.left_offset_cp = float_arg(pargs) * 10.0;
+ update_xfm_state(pcs, 0);
+ return 0;
+}
+
+/*
+ * ESC & l <yoff_dp> Z
+ *
+ * Note that this shifts the logical page, but does NOT change its size nor
+ * does it reset any logical-page related parameters.
+ */
+ static int
+set_top_offset_registration(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->xfm_state.top_offset_cp = float_arg(pargs) * 10;
+ update_xfm_state(pcs, 0);
+ return 0;
+}
+
+/*
+ * ESC & l <orient> O
+ *
+ * Set logical page orientation.
+ */
+ static int
+set_logical_page_orientation(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+ int code;
+
+ /* the command is ignored if it is value is out of range */
+ if ( i > 3 )
+ return 0;
+
+ /* this command is ignored in pcl xl snippet mode. NB we need a
+ better flag for snippet mode. */
+ if (pcs->end_page != pcl_end_page_top) {
+ return 0;
+ }
+
+ /* If orientation is same as before ignore the command */
+ if ( i == pcs->xfm_state.lp_orient ) {
+ pcs->orientation_set = true;
+ return 0;
+ }
+
+ /* ok to execute - clear the page, set up the transformations and
+ set the flag disabling the orientation command for this page. */
+ code = pcl_end_page_if_marked(pcs);
+ if ( code >= 0 ) {
+ new_logical_page(pcs, i, pcs->xfm_state.paper_size, false, false);
+ pcs->orientation_set = true;
+ }
+ return code;
+}
+
+/*
+ * ESC & a <angle> P
+ */
+ static int
+set_print_direction(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ if ((i <= 270) && (i % 90 == 0)) {
+ i /= 90;
+ if (i != pcs->xfm_state.print_dir) {
+ pcl_break_underline(pcs);
+ pcs->xfm_state.print_dir = i;
+ update_xfm_state(pcs, 0);
+ pcl_continue_underline(pcs);
+ }
+ else {
+ pcs->xfm_state.print_dir = i;
+ update_xfm_state(pcs, 0);
+ }
+ }
+ return 0;
+}
+
+/*
+ * ESC & a <col> L
+ *
+ * Set left margin.
+ */
+ static int
+set_left_margin(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ coord lmarg = uint_arg(pargs) * pcl_hmi(pcs);
+
+ /* adjust underlining if the left margin passes to the right of
+ the underline start position */
+ if ((pcs->underline_enabled) && (lmarg > pcs->underline_start.x))
+ pcs->underline_start.x = lmarg;
+
+ if (lmarg < pcs->margins.right) {
+ pcs->margins.left = lmarg;
+ if (pcs->cap.x < lmarg)
+ pcl_set_cap_x(pcs, lmarg, false, false);
+ }
+ return 0;
+}
+
+/*
+ * ESC & a <col> M
+ *
+ * Set right margin. The right margin is set to the *right* edge of the
+ * specified column, so we need to add 1 to the column number.
+ */
+ static int
+set_right_margin(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ coord rmarg = (uint_arg(pargs) + 1) * pcl_hmi(pcs);
+
+ if (rmarg > pcs->xfm_state.pd_size.x)
+ rmarg = pcs->xfm_state.pd_size.x;
+ if (rmarg > pcs->margins.left) {
+ pcs->margins.right = rmarg;
+ if (pcs->cap.x > rmarg)
+ pcl_set_cap_x(pcs, rmarg, false, false);
+ }
+
+ return 0;
+}
+
+/*
+ * ESC 9
+ *
+ * Clear horizontal margins.
+ */
+ static int
+clear_horizontal_margins(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ reset_horizontal_margins(pcs);
+ return 0;
+}
+
+
+/*
+ * ESC & l <line> E
+ *
+ * Set top margin. This will also reset the page length.
+ */
+ static int
+set_top_margin(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ coord hgt = pcs->xfm_state.pd_size.y;
+ coord tmarg = uint_arg(pargs) * pcs->vmi_cp;
+
+ if ((pcs->vmi_cp != 0) && (tmarg <= hgt)) {
+ bool was_default = (pcs->margins.top == TOP_MARGIN(hgt, DFLT_TOP_MARGIN) &&
+ pcs->margins.left == DFLT_LEFT_MARGIN);
+
+ pcs->margins.top = tmarg;
+ pcs->margins.length = PAGE_LENGTH(hgt - tmarg, DFLT_BOTTOM_MARGIN);
+
+ /* If the cursor has been moved then we have a fixed cap and the
+ top margin only affects the next page. If the cap is floating,
+ unmarked and unmoved, then the cap moves to the first line of text.
+ More restrictive than implementor's guide:
+ iff a default margin is changed on an unmarked unmoved page to the new margin.
+ margin_set(A) ^L margin_set(B) --> use (A)
+ escE margin_set(B) --> use (B)
+ */
+ if (was_default && pcl_page_marked(pcs) == 0 )
+ return pcl_set_cap_y(pcs, 0L, false, false, true, false);
+ }
+ return 0;
+}
+
+/*
+ * ESC & l <lines> F
+ *
+ * Set text length (which indirectly sets the bottom margin).
+ */
+ static int
+set_text_length(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ coord len = uint_arg(pargs) * pcs->vmi_cp;
+
+ if (len == 0) {
+ len = pcs->xfm_state.pd_size.y - pcs->margins.top - inch2coord(1.0/2.0);
+ if (len < 0) {
+ len += inch2coord(1.0/2.0);
+ }
+ }
+ if ((len >= 0) && (pcs->margins.top + len <= pcs->xfm_state.pd_size.y) )
+ pcs->margins.length = len;
+ return 0;
+}
+
+/*
+ * ESC & l <enable> L
+ *
+ * Set perforation skip mode. Though performation skip is more closely related
+ * to vertical motion than to margins, the command is included here because it
+ * resets the vertical margins (top margin and text length) to their defaults.
+ */
+ static int
+set_perforation_skip(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ bool new_skip = uint_arg(pargs);
+
+ if ((new_skip != pcs->perforation_skip) && (new_skip <= 1))
+ pcs->perforation_skip = new_skip;
+ return 0;
+}
+
+/*
+ * (From PCL5 Comparison Guide, p. 1-98)
+ *
+ * ESC & l <type> M
+ *
+ * Set media type.
+ */
+ static int
+pcl_media_type(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int type = uint_arg(pargs);
+
+ if (type <= 4) {
+ int code = pcl_end_page_if_marked(pcs);
+
+ if (code >= 0)
+ pcl_home_cursor(pcs);
+ return (code < 0 ? code : e_Unimplemented);
+ } else
+ return e_Range;
+}
+
+/*
+ * (From PCL5 Comparison Guide, p. 1-99)
+ *
+ * ESC * o <quality> Q
+ *
+ * Set print quality.
+ */
+ static int
+pcl_print_quality(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int quality = int_arg(pargs);
+
+ if ((quality >= -1) && (quality <= 1)) {
+ int code = pcl_end_page_if_marked(pcs);
+
+ if (code >= 0)
+ pcl_home_cursor(pcs);
+ return (code < 0 ? code : 0);
+ } else
+ return e_Range;
+}
+
+/*
+ * Initialization
+ */
+ static int
+pcpage_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem /* ignored */
+)
+{
+ /* Register commands */
+ DEFINE_CLASS('&')
+ {
+ 'l', 'A',
+ PCL_COMMAND( "Page Size",
+ set_page_size,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'H',
+ PCL_COMMAND( "Paper Source",
+ set_paper_source,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'U',
+ PCL_COMMAND( "Left Offset Registration",
+ set_left_offset_registration,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'Z',
+ PCL_COMMAND( "Top Offset Registration",
+ set_top_offset_registration,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'O',
+ PCL_COMMAND( "Page Orientation",
+ set_logical_page_orientation,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'a', 'P',
+ PCL_COMMAND( "Print Direction",
+ set_print_direction,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'a', 'L',
+ PCL_COMMAND( "Left Margin",
+ set_left_margin,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'a', 'M',
+ PCL_COMMAND( "Right Margin",
+ set_right_margin,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'E',
+ PCL_COMMAND( "Top Margin",
+ set_top_margin,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'F',
+ PCL_COMMAND( "Text Length",
+ set_text_length,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'L',
+ PCL_COMMAND( "Perforation Skip",
+ set_perforation_skip,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'M',
+ PCL_COMMAND( "Media Type",
+ pcl_media_type,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ END_CLASS
+
+ DEFINE_ESCAPE( '9',
+ "Clear Horizontal Margins",
+ clear_horizontal_margins
+ )
+
+ DEFINE_CLASS_COMMAND_ARGS( '*',
+ 'o',
+ 'Q',
+ "Print Quality",
+ pcl_print_quality,
+ pca_neg_ok | pca_big_ignore
+ )
+ return 0;
+}
+
+pcl_paper_size_t *
+pcl_get_default_paper(
+ pcl_state_t * pcs
+)
+{
+ int i;
+ pjl_envvar_t *psize = pjl_proc_get_envvar(pcs->pjls, "paper");
+ pcs->wide_a4 = false;
+ for (i = 0; i < countof(paper_sizes); i++)
+ if (!pjl_proc_compare(pcs->pjls, psize, paper_sizes[i].pname)) {
+ /* set wide a4, only used if the paper is a4 */
+ if (!pjl_proc_compare(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "widea4"), "YES"))
+ pcs->wide_a4 = true;
+ return &(paper_sizes[i].psize);
+ }
+ dprintf("system does not support requested paper setting\n");
+ return &(paper_sizes[1].psize);
+}
+
+ static void
+pcpage_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+
+ /* NB hack for snippet mode */
+ if (pcs->end_page != pcl_end_page_top) {
+ pcs->xfm_state.print_dir = 0;
+ pcs->xfm_state.left_offset_cp = 0.0;
+ pcs->xfm_state.top_offset_cp = 0.0;
+ update_xfm_state(pcs, 0);
+
+ reset_margins(pcs, !pcl_reset_printer); /* esc E in snippet mode */
+ return;
+ }
+
+ if ((type & (pcl_reset_initial | pcl_reset_printer)) != 0) {
+ pcs->orientation_set = false;
+ pcs->paper_source = 0; /* ??? */
+ pcs->xfm_state.left_offset_cp = 0.0;
+ pcs->xfm_state.top_offset_cp = 0.0;
+ pcs->perforation_skip = 1;
+ new_logical_page( pcs,
+ !pjl_proc_compare(pcs->pjls, pjl_proc_get_envvar(pcs->pjls,
+ "orientation"),
+ "portrait") ? 0 : 1,
+ pcl_get_default_paper(pcs),
+ (type & pcl_reset_initial) != 0,
+ false
+ );
+ } else if ((type & pcl_reset_overlay) != 0) {
+ pcs->perforation_skip = 1;
+ update_xfm_state(pcs, 0);
+ reset_margins(pcs, false);
+ pcl_xfm_reset_pcl_pat_ref_pt(pcs);
+ }
+}
+
+const pcl_init_t pcpage_init = { pcpage_do_registration, pcpage_do_reset, 0 };
diff --git a/pcl/pcpage.h b/pcl/pcpage.h
new file mode 100644
index 000000000..0dd400593
--- /dev/null
+++ b/pcl/pcpage.h
@@ -0,0 +1,68 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpage.c - PCL5 page and transformation control interface */
+
+#ifndef pcpage_INCLUDED
+#define pcpage_INCLUDED
+
+#include "pcstate.h"
+#include "pcommand.h"
+
+/* set the page output procedure */
+void pcl_set_end_page(int (*procp)(pcl_state_t *, int, int));
+
+/*
+ * End a page, either unconditionally or only if there are marks on it.
+ * Return 1 if the page was actually printed and erased.
+ */
+typedef enum {
+ pcl_print_always,
+ pcl_print_if_marked
+} pcl_print_condition_t;
+
+int pcl_end_page(
+ pcl_state_t * pcs,
+ pcl_print_condition_t condition
+);
+
+void new_logical_page(
+ pcl_state_t * pcs,
+ int lp_orient,
+ const pcl_paper_size_t * psize,
+ bool reset_initial,
+ bool for_passthrough
+);
+
+ int
+pcl_getdevice_initial_matrix(
+ pcl_state_t * pcs,
+ gs_matrix * mat
+);
+
+bool pcl_page_marked(
+ pcl_state_t * pcs
+);
+
+void pcl_mark_page_for_path(pcl_state_t *pcs);
+void pcl_mark_page_for_current_pos(pcl_state_t *pcs);
+int new_logical_page_for_passthrough_snippet(pcl_state_t *pcs, int orient, int tag);
+pcl_paper_size_t *pcl_get_default_paper(pcl_state_t *pcs);
+int pcl_new_logical_page_for_passthrough(pcl_state_t *pcs, int orient, int tag);
+
+#define pcl_end_page_always(pcs) pcl_end_page((pcs), pcl_print_always)
+#define pcl_end_page_if_marked(pcs) pcl_end_page((pcs), pcl_print_if_marked)
+
+extern const pcl_init_t pcpage_init;
+
+#endif /* pcpage_INCLUDED */
diff --git a/pcl/pcpalet.c b/pcl/pcpalet.c
new file mode 100644
index 000000000..02d2e9ccf
--- /dev/null
+++ b/pcl/pcpalet.c
@@ -0,0 +1,1144 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpalet.c - PCL 5c palette object implementation */
+#include "gx.h"
+#include "pldict.h"
+#include "pcdraw.h"
+#include "pcpage.h"
+#include "pcursor.h"
+#include "pcpalet.h"
+#include "pcfrgrnd.h"
+#include "pccrd.h"
+#include "gsparam.h"
+#include "gsdevice.h"
+#include "gxcmap.h"
+#include "gxdcconv.h"
+#include "gzstate.h"
+
+/* GC routines */
+private_st_palette_t();
+private_st_pstack_entry_t();
+
+/*
+ * Free a PCL palette.
+ */
+static void
+free_palette(
+ gs_memory_t * pmem,
+ void * pvpalet,
+ client_name_t cname
+)
+{
+ pcl_palette_t * ppalet = (pcl_palette_t *)pvpalet;
+
+ if (ppalet->pindexed != 0)
+ pcl_cs_indexed_release(ppalet->pindexed);
+ if (ppalet->pcrd != 0)
+ pcl_crd_release(ppalet->pcrd);
+ if (ppalet->pht != 0)
+ pcl_ht_release(ppalet->pht);
+ gs_free_object(pmem, pvpalet, cname);
+}
+
+void
+pcl_free_default_objects(
+ gs_memory_t * mem,
+ pcl_state_t * pcs
+ )
+{
+ pcl_palette_t * ppalette = (pcl_palette_t *)pcs->pdflt_palette;
+
+ rc_decrement(pcs->pdflt_cs_indexed, "free_default_palette(pdflt_cs_indexed)");
+
+ if (ppalette != 0) {
+
+ rc_decrement(ppalette->pindexed, "free_default_palette cs indexed released");
+ if (ppalette->pht)
+ rc_decrement(ppalette->pht, "free_default_palette ht released");
+ if (ppalette->pcrd)
+ rc_decrement(ppalette->pcrd, "free_default_palette pcl_crd_release");
+ gs_free_object(mem, ppalette, "free_default_palette ppalette free");
+ pcs->pdflt_palette = 0;
+ }
+ rc_decrement(pcs->pdflt_ht, "free_default_palette pdflt_ht release");
+ rc_decrement(pcs->pdflt_ht, "free_default_palette pdflt_ht release");
+ rc_decrement(pcs->pdflt_ht, "free_default_palette pdflt_ht release");
+ rc_decrement(pcs->pdflt_ht, "free_default_palette pdflt_ht release");
+
+ if(pcs->pcl_default_crd)
+ free_crd(mem, pcs->pcl_default_crd, "free_default_palette pcl_default_crd free");
+}
+/*
+ * Free procedure for palettes to be used by the dictionary which implements
+ * the palette store.
+ */
+ static void
+dict_free_palette(
+ gs_memory_t * pmem,
+ void * pvpalet,
+ client_name_t cname
+)
+{
+ pcl_palette_t * ppalet = (pcl_palette_t *)pvpalet;
+
+ rc_decrement(ppalet, cname);
+}
+
+/*
+ * Allocat a PCL palette object.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+alloc_palette(
+ pcl_state_t * pcs,
+ pcl_palette_t ** pppalet,
+ gs_memory_t * pmem
+)
+{
+ pcl_palette_t * ppalet = 0;
+ rc_alloc_struct_1( ppalet,
+ pcl_palette_t,
+ &st_palette_t,
+ pmem,
+ return e_Memory,
+ "allocate pcl palette object"
+ );
+ ppalet->rc.free = free_palette;
+ ppalet->id = pcl_next_id(pcs);
+ ppalet->pindexed = 0;
+ ppalet->pcrd = 0;
+ ppalet->pht = 0;
+ *pppalet = ppalet;
+ return 0;
+}
+
+/*
+ * Create a unique copy of a PCL palette.
+ *
+ * The unsharing of PCL palettes is a bit involved due to the nature of the
+ * palette store. In normal handling, the current PCL state does not maintain
+ * a reference to the current palette. Rather, it keeps the current palette id.,
+ * and the definition of this id. in the dictionary that implements the palette
+ * store is the only reference to the palette.
+ *
+ * The structure of XL dictionaries is (properly) opaque, so there is no direct
+ * access is available to pointer to a palette. Furthermore, the dictionary
+ * get, put, and undef procedures do not recognize object structure, hence they
+ * provide no native support for reference counted objects.
+ *
+ * To work around these problems, a separate pointer to a palette is maintained
+ * in the PCL, though one that does not normally counted as a reference. The
+ * make-unique operation will modify this pointer, and immediately redefine
+ * the current palette id.
+ *
+ * To simplify the remainder of this code, unshared palettes are given new
+ * identifiers, even if the unshare operation does nothing. This operation is
+ * specifically overridden when modifying pen widths, since the latter are never
+ * cached.
+ *
+ * Unlike the "unshare" functions for other objects, this function will create
+ * the PCL palette object if it does not already exist.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+unshare_palette(
+ pcl_state_t * pcs
+)
+{
+ pcl_palette_t * ppalet = pcs->ppalet;
+ pcl_palette_t * pnew = 0;
+ int code = 0;
+ pcl_id_t key;
+
+ /* check if there is anything to do */
+ if ((ppalet != 0) && (ppalet->rc.ref_count == 1)) {
+ ppalet->id = pcl_next_id(pcs);
+ return 0;
+ }
+
+ /* allocate a new palette */
+ if ((code = alloc_palette(pcs, &pnew, pcs->memory)) < 0)
+ return code;
+ if (ppalet != 0) {
+ pcl_cs_indexed_init_from(pnew->pindexed, ppalet->pindexed);
+ pcl_crd_init_from(pnew->pcrd, ppalet->pcrd);
+ pcl_ht_init_from(pnew->pht, ppalet->pht);
+ }
+
+ /* redefine the current palette id. */
+ pcs->ppalet = pnew;
+ id_set_value(key, pcs->sel_palette_id);
+ code = pl_dict_put(&pcs->palette_store, id_key(key), 2, pnew);
+ return (code == -1 ? e_Memory : 0);
+}
+
+/*
+ * Build a default palette, and define it to be the currently selected
+ * palette.
+ */
+ static int
+build_default_palette(
+ pcl_state_t * pcs
+)
+{
+ pcl_id_t key;
+ gs_memory_t * pmem = pcs->memory;
+ pcl_palette_t * ppalet = 0;
+ int code = 0;
+
+ if (pcs->pdflt_palette == 0) {
+ code = alloc_palette(pcs, &ppalet, pmem);
+ if (code == 0)
+ code = pcl_cs_indexed_build_default_cspace( pcs,
+ &(ppalet->pindexed),
+ pmem
+ );
+ if ((code == 0) && (pcs->pcl_default_crd == 0))
+ code = pcl_crd_build_default_crd(pcs);
+ if (code == 0)
+ pcl_crd_init_from(ppalet->pcrd, pcs->pcl_default_crd);
+ if (code == 0)
+ code = pcl_ht_build_default_ht(pcs, &(ppalet->pht), pmem);
+ if (code < 0) {
+ if (ppalet != 0)
+ free_palette(pmem, ppalet, "build default palette");
+ return code;
+ }
+ pcl_palette_init_from(pcs->pdflt_palette, ppalet);
+ } else
+ pcl_palette_init_from(ppalet, pcs->pdflt_palette);
+
+
+ /* NB: definitions do NOT record a referece */
+ id_set_value(key, pcs->sel_palette_id);
+ code = pl_dict_put(&pcs->palette_store, id_key(key), 2, ppalet);
+ if (code < 0)
+ return e_Memory;
+ rc_increment(ppalet);
+ /* the graphic state pointer does not (yet) amount to a reference */
+ pcs->ppalet = ppalet;
+ return 0;
+}
+
+/*
+ * Clear the palette stack.
+ */
+ void
+clear_palette_stack(
+ pcl_state_t * pcs,
+ gs_memory_t * pmem
+)
+{
+ pstack_entry_t * pentry = pcs->palette_stack;
+
+ while (pentry != 0) {
+ pstack_entry_t * pnext = pentry->pnext;
+
+ pcl_palette_release(pentry->ppalet);
+ gs_free_object(pmem, pentry, "clear palette stack");
+ pentry = pnext;
+ }
+ pcs->palette_stack = 0;
+}
+
+/*
+ * ESC * p # P
+ *
+ * Push a copy of the current palette onto the palette stack, or pop one off.
+ * Note the need to redefine the select palette id. in the event that a palette
+ * is popped.
+ */
+ static int
+push_pop_palette(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int action = uint_arg(pargs);
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ if (action == 0) {
+ pstack_entry_t * pentry;
+ int code;
+
+ /* if there is not yet a palette, build the default */
+ if ((pcs->ppalet == 0) && ((code = build_default_palette(pcs)) < 0))
+ return code;
+
+ pentry = gs_alloc_struct( pcs->memory,
+ pstack_entry_t,
+ &st_pstack_entry_t,
+ "push pcl palette"
+ );
+ if (pentry == 0)
+ return e_Memory;
+
+ pcl_palette_init_from(pentry->ppalet, pcs->ppalet);
+ pentry->pnext = pcs->palette_stack;
+ pcs->palette_stack = pentry;
+
+ return 0;
+
+ } else if (action == 1) {
+ pstack_entry_t * pentry = pcs->palette_stack;
+ int code = 0;
+
+ if (pentry != 0) {
+ pcl_id_t key;
+
+ pcs->palette_stack = pentry->pnext;
+
+ /* NB: just set - pcs->ppalet is not a reference */
+ pcs->ppalet = pentry->ppalet;
+
+ /* the dictionary gets the stack reference on the palette */
+ id_set_value(key, pcs->sel_palette_id);
+ code = pl_dict_put(&pcs->palette_store, id_key(key), 2, pentry->ppalet);
+ gs_free_object(pcs->memory, pentry, "pop pcl palette");
+ }
+
+ return (code < 0 ? e_Memory : 0);
+
+ } else
+ return 0;
+}
+
+
+/*
+ * Set the number of entries in a color palette. This is needed only for the
+ * GL/2 NP command; PCL sets the number of entries in a palette via the
+ * configure image data command, which creates a new indexed color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_NP(
+ pcl_state_t * pcs,
+ int num_entries
+)
+{
+ int code = unshare_palette(pcs);
+
+ /* if the default color space must be built, it is fixed, so don't bother */
+ if (pcs->ppalet->pindexed == 0)
+ return code;
+
+ if (code == 0)
+ code = pcl_cs_indexed_set_num_entries( &(pcs->ppalet->pindexed),
+ num_entries,
+ true
+ );
+ /* shrinking a palette may make it gray, growing may make it color */
+ if (code == 0)
+ code = pcl_ht_remap_render_method(pcs,
+ &(pcs->ppalet->pht),
+ pcl_ht_is_all_gray_palette(pcs));
+ return code;
+}
+
+/*
+ * Set the render method for the palette.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ *
+ * The value of the render method is not checked against the existing value,
+ * since the fact that two are the same is neither a necessary nor sufficient
+ * condition for determining that the render algorithm has changed: it is
+ * possible that the rendering remap array (see pcht.c) has been modified.
+ */
+ int
+pcl_palette_set_render_method(
+ pcl_state_t * pcs,
+ uint render_method
+)
+{
+ int code = unshare_palette(pcs);
+
+ if ((code == 0) && (pcs->ppalet->pht == 0))
+ code = pcl_ht_build_default_ht(pcs, &(pcs->ppalet->pht), pcs->memory);
+ if (code >= 0)
+ code = pcl_ht_set_render_method(pcs, &(pcs->ppalet->pht), render_method);
+ if (code >= 0)
+ pcs->render_mode = render_method;
+ return code;
+}
+
+/*
+ * Set gamma correction information for a palette.
+ *
+ * Gamma correction and the color lookup table for device specific color spaces
+ * perform the same function, but are of different origins. Hence, while a
+ * configure image data command will discard all color lookup tables, it inherits
+ * the gamma configuration parameter from the existing palette. In addition,
+ * while there is an "unset" command for color lookup tables, there is no such
+ * command for gamma correction: to override the existing gamma correction,
+ * either specify a new one or download a color correction table for a device
+ * specific color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_set_gamma(
+ pcl_state_t * pcs,
+ float gamma
+)
+{
+ int code = unshare_palette(pcs);
+
+ if ((code == 0) && (pcs->ppalet->pht == 0))
+ code = pcl_ht_build_default_ht(pcs, &(pcs->ppalet->pht), pcs->memory);
+ if (code == 0)
+ code = pcl_ht_set_gamma(&(pcs->ppalet->pht), gamma);
+ return code;
+}
+
+/*
+ * Set color lookup table information for a palette.
+ *
+ * Lookup tables for device-specific and device-independent color spaces are
+ * implemented in different ways. The former are implemented via transfer
+ * functions, and thus affect the halftone component of the current palette.
+ * The latter are implemented in the device-independent color spaces themselves,
+ * and thus affect the color spaces component of the palette.
+ *
+ * An anachronism of the PCL is that, while color lookup tables may be set
+ * individually for different color spaces, they only be cleared all at once.
+ * This is accomplished by calling this routine with a null lookup table pointer.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_set_lookup_tbl(
+ pcl_state_t * pcs,
+ pcl_lookup_tbl_t * plktbl
+)
+{
+ int code = unshare_palette(pcs);
+ pcl_cspace_type_t lktype;
+
+ if ((code == 0) && (pcs->ppalet->pindexed == 0))
+ code = pcl_cs_indexed_build_default_cspace( pcs,
+ &(pcs->ppalet->pindexed),
+ pcs->memory
+ );
+ if ((code == 0) && (pcs->ppalet->pht == 0))
+ code = pcl_ht_build_default_ht(pcs, &(pcs->ppalet->pht), pcs->memory);
+ if (code < 0)
+ return code;
+
+ /* all look tables are cleared simultaneously */
+ if (plktbl != 0)
+ lktype = pcl_lookup_tbl_get_cspace(plktbl);
+ if ((plktbl == 0) || (lktype <= pcl_cspace_CMY))
+ code = pcl_ht_set_lookup_tbl(&(pcs->ppalet->pht), plktbl);
+ if ( (code == 0) && ((plktbl == 0) || (lktype >= pcl_cspace_Colorimetric)) )
+ code = pcl_cs_indexed_update_lookup_tbl(&(pcs->ppalet->pindexed), plktbl);
+ return code;
+}
+
+/*
+ * Set an entry in a color palette.
+ *
+ * Returns 0 on success, < 0 in the event of an error. The returned code will
+ * normally be ignored.
+ */
+ int
+pcl_palette_set_color(
+ pcl_state_t * pcs,
+ int indx,
+ const float comps[3]
+)
+{
+ int code = unshare_palette(pcs);
+ bool was_gray;
+ bool now_gray;
+
+ /* if the default color space must be built, it is fixed, so don't bother */
+ if (pcs->ppalet->pindexed == 0)
+ return code;
+
+ if (code == 0)
+ code = pcl_cs_indexed_set_palette_entry( &(pcs->ppalet->pindexed),
+ indx,
+ comps
+ );
+
+ if ( pcs->monochrome_mode == 0 ) {
+ was_gray = pcs->ppalet->pht->is_gray_render_method;
+
+ now_gray = ((pcs->ppalet->pindexed->palette.data[indx*3 + 0] ==
+ pcs->ppalet->pindexed->palette.data[indx*3 + 1]) &&
+ (pcs->ppalet->pindexed->palette.data[indx*3 + 1] ==
+ pcs->ppalet->pindexed->palette.data[indx*3 + 2]) );
+
+ if ( !was_gray && now_gray ) {
+ /* change one entry from color to gray,
+ * check entire palette for grey
+ */
+ code = pcl_ht_remap_render_method(pcs,
+ &(pcs->ppalet->pht),
+ pcl_ht_is_all_gray_palette(pcs));
+ }
+ else if ( was_gray && !now_gray ) {
+ /* one color entry in gray palette makes it color
+ */
+ code = pcl_ht_remap_render_method(pcs,
+ &(pcs->ppalet->pht),
+ false);
+ }
+ }
+ return code;
+}
+
+/*
+ * Set a palette entry to its default color.
+ *
+ * Returns 0 on success, < 0 in the event of an error. The returned code will
+ * normally be ignored.
+ */
+ int
+pcl_palette_set_default_color(
+ pcl_state_t * pcs,
+ int indx
+)
+{
+ int code = unshare_palette(pcs);
+
+ /* if the default color space must be built, it is fixed, so don't bother */
+ if (pcs->ppalet->pindexed == 0)
+ return code;
+
+ if (code == 0)
+ code = pcl_cs_indexed_set_default_palette_entry( &(pcs->ppalet->pindexed),
+ indx
+ );
+ if (code == 0)
+ code = pcl_ht_remap_render_method(pcs,
+ &(pcs->ppalet->pht),
+ pcl_ht_is_all_gray_palette(pcs));
+ return code;
+}
+
+/*
+ * Set a pen width. Note that this does NOT change the palette id. This
+ * procedure can only be called from GL/2, hence the procedure name.
+ *
+ * Returns 0 on success, < 0 in the even of an error;
+ */
+ int
+pcl_palette_PW(
+ pcl_state_t * pcs,
+ int pen,
+ floatp width
+)
+{
+ int code = 0;
+ pcl_gsid_t palette_id;
+ pcl_palette_t * ppalet = pcs->ppalet;
+
+ if (ppalet != 0) {
+ pcl_cs_indexed_t * pindexed = ppalet->pindexed;
+
+ if ( (pindexed != 0) &&
+ (pen >= 0) &&
+ (pen < pcl_cs_indexed_get_num_entries(pindexed)) &&
+ (width == pcl_cs_indexed_get_pen_widths(pindexed)[pen]) )
+ return 0;
+
+ palette_id = ppalet->id;
+ if ((code = unshare_palette(pcs)) < 0)
+ return code;
+ ppalet = pcs->ppalet;
+ ppalet->id = palette_id;
+
+ } else {
+ if ((code = unshare_palette(pcs)) < 0)
+ return code;
+ ppalet = pcs->ppalet;
+ }
+
+ return pcl_cs_indexed_set_pen_width(&(ppalet->pindexed), pen, width);
+}
+
+/*
+ * Set the user-defined dither matrix.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_set_udither(
+ pcl_state_t * pcs,
+ pcl_udither_t * pdither
+)
+{
+ int code = unshare_palette(pcs);
+
+ if ((code == 0) && (pcs->ppalet->pht == 0))
+ code = pcl_ht_build_default_ht(pcs, &(pcs->ppalet->pht), pcs->memory);
+ if (code == 0)
+ code = pcl_ht_set_udither(&(pcs->ppalet->pht), pdither);
+ return code;
+}
+
+/*
+ * Overwrite the current palette with new a new image data configuration.
+ * This will rebuild the indexed color space, and discard any currently
+ * installed color lookup tables.
+ *
+ * Tf the operand "fixed" is true, this procedure is being called as part of
+ * a "simple color mode" command, and the resulting color palette will have
+ * fixed entries.
+ *
+ * The boolean operand gl2 indicates if this call is being made as the result
+ * of an IN command in GL/2. If so, the default set of entries in the color
+ * palette is modified.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_set_cid(
+ pcl_state_t * pcs,
+ pcl_cid_data_t * pcid,
+ bool fixed,
+ bool gl2
+)
+{
+ int code = unshare_palette(pcs);
+ pcl_palette_t * ppalet = pcs->ppalet;
+ pcl_cspace_type_t cstype_new = pcl_cid_get_cspace(pcid);
+ pcl_cspace_type_t cstype_old;
+
+ if (code < 0)
+ return code;
+
+ /* record the old color space type, if it is present */
+ if (ppalet->pindexed != 0)
+ cstype_old = (pcl_cspace_type_t)ppalet->pindexed->cid.cspace;
+ else
+ cstype_old = cstype_new;
+
+ /* pcl_cspace_bnuild_indexed_cspace will release the old space */
+ code = pcl_cs_indexed_build_cspace( pcs,
+ &(ppalet->pindexed),
+ pcid,
+ fixed,
+ gl2,
+ pcs->memory
+ );
+ if (code == 0) {
+ bool is_gray = false;
+ /* direct raster is always color */
+ if ( pcl_cid_get_encoding(pcid) <= 1 ) {
+ /* indexed used palette which maybe gray or color */
+ is_gray = pcl_ht_is_all_gray_palette(pcs);
+ }
+ code = pcl_ht_remap_render_method(pcs,
+ &(pcs->ppalet->pht),
+ is_gray);
+ }
+
+ /* if a halftone exist, inform it of the update and discard lookup tables */
+ if ((code == 0) && (ppalet->pht != 0)) {
+ code = pcl_ht_update_cspace(pcs, &(ppalet->pht), cstype_old, cstype_new);
+ if (code == 0)
+ code = pcl_ht_set_lookup_tbl(&(ppalet->pht), NULL);
+ }
+
+ return code;
+}
+
+/*
+ * Set the view illuminant for a palette.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_set_view_illuminant(
+ pcl_state_t * pcs,
+ const gs_vector3 * pwht_pt
+)
+{
+ int code = unshare_palette(pcs);
+
+ if ((code == 0) && (pcs->ppalet->pcrd == 0)) {
+ if ((code = pcl_crd_build_default_crd(pcs)) == 0)
+ pcl_crd_init_from(pcs->ppalet->pcrd, pcs->pcl_default_crd);
+ }
+ if (code == 0)
+ code = pcl_crd_set_view_illuminant(pcs, &(pcs->ppalet->pcrd), pwht_pt);
+ return code;
+}
+
+/*
+ * Check that all parts of a PCL palette have been built. If not, build the
+ * necessary default objects.
+ *
+ * This procedure should never be required, as the reset operation should build
+ * a default palette, but it is kept in case that routine does not succeed.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_palette_check_complete(
+ pcl_state_t * pcs
+)
+{
+ pcl_palette_t * ppalet = pcs->ppalet;
+ int code = 0;
+
+ if ( (ppalet != 0) &&
+ (ppalet->pindexed != 0) &&
+ (ppalet->pcrd != 0) &&
+ (ppalet->pht != 0) )
+ return 0;
+
+ if ((code = unshare_palette(pcs)) < 0)
+ return code;
+ ppalet = pcs->ppalet;
+ if (ppalet->pindexed == 0)
+ code = pcl_cs_indexed_build_default_cspace( pcs,
+ &(ppalet->pindexed),
+ pcs->memory
+ );
+ if ((code == 0) && (ppalet->pcrd == 0)) {
+ if ((code = pcl_crd_build_default_crd(pcs)) == 0)
+ pcl_crd_init_from(pcs->ppalet->pcrd, pcs->pcl_default_crd);
+ }
+ if ((code == 0) && (ppalet->pht == 0))
+ code = pcl_ht_build_default_ht(pcs, &(ppalet->pht), pcs->memory);
+ return code;
+}
+
+
+/*
+ * ESC & p # S
+ *
+ * Change the select palette id. Note that, since the pointer to the palette in
+ * the pcl state does not count as a reference, no reference counts are adjusted.
+ */
+ static int
+set_sel_palette_id(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint id = uint_arg(pargs);
+ pcl_id_t key;
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ /* ignore attempts to select non-existent palettes */
+ id_set_value(key, id);
+ if ( pl_dict_lookup( &pcs->palette_store,
+ id_key(key),
+ 2,
+ (void **)&(pcs->ppalet),
+ false,
+ NULL
+ ) )
+ pcs->sel_palette_id = id;
+ return 0;
+}
+
+/*
+ * ESC & p # I
+ *
+ * Set the palette control id.
+ */
+ static int
+set_ctrl_palette_id(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode)
+ return 0;
+
+ pcs->ctrl_palette_id = uint_arg(pargs);
+ return 0;
+}
+
+/*
+ * Clear the palette store. This will delete the current palette, but will
+ * NOT build the default palette in its place.
+ *
+ * If the current palette id. already has the default palette assigned, don't
+ * bother removing it. This is helpful when working with memory leak detection
+ * tools.
+ */
+ static void
+clear_palette_store(
+ pcl_state_t * pcs
+)
+{
+ pl_dict_enum_t denum;
+ void * pvalue;
+ gs_const_string plkey;
+ int sel_id = pcs->sel_palette_id;
+
+ pl_dict_enum_begin(&pcs->palette_store, &denum);
+ while (pl_dict_enum_next(&denum, &plkey, &pvalue)) {
+ int id = (((int)plkey.data[0]) << 8) + plkey.data[1];
+
+ if (id == sel_id) {
+ if (pvalue != pcs->pdflt_palette)
+ build_default_palette(pcs); /* will redefine sel_id */
+ } else
+ pl_dict_undef(&pcs->palette_store, plkey.data, plkey.size);
+ }
+}
+
+/*
+ * ESC & p # C
+ *
+ * Palette control
+ */
+ static int
+palette_control(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint action = uint_arg(pargs);
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ switch (action) {
+
+ case 0:
+ clear_palette_store(pcs);
+ break;
+
+ case 1:
+ clear_palette_stack(pcs, pcs->memory);
+ break;
+
+ case 2:
+ if (pcs->ctrl_palette_id == pcs->sel_palette_id) {
+ if ((pcs->ppalet == 0) || (pcs->ppalet != pcs->pdflt_palette))
+ build_default_palette(pcs);
+ } else {
+ pcl_id_t key;
+
+ id_set_value(key, pcs->ctrl_palette_id);
+ pl_dict_undef(&pcs->palette_store, id_key(key), 2);
+ }
+ break;
+
+ case 6:
+ if (pcs->ctrl_palette_id != pcs->sel_palette_id) {
+ pcl_id_t key;
+ int code = 0;
+
+ /* NB: definitions don't incremente refernece counts */
+ id_set_value(key, pcs->ctrl_palette_id);
+ code = pl_dict_put(&pcs->palette_store, id_key(key), 2, pcs->ppalet);
+ if (code < 0)
+ return code;
+ rc_increment(pcs->ppalet);
+
+ }
+ break;
+
+ default:
+ return e_Range;
+ }
+
+ return 0;
+}
+
+/*
+ * ESC * t # J
+ *
+ * Set render method. The rendering method is specifically part of the PCL
+ * halftone structure, but the setting command is included here because it
+ * must run via the palette mechanism.
+ */
+ static int
+set_render_algorithm(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ return pcl_palette_set_render_method(pcs, uint_arg(pargs));
+}
+
+static bool swapped_device_color_procs = false;
+static gx_cm_color_map_procs device_cm_procs;
+/* needs type */
+static dev_proc_get_color_mapping_procs(*saved_get_color_map_proc);
+
+static void
+pcl_gray_cs_to_cm(gx_device * dev, frac gray, frac out[])
+{
+ /* just pass it along */
+ device_cm_procs.map_gray(dev, gray, out );
+}
+
+static void
+pcl_rgb_cs_to_cm(gx_device * dev, const gs_imager_state * pis, frac r, frac g, frac b, frac out[])
+{
+ frac gray = color_rgb_to_gray(r, g, b, NULL);
+ device_cm_procs.map_rgb(dev, pis, gray, gray, gray, out);
+}
+
+static void
+pcl_cmyk_cs_to_cm(gx_device * dev, frac c, frac m, frac y, frac k, frac out[])
+{
+ frac gray = color_cmyk_to_gray(c, m, y, k, NULL);
+ device_cm_procs.map_cmyk(dev, gray, gray, gray, gray, out);
+}
+
+static const gx_cm_color_map_procs pcl_mono_procs = {
+ pcl_gray_cs_to_cm, pcl_rgb_cs_to_cm, pcl_cmyk_cs_to_cm
+};
+
+static const gx_cm_color_map_procs *
+pcl_mono_color_mapping_procs(const gx_device * dev)
+{
+ return &pcl_mono_procs;
+}
+
+
+/* set monochrome page device parameter. NB needs testing. We don't
+ currently have a device that does what we need with
+ ProcessColorModel. We assume non color devices will simply ignore
+ the parameter. */
+static int
+pcl_update_mono(pcl_state_t *pcs)
+{
+ gx_device *dev = gs_currentdevice(pcs->pgs);
+ const gx_cm_color_map_procs *cm_procs = dev_proc(dev, get_color_mapping_procs)(dev);
+ if (pcs->monochrome_mode) {
+ if (swapped_device_color_procs == false) {
+ device_cm_procs = *cm_procs;
+ saved_get_color_map_proc = dev->procs.get_color_mapping_procs;
+ dev->procs.get_color_mapping_procs = pcl_mono_color_mapping_procs;
+ swapped_device_color_procs = true;
+ }
+ } else {
+ if (swapped_device_color_procs == true) {
+ dev->procs.get_color_mapping_procs = saved_get_color_map_proc;
+ swapped_device_color_procs = false;
+ }
+ }
+ gx_unset_dev_color(pcs->pgs);
+ return 0;
+}
+
+/*
+ * ESC & b # M
+ *
+ * Set monochrome or normal print mode.
+ * Note ForceMono=1 is similar to monochrome mode locked on.
+ *
+ * The monochrome print mode command is ignored if the page is dirty.
+ *
+ */
+ static int
+set_print_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint mode = uint_arg(pargs);
+
+ if ( pcs->personality == pcl5e || pcs->raster_state.graphics_mode )
+ return 0;
+
+ if (mode > 1)
+ return 0;
+
+ if (pcs->page_marked)
+ return 0;
+
+ if (mode == 1)
+ pcs->monochrome_mode = true;
+ else
+ pcs->monochrome_mode = false;
+
+ return pcl_update_mono(pcs);
+}
+
+/*
+ * Initialization routine for palettes.
+ */
+ static int
+palette_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'p', 'P',
+ PCL_COMMAND( "Push/Pop Palette",
+ push_pop_palette,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 't', 'J',
+ PCL_COMMAND( "Render Algorithm",
+ set_render_algorithm,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ END_CLASS
+
+ DEFINE_CLASS('&')
+ {
+ 'b', 'M',
+ PCL_COMMAND( "Monochrome Printing",
+ set_print_mode,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'p', 'S',
+ PCL_COMMAND( "Select Palette",
+ set_sel_palette_id,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'p', 'I',
+ PCL_COMMAND( "Palette Control ID",
+ set_ctrl_palette_id,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'p', 'C',
+ PCL_COMMAND( "Palette Control",
+ palette_control,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+/*
+ * Reset routine for palettes.
+ */
+ static void
+palette_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_cold
+ | pcl_reset_printer
+ | pcl_reset_overlay
+ | pcl_reset_permanent);
+
+
+
+ if ((type & mask) == 0)
+ return;
+
+ /* for initial reset, set up the palette store */
+ if ((type & pcl_reset_initial) != 0) {
+ pl_dict_init(&pcs->palette_store, pcs->memory, dict_free_palette);
+ pcs->ppalet = 0;
+ pcs->pfrgrnd = 0;
+
+ /* set up the built-in render methods and dithers matrices */
+ pcl_ht_init_render_methods(pcs, pcs->memory);
+
+
+ } else if ((type & (pcl_reset_cold | pcl_reset_printer | pcl_reset_permanent)) != 0) {
+ pcs->monochrome_mode = 0;
+ pcl_update_mono(pcs);
+ /* clear the palette stack and store */
+ clear_palette_stack(pcs, pcs->memory);
+ clear_palette_store(pcs);
+ }
+ if ( type & pcl_reset_permanent ) {
+ pl_dict_release(&pcs->palette_store);
+ if (pcs->ppalet != pcs->pdflt_palette) {
+ /* stefan foo: free or decrement reference counts? */
+ gs_free_object(pcs->memory, pcs->ppalet->pindexed, "palette cs indexed released permanent reset");
+ gs_free_object(pcs->memory, pcs->ppalet->pht, "palette ht released permanent reset");
+ gs_free_object(pcs->memory, pcs->ppalet->pcrd, "palette ht released permanent reset");
+ gs_free_object(pcs->memory, pcs->ppalet, "palette released permanent reset");
+ }
+ }
+ /* select and control palette ID's must be set back to 0 */
+ pcs->sel_palette_id = 0;
+ pcs->ctrl_palette_id = 0;
+
+ if ( !(type & pcl_reset_permanent) ) {
+ (void)build_default_palette(pcs);
+ (void)pcl_frgrnd_set_default_foreground(pcs);
+ }
+}
+
+/*
+ * The copy function for palettes.
+ *
+ * This procedure implements the two most unusual features of the palette
+ * object:
+ *
+ * The palette pointer becomes a reference on the palette when the
+ * state is saved.
+ *
+ * When the state is restored, the palette in the saved state is used
+ * to re-define the select palette id. in the palette store. Palettes are
+ * the only PCL resource object with this behavior.
+ *
+ * It is not clear HP intended palette to have this behavior. More likely,
+ * it was a by-product of the way in which they implemented the save/restore
+ * for foregrounds.
+ *
+ * Note that, in the restore case, the dictionary definition absorbs the
+ * reference to the palette held by the saved state, so there is no need to
+ * explicitly release this reference (an example of the asymmetric define/
+ * undefine properties of the pl_dict_t object).
+ */
+ static int
+palette_do_copy(
+ pcl_state_t * psaved,
+ const pcl_state_t * pcs,
+ pcl_copy_operation_t operation
+)
+{
+ if ((operation & (pcl_copy_before_call | pcl_copy_before_overlay)) != 0)
+ pcl_palette_init_from(psaved->ppalet, pcs->ppalet);
+ else if ((operation & pcl_copy_after) != 0) {
+ pcl_id_t key;
+ /* fix the compiler warning resulting from overuse of const */
+ pcl_state_t *pcs2 = (pcl_state_t *)pcs;
+ id_set_value(key, psaved->sel_palette_id);
+ pl_dict_put(&pcs2->palette_store, id_key(key), 2, psaved->ppalet);
+ psaved->palette_stack = pcs2->palette_stack;
+ psaved->palette_store = pcs2->palette_store;
+ }
+ return 0;
+}
+
+const pcl_init_t pcl_palette_init = {
+ palette_do_registration, palette_do_reset, palette_do_copy
+};
diff --git a/pcl/pcpalet.h b/pcl/pcpalet.h
new file mode 100644
index 000000000..4df5b4924
--- /dev/null
+++ b/pcl/pcpalet.h
@@ -0,0 +1,319 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpalet.h - PCL palette object */
+
+#ifndef pcpalet_INCLUDED
+#define pcpalet_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "pcident.h"
+#include "pcstate.h"
+#include "pcommand.h"
+#include "pclookup.h"
+#include "pcdither.h"
+#include "pccid.h"
+#include "pcindxed.h"
+#include "pcht.h"
+#include "pccrd.h"
+
+/*
+ * The PCL palette.
+ *
+ * The identifier is used to indicate when colored patterns need to be
+ * re-rendered.
+ *
+ * A curious feature of the PCL palette is not the object itself, but the
+ * manner in which it is stored in the PCL state. During normal operation,
+ * the PCL state does not maintain a reference to a plette. Rather, it
+ * maintains a current installed palette ID, which can be searched for the
+ * in the appropriate dictionary to find the current palette. Changes to
+ * the current palette update this entry directly.
+ *
+ * In the case of a called or overlayed macro, however, the saved PCL state
+ * will create its own reference to the palette, as well as retaining the
+ * current palette id. in effect at the time the palette was saved. When the
+ * state is subsequently restored, the save palette is once more associated
+ * with the save palette id. Hence, the end of a called or overlay macro can
+ * lead to a redefinition in the palette store. This is inconsistent with
+ * the way all other identified objects are handled in PCL, but it is the
+ * mechanism HP selected.
+ */
+struct pcl_palette_s {
+ rc_header rc;
+ pcl_gsid_t id;
+ pcl_cs_indexed_t * pindexed;
+ pcl_crd_t * pcrd;
+ pcl_ht_t * pht;
+};
+
+#ifndef pcl_palette_DEFINED
+#define pcl_palette_DEFINED
+typedef struct pcl_palette_s pcl_palette_t;
+#endif
+
+#define private_st_palette_t() \
+ gs_private_st_ptrs3( st_palette_t, \
+ pcl_palette_t, \
+ "pcl palette object", \
+ palette_enum_ptrs, \
+ palette_reloc_ptrs, \
+ pindexed, \
+ pcrd, \
+ pht \
+ )
+
+
+/*
+ * The usual init, copy,and release macros.
+ */
+#define pcl_palette_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_palette_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_palette_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_palette_release(pbase) \
+ rc_decrement(pbase, "pcl_frgrnd_release")
+
+
+/*
+ * Get the color space type for the base color space of a palette.
+ */
+#define pcl_palette_get_cspace(ppalet) \
+ ((pcl_cspace_type_t)((ppalet)->pindexed->cid.cspace))
+
+/*
+ * Get the pixel encoding mode from the current palette.
+ */
+#define pcl_palette_get_encoding(ppalet) \
+ ((pcl_encoding_type_t)((ppalet)->pindexed->cid.encoding))
+
+/*
+ * Get the number of bits per index from the current palette.
+ */
+#define pcl_palette_get_bits_per_index(ppalet) \
+ ((ppalet)->pindexed->cid.bits_per_index)
+
+/*
+ * Get the number of bits per primary from the current palette.
+ */
+#define pcl_palette_get_bits_per_primary(ppalet, i) \
+ ((ppalet)->pindexed->cid.bits_per_primary[i])
+
+/*
+ * Macro to return the number or entries in the current palette.
+ */
+#define pcl_palette_get_num_entries(ppalet) \
+ pcl_cs_indexed_get_num_entries((ppalet)->pindexed)
+
+/*
+ * Macro to return a pointer to the array of pen widths.
+ */
+#define pcl_palette_get_pen_widths(ppalet) \
+ pcl_cs_indexed_get_pen_widths((ppalet)->pindexed)
+
+/*
+ * Set the normalization values for an indexed color space. This is needed
+ * only for the GL/2 CR command; PCL sets normalization information via the
+ * configure image data command, which builds a new indexed color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_CR(
+ pcl_state_t * pcs,
+ floatp wht0,
+ floatp wht1,
+ floatp wht2,
+ floatp blk0,
+ floatp blk1,
+ floatp blk2
+);
+
+/*
+ * Set the number of entries in a color palette. This is needed only for the
+ * GL/2 NP command; PCL sets the number of entries in a palette via the
+ * configure image data command, which creates a new indexed color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_NP(pcl_state_t * pcs, int num_entries);
+
+/*
+ * Set a pen width. Note that this does NOT change the palette id. This
+ * procedure can only be called from GL/2, hence the procedure name.
+ *
+ * Returns 0 on success, < 0 in the even of an error;
+ */
+int pcl_palette_PW(pcl_state_t * pcs, int pen, floatp width);
+
+/*
+ * Support for the GL/2 IN command. This is actually implemented in pccid.c,
+ * but an interface is included here for consistency.
+ */
+#define pcl_palette_IN(pcs) pcl_cid_IN(pcs)
+
+/*
+ * Set the render method for the palette.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_set_render_method(
+ pcl_state_t * pcs,
+ uint render_method
+);
+
+/*
+ * Set gamma correction information for a palette.
+ *
+ * Gamma correction and the color lookup table for device specific color spaces
+ * perform the same function, but are of different origins. Hence, while a
+ * configure image data command will discard all color lookup tables, it inherits
+ * the gamma configuration parameter from the existing palette. In addition,
+ * while there is an "unset" command for color lookup tables, there is no such
+ * command for gamma correction: to override the existing gamma correction,
+ * either specify a new one or download a color correction table for a device
+ * specific color space.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_set_gamma(pcl_state_t * pcs, float gamma);
+
+/*
+ * Set color lookup table information for a palette.
+ *
+ * Lookup tables for device-specific and device-independent color spaces are
+ * implemented in different ways. The former are implemented via transfer
+ * functions, and thus affect the halftone component of the current palette.
+ * The latter are implemented in the device-independent color spaces themselves,
+ * and thus affect the color spaces component of the palette.
+ *
+ * An anachronism of the PCL is that, while color lookup tables may be set
+ * individually for different color spaces, they only be cleared all at once.
+ * This is accomplished by calling this routine with a null lookup table pointer.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_set_lookup_tbl(
+ pcl_state_t * pcs,
+ pcl_lookup_tbl_t * plktbl
+);
+
+/*
+ * Set an entry in a color palette.
+ *
+ * Returns 0 on success, < 0 in the event of an error. The returned code will
+ * normally be ignored.
+ */
+int pcl_palette_set_color(
+ pcl_state_t * pcs,
+ int indx,
+ const float comps[3]
+);
+
+/*
+ * Set a palette entry to its default color.
+ *
+ * Returns 0 on success, < 0 in the event of an error. The returned code will
+ * normally be ignored.
+ */
+int pcl_palette_set_default_color(
+ pcl_state_t * pcs,
+ int indx
+);
+
+/*
+ * Set the user-defined dither matrix.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_set_udither(
+ pcl_state_t * pcs,
+ pcl_udither_t * pdither
+);
+
+/*
+ * Overwrite the current palette with new a new image data configuration.
+ * This will rebuild the indexed color space, and discard any currently
+ * installed color lookup tables.
+ *
+ * Tf the operand "fixed" is true, this procedure is being called as part of
+ * a "simple color mode" command, and the resulting color palette will have
+ * fixed entries.
+ *
+ * The boolean operand gl2 indicates if this call is being made as the result
+ * of an IN command in GL/2. If so, the default set of entries in the color
+ * palette is modified.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_set_cid(
+ pcl_state_t * pcs,
+ pcl_cid_data_t * pcid,
+ bool fixed,
+ bool gl2
+);
+
+/*
+ * Set the view illuminant for a palette.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_set_view_illuminant(
+ pcl_state_t * pcs,
+ const gs_vector3 * pwht_pt
+);
+
+/*
+ * Check that all parts of a PCL palette have been built. If not, build the
+ * necessary default objects.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_palette_check_complete(pcl_state_t * pcs);
+
+
+#define private_st_pstack_entry_t() \
+ gs_private_st_ptrs1( st_pstack_entry_t, \
+ pstack_entry_t, \
+ "palette stack entry", \
+ pstack_enum_ptrs, \
+ pstack_reloc_ptrs, \
+ ppalet \
+ );
+
+/*
+ * Entry points to the palette-related commands.
+ */
+extern const pcl_init_t pcl_palette_init;
+extern const pcl_init_t pcl_color_init;
+
+
+/* free default objects (pcs->pdfl_*)
+ * called at end of process.
+ */
+void pcl_free_default_objects(gs_memory_t *mem, pcl_state_t *pcs);
+
+
+#endif /* pcpalet_INCLUDED */
diff --git a/pcl/pcparam.h b/pcl/pcparam.h
new file mode 100644
index 000000000..81e2a61ac
--- /dev/null
+++ b/pcl/pcparam.h
@@ -0,0 +1,34 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/*
+ * pcparam.h - Definitions for PCL5 parameter setting
+ * Requires gsmemory.h
+ */
+
+#ifndef pcparam_INCLUDED
+# define pcparam_INCLUDED
+
+#include "gsparam.h"
+
+/*
+ * Put a single device parameter.
+ * Return 0 if OK, 1 if must reopen device, or an error code.
+ */
+int put_param1_bool(pcl_state_t *, gs_param_name pkey, bool val);
+int put_param1_float(pcl_state_t *, gs_param_name pkey, floatp val);
+int put_param1_int(pcl_state_t *, gs_param_name pkey, int val);
+int put_param1_float_array(pcl_state_t *, gs_param_name pkey, float val_array[2]);
+int put_param1_string(pcl_state_t *pcs, gs_param_name pkey, const char *val);
+
+#endif /* pcparam_INCLUDED */
diff --git a/pcl/pcparse.c b/pcl/pcparse.c
new file mode 100644
index 000000000..926fe05d1
--- /dev/null
+++ b/pcl/pcparse.c
@@ -0,0 +1,647 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcparse.c */
+/* PCL5 parser */
+#include "stdio_.h"
+#include "gdebug.h"
+#include "gstypes.h"
+#include "scommon.h"
+#include "pcparse.h"
+#include "pcstate.h" /* for display_functions */
+#include "pcursor.h"
+#include "rtgmode.h"
+
+/* We don't know whether an Enable Display Functions takes effect while */
+/* defining a macro. To play it safe, we're providing both options. */
+/* If the following #define is uncommented, E.D.F. *does* take effect */
+/* while scanning a macro definition. */
+/*#define DISPLAY_FUNCTIONS_IN_MACRO*/
+
+/* ---------------- Command definition ---------------- */
+
+/* Register a command. Return true if this is a redefinition. */
+static bool
+pcl_register_command(byte *pindex, const pcl_command_definition_t *pcmd,
+ pcl_parser_state_t *pcl_parser_state)
+{ int index = pcl_parser_state->definitions->pcl_command_next_index;
+ byte prev = *pindex;
+
+ if ( prev != 0 && prev <= index && pcl_parser_state->definitions->pcl_command_list[prev] == pcmd )
+ index = prev;
+ else if ( index != 0 && pcl_parser_state->definitions->pcl_command_list[index] == pcmd )
+ ;
+ else
+ pcl_parser_state->definitions->pcl_command_list[pcl_parser_state->definitions->pcl_command_next_index = ++index] = (pcl_command_definition_t *)pcmd;
+ *pindex = index;
+ return (prev != 0 && prev != index);
+}
+
+/* Define a command or list of commands. */
+void
+pcl_define_control_command(int/*char*/ chr, const pcl_command_definition_t *pcmd,
+ pcl_parser_state_t *pcl_parser_state)
+{
+#ifdef DEBUG
+ if ( chr < 0 || chr >= countof(pcl_parser_state->definitions->pcl_control_command_indices) )
+ if_debug1('I', "Invalid control character %d\n", chr);
+ else if (
+#endif
+ pcl_register_command(&pcl_parser_state->definitions->pcl_control_command_indices[chr], pcmd, pcl_parser_state)
+#ifdef DEBUG
+ )
+ if_debug1('I', "Redefining control character %d\n", chr);
+#endif
+ ;
+}
+void
+pcl_define_escape_command(int/*char*/ chr,
+ const pcl_command_definition_t *pcmd,
+ pcl_parser_state_t *pcl_parser_state)
+{
+#ifdef DEBUG
+ if ( chr < min_escape_2char || chr > max_escape_2char )
+ if_debug1('I', "Invalid escape character %c\n", chr);
+ else if (
+#endif
+ pcl_register_command(&pcl_parser_state->definitions->pcl_escape_command_indices
+ [chr - min_escape_2char], pcmd,
+ pcl_parser_state)
+#ifdef DEBUG
+ )
+ if_debug1('I', "Redefining ESC %c\n", chr)
+#endif
+ ;
+}
+
+/*
+ * Convert escape classes to second level dispatch indices.
+ */
+static const byte pcl_escape_class_indices[max_escape_class - min_escape_class + 1] = {
+ 0, 0, 0, 0, 1/*%*/, 2/*&*/, 0, 3/*(*/, 4/*)*/, 5/***/, 0, 0, 0, 0, 0
+};
+
+void
+pcl_define_class_command(int/*char*/ class, int/*char*/ group,
+ int/*char*/ command,
+ const pcl_command_definition_t *pcmd,
+ pcl_parser_state_t *pcl_parser_state)
+{
+#ifdef DEBUG
+ if ( class < min_escape_class || class > max_escape_class ||
+ pcl_escape_class_indices[class - min_escape_class] == 0 ||
+ (group != 0 && (group < min_escape_group || group > max_escape_group)) ||
+ command < min_escape_command || command > max_escape_command
+ )
+ if_debug3('I', "Invalid command %c %c %c\n", class, group, command);
+ else if (
+#endif
+ pcl_register_command(&pcl_parser_state->definitions->pcl_grouped_command_indices
+ [pcl_escape_class_indices[class - min_escape_class] - 1]
+ [group == 0 ? 0 : group - min_escape_group + 1]
+ [command - min_escape_command], pcmd,
+ pcl_parser_state)
+#ifdef DEBUG
+ )
+ if_debug3('I', "Redefining ESC %c %c %c\n", class,
+ (group == 0 ? ' ' : group), command)
+#endif
+ ;
+}
+void
+pcl_define_class_commands(int/*char*/ class,
+ const pcl_grouped_command_definition_t *pgroup,
+ pcl_parser_state_t *pcl_parser_state)
+{ const pcl_grouped_command_definition_t *pgc = pgroup;
+
+ for ( ; pgc->command != 0; ++pgc )
+ pcl_define_class_command(class, pgc->group, pgc->command,
+ &pgc->defn, pcl_parser_state);
+}
+
+/*
+ * Look up an escape command. The arguments are as follows:
+ * ESC x 0, 0, 'x'
+ * ESC ? <arg> c '?', 0, 'c'
+ * ESC ? b <arg> c '?', 'b', 'c'
+ * The caller is responsible for providing valid arguments.
+ */
+static const pcl_command_definition_t *
+pcl_get_command_definition(pcl_parser_state_t *pcl_parser_state,
+ int/*char*/ class,
+ int/*char*/ group,
+ int/*char*/ command)
+{ const pcl_command_definition_t *cdefn = 0;
+
+ if ( class == 0 )
+ {if ( command >= min_escape_2char && command <= max_escape_2char )
+ cdefn = pcl_parser_state->definitions->pcl_command_list
+ [pcl_parser_state->definitions->pcl_escape_command_indices[command - min_escape_2char]];
+ }
+ else
+ { int class_index = pcl_escape_class_indices[class - min_escape_class];
+ if ( class_index )
+ cdefn = pcl_parser_state->definitions->pcl_command_list
+ [pcl_parser_state->definitions->pcl_grouped_command_indices[class_index - 1]
+ [group ? group - min_escape_group + 1 : 0]
+ [command - min_escape_command]
+ ];
+ }
+#ifdef DEBUG
+ if ( cdefn == 0 )
+ { if ( class == 0 )
+ if_debug1('I', "ESC %c undefined\n", command);
+ else if ( group == 0 )
+ if_debug2('I', "ESC %c %c undefined\n", class, command);
+ else
+ if_debug3('I', "ESC %c %c %c undefined\n", class, group, command);
+ }
+#endif
+ return cdefn;
+}
+
+/* ---------------- Parsing ---------------- */
+
+/* Initialize the parser state. */
+void
+pcl_process_init(pcl_parser_state_t *pst)
+{ pcl_parser_init_inline(pst);
+}
+
+/* Adjust the argument value according to the command's argument type. */
+/* Return 1 if the command should be ignored. */
+static int
+pcl_adjust_arg(pcl_args_t *pargs, const pcl_command_definition_t *pdefn)
+{ uint acts = pdefn->actions;
+
+ if ( value_is_neg(&pargs->value) )
+ { switch ( acts & pca_neg_action )
+ {
+ case pca_neg_clamp:
+ arg_set_uint(pargs, 0); break;
+ case pca_neg_error:
+ return e_Range;
+ case pca_neg_ignore:
+ return 1;
+ default: /* case pca_neg_ok */
+ ;
+ }
+ }
+ else if ( pargs->value.i > 32767 ) /* overflowed int range */
+ switch ( acts & pca_big_action )
+ {
+ case pca_big_clamp:
+ arg_set_uint(pargs, 32767); break;
+ case pca_big_error:
+ return e_Range;
+ case pca_big_ignore:
+ return 1;
+ default: /* case pca_big_ok */
+ ;
+ }
+ return 0;
+}
+
+/* Append some just-scanned input data to the macro being defined. */
+static int
+append_macro(const byte *from, const byte *to, pcl_state_t *pcs)
+{ uint count = to - from;
+ uint size = gs_object_size(pcs->memory, pcs->macro_definition);
+ byte *new_defn =
+ gs_resize_object(pcs->memory, pcs->macro_definition, size + count,
+ "append_macro");
+
+ if ( new_defn == 0 )
+ return_error(e_Memory);
+ memcpy(new_defn + size, from + 1, count);
+ pcs->macro_definition = new_defn;
+ return 0;
+}
+
+/* Process a buffer of PCL commands. */
+int
+pcl_process(pcl_parser_state_t *pst, pcl_state_t *pcs, stream_cursor_read *pr)
+{ const byte *p = pr->ptr;
+ const byte *rlimit = pr->limit;
+ int code = 0;
+ bool in_macro = pcs->defining_macro;
+ /* Record how much of the input we've copied into a macro */
+ /* in the process of being defined. */
+ const byte *macro_p = p;
+
+/* Reset the parameter scanner */
+#define avalue pst->args.value
+#define param_init()\
+ (avalue.type = pcv_none, avalue.i = 0)
+
+#ifdef DISPLAY_FUNCTIONS_IN_MACRO
+# define do_display_functions() 1
+#else
+# define do_display_functions() (!in_macro)
+#endif
+
+ while ( p < rlimit )
+ { byte chr;
+ const pcl_command_definition_t *cdefn = NULL;
+
+ switch ( pst->scan_type )
+ {
+ case scanning_data:
+ { /* Accumulate command data in a buffer. */
+ uint count = uint_arg(&pst->args);
+ uint pos = pst->data_pos;
+
+ if ( pos < count )
+ { uint avail = rlimit - p;
+ uint copy = min(count - pos, avail);
+
+ memcpy(pst->args.data + pos, p + 1, copy);
+ pst->data_pos += copy;
+ p += copy;
+ continue;
+ }
+ /* Invoke the command. */
+ cdefn = pcl_get_command_definition(pst,
+ pst->param_class,
+ pst->param_group,
+ pst->args.command);
+ pst->scan_type = scanning_none;
+ break;
+ }
+ case scanning_display:
+ { /* Display, don't execute, all characters. */
+ chr = *++p;
+ if ( chr == ESC )
+ { int index;
+ if ( p >= rlimit )
+ goto x;
+ if ( p[1] >= min_escape_2char && p[1] <= max_escape_2char &&
+ (index = pst->definitions->pcl_escape_command_indices[p[1] - min_escape_2char]) != 0 &&
+ pst->definitions->pcl_command_list[index]->proc ==
+ pcl_disable_display_functions
+ )
+ { if ( do_display_functions() )
+ { pst->args.command = chr;
+ code = pcl_plain_char(&pst->args, pcs);
+ if ( code < 0 )
+ goto x;
+ }
+ pst->args.command = chr = *++p;
+ pcl_disable_display_functions(&pst->args, pcs);
+ pst->scan_type = scanning_none;
+ }
+ }
+ if ( do_display_functions() )
+ { if ( chr == CR )
+ { pcl_do_CR(pcs);
+ code = pcl_do_LF(pcs);
+ }
+ else
+ { pst->args.command = chr;
+ code = pcl_plain_char(&pst->args, pcs);
+ }
+ if ( code < 0 )
+ goto x;
+ }
+ continue;
+ }
+ case scanning_parameter:
+ for ( ; ; )
+ { if ( p >= rlimit )
+ goto x;
+ chr = *++p;
+ /*
+ * The parser for numbers is very lenient, and accepts
+ * many strings that aren't valid numbers. If this
+ * ever becomes a problem, we can tighten it up....
+ */
+ if ( chr >= '0' && chr <= '9' )
+ { chr -= '0';
+ if ( value_is_float(&avalue) )
+ avalue.fraction += (chr / (pst->scale *= 10));
+ else
+ avalue.type |= pcv_int,
+ avalue.i = avalue.i * 10 + chr;
+ }
+ else if ( chr == '-' )
+ avalue.type |= pcv_neg;
+ else if ( chr == '+' )
+ avalue.type |= pcv_pos;
+ else if ( chr == '.' )
+ avalue.type |= pcv_float,
+ avalue.fraction = 0,
+ pst->scale = 1.0;
+ else if ( chr >= ' ' && chr <= '?' )
+ { /* Ignore garbage nearby in the code space. */
+ continue;
+ }
+ else
+ break;
+ }
+#ifdef DEBUG
+ if ( gs_debug_c('i') )
+ { dprintf2("(ESC %c %c)",
+ pst->param_class, pst->param_group);
+ if ( value_is_present(&avalue) )
+ { dputc(' ');
+ if ( value_is_signed(&avalue) )
+ dputc((value_is_neg(&avalue) ? '-' : '+'));
+ if ( value_is_float(&avalue) )
+ dprintf1("%g", avalue.i + avalue.fraction);
+ else
+ dprintf1("%u", avalue.i);
+ }
+ dprintf1(" %c\n", chr);
+ }
+#endif
+ if ( chr >= min_escape_command + 32 &&
+ chr <= max_escape_command + 32
+ )
+ chr -= 32;
+ else if ( chr >= min_escape_command &&
+ chr <= max_escape_command
+ )
+ pst->scan_type = scanning_none;
+ else
+ { pst->scan_type = scanning_none;
+ /* Rescan the out-of-place character. */
+ --p;
+ continue;
+ }
+ /* Dispatch on param_class, param_group, and chr. */
+ cdefn = pcl_get_command_definition(pst,
+ pst->param_class,
+ pst->param_group,
+ chr);
+ if ( cdefn )
+ { if_debug1('i', " [%s]\n", cdefn->cname);
+ code = pcl_adjust_arg(&pst->args, cdefn);
+ if ( code < 0 )
+ goto x;
+ if ( cdefn->actions & pca_byte_data ) {
+ uint count = uint_arg(&pst->args);
+ if ( (count > 0 ) && (rlimit - p <= count) ) {
+ pst->args.data =
+ gs_alloc_bytes(pcs->memory, count,
+ "command data");
+ if ( pst->args.data == 0 )
+ { --p;
+ code = gs_note_error(e_Memory);
+ goto x;
+ }
+ pst->args.data_on_heap = true;
+ pst->args.command = chr;
+ pst->data_pos = 0;
+ pst->scan_type = scanning_data;
+ continue;
+ }
+ pst->args.data = (byte *)(p + 1);
+ pst->args.data_on_heap = false;
+ p += count;
+ }
+ break;
+ }
+ param_init();
+ continue;
+ case scanning_none:
+ if ( pcs->parse_other )
+ { /*
+ * Hand off the data stream
+ * to another parser (HP-GL/2).
+ */
+ pr->ptr = p;
+ code = (*pcs->parse_other)
+ (pcs->parse_data, pcs, pr);
+ p = pr->ptr;
+ if ( code < 0 || (code == 0 && pcs->parse_other) )
+ goto x;
+ }
+ chr = *++p;
+ /* check for double byte scanning */
+ if ( pcl_char_is_2_byte(chr, pcs->text_parsing_method ) ) {
+ /* we need to have at least 2 bytes - check if we need more data */
+ if ( p >= rlimit ) {
+ --p;
+ goto x;
+ }
+ if_debug2('i', "%x%x\n", p[0], p[1]);
+ code = pcl_text(p, 2, pcs, false);
+ if ( code < 0 ) goto x;
+ /* now pass over the second byte */
+ p++;
+ cdefn = NULL;
+ } else if ( chr != ESC )
+ { if_debug1('i',
+ (chr == '\\' ? "\\%c\n" :
+ chr >= 33 && chr <= 126 ?
+ "%c\n" : "\\%03o\n"),
+ chr);
+ cdefn = pst->definitions->pcl_command_list
+ [chr < 33 ?
+ pst->definitions->pcl_control_command_indices[chr] :
+ pst->definitions->pcl_control_command_indices[1]];
+ if ( (cdefn == 0 ||
+ cdefn->proc == pcl_plain_char) &&
+ !in_macro &&
+ !pcs->parse_other &&
+ !pcs->raster_state.graphics_mode
+ )
+ { /*
+ * Look ahead for a run of plain text.
+ * We can be very conservative about this,
+ * because this is only a performance
+ * enhancement.
+ */
+ const byte *str = p;
+ while ( p < rlimit && p[1] >= 32 &&
+ p[1] <= 127
+ )
+ { if_debug1('i', "%c", p[1]);
+ ++p;
+ }
+
+ if_debug0('i', "\n");
+ code = pcl_text(str, (uint)(p + 1 - str),
+ pcs, false);
+ if ( code < 0 )
+ goto x;
+ cdefn = NULL;
+ }
+ }
+ else
+ { if ( p >= rlimit ) { --p; goto x; }
+ chr = *++p;
+ if ( chr < min_escape_class ||
+ chr > max_escape_class
+ )
+ { if_debug1('i',
+ (chr >= 33 && chr <= 126 ?
+ "ESC %c\n" :
+ "ESC \\%03o\n"),
+ chr);
+ cdefn =
+ pcl_get_command_definition(pst, 0, 0, chr);
+ if ( !cdefn )
+ {
+ /* Skip the ESC, back up
+ to the char following the
+ ESC. */
+ --p;
+ continue;
+ }
+ if_debug1('i', " [%s]\n",
+ cdefn->cname);
+ }
+ else
+ { if ( p >= rlimit ) { p -= 2; goto x; }
+ pst->param_class = chr;
+ chr = *++p;
+ if ( chr < min_escape_group ||
+ chr > max_escape_group
+ )
+ { /* Class but no group */
+ --p;
+ chr = 0;
+ }
+ pst->param_group = chr;
+ if_debug2('i', "ESC %c %c\n",
+ pst->param_class, chr);
+ pst->scan_type = scanning_parameter;
+ param_init();
+ continue;
+ }
+ }
+ break;
+ }
+ if ( cdefn == NULL )
+ { param_init();
+ continue;
+ }
+ if ( !in_macro || (cdefn->actions & pca_in_macro) )
+ { /* This might be the end-of-macro command. */
+ /* Make sure all the data through this point */
+ /* has been captured in the macro definition. */
+ if ( in_macro )
+ { code = append_macro(macro_p, p, pcs);
+ macro_p = p;
+ if ( code < 0 )
+ goto x;
+ }
+ pst->args.command = chr;
+ if ( !pcs->raster_state.graphics_mode ||
+ (cdefn->actions & pca_raster_graphics) ||
+ (code = pcl_end_graphics_mode(pcs)) >= 0
+ ) {
+ if ( (pcs->personality != rtl) ||
+ ((pcs->personality == rtl) && (cdefn->actions & pca_in_rtl)) )
+ code = (*cdefn->proc)(&pst->args, pcs);
+ }
+ /*
+ * If we allocated a buffer for command data,
+ * and the command didn't take possession of it,
+ * free it now. */
+ if ( pst->args.data_on_heap && pst->args.data )
+ { gs_free_object(pcs->memory, pst->args.data,
+ "command data");
+ pst->args.data = 0;
+ }
+ if ( code == e_Unimplemented )
+ {
+#if e_Unimplemented != 0
+ if_debug0('i', "Unimplemented\n");
+#endif
+ }
+ else if ( code < 0 )
+ break;
+ if ( pcs->display_functions )
+ { /* This calls for a special parsing state. */
+ pst->scan_type = scanning_display;
+ }
+ if ( pcs->defining_macro && !in_macro )
+ { /* We just started a macro definition. */
+ if (pst->scan_type != scanning_none)
+ { /* combinded command started macro */
+ /* start definition of macro with esc& preloaded */
+ static const byte macro_prefix[3] = " \033&";
+ append_macro(&macro_prefix[0], &macro_prefix[2], pcs);
+ }
+ macro_p = p;
+ }
+ in_macro = pcs->defining_macro;
+ }
+ else
+ { /*
+ * If we allocated a buffer for command data,
+ * free it now.
+ */
+ if ( pst->args.data_on_heap && pst->args.data )
+ { gs_free_object(pcs->memory, pst->args.data,
+ "command data");
+ pst->args.data = 0;
+ }
+ }
+ param_init();
+ }
+x: pr->ptr = p;
+ /* Append the last bit of data to the macro, if defining. */
+ if ( in_macro )
+ { int mcode = append_macro(macro_p, p, pcs);
+ if ( mcode < 0 && code >= 0 )
+ code = mcode;
+ }
+ return code;
+}
+
+/* inialize the pcl command counter */
+ int
+pcl_init_command_index(pcl_parser_state_t *pcl_parser_state, pcl_state_t *pcs)
+{
+ pcl_command_definitions_t *definitions =
+ (pcl_command_definitions_t *)gs_alloc_bytes(pcs->memory,
+ sizeof(pcl_command_definitions_t),
+ "pcl_init_command_index");
+ /* fatal */
+ if ( definitions == 0 )
+ return -1;
+ /* we should set these individually but each field is properly
+ initialized to zero */
+ memset(definitions, 0, sizeof(pcl_command_definitions_t));
+ /* plug command definitions into the parser state and a pointer
+ for the command definitions into pcl's state for use by macros,
+ I don't like this but the alternative is getting the parser
+ state to the code that executer macros which is inconvenient at
+ this time */
+ pcs->pcl_commands = pcl_parser_state->definitions = definitions;
+ return 0;
+}
+
+/* for now deallocates the memory associated with the command definitions */
+ int
+pcl_parser_shutdown(pcl_parser_state_t *pcl_parser_state, gs_memory_t *mem)
+{
+ gs_free_object(mem, pcl_parser_state->definitions,
+ "pcl_parser_shutdown");
+ return 0;
+}
+/* ---------------- Initialization ---------------- */
+
+void
+pcparse_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{
+ if ( type & (pcl_reset_initial | pcl_reset_printer) )
+ pcs->parse_other = 0;
+}
+
+const pcl_init_t pcparse_init = {
+ 0, pcparse_do_reset
+};
diff --git a/pcl/pcparse.h b/pcl/pcparse.h
new file mode 100644
index 000000000..747882925
--- /dev/null
+++ b/pcl/pcparse.h
@@ -0,0 +1,110 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcparse.h */
+/* Interface and definitions for PCL5 parser */
+
+#ifndef pcparse_INCLUDED
+# define pcparse_INCLUDED
+
+#include "gsmemory.h"
+#include "scommon.h"
+#include "pcommand.h"
+
+/* Define the lexical state of the scanner. */
+typedef enum {
+ scanning_none,
+ scanning_parameter,
+ scanning_display, /* display_functions mode */
+ scanning_data /* data following a command */
+} pcl_scan_type_t;
+
+#define min_escape_2char '0'
+#define max_escape_2char '~'
+#define min_escape_class '!'
+#define max_escape_class '/'
+#define min_escape_group '`'
+#define max_escape_group '~'
+#define min_escape_command '@' /* or '`' */
+#define max_escape_command '^' /* or '~' */
+
+typedef struct pcl_command_definitions_s {
+ /*
+ * First-level dispatch for control characters.
+ */
+ byte pcl_control_command_indices[33];
+ /*
+ * Second-level dispatch for 2-character escape sequences.
+ */
+ byte pcl_escape_command_indices[max_escape_2char - min_escape_2char + 1];
+ /*
+ * Dispatch on class, group, and command.
+ */
+ byte pcl_grouped_command_indices
+ [5 /* number of implemented classes, see escape_class_indices above */]
+ [1 + max_escape_group - min_escape_group + 1]
+ [max_escape_command - min_escape_command + 1];
+ int pcl_command_next_index;
+ /*
+ * We register all the PCL5* commands dynamically, for maximum configuration
+ * flexibility. pcl_command_list points to the individual command
+ * definitions; as each command is registered, we enter it in the list, and
+ * then store its index in the actual dispatch table
+ * (pcl_xxx_command_xxx_indices).
+ */
+ pcl_command_definition_t *pcl_command_list[256];
+} pcl_command_definitions_t;
+
+/* Define the state of the parser. */
+struct pcl_parser_state_s {
+ /* Internal state */
+ pcl_scan_type_t scan_type;
+ pcl_args_t args;
+ double scale; /* for accumulating floating numbers */
+ byte param_class, param_group; /* for parameterized commands */
+ uint data_pos; /* for data crossing buffer boundaries */
+ hpgl_parser_state_t *hpgl_parser_state;
+ pcl_command_definitions_t *definitions;
+};
+#define pcl_parser_init_inline(pst)\
+ ((pst)->scan_type = scanning_none, (pst)->args.data = 0, (pst)->args.data_on_heap = false)
+
+/* Define the prefix of a macro definition. */
+typedef struct pcl_macro_s {
+ pcl_data_storage_t storage;
+} pcl_macro_t;
+
+/* ---------------- Procedural interface ---------------- */
+
+/* Allocate a parser state. */
+pcl_parser_state_t *pcl_process_alloc(gs_memory_t *memory);
+
+/* Initialize the PCL parser. */
+void pcl_process_init(pcl_parser_state_t *pst);
+
+/* Process a buffer of PCL commands. */
+int pcl_process(pcl_parser_state_t *pst, pcl_state_t *pcs,
+ stream_cursor_read *pr);
+
+/* Execute a macro (in pcmacros.c). */
+int pcl_execute_macro(const pcl_macro_t *pmac, pcl_state_t *pcs,
+ pcl_copy_operation_t before, pcl_reset_type_t reset,
+ pcl_copy_operation_t after);
+
+void pcparse_do_reset(pcl_state_t *pcs, pcl_reset_type_t type);
+
+int pcl_init_command_index(pcl_parser_state_t *pcl_parser_state, pcl_state_t *pcs);
+
+/* shutdown the pcl parser */
+int pcl_parser_shutdown(pcl_parser_state_t *pcl_parser_state, gs_memory_t *mem);
+#endif /* pcparse_INCLUDED */
diff --git a/pcl/pcpatrn.c b/pcl/pcpatrn.c
new file mode 100644
index 000000000..4f6471ea9
--- /dev/null
+++ b/pcl/pcpatrn.c
@@ -0,0 +1,1464 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpatrn.c - code for PCL and GL/2 patterns, including color */
+
+#include "gx.h"
+#include "gsuid.h"
+#include "gsmatrix.h"
+#include "gspcolor.h"
+#include "gxdcolor.h"
+#include "gxpcolor.h"
+#include "gxstate.h"
+#include "pccid.h"
+#include "pcfont.h"
+#include "pcpalet.h"
+#include "pcfrgrnd.h"
+#include "pcht.h"
+#include "pcwhtidx.h"
+#include "pcpatrn.h"
+#include "pcbiptrn.h"
+#include "pcuptrn.h"
+#include "pcpatxfm.h"
+
+
+
+/*
+ * The base color space for setting the color white. Unlike all other color
+ * spaces in PCL, this uses the DeviceGray color space in the graphic library.
+ *
+ * A copy of the default halftone is also maintained for setting the color
+ * "white". Since the halftone carries the device-specific color lookup tables,
+ * a non-standard halftone might end up mapping white to black (definitely
+ * undesirable).
+ */
+static const gs_paint_color white_paint = {{ 1.0, 0.0, 0.0, 0.0 }};
+
+/* GC routines */
+private_st_ccolor_t();
+
+
+/*
+ * Convert a color value specified as a three-element byte array, or an index
+ * to a palette, into a gs_paint_color structure.
+ */
+static void
+convert_color_to_paint(
+ const byte * pcomp,
+ gs_paint_color * ppaint
+)
+{
+ ppaint->values[0] = (float)pcomp[0] / 255.0;
+ ppaint->values[1] = (float)pcomp[1] / 255.0;
+ ppaint->values[2] = (float)pcomp[2] / 255.0;
+ ppaint->values[3] = 0.0;
+}
+
+static void
+convert_index_to_paint(
+ int indx,
+ gs_paint_color * ppaint
+)
+{
+ ppaint->values[0] = indx;
+ ppaint->values[1] = 0.0;
+ ppaint->values[2] = 0.0;
+ ppaint->values[3] = 0.0;
+}
+
+/*
+ * Set the halftone and color rendering dictionary objects from the
+ * current palette. This will check that the palette is complete.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+static int
+set_ht_crd_from_palette(
+ pcl_state_t * pcs
+)
+{
+ int code = 0;
+ pcl_cspace_type_t cstype = pcl_palette_get_cspace(pcs->ppalet);
+ pcl_palette_t * ppalet = 0;
+
+ /* check that the palette is complete */
+ pcl_palette_check_complete(pcs);
+ ppalet = pcs->ppalet;
+
+ /* install crd and ht */
+ code = pcl_ht_set_halftone(pcs, &(ppalet->pht), cstype, false);
+ if (code == 0)
+ code = pcl_crd_set_crd(&(ppalet->pcrd), pcs);
+ return code;
+}
+
+/*
+ * Set the halftone and color rendering dictionary objects from the current
+ * foreground.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+static int
+set_ht_crd_from_foreground(
+ pcl_state_t * pcs
+)
+{
+ int code = 0;
+ pcl_frgrnd_t * pfrgrnd = pcs->pfrgrnd;
+ pcl_cspace_type_t cstype = pcl_frgrnd_get_cspace(pfrgrnd);
+
+ /* install crd and ht */
+ code = pcl_ht_set_halftone(pcs, &(pfrgrnd->pht), cstype, false);
+ if (code == 0)
+ code = pcl_crd_set_crd(&(pfrgrnd->pcrd), pcs);
+ return code;
+}
+
+
+/*
+ * Free a PCL client color structure.
+ */
+static void
+free_ccolor(
+ gs_memory_t * pmem,
+ void * pvccolor,
+ client_name_t cname
+)
+{
+ pcl_ccolor_t * pccolor = (pcl_ccolor_t *)pvccolor;
+
+ pcl_pattern_data_release(pccolor->ppat_data);
+ pcl_cs_indexed_release(pccolor->pindexed);
+ pcl_cs_base_release(pccolor->pbase);
+ if (pccolor->prast != 0)
+ gs_free_object(pmem, (void *)pccolor->prast, cname);
+ gs_pattern_reference(&(pccolor->ccolor), -1);
+ gs_free_object(pmem, pvccolor, cname);
+}
+
+/*
+ * Make a unique copy of a PCL client color structure. This function also
+ * serves as the allocator function.
+ *
+ * Because the byte array pointed to by the prast structure is not reference
+ * counted, the "copy" of the client color created this procedure will always
+ * have this pointer set to NULL. This is unfortunate and ugly, as it implies
+ * the copy cannot be used immediately as a client color, but it causes no
+ * trouble in the current context because:
+ *
+ * prast is non-null only for colored patterns
+ * the client color for a colored pattern would only be unshared
+ * if it was about to be rendered, in which case the prast
+ * array would need to be recreated.
+ *
+ * Newly created colors are solid white.
+ */
+static int
+unshare_ccolor(
+ pcl_state_t * pcs,
+ pcl_ccolor_t ** ppccolor,
+ gs_memory_t * pmem
+)
+{
+ pcl_ccolor_t * pold = *ppccolor;
+ pcl_ccolor_t * pnew = 0;
+
+ if ((pold != NULL) && (pold->rc.ref_count == 1)) {
+ if (pold->prast != 0)
+ gs_free_object( pmem,
+ (void *)pold->prast,
+ "unshared PCL client color"
+ );
+ pold->prast = 0;
+ return 0;
+ }
+ rc_decrement(pold, "unshare PCL client color object");
+
+ rc_alloc_struct_1( pnew,
+ pcl_ccolor_t,
+ &st_ccolor_t,
+ pmem,
+ return e_Memory,
+ "allocate PCL client color"
+ );
+ pnew->rc.free = free_ccolor;
+ pnew->prast = 0;
+
+ if (pold != 0) {
+ pnew->type = pold->type;
+ pcl_pattern_data_init_from(pnew->ppat_data, pold->ppat_data);
+ pcl_cs_indexed_init_from(pnew->pindexed, pold->pindexed);
+ pcl_cs_base_init_from(pnew->pbase, pold->pbase);
+ pnew->ccolor = pold->ccolor;
+ gs_pattern_reference(&(pnew->ccolor), 1);
+ } else {
+ pnew->type = pcl_ccolor_unpatterned;
+ pnew->ppat_data = 0;
+ pnew->pindexed = 0;
+
+ /* set the color space to pure white */
+ pnew->pbase = 0;
+ (void)pcl_cs_base_build_white_cspace(pcs, &(pnew->pbase), pmem);
+ pnew->ccolor.paint = white_paint;
+ pnew->ccolor.pattern = 0;
+ }
+
+ *ppccolor = pnew;
+ return 0;
+}
+
+/*
+ * Set a solid color (unpattered) color. This is handled separately from
+ * patterns as it will usually not be necessary to build a PCL client color
+ * structure in this case.
+ *
+ * Exactly one of the pair of operands pbase and pindex shoud be non-null.
+ */
+static int
+set_unpatterned_color(
+ pcl_state_t * pcs,
+ pcl_cs_indexed_t * pindexed,
+ pcl_cs_base_t * pbase,
+ const gs_paint_color * ppaint
+)
+{
+ pcl_ccolor_t * pcur = pcs->pids->pccolor;
+ int code = 0;
+ pcl_ccolor_type_t type;
+
+ if ( pcur != 0 )
+ type = pcur->type;
+ else
+ type = pcl_ccolor_unpatterned;
+
+ if ( (pcur != 0) &&
+ (type == pcl_ccolor_unpatterned) &&
+ (pcur->pindexed == pindexed) &&
+ (pcur->pbase == pbase) &&
+ (pcur->ccolor.paint.values[0] == ppaint->values[0]) &&
+ (pcur->ccolor.paint.values[1] == ppaint->values[1]) &&
+ (pcur->ccolor.paint.values[2] == ppaint->values[2]) )
+ return 0;
+
+ if ( (code = unshare_ccolor(pcs, &(pcs->pids->pccolor), pcs->memory)) < 0 )
+ return code;
+ pcur = pcs->pids->pccolor;
+
+ pcur->type = pcl_ccolor_unpatterned;
+ if (pcur->ppat_data != 0) {
+ pcl_pattern_data_release(pcur->ppat_data);
+ pcur->ppat_data = 0;
+ }
+
+ if (pindexed != 0) {
+ if ((type != pcl_ccolor_unpatterned) || (pcur->pindexed != pindexed))
+ code = pcl_cs_indexed_install(&pindexed, pcs);
+ } else { /* pbase != 0 */
+ if ((type != pcl_ccolor_unpatterned) || (pcur->pbase != pbase))
+ code = pcl_cs_base_install(&pbase, pcs);
+ }
+ if (code < 0)
+ return code;
+ pcl_cs_indexed_copy_from(pcur->pindexed, pindexed);
+ pcl_cs_base_copy_from(pcur->pbase, pbase);
+
+ gs_pattern_reference(&(pcur->ccolor), -1);
+ pcur->ccolor.pattern = 0;
+ pcur->ccolor.paint = *ppaint;
+ return gs_setcolor(pcs->pgs, &(pcur->ccolor));
+}
+
+/*
+ * Set a patterned color space. Note that this is a substantially different
+ * operation from setting a solid (unpatterned) color.
+ */
+static int
+set_patterned_color(
+ pcl_state_t * pcs,
+ pcl_ccolor_t * pnew
+)
+{
+ pcl_ccolor_t * pcur = pcs->pids->pccolor;
+ int code = 0;
+
+ /* check if already set */
+ if (pcur == pnew)
+ return 0;
+
+ /* set a base color space for the pattern, if necessary */
+ if (pnew->type == pcl_ccolor_mask_pattern) {
+
+ if ( (pnew->pindexed != 0) &&
+ ((pcur == 0) || (pcur->pindexed != pnew->pindexed)) )
+ code = pcl_cs_indexed_install(&(pnew->pindexed), pcs);
+
+ if ( (pnew->pbase != 0) &&
+ ((pcur == 0) || (pcur->pbase != pnew->pbase)) )
+ code = pcl_cs_base_install(&(pnew->pbase), pcs);
+ }
+ if (code < 0)
+ return code;
+
+ /* set the pattern instance */
+ if ((code = gs_setpattern(pcs->pgs, &(pnew->ccolor))) >= 0)
+ pcl_ccolor_copy_from(pcs->pids->pccolor, pnew);
+ return code;
+}
+
+/*
+ * Check if the pattern pointed to by pptrn has a rendering and, if so, whether
+ * or not that rendering is appropriate for the curren environment.
+ *
+ * If the rendering is appropriate, install the conrresponding color; otherwise
+ * return false.
+ *
+ * The case of GL uncolored patterns rendered with patterns opaque is unique.
+ * In this case the pattern must be generated as a colored pattern (mask
+ * patterns are always transparent), with a specially generated 2-entry
+ * indexed color space. The cache_id field identifies the palette that gave
+ * rise to this pattern, but not the entry from that palette that was used
+ * as the foreground color. Hence, for this case alone there must be a match
+ * on the pen number key. To avoid the need for a much qualified check in this
+ * case, we use the convention that the pen number field is zero in all but
+ * this case.
+ *
+ * Note that a difference in the paint color does not require re-rendering;
+ * these fields are ignored for colored patterns, and for mask patterns changes
+ * only require another call to gs_setpattern.
+ */
+static bool
+check_pattern_rendering(
+ pcl_state_t * pcs,
+ pcl_pattern_t * pptrn,
+ bool use_frgrnd, /* else use palette */
+ uint pen_num,
+ bool colored,
+ const gs_paint_color * ppaint
+)
+{
+ pcl_ccolor_t * pccolor = 0;
+
+ /* check the common parameters first */
+ if ( (pptrn->orient != pcs->pat_orient) ||
+ (pptrn->ref_pt.x != pcs->pat_ref_pt.x) ||
+ (pptrn->ref_pt.y != pcs->pat_ref_pt.y) )
+ return false;
+
+ if (colored) {
+ pcl_gsid_t cache_id = ( use_frgrnd ? pcs->pfrgrnd->id
+ : pcs->ppalet->id );
+
+ /* check that there is a rendering in the appropriate environment */
+ if ( ((pccolor = pptrn->pcol_ccolor) == 0) ||
+ (pptrn->transp != pcs->pattern_transparent) ||
+ (pptrn->cache_id != cache_id) ||
+ (pptrn->pen != pen_num) )
+ return false;
+
+ } else { /* mask pattern */
+ pcl_cs_indexed_t * pindexed = (use_frgrnd ? 0 : pcs->ppalet->pindexed);
+ pcl_cs_base_t * pbase = (use_frgrnd ? pcs->pfrgrnd->pbase : 0);
+
+ /* check if there is a rendering */
+ if ((pccolor = pptrn->pmask_ccolor) == 0)
+ return false;
+
+ /* handle changes in the "foreground" color or color space */
+ if ( (pccolor->ccolor.paint.values[0] != ppaint->values[0]) ||
+ (pccolor->ccolor.paint.values[1] != ppaint->values[1]) ||
+ (pccolor->ccolor.paint.values[2] != ppaint->values[2]) ||
+ (pccolor->pindexed != pindexed) ||
+ (pccolor->pbase != pbase) ) {
+
+ /* get a unique copy, and update the painting information */
+ if (unshare_ccolor(pcs, &(pptrn->pmask_ccolor), pcs->memory) < 0)
+ return false;
+ pccolor = pptrn->pmask_ccolor;
+
+ pcl_cs_indexed_copy_from(pccolor->pindexed, pindexed);
+ pcl_cs_base_copy_from(pccolor->pbase, pbase);
+ pccolor->ccolor.paint = *ppaint;
+ }
+ }
+
+ return (set_patterned_color(pcs, pccolor) == 0);
+}
+
+/*
+ * Render and set a pattern.
+ *
+ * In a somewhat unfortunate division of labor, this code sets some but not
+ * all of the cache keys in the pattern. The fields set are transparency,
+ * orientation, and reference point. The caller is responsible for setting
+ * the cache_id and pen number.
+ *
+ * If this routine is called, it may be assumed that the pattern needs to be
+ * rendered.
+ *
+ */
+static int
+render_pattern(
+ pcl_state_t * pcs,
+ pcl_pattern_t * pptrn,
+ pcl_ccolor_type_t type,
+ pcl_cs_indexed_t * pindexed,
+ pcl_cs_base_t * pbase,
+ const gs_paint_color * ppaint,
+ int wht_indx,
+ bool remap
+)
+{
+ int code = 0;
+ pcl_ccolor_t * pccolor = 0;
+ gs_color_space * pcspace;
+ gs_matrix mat;
+ gs_depth_bitmap pixinfo;
+
+ /*
+ * If the orientation or reference point has changed, discard both
+ * renderings. Otherwise, just discard the one being modified.
+ *
+ * Note that the unshare function doubles as an allocator.
+ */
+ if ( (pptrn->orient != pcs->pat_orient) ||
+ (pptrn->ref_pt.x != pcs->pat_ref_pt.x) ||
+ (pptrn->ref_pt.y != pcs->pat_ref_pt.y) ) {
+ if (type == pcl_ccolor_mask_pattern) {
+ pcl_ccolor_release(pptrn->pcol_ccolor);
+ pptrn->pcol_ccolor = 0;
+ } else { /* type == pcl_ccolor_colored_pattern */
+ pcl_ccolor_release(pptrn->pmask_ccolor);
+ pptrn->pmask_ccolor = 0;
+ }
+ }
+
+ /* un-share, or allocate, the appropriate client color */
+ if (type == pcl_ccolor_mask_pattern) {
+ code = unshare_ccolor(pcs, &(pptrn->pmask_ccolor), pcs->memory);
+ pccolor = pptrn->pmask_ccolor;
+ pcspace = 0;
+ } else { /* type == pcl_ccolor_colored_pattern */
+ code = unshare_ccolor(pcs, &(pptrn->pcol_ccolor), pcs->memory);
+ pccolor = pptrn->pcol_ccolor;
+ pcspace = pindexed->pcspace;
+ pptrn->transp = pcs->pattern_transparent;
+ }
+ if (code < 0)
+ return code;
+
+ /* discard the existing pattern instance */
+ gs_pattern_reference(&(pccolor->ccolor), -1);
+ pccolor->ccolor.pattern = 0;
+
+ /* initialize the pattern data, if the client color is newly allocated */
+ pccolor->type = type;
+ pcl_pattern_data_copy_from(pccolor->ppat_data, pptrn->ppat_data);
+
+ /* set up the transformation and transparency information */
+ pcl_xfm_get_pat_xfm(pcs, pptrn, &mat);
+
+ /* set up the white index and remap as necessary */
+ if (remap) {
+ code = pcl_cmap_map_raster( pindexed,
+ &wht_indx,
+ &(pptrn->ppat_data->pixinfo),
+ &pixinfo,
+ true,
+ pcs->memory
+ );
+ if (code < 0)
+ return code;
+ pcspace = pindexed->pcspace;
+ if (pixinfo.data != pptrn->ppat_data->pixinfo.data)
+ pccolor->prast = pixinfo.data;
+ } else
+ pixinfo = pptrn->ppat_data->pixinfo;
+
+ if (pcspace != 0)
+ code = pcl_cs_indexed_install(&pindexed, pcs);
+ if ( code < 0 )
+ return code;
+
+ /* the following is placed here until we have time to properly
+ address this. The makepixmappattern() procedure detects a
+ pattern as opaque if the white index is the number of entries
+ in the current palette (the index of an invalid color).
+ The motivation for this is the white index has no purpose for
+ opaque patterns. Upon remapping (see above) the white index
+ may be set to a white value in the palette, a valid color. We
+ restore the invariant here, if necessary. */
+ if ( (type == pcl_ccolor_colored_pattern) && !pcs->pattern_transparent )
+ wht_indx = pindexed->num_entries;
+
+ code = gs_makepixmappattern( &(pccolor->ccolor),
+ &pixinfo,
+ (pcspace == 0),
+ &mat,
+ no_UniqueID,
+ pcspace,
+ wht_indx,
+ pcs->pgs,
+ pcs->memory
+ );
+
+ /* if all is OK, install the pattern; otherwise clear the pattern */
+ if (code >= 0) {
+ pcl_cs_indexed_copy_from(pccolor->pindexed, pindexed);
+ pcl_cs_base_copy_from(pccolor->pbase, pbase);
+ if (type == pcl_ccolor_mask_pattern)
+ pccolor->ccolor.paint = *ppaint;
+ code = set_patterned_color(pcs, pccolor);
+ }
+ return code;
+}
+
+/*
+ * Set a pattern using the foreground parameters.
+ *
+ * The for-image boolean indicates if the foreground is being set to render
+ * a PCL raster. If so, and if the halftone/CRD combination for the foreground
+ * is not the same as for the palette, a colored pattern must be generated.
+ * This is because the CRD/halftone combination for the palette will be
+ * current at the time the pattern is loaded into the cache, and thus the
+ * color would be evaluated in the wrong context.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+static int
+set_frgrnd_pattern(
+ pcl_state_t * pcs,
+ pcl_pattern_t * pptrn,
+ bool for_image
+)
+{
+ pcl_frgrnd_t * pfrgrnd = pcs->pfrgrnd;
+ pcl_cs_base_t * pbase = pfrgrnd->pbase;
+ pcl_cs_indexed_t * pindexed = 0;
+ pcl_ccolor_type_t type = pcl_ccolor_mask_pattern;
+ gs_paint_color paint;
+ bool colored = false;
+ int code = set_ht_crd_from_foreground(pcs);
+ int wht_indx = (pcs->pattern_transparent ? 0 : 2);
+
+ if (code < 0)
+ return code;
+
+ if ( (pfrgrnd->pht == pcs->ppalet->pht) &&
+ (pfrgrnd->pcrd == pcs->ppalet->pcrd) )
+ for_image = false;
+ colored = (for_image || !pcs->pattern_transparent);
+
+ convert_color_to_paint(pfrgrnd->color, &paint);
+ if (check_pattern_rendering(pcs, pptrn, true, 0, colored, &paint))
+ return 0;
+
+ /* build the two-entry palette if necessary */
+ if (colored) {
+ code = pcl_cs_indexed_build_special( &pindexed,
+ pbase,
+ pfrgrnd->color,
+ pcs->memory
+ );
+ if (code < 0)
+ return code;
+ pbase = 0;
+ type = pcl_ccolor_colored_pattern;
+ }
+
+ code = render_pattern( pcs,
+ pptrn,
+ type,
+ pindexed,
+ pbase,
+ &paint,
+ wht_indx,
+ false
+ );
+
+ /* release the extra reference to the indexed color space */
+ if (colored) {
+ pcl_cs_indexed_release(pindexed);
+ if (code >= 0) {
+ pptrn->pen = 0;
+ pptrn->cache_id = pfrgrnd->id;
+ }
+ }
+
+ return code;
+}
+
+/*
+ * Set an uncolored pattern using the palette parameters and indicated pen
+ * number.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+static int
+set_uncolored_palette_pattern(
+ pcl_state_t * pcs,
+ pcl_pattern_t * pptrn,
+ int pen
+)
+{
+ pcl_cs_indexed_t * pindexed = pcs->ppalet->pindexed;
+ pcl_ccolor_type_t type = pcl_ccolor_mask_pattern;
+ gs_paint_color paint;
+ bool colored = !pcs->pattern_transparent;
+ int code = set_ht_crd_from_palette(pcs);
+
+ if (code < 0)
+ return code;
+
+ convert_index_to_paint(pen, &paint);
+ if (check_pattern_rendering(pcs, pptrn, false, pen, colored, &paint))
+ return 0;
+
+ /* build the two-entry palette if necessary */
+ if (colored) {
+ code = pcl_cs_indexed_build_special( &pindexed,
+ pindexed->pbase,
+ &(pindexed->palette.data[3 * pen]),
+ pcs->memory
+ );
+ if (code < 0)
+ return code;
+ type = pcl_ccolor_colored_pattern;
+ }
+
+ code = render_pattern(pcs, pptrn, type, pindexed, NULL, &paint, 2, false);
+
+ /* release the extra reference to the indexed color space */
+ if (colored) {
+ pcl_cs_indexed_release(pindexed);
+ if (code >= 0) {
+ pptrn->pen = pen;
+ pptrn->cache_id = pcs->ppalet->id;
+ }
+ }
+
+ return code;
+}
+
+/*
+ * Set a colored pattern.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+static int
+set_colored_pattern(
+ pcl_state_t * pcs,
+ pcl_pattern_t * pptrn
+)
+{
+ pcl_cs_indexed_t * pindexed = pcs->ppalet->pindexed;
+ pcl_gsid_t cache_id = pcs->ppalet->id;
+ int code = set_ht_crd_from_palette(pcs);
+
+ if (code < 0)
+ return code;
+
+ if (check_pattern_rendering(pcs, pptrn, false, 0, true, NULL))
+ return 0;
+
+ /* note we always remap the white point. The remapping procedure
+ serves the dual purpose of remapping the white point which may
+ be necessary in the transparent case and resizing the palette
+ which may be needed for either transparent or opaque
+ patterns. */
+ code = render_pattern( pcs,
+ pptrn,
+ pcl_ccolor_colored_pattern,
+ pindexed,
+ NULL,
+ &white_paint,
+ 0,
+ true /* remap */
+ );
+ if (code >= 0) {
+ pptrn->pen = 0;
+ pptrn->cache_id = cache_id;
+ }
+
+ return code;
+}
+
+/*
+ * Routines to set the current color space to a specific pattern. Since patterns
+ * have different sources, each with its own system of identifiers, there are
+ * several such routines. Each routine takes the current PCL state (including
+ * the GL/2 state) as an operand; the additional operands, if any, vary by
+ * routine type.
+ *
+ * pattern_set_white No additional operands. This routine
+ * will set the color space to DeviceRGB, the
+ * color to white, but will not override the
+ * source or pattern transparency. A special
+ * halftone with a null transfer function is used,
+ * to avoid possible re-mapping of white to some
+ * other color.
+ *
+ * pattern_set_pen Two additional operand: the pen number and a flag
+ * to suppress use of unsolid patterns. GL pens Use
+ * the indexed color space from the current palette
+ * as the color space, and the pen number operand as
+ * the index into this palette. The halftone and color
+ * rendering dictionaries are taken from the current
+ * palette.
+ *
+ * This routine is also used to set up the color to
+ * be used for PCL rasters. This is necessary because,
+ * while images in the graphic library carry their
+ * own color space, this space must be installed in
+ * a graphic state at least once inorder to be used
+ * (specifically, CIE color spaces have this
+ * requirement). In this situation, the use of the
+ * "unsolid pattern" for transparency, which is
+ * specific to GL, must be suppressed.
+ *
+ * Note that this routine does NOT set the current
+ * line width (it does not have sufficient
+ * information to convert the dimensions).
+ *
+ * pattern_set_frgrnd One additional operands. Sets currect base
+ * color space as the color space, and the
+ * foreground color as the current color.
+ * The third (NOT second) operand indicates if the
+ * foreground is being set to render a PCL raster.
+ * The latter case involves special considerations;
+ * see the paragraphs at the bottom of this comment
+ * for additional information.
+ *
+ * pattern_set_shade_pcl
+ * Two additional operands, the shade indensity
+ * value and whether or not the shade pattern is
+ * being set to render a PCL raster.
+ *
+ * This procedure is intended to be used by PCL.
+ * It generates the shade as a colored pattern from
+ * a two-element color palette consisting of the
+ * canonical white for the current base color space
+ * and the foreground color. The color space in the
+ * graphic state is set to Pattern color space and
+ * the current color is set to be the generated
+ * pattern. The halftone and color rendering dictionary
+ * objects are also taken from the current
+ * foreground.
+ *
+ * Special considerations apply if the pattern is
+ * being set to render a PCL raster. See the
+ * paragraphs at the bottom of this comment for
+ * additional information.
+ *
+ * pattern_set_shade_gl Two additional operands; the first provides
+ * the pattern intensity, the latter the pen
+ * number to be be used as the foreground color.
+ * This routine generates the pattern using a two
+ * entry palette consisting of canonical white in
+ * the current base color space, and the operand
+ * pen color from the current palette as the
+ * second. The color space in the graphic state
+ * is set to Pattern color space and the current
+ * color is set to the generated pattern. The
+ * halftone and color rendering dictionary objects
+ * are taken from the current palette.
+ *
+ * pattern_set_hatch_pcl
+ * Two additional operands, the index of the cross
+ * hatch pattern and an indication of whether or not
+ * the pattern is being set to render a PCL raster.
+ *
+ * Similar to pcl_pattern_set_shade_pcl, but for
+ * cross-hatch patterns.
+ *
+ * pattern_set_hatch_gl Two additional operands; the first provides
+ * the index of the cross hatch pattern, the
+ * latter the pen number to be used as the
+ * foreground color. Similar to
+ * pcl_pattern_set_shade_gl, but for cross hatch
+ * patterns.
+ *
+ * pattern_set_user_pcl
+ * Two additional operands, the user pattern id. and
+ * and indicator of whether or not the pattern is being
+ * set to render a PCL raster.
+ *
+ * Handling is based on whether the pattern is
+ * colored or uncolored.
+ *
+ * For uncolored patterns, handling is similar
+ * to pcl_pattern_set_shade_pcl. The special
+ * consideration for rasters apply only in this case.
+ *
+ * For colored patterns, the pattern is generated
+ * using the indexed color space in the current
+ * color palette. The color space in the graphic
+ * state is set to Pattern color space, the current
+ * color is set to the generated pattern, and the
+ * halftone and color rendering dictionary objects
+ * are taken from the current palette.
+ *
+ * pattern_set_user_gl Two additional operands. The first provides the
+ * PCL user-defined pattern id. The second is the
+ * current pen. Handling is base on whether the
+ * pattern is colored or uncolored.
+ *
+ * For uncolored patterns, handling is similar
+ * to pcl_pattern_set_shade_gl.
+ *
+ * For colored patterns, handling is similar to
+ * pcl_pattern_set_user_pcl.
+ *
+ * pattern_set_gl_RF Two additional operands, the index of the
+ * GL/2 user defined pattern (created with the
+ * RF command), and the current pen number. The
+ * latter is used only for unoclored RF patterns.
+ *
+ * To keep life interesting, HP inserted a very
+ * odd feature into the behavior of uncolored
+ * RF patterns. Generally, the applicable SV or
+ * FT command determines whether the current pen
+ * or pen 1 is to be used for the foreground pixels.
+ * However, if the reference pattern does not exist,
+ * the current pen is always used.
+ *
+ * To accommodate this behavior within the current
+ * scheme, the current pen is passed as a negative
+ * number if pen 1 is for a pattern that exists.
+ *
+ * All procedures return 0 on success, < 0 in the event of an error.
+ *
+ * If that did not seem to make things complex enough, some additional
+ * complications arise for transparency in GL/2 and for PCL rasters.
+ *
+ * GL/2 has a concept of transparency similar to PCL's, though what GL terms
+ * "source" transparency corresponds to PCL's pattern transparency (all GL/2
+ * objects are mask; hence, they have neither color nor background, so the
+ * PCL concept of source transparency is irrelevant for them). Unlike PCL,
+ * however, uncolored patterns in GL/2 are fully transparent if the current
+ * pen is white. The normal code for uncolored patterns is not equipped to
+ * handle this situation, and it make little sense to modify it for what is
+ * not a particular useful case. Hence, a special "unsolid" uncolored pattern
+ * is provided. This pattern has only background, and thus is fully transparent.
+ *
+ * The difficulty with PCL rasters is that, being colored objects, they make
+ * use of a CRD and a halftone to render. Rasters may also interact with the
+ * current color, which may be using a different CRD and halftone.
+ *
+ * The CRD and halftone to be used with rasters are taken from the current
+ * PCL palette. If the current pattern is either solid foreground (the most
+ * typical case) or an uncolored pattern, the current "texture" is generated
+ * using the CRD and halftone from the PCL foreground. The two may not be the
+ * same, and unfortunately there is room for only one of each in the graphic
+ * state.
+ *
+ * The solution is to make use of an additional graphic state. Patterns in the
+ * graphic library have their own graphic state. Hence, but converting a solid
+ * foreground into an uncolored pattern which happens to be "on" everywhere, it
+ * is possible to achieve the desired result. For performance reasons, this
+ * should be done only when necessary.
+ */
+
+static int
+pattern_set_white(
+ pcl_state_t * pcs,
+ int arg1, /* ignored */
+ int arg2 /* ignored */
+)
+{
+ int code = set_ht_crd_from_foreground(pcs);
+ pcl_cs_base_t * pwhite_cs = 0;
+ pcl_ht_t * pdflt_ht = 0;
+
+ if (code < 0)
+ return code;
+
+ /* build the pure white color space and default halftone if necessary */
+ if ((code = pcl_cs_base_build_white_cspace(pcs, &pwhite_cs, pcs->memory)) >= 0)
+ code = pcl_ht_build_default_ht(pcs, &pdflt_ht, pcs->memory);
+
+ /* set the halftone and color space */
+ if (code >= 0) {
+ code = pcl_ht_set_halftone(pcs, &pdflt_ht, pcl_cspace_RGB, false);
+ pcl_ht_release(pdflt_ht); /* decrement reference to local ptr */
+ }
+
+ if (code >= 0)
+ code = set_unpatterned_color(pcs, NULL, pwhite_cs, &white_paint);
+ pcl_cs_base_release(pwhite_cs);
+ return code;
+}
+
+static int pattern_set_shade_gl(
+ pcl_state_t * pcs,
+ int inten, /* intensity value */
+ int pen /* pen number for foreground */
+);
+
+ static int
+pattern_set_pen(
+ pcl_state_t * pcs,
+ int pen,
+ int for_pcl_raster
+)
+{
+ pcl_cs_indexed_t * pindexed = pcs->ppalet->pindexed;
+ int num_entries = pindexed->num_entries;
+ int code = 0;
+
+ /* put the pen number in the proper range */
+ if ( (pen >= num_entries) &&
+ ((pen = (pen % num_entries) + 1) == num_entries) )
+ pen = 1;
+
+ /* check if the current pen is white; if so, use the "unsolid" pattern */
+ if (!for_pcl_raster && pcl_cs_indexed_is_white(pindexed, pen))
+ return pattern_set_shade_gl(pcs, 1, pen);
+
+ /* set halftone and crd from the palette */
+ code = set_ht_crd_from_palette(pcs);
+
+ if (code >= 0) {
+ gs_paint_color paint = {0,0,0,0};
+
+ convert_index_to_paint(pen, &paint);
+ code = set_unpatterned_color(pcs, pindexed, NULL, &paint);
+ }
+ return code;
+}
+
+ static int
+pattern_set_frgrnd(
+ pcl_state_t * pcs,
+ int arg1, /* ignored */
+ int for_image
+)
+{
+ pcl_frgrnd_t * pfrgrnd = pcs->pfrgrnd;
+ pcl_palette_t * ppalet = pcs->ppalet;
+ int code = set_ht_crd_from_foreground(pcs);
+
+ if (code < 0)
+ return code;
+
+ /* check if a solid pattern should be substituted */
+ if ( for_image ) {
+ if ((pfrgrnd->pht != ppalet->pht) ||
+ (pfrgrnd->pcrd != ppalet->pcrd) ) {
+ code = set_frgrnd_pattern(pcs, pcl_pattern_get_solid_pattern(pcs), true);
+ if (code >= 0)
+ code = set_ht_crd_from_palette(pcs);
+ return code;
+ }
+ else if ( (ppalet->pindexed->original_cspace == 1 && !pfrgrnd->is_cmy ) ||
+ (ppalet->pindexed->original_cspace != 1 && pfrgrnd->is_cmy ) ) {
+ const byte blk[] = {0, 0, 0};
+ gs_paint_color paint;
+
+ /* NB: HP forces black foreground, as they can't handle different
+ * colorspaces in foreground and raster palette
+ */
+ convert_color_to_paint(blk, &paint);
+ code = set_unpatterned_color(pcs, NULL, pfrgrnd->pbase, &paint);
+ return code;
+ }
+ }
+ {
+ gs_paint_color paint;
+
+ convert_color_to_paint(pfrgrnd->color, &paint);
+ code = set_unpatterned_color(pcs, NULL, pfrgrnd->pbase, &paint);
+ }
+
+ return code;
+}
+
+ static int
+pattern_set_shade_pcl(
+ pcl_state_t * pcs,
+ int inten, /* intensity value */
+ int for_image
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_shade(pcs, inten);
+
+ if (pptrn == 0)
+ return ( inten > 0 ? pattern_set_frgrnd(pcs, 0, for_image)
+ : pattern_set_white(pcs, 0, 0) );
+ else {
+ int code = 0;
+
+ pcl_xfm_pcl_set_pat_ref_pt(pcs);
+ code = set_frgrnd_pattern(pcs, pptrn, for_image);
+
+ if (for_image && (code >= 0))
+ code = set_ht_crd_from_palette(pcs);
+ return code;
+ }
+}
+
+ static int
+pattern_set_shade_gl(
+ pcl_state_t * pcs,
+ int inten, /* intensity value */
+ int pen /* pen number for foreground */
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_shade(pcs, inten);
+
+ /* check if the current pen is white; if so, use the "unsolid" pattern */
+ if (pcl_cs_indexed_is_white(pcs->ppalet->pindexed, pen))
+ pptrn = pcl_pattern_get_unsolid_pattern(pcs);
+ else if (pptrn == 0)
+ return ( inten > 0 ? pattern_set_pen(pcs, pen, false)
+ : pattern_set_white(pcs, 0, 0) );
+
+ pcl_xfm_gl_set_pat_ref_pt(pcs);
+ return set_uncolored_palette_pattern(pcs, pptrn, pen);
+}
+
+ static int
+pattern_set_hatch_pcl(
+ pcl_state_t * pcs,
+ int indx, /* cross-hatch pattern index */
+ int for_image
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_cross(pcs, indx);
+
+ if (pptrn == 0)
+ return pattern_set_frgrnd(pcs, 0, for_image);
+ else {
+ int code = 0;
+
+ pcl_xfm_pcl_set_pat_ref_pt(pcs);
+ code = set_frgrnd_pattern(pcs, pptrn, for_image);
+ if (for_image && (code >= 0))
+ code = set_ht_crd_from_palette(pcs);
+ return code;
+ }
+}
+
+ static int
+pattern_set_hatch_gl(
+ pcl_state_t * pcs,
+ int indx, /* cross-hatch pattern index */
+ int pen /* pen number for foreground */
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_cross(pcs, indx);
+
+ /* check if the current pen is white; if so, use the "unsolid" pattern */
+ if (pcl_cs_indexed_is_white(pcs->ppalet->pindexed, pen))
+ pptrn = pcl_pattern_get_unsolid_pattern(pcs);
+ else if (pptrn == 0)
+ return pattern_set_pen(pcs, pen, false);
+
+ pcl_xfm_gl_set_pat_ref_pt(pcs);
+ return set_uncolored_palette_pattern(pcs, pptrn, pen);
+}
+
+ static int
+pattern_set_user_pcl(
+ pcl_state_t * pcs,
+ int id, /* pattern id. */
+ int for_image
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_pcl_uptrn(pcs, id);
+
+ if (pptrn == 0)
+ return pattern_set_frgrnd(pcs, 0, for_image);
+ else {
+ pcl_xfm_pcl_set_pat_ref_pt(pcs);
+ if (pptrn->ppat_data->type == pcl_pattern_uncolored) {
+ int code = set_frgrnd_pattern(pcs, pptrn, for_image);
+
+ if (for_image && (code >= 0))
+ code = set_ht_crd_from_palette(pcs);
+ return code;
+ } else
+ return set_colored_pattern(pcs, pptrn);
+ }
+}
+
+ static int
+pattern_set_user_gl(
+ pcl_state_t * pcs,
+ int id, /* pattern id. */
+ int pen /* pen to use for foreground */
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_pcl_uptrn(pcs, id);
+
+ if (pptrn == 0)
+ return pattern_set_pen(pcs, 0, false);
+ else {
+
+ pcl_xfm_gl_set_pat_ref_pt(pcs);
+ if (pptrn->ppat_data->type == pcl_pattern_uncolored) {
+
+ /* check if the current pen is white */
+ if (pcl_cs_indexed_is_white(pcs->ppalet->pindexed, pen))
+ pptrn = pcl_pattern_get_unsolid_pattern(pcs);
+ return set_uncolored_palette_pattern(pcs, pptrn, pen);
+
+ } else
+ return set_colored_pattern(pcs, pptrn);
+ }
+}
+
+ static int
+pattern_set_gl_RF(
+ pcl_state_t * pcs,
+ int indx, /* GL/2 RF pattern index */
+ int pen /* used only for uncolored patterns */
+)
+{
+ pcl_pattern_t * pptrn = pcl_pattern_get_gl_uptrn(pcs, indx);
+
+ /*
+ * HACK - if pen 1 is to be use for actual uncolored RF patterns, the pen
+ * operand will be the opposite of the current pen number. This allows us
+ * to use the current pen if the pattern does not exist.
+ */
+ if (pptrn == 0)
+ return pattern_set_pen(pcs, (pen < 0 ? -pen : pen), false);
+ else {
+ if (pen < 0)
+ pen = 1;
+
+ pcl_xfm_gl_set_pat_ref_pt(pcs);
+ if (pptrn->ppat_data->type == pcl_pattern_uncolored) {
+
+ /* check if the current pen is white */
+ if (pcl_cs_indexed_is_white(pcs->ppalet->pindexed, pen))
+ pptrn = pcl_pattern_get_unsolid_pattern(pcs);
+ return set_uncolored_palette_pattern(pcs, pptrn, pen);
+
+ } else
+ return set_colored_pattern(pcs, pptrn);
+ }
+}
+
+
+/*
+ * Return the appropriate "set" procedure, given a PCL pattern type.
+ */
+ pcl_pattern_set_proc_t
+pcl_pattern_get_proc_PCL(
+ pcl_pattern_source_t pattern_source
+)
+{
+ static const pcl_pattern_set_proc_t procs[] = { pattern_set_frgrnd,
+ pattern_set_white,
+ pattern_set_shade_pcl,
+ pattern_set_hatch_pcl,
+ pattern_set_user_pcl,
+ 0,
+ pattern_set_pen };
+
+ return procs[(int)pattern_source];
+}
+
+/*
+ * Returen the appropriate "set" procedure, given a GL fill type specification.
+ */
+ pcl_pattern_set_proc_t
+pcl_pattern_get_proc_FT(
+ hpgl_FT_pattern_source_t pattern_source
+)
+{
+ if ( (pattern_source == hpgl_FT_pattern_solid_pen1) ||
+ (pattern_source == hpgl_FT_pattern_solid_pen2) )
+ return pattern_set_pen;
+ else if (pattern_source == hpgl_FT_pattern_shading)
+ return pattern_set_shade_gl;
+ else if (pattern_source == hpgl_FT_pattern_RF)
+ return pattern_set_gl_RF;
+ else if (pattern_source == hpgl_FT_pattern_cross_hatch)
+ return pattern_set_hatch_gl;
+ else if (pattern_source == hpgl_FT_pattern_user_defined)
+ return pattern_set_user_gl;
+ else
+ return 0;
+}
+
+/*
+ * Returen the appropriate "set" procedure, given a GL screened vector
+ * specification.
+ */
+ pcl_pattern_set_proc_t
+pcl_pattern_get_proc_SV(
+ hpgl_SV_pattern_source_t pattern_source
+)
+{
+ if (pattern_source == hpgl_SV_pattern_solid_pen)
+ return pattern_set_pen;
+ else if (pattern_source == hpgl_SV_pattern_shade)
+ return pattern_set_shade_gl;
+ else if (pattern_source == hpgl_SV_pattern_RF)
+ return pattern_set_gl_RF;
+ else if (pattern_source == hpgl_SV_pattern_cross_hatch)
+ return pattern_set_hatch_gl;
+ else if (pattern_source == hpgl_SV_pattern_user_defined)
+ return pattern_set_user_gl;
+ else
+ return 0;
+}
+
+
+/*
+ * ESC * c <#/id> G
+ *
+ * Set the pattern id.
+ */
+static int
+set_pattern_id(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->pattern_id = int_arg(pargs);
+ return 0;
+}
+
+/*
+ * ESC * v <bool> N
+ *
+ * Set source transparency mode
+ */
+ static int
+set_source_transparency_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ if (i <= 1) {
+ pcl_break_underline(pcs);
+ pcs->source_transparent = (i == 0);
+ }
+ return 0;
+}
+
+/*
+ * ESC * v <bool> O
+ *
+ * Set pattern transparency mode.
+ */
+static int
+set_pattern_transparency_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ if (i <= 1) {
+ pcl_break_underline(pcs);
+ pcs->pcl_pattern_transparent = (i == 0);
+ }
+ return 0;
+}
+
+/*
+ * ESC * v # T
+ *
+ * Set current pattern id.
+ */
+ static int
+select_current_pattern(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ if (i <= (int)pcl_pattern_user_defined) {
+ pcl_break_underline(pcs);
+ pcs->current_pattern_id = pcs->pattern_id;
+ pcs->pattern_type = (pcl_pattern_source_t)i;
+ }
+ return 0;
+}
+
+/*
+ * ESC * o # W
+ *
+ * Driver configuration command. A partial implementation to show
+ * that we are parsing the command correctly. The lightness and
+ * saturation parameters are not documented so we do not believe this
+ * command will be used by an application or driver.
+ *
+ */
+
+typedef struct driver_configuration_s {
+ byte device_id;
+ byte function_index;
+ char arguments;
+} driver_configuration_t;
+
+ static int
+set_driver_configuration(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs /* ignored */
+)
+{
+ uint count = uint_arg(pargs);
+ driver_configuration_t *driver = (driver_configuration_t *)arg_data(pargs);
+
+ if ( pcs->personality == pcl5e )
+ return 0;
+
+ if ( count != sizeof(driver_configuration_t) )
+ return e_Range;
+
+ /* the only device known to support this command */
+ if ( ( driver->device_id < 6 ) /* 6 == hp color laserjet */
+ || /* 7 == hp clj 5 */
+ ( driver->device_id > 8 ) ) /* 8 == hp 4500 - 4550 */ {
+ dprintf1("unknown device id %d\n", driver->device_id );
+ return e_Range;
+ }
+
+ switch (driver->function_index) {
+ case 0: /* lightness */
+ {
+ int code;
+ if ( driver->arguments < -100 || driver->arguments > 100 )
+ return e_Range;
+ /* map -100..100 to gamma setting 0.05..4.05 */
+ code = pcl_palette_set_gamma(pcs, ((driver->arguments + 100.0) / 200.0) + 0.05);
+ if ( code < 0 )
+ return code;
+ }
+ break;
+ case 1: /* saturation */
+ {
+ int code;
+ if ( driver->arguments < -100 || driver->arguments > 100 )
+ return e_Range;
+ /* map -100..100 to gamma setting 0.05..4.05 */
+ code = pcl_palette_set_gamma(pcs, ((driver->arguments + 100.0) / 200.0) + 0.05);
+ if ( code < 0 )
+ return code;
+ }
+ break;
+ case 4:
+ if ( driver->arguments == 3 ) {
+ pcs->useciecolor = false;
+ }
+ else if ( driver->arguments == 6 ) {
+ pcs->useciecolor = true;
+ } else
+ return e_Range;
+ break;
+ default:
+ return e_Range;
+ }
+ return 0;
+}
+
+
+/*
+ * Initialization and reset routines.
+ */
+static int
+pattern_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'c', 'G',
+ PCL_COMMAND( "Pattern ID",
+ set_pattern_id,
+ pca_neg_ignore | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'v', 'N',
+ PCL_COMMAND( "Source Transparency Mode",
+ set_source_transparency_mode,
+ pca_neg_ignore | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'v', 'O',
+ PCL_COMMAND( "Pattern Transparency Mode",
+ set_pattern_transparency_mode,
+ pca_neg_ignore | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'v', 'T',
+ PCL_COMMAND( "Select Current Pattern",
+ select_current_pattern,
+ pca_neg_ignore | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'o', 'W',
+ PCL_COMMAND( "Driver Configuration Command",
+ set_driver_configuration,
+ pca_bytes | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+
+}
+
+ static void
+pattern_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_cold
+ | pcl_reset_printer
+ | pcl_reset_overlay );
+
+ if ((type & mask) != 0) {
+ if ((type & pcl_reset_initial) != 0)
+ pcl_pattern_init_bi_patterns(pcs);
+ pcs->pcl_pattern_transparent = true;
+ pcs->pattern_transparent = true;
+ pcs->source_transparent = true;
+ pcs->pattern_id = 0;
+ pcs->current_pattern_id = 0;
+ pcs->pattern_type = pcl_pattern_solid_frgrnd;
+ }
+ if ( type & pcl_reset_permanent || type & pcl_reset_printer ) {
+ if (gstate_pattern_cache(pcs->pgs)) {
+ gs_state *pgs = pcs->pgs;
+
+ (gstate_pattern_cache(pgs)->free_all)(gstate_pattern_cache(pgs));
+ gs_free_object(pcs->memory,
+ gstate_pattern_cache(pgs)->tiles,
+ "pattern_do_reset(tiles)");
+ gs_free_object(pcs->memory,
+ gstate_pattern_cache(pgs),
+ "pattern_do_reset(struct)");
+ while (pgs) {
+ gstate_set_pattern_cache(pgs, 0);
+ pgs = gs_state_saved(pgs);
+ }
+ }
+ }
+}
+
+const pcl_init_t pcl_pattern_init = { pattern_do_registration, pattern_do_reset, 0 };
diff --git a/pcl/pcpatrn.h b/pcl/pcpatrn.h
new file mode 100644
index 000000000..64c799f79
--- /dev/null
+++ b/pcl/pcpatrn.h
@@ -0,0 +1,561 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpatrn.h - PCL/GL client color and pattern code */
+
+#ifndef pcpatrn_INCLUDED
+#define pcpatrn_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+#include "gsrefct.h"
+#include "pcindxed.h"
+#include "pccsbase.h"
+
+/*
+ * PCL pattern types.
+ *
+ * There are two types of patterns used in PCL, colored and uncolored. In
+ * order to support transparency, both types are implemented as colored
+ * patterns in the graphics library (which does not support opaque
+ * uncolored patterns).
+ *
+ * The values used are defined by HP.
+ *
+ * Note: The implementation of opaque uncolored patterns is not correct, and
+ * cannot be handled correctly with the current graphics library. The
+ * difficulty is that the "background" regions of opaque uncolored
+ * patterns should be rendered in "device" white. Due to the properties
+ * of the color space and the color lookup tables employed, it is not
+ * obvious which source color yields device white, or whether such a
+ * a source color even exists. Hence, there is no colored pattern that
+ * is known to give the same result as the opaque uncolored pattern.
+ */
+typedef enum {
+ pcl_pattern_uncolored = 0,
+ pcl_pattern_colored = 1
+} pcl_pattern_type_t;
+
+/*
+ * The pattern data structure. This includes the pattern data, dimensions,
+ * type, and implied resolution.
+ *
+ * It is not strictly necessary that this structure be reference counted, as
+ * there is no chance that any unrendered objects will make use of the deleted
+ * pattern. The use of reference counts makes for a more consistent
+ * implementation, however, and leaves open the possibility of subsequent
+ * implementations that may involve delayed rendering.
+ */
+typedef struct pcl_pattern_data_s {
+ gs_depth_bitmap pixinfo; /* pixmap information; must be first */
+ pcl_data_storage_t storage; /* temporary/permanent/internal flag */
+ rc_header rc;
+ pcl_pattern_type_t type; /* pattern type */
+ int xres; /* intended resolution for pattern */
+ int yres;
+} pcl_pattern_data_t;
+
+#define private_st_pattern_data_t() /* in pcuptrn.c */ \
+ gs_private_st_suffix_add0( st_pattern_data_t, \
+ pcl_pattern_data_t, \
+ "PCL/GL pattern data", \
+ pattern_data_enum_ptrs, \
+ pattern_data_reloc_ptrs, \
+ st_gs_depth_bitmap \
+ )
+
+/*
+ * The usual copy, init, and release macros.
+ */
+#define pcl_pattern_data_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_pattern_data_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_pattern_data_copy_from");\
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_pattern_data_release(ppat_data) \
+ rc_decrement(ppat_data, "pcl_pattern_data_release")
+
+
+
+/* forward declaration */
+#ifndef pcl_ccolor_DEFINED
+#define pcl_ccolor_DEFINED
+typedef struct pcl_ccolor_s pcl_ccolor_t;
+#endif
+
+/*
+ * The pattern structure. This is not reference counted, as the only place it
+ * is referred to is the pattern dictionary.
+ *
+ * The primary purpose for this structure is to handle cahcing of pattern
+ * instances. There are potentially two rendered instances of a pattern,
+ * one as a mask (uncolored) pattern and one as a colored pattern.
+ *
+ * A "colored" pattern in the PCL sense will never have a mask rendering, but
+ * an "uncolored" PCL pattern may have both a mask and a colored rendering,
+ * because mask patterns in the graphic library cannot be opaque, and cannot
+ * use a halftone or color redering dictionary that differs from that being
+ * used by a raster.
+ *
+ * The various "render key" field values are used to identify the environment
+ * for which the client colors pointed to by pmask_ccolor and pcol_ccolor
+ * have been rendered for. Not all fields apply to both client colors:
+ *
+ *
+ * The transp bit indicates if the colored rendering was render with
+ * transparency set (mask patterns are always rendered with
+ * transparency set).
+ *
+ * The orient field indicates the orientation of the rendering, in
+ * the range 0 to 3.
+ *
+ * The pen field applies only to the colored pattern rendering and is used
+ * only for patterns that are uncolored in the PCL sense and rendered
+ * from GL/2. The pen field indicates the palette entry used as the
+ * foreground for the pattern. For PCL colored patterns or uncolored
+ * patterns rendered from PCL, this field will be 0. The value 0 is
+ * also valid for GL/2, but this causes no difficulty as uncolored
+ * patterns rendered in GL/2 use the current palette, while those
+ * rendered in PCL use the current foreground. Hence, the cache_id
+ * (see below) will never be the same for both cases.
+ *
+ * cache_id is the identifier of either the foreground or palette used
+ * to create the colored rendering of the pattern. This is the
+ * identifier of either a palette or a foreground. Only for opaque
+ * uncolored (in the PCL sense) patterns rendered from PCL is it
+ * the id of the foreground; in all other cases it is the id of the
+ * palette.
+ *
+ * The ref_pt field identifies the reference point, in device space, for
+ * which both renderings of the pattern were created.
+ */
+typedef struct pcl_pattern_t {
+ pcl_pattern_data_t * ppat_data;
+
+ /* the mask and colored rendered instances, if any */
+ pcl_ccolor_t * pcol_ccolor;
+ pcl_ccolor_t * pmask_ccolor;
+
+ /* "rendered key" */
+ uint transp:1; /* transparency of rendering */
+ uint orient:2; /* orientation of rendering */
+ uint pen:8; /* 0 for PCL or colored patterns */
+ pcl_gsid_t cache_id; /* foreground or palette */
+ gs_point ref_pt; /* referenc point (device space) */
+} pcl_pattern_t;
+
+#define private_st_pattern_t() /* in pcuptrn.c */ \
+ gs_private_st_ptrs3( st_pattern_t, \
+ pcl_pattern_t, \
+ "PCL/GL pattern", \
+ pattern_enum_ptrs, \
+ pattern_reloc_ptrs, \
+ ppat_data, \
+ pcol_ccolor, \
+ pmask_ccolor \
+ )
+
+
+/*
+ * The PCL structure corresponding to the graphic library's client color
+ * structure. The latter potentially contains a client data structure pointer
+ * (for pattern colors) which it does not (an cannot) take ownership of. To
+ * release the associated memory at the correct time, it is necessary to build
+ * a parallel structure which has ownership of the client data, and which
+ * can be kept in a one-to-one relationship with the graphic library client
+ * color structure.
+ *
+ * The interpretation of the various fields varies by color type:
+ *
+ * For pcl_ccolor_unpatterned:
+ *
+ * ppat_data == NULL,
+ *
+ * one of pindexed or pbase points to the current color space (the other
+ * is NULL)
+ *
+ * ccolor.paint.values[0] or ccolor.paint.values[0..2] holds the
+ * color component values
+ *
+ * ccolor.pattern == NULL
+ *
+ * For pcl_ccolor_mask_pattern:
+ *
+ * ppat_data points to the pattern data
+ *
+ * one of pindexed or pbase points to the base color space of the
+ * pattern color space (the other is NULL)
+ *
+ * ccolor.paint.values[0] or ccolor.paint.values[0..2] holds the
+ * color values to be use for the pattern foreground
+ *
+ * ccolor.pattern points to the pattern instance
+ *
+ * For pcl_ccolor_colored_pattern
+ *
+ * ppat_data points to the pattern data
+ *
+ * pindexed points to the base color space of the pattern
+ *
+ * pbase == NULL,
+ *
+ * ccolor.paint is ignored
+ *
+ * ccolor.pattern points to the pattern instance
+ *
+ * Not that exactly one of pbase or pindexed will ever be non-NULL.
+ *
+ * The prast data is used only for colored patterns. When these are rendered
+ * with transparency on, difficulties might arise because there is more than
+ * one "white" value in the palette of the indexed color space pointed to by
+ * pindexed. Since the ImageType 4 rendering mechanism used to implement
+ * transaprent colored patterns cannot accommodate multiple non-contiguous
+ * while values, the pattern data must be copied and all white values mapped
+ * to a unique white value. The prast pointer points to this remapped array.
+ */
+
+typedef enum {
+ pcl_ccolor_unpatterned = 0,
+ pcl_ccolor_mask_pattern,
+ pcl_ccolor_colored_pattern
+} pcl_ccolor_type_t;
+
+struct pcl_ccolor_s {
+ rc_header rc;
+ pcl_ccolor_type_t type;
+ pcl_pattern_data_t * ppat_data;
+ pcl_cs_indexed_t * pindexed;
+ pcl_cs_base_t * pbase;
+ const byte * prast;
+ gs_client_color ccolor;
+};
+
+#define private_st_ccolor_t() \
+ gs_private_st_ptrs4( st_ccolor_t, \
+ pcl_ccolor_t, \
+ "PCL client color",\
+ ccolor_enum_ptrs, \
+ ccolor_reloc_ptrs, \
+ ppat_data, \
+ pindexed, \
+ pbase, \
+ ccolor.pattern \
+ )
+
+/*
+ * The usual copy, init, and release macros.
+ */
+#define pcl_ccolor_init_from(pto, pfrom) \
+ BEGIN \
+ rc_increment(pfrom); \
+ (pto) = (pfrom); \
+ END
+
+#define pcl_ccolor_copy_from(pto, pfrom) \
+ BEGIN \
+ if ((pto) != (pfrom)) { \
+ rc_increment(pfrom); \
+ rc_decrement(pto, "pcl_ccolor_copy_from"); \
+ (pto) = (pfrom); \
+ } \
+ END
+
+#define pcl_ccolor_release(pccolor) \
+ rc_decrement(pccolor, "pcl_ccolor_release")
+
+
+/*
+ * Create a colored pcl_pattern_t object from a gs_depth_bitmap object. This
+ * object will be considered "temporary" in the sense of a PCL resource, and
+ * is stored in the GL/2 pattern dictionary (reserved for patterns created
+ * via the GL/2 RF command.
+ *
+ * This procedure is exported for the convenience of the GL/2 RF command, as
+ * it avoids having the GL/2 module deal with the pattern structure provided
+ * above.
+ *
+ * Passing a null pointer clears the indicated entry; this can be used by
+ * GL/2 to facilitate the reset functions of the IN and DF operators (and
+ * the RF operator without operands).
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_pattern_RF(
+ int ptrn_indx, /* pattern index */
+ const gs_depth_bitmap * ppixmap, /* pixmap */
+ pcl_state_t * pcs
+);
+
+/*
+ * Procedure to get/set up the current graphic state for the proper "pattern"
+ * (which may be a solid color). The routine is called with the current PCL
+ * state and one or two additional operands. The interpretation of the operands
+ * is dependent on the particular routine used.
+ *
+ * These routines are intended to handle the many different combinations of
+ * color space, color rendering dictionary, and halftone object required in
+ * the graphic state in different situations. The chart below characterizes
+ * what the operands are interpreted to mean, and what the source of the
+ * (graphic state) color space, color, color rendering dictionary, and
+ * halftone (including transfer function) are for each case. Note in
+ * particular that uncolored patterns (including the built-in shades and
+ * cross-hatch patterns) must be handled separately for PCL and GL.
+ *
+ * solid white (PCL or GL)
+ * arg1 ignored
+ * arg2 ignored
+ *
+ * pattern source none
+ *
+ * cspace DeviceGray (irrespective of current space)
+ * color 1,0 (irrespective of current color)
+ * CRD unchanged (irrelevant since DeviceGray is
+ * the color space)
+ * halftone Fixed halftone with null transfer function
+ *
+ * note: this routine does NOT override the current transparency
+ * values.
+ *
+ * solid color (GL only)
+ * arg1 pen number
+ * arg2 ignored
+ *
+ * pattern source none
+ *
+ * cspace indexed color space from current palette
+ * color pen number
+ * CRD from current palette
+ * halftone from current palette
+ *
+ * note: this routine does NOT set the line width
+ *
+ * solid foreground (PCL only)
+ * arg1 ignored
+ * arg2 ignored
+ *
+ * pattern source none
+ *
+ * cspace base color space from current foreground
+ * color color from current foreground
+ * CRD from current foreground
+ * halftone from current foreground
+ *
+ * shade pattern (PCL only)
+ * arg1 shade percentage
+ * arg2 ignored
+ *
+ * pattern source built-in shade patterns
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and a special indexed color space
+ * which utilizes the base color space in the
+ * current foreground and a 2-entry palette. The
+ * palette contains the canonical white color and
+ * the foreground color. The color rendering
+ * dictionary and halftone also are taken from
+ * the current color.
+ * CRD from current foreground (only relevant for
+ * pattern rendering)
+ * halftone from current foreground (only relevant for
+ * pattern rendering).
+ *
+ * shade pattern (GL only)
+ * arg1 shade percentage
+ * arg2 current pen
+ *
+ * pattern source built-in shade patterns
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and a special indexed color space
+ * which utilizes the base color space in the
+ * current palette and a 2-entry palette. The
+ * palette contains the canonical white color and
+ * the color corresponding to the given pen. The
+ * color rendering dictionary and halftone are
+ * taken from the given palette.
+ * CRD from current palette (only relevant for
+ * pattern rendering)
+ * halftone from current palette (only relevant for
+ * pattern rendering).
+ *
+ * cross-hatch pattern (PCL only)
+ * arg1 pattern index
+ * arg2 ignored
+ *
+ * pattern-source built-in cross-hatch patterns
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and a special indexed color space
+ * which utilizes the base color space in the
+ * current foreground and a 2-entry palette. The
+ * palette contains the canonical white color and
+ * the foreground color. The color rendering
+ * dictionary and halftone also are taken from the
+ * current color.
+ * CRD from current foreground (only relevant for
+ * pattern rendering)
+ * halftone from current foreground (only relevant for
+ * pattern rendering).
+ *
+ * cross-hatch pattern (GL only)
+ * arg1 pattern index
+ * arg2 current pen
+ *
+ * pattern source built-in cross-hatch patterns
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and a special indexed color space
+ * which utilizes the base color space in the
+ * current palette und and a 2-entry palette. The
+ * palette contains the canonical white color and
+ * the color corresponding to the given pen. The
+ * color rendering dictionary and halftone are
+ * taken from the given palette.
+ * CRD from current palette (only relevant for
+ * pattern rendering)
+ * halftone from current palette (only relevant for
+ * pattern rendering).
+ *
+ * PCL user-defined pattern (PCL only)
+ * arg1 pattern id
+ * arg2 ignored
+ *
+ * pattern source PCL user defined patterns
+ *
+ * Handling depends on the pattern type. For uncolored patterns, the
+ * settings are:
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and a special indexed color space
+ * which utilizes the base color space in the
+ * current foreground and a 2-entry palette. The
+ * palette contains the canonical white color and
+ * the foreground color. The color rendering
+ * dictionary and halftone also are taken from the
+ * current color.
+ * CRD from current foreground (only relevant for
+ * pattern rendering)
+ * halftone from current foreground (only relevant for
+ * pattern rendering).
+ *
+ * For colored patterns, the settings are:
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and the indexed color space in the
+ * current palette, along with the halftone and
+ * color rendering dictionary in the current palette
+ * CRD from current palette (only relevant for
+ * pattern rendering)
+ * halftone from current palette (only relevant for color
+ * generation)
+ *
+ * PCL user-defined pattern (GL only)
+ * arg1 pattern id
+ * arg2 current pen
+ *
+ * pattern source PCL user defined patterns
+ *
+ * Handling depends on the pattern type. For uncolored patterns, the
+ * settings are:
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and a special indexed color space
+ * which utilizes the base color space in the
+ * current palette and a 2-entry palette. The
+ * palette contains the canonical white color and
+ * the color corresponding to the given pen. The
+ * color rendering dictionary and halftone are
+ * taken from the given palette.
+ * CRD from current palette (only relevant for
+ * pattern rendering)
+ * halftone from current palette (only relevant for
+ * pattern rendering).
+ *
+ * For colored patterns, the settings are:
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and the indexed color space in the
+ * current palette, along with the halftone and
+ * color rendering dictionary in the current palette
+ * CRD from current palette (only relevant for
+ * pattern rendering)
+ * halftone from current palette (only relevant for color
+ * generation)
+ *
+ * RF pattern (GL only)
+ * arg1 pattern index
+ * arg2 ignored
+ *
+ * pattern source GL user defined patterns
+ *
+ * cspace Pattern color space without base color space
+ * color Colored pattern generated from the pixmap data
+ * provided and the indexed color space in the
+ * current palette, along with the halftone and
+ * color rendering dictionary in the current palette
+ * CRD from current palette (only relevant for
+ * pattern rendering)
+ * halftone from current palette (only relevant for color
+ * generation)
+ *
+ * These routines will also set the pattern reference point appropriatel for
+ * either PCL or GL.
+ *
+ * The routines return 0 on success (with the graphic state properly set up),
+ * < 0 in the event of an error.
+ */
+
+typedef int (*pcl_pattern_set_proc_t)( pcl_state_t *, int arg1, int arg2 );
+
+/*
+ * Return the pattern set procedure appropriate for the specified pattern
+ * source specification (the command that selected the pattern).
+ *
+ * A return of NULL indicates a range check error.
+ */
+pcl_pattern_set_proc_t pcl_pattern_get_proc_PCL(
+ pcl_pattern_source_t pattern_source
+);
+
+pcl_pattern_set_proc_t pcl_pattern_get_proc_FT(
+ hpgl_FT_pattern_source_t pattern_source
+);
+
+pcl_pattern_set_proc_t pcl_pattern_get_proc_SV(
+ hpgl_SV_pattern_source_t pattern_source
+);
+
+/*
+ * Entry point to pattern-related functions.
+ */
+extern const pcl_init_t pcl_pattern_init;
+
+#endif /* pcpatrn_INCLUDED */
diff --git a/pcl/pcpattyp.h b/pcl/pcpattyp.h
new file mode 100644
index 000000000..82875599f
--- /dev/null
+++ b/pcl/pcpattyp.h
@@ -0,0 +1,112 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpattyp.h - pattern type enumerations and related information */
+
+#ifndef pcpattyp_INCLUDED
+#define pcpattyp_INCLUDED
+
+/*
+ * Pattern source identifiers. There are three of these, one for PCL and two
+ * for GL (one for FT, the other for SV). Though GL types are not usually
+ * defined in PCL files, they are in this case so that the pattern code
+ * can be kept together.
+ */
+typedef enum {
+ pcl_pattern_solid_frgrnd = 0, /* solid foreground / current pen */
+ pcl_pattern_solid_white,
+ pcl_pattern_shading,
+ pcl_pattern_cross_hatch,
+ pcl_pattern_user_defined,
+ pcl_pattern_current_pattern, /* for rectangle fill only */
+ pcl_pattern_raster_cspace /* internal - used for rasters only */
+} pcl_pattern_source_t;
+
+typedef enum {
+ hpgl_FT_pattern_solid_pen1 = 1,
+ hpgl_FT_pattern_solid_pen2 = 2,
+ hpgl_FT_pattern_one_line = 3,
+ hpgl_FT_pattern_two_lines = 4,
+ hpgl_FT_pattern_shading = 10,
+ hpgl_FT_pattern_RF = 11,
+ hpgl_FT_pattern_cross_hatch = 21,
+ hpgl_FT_pattern_user_defined = 22
+} hpgl_FT_pattern_source_t;
+
+typedef enum {
+ hpgl_SV_pattern_solid_pen = 0,
+ hpgl_SV_pattern_shade = 1,
+ hpgl_SV_pattern_RF = 2,
+ hpgl_SV_pattern_cross_hatch = 21,
+ hpgl_SV_pattern_user_defined = 22
+} hpgl_SV_pattern_source_t;
+
+
+/*
+ * Opaque definitions of palettes, foregrounds, client colors, halftones,
+ * and backgrounds.
+ */
+#ifndef pcl_palette_DEFINED
+#define pcl_palette_DEFINED
+typedef struct pcl_palette_s pcl_palette_t;
+#endif
+
+#ifndef pcl_frgrnd_DEFINED
+#define pcl_frgrnd_DEFINED
+typedef struct pcl_frgrnd_s pcl_frgrnd_t;
+#endif
+
+#ifndef pcl_ccolor_DEFINED
+#define pcl_ccolor_DEFINED
+typedef struct pcl_ccolor_s pcl_ccolor_t;
+#endif
+
+#ifndef pcl_ht_DEFINED
+#define pcl_ht_DEFINED
+typedef struct pcl_ht_s pcl_ht_t;
+#endif
+
+#ifndef pcl_crd_DEFINED
+#define pcl_crd_DEFINED
+typedef struct pcl_crd_s pcl_crd_t;
+#endif
+
+/*
+ * Structure to track what has been installed in the graphic state. This is
+ * used to avoid unnecessary re-installation, and to avoid memory handling
+ * problems that would arise if various objects were released while the
+ * graphic state still retained pointes to them.
+ *
+ * The PCL client color structure (pcl_ccolor_t) incorporates both color and
+ * color space information.
+ */
+typedef struct pcl_gstate_ids_s {
+ struct pcl_gstate_ids_s * prev; /* stack back pointer */
+ pcl_ccolor_t * pccolor;
+ pcl_ht_t * pht;
+ pcl_crd_t * pcrd;
+} pcl_gstate_ids_t;
+
+#define private_st_gstate_ids_t() /* in pcdraw.c */ \
+ gs_private_st_ptrs4( st_gstate_ids_t, \
+ pcl_gstate_ids_t, \
+ "PCL graphics state tracker", \
+ gstate_ids_enum_ptrs, \
+ gstate_ids_reloc_ptrs, \
+ prev, \
+ pccolor, \
+ pht, \
+ pcrd \
+ )
+
+#endif /* pcpattyp_INCLUDED */
diff --git a/pcl/pcpatxfm.c b/pcl/pcpatxfm.c
new file mode 100644
index 000000000..6723110e3
--- /dev/null
+++ b/pcl/pcpatxfm.c
@@ -0,0 +1,354 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpatxfm.c - code to set the pattern transformation */
+
+#include "gx.h"
+#include "math_.h"
+#include "pcpatrn.h"
+#include "pcfont.h"
+#include "pcpatxfm.h"
+
+
+/*
+ * The four rotation matrices used by PCL. Note that rotations in PCL are
+ * always multiples of 90 degrees, and map the positive x-axis to the negative
+ * y-axis (the opposite or the rotation sense used by PostScript).
+ *
+ * All of the matrices are pure rotations; they have no scaling or translation
+ * components.
+ */
+static const gs_matrix rot_mtx[4] = {
+ { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* 0 degrees */
+ { 0.0, -1.0, 1.0, 0.0, 0.0, 0.0 }, /* 90 degrees */
+ { -1.0, 0.0, 0.0, -1.0, 0.0, 0.0 }, /* 180 degrees */
+ { 0.0, 1.0, -1.0, 0.0, 0.0, 0.0 } /* 270 degrees */
+};
+
+
+/*
+ * Inverst a diagonal 2-dimensional affine transformation. This is much simpler
+ * than inverting a general 2-dimensional affine transformation, hence a
+ * separate routine is provided for this purpose.
+ *
+ * Note that both operands may point to the same matrix.
+ *
+ * NB: This routine ASSUMES that *pmtx1 is non singular. This is always the
+ * case for PCL, but obviously may not be in a more general setting.
+ */
+ void
+pcl_invert_mtx(
+ const gs_matrix * pmtx1,
+ gs_matrix * pmtx2
+)
+{
+ float xx = pmtx1->xx;
+ float tx = pmtx1->tx;
+ float ty = pmtx1->ty;
+
+ if (xx == 0.0) {
+ float xy = pmtx1->xy;
+ float yx = pmtx1->yx;
+
+ pmtx2->xx = 0.0;
+ pmtx2->xy = 1.0 / yx;
+ pmtx2->yx = 1.0 / xy;
+ pmtx2->yy = 0.0;
+ pmtx2->tx = -ty / xy;
+ pmtx2->ty = -tx / yx;
+
+ } else {
+ float yy = pmtx1->yy;
+
+ pmtx2->xx = 1.0 / xx;
+ pmtx2->xy = 0.0;
+ pmtx2->yx = 0.0;
+ pmtx2->yy = 1.0 / yy;
+ pmtx2->tx = -tx / xx;
+ pmtx2->ty = -ty / yy;
+ }
+}
+
+/*
+ * Transform an aligned rectangle. Because all transformations in PCL are
+ * diagonal, both the source and destination rectangles are aligned with the
+ * coordinate axes, and hence may be represented by a pair of points.
+ *
+ * prect1 and prect2 may point to the same rectangle.
+ */
+void
+pcl_transform_rect(const gs_memory_t *mem,
+ const gs_rect * prect1,
+ gs_rect * prect2,
+ const gs_matrix * pmtx
+)
+{
+ gs_point_transform(prect1->p.x, prect1->p.y, pmtx, &(prect2->p));
+ gs_point_transform(prect1->q.x, prect1->q.y, pmtx, &(prect2->q));
+ if (prect2->p.x > prect2->q.x) {
+ double ftmp = prect2->p.x;
+
+ prect2->p.x = prect2->q.x;
+ prect2->q.x = ftmp;
+ }
+ if (prect2->p.y > prect2->q.y) {
+ double ftmp = prect2->p.y;
+
+ prect2->p.y = prect2->q.y;
+ prect2->q.y = ftmp;
+ }
+}
+
+/*
+ * Create the transformation matrix corresponding to a PCL rotation.
+ *
+ * The rotation operand is an integer in the range 0..3; the desired angle of
+ * rotation is 90 * rot.
+ *
+ * PCL rotations are not pure rotations, and thus cannot be uniquely identified
+ * by an angle. A PCL coordinate system is always associated with a rectangular
+ * (and aligned) subset of the page, which lies in the possitive quadrant of
+ * the coordinate system. The origin of the coordinate system is always one
+ * corner of this rectangular region. A rotation in PCL both alters the
+ * orientation of the coordinate system and moves its origin to another corner,
+ * so as to keep the rectangluar subregion in the positive quadrant.
+ *
+ * To implement such a transformation, it is necessary to know both the
+ * desired change of orientation, and the dimensions of the rectangular
+ * region (in the original coordinate system).
+ */
+ void
+pcl_make_rotation(
+ int rot,
+ floatp width,
+ floatp height,
+ gs_matrix * pmtx
+)
+{
+ *pmtx = rot_mtx[rot & 0x3];
+ if (pmtx->xx + pmtx->yx < 0.0)
+ pmtx->tx = width;
+ if (pmtx->xy + pmtx->yy < 0.0)
+ pmtx->ty = height;
+}
+
+/*
+ * Pattern reference point manipulation.
+ *
+ * Logically, the pattern reference point transforms in the same manner as the
+ * logical page: it is reset by changing the logical page orientation (not
+ * documented, but verified empirically), it moves with the left and top offset
+ * commands, but it does not change with changes in print direction.
+ *
+ * Ergo, the logical space in which to maintain the pattern reference point
+ * is the logical page transformation. This is also the logical space in which
+ * to keep the current addressable (cursor) position, but the PCL code is
+ * illogical in this regard (see the code for pcl_set_print_direction in
+ * pcdraw.c if you are not convinced of this); the current addressable
+ * position is instead maintained in a curious "semi-print-direction" space,
+ * which incorporates the orientation but not the translation component of
+ * the "print direction" coordinate space.
+ *
+ * Hence, this code must convert the current addressable position back into
+ * logical page space before making use of it. In other portions of this code
+ * such a change is by using the current transformation directly the graphic
+ * state. This is a bit unfortunate, as transformation must be set twice,
+ * which can play havoc with transformation-sensitive caches.
+ *
+ * The current code instead instead directly access the matrix machinery,
+ * using the graphic state only to gather the default transformation (which
+ * maps the physical page to the device, with centipoints as the source unit).
+ *
+ * When setting up the transformation matrix to be used by a pattern, the code
+ * constructs the resulting matrix in three steps:
+ *
+ * Get the default transformation matrix and modify it to transform
+ * logical page space to device space. This involves incorporating
+ * the left and top offsets and the logical page orientation.
+ *
+ * Translate the resulting matrix by the pattern reference point.
+ *
+ * If the pattern is to be rotated by the print direction, apply the
+ * print direction rotation
+ */
+
+/*
+ * Convert a floating point number that is nearly an integer to an integer.
+ */
+ static floatp
+adjust_param(
+ floatp val
+)
+{
+ floatp fval = floor(val);
+ floatp cval = ceil(val);
+
+ return (val - fval < .001 ? fval : (cval - val < .001 ? cval : val));
+}
+
+/*
+ * Form the transformation matrix required to render a pattern.
+ */
+ void
+pcl_xfm_get_pat_xfm(
+ const pcl_state_t * pcs,
+ pcl_pattern_t * pptrn,
+ gs_matrix * pmat
+)
+{
+ const pcl_xfm_state_t * pxfmst = &(pcs->xfm_state);
+ int rot = (pcs->pat_orient - pxfmst->lp_orient) & 0x3;
+
+ *pmat = pxfmst->lp2dev_mtx;
+ pmat->tx = pcs->pat_ref_pt.x;
+ pmat->ty = pcs->pat_ref_pt.y;
+
+ /* record the referenc point used in the rendering structure */
+ pptrn->ref_pt = pcs->pat_ref_pt;
+
+ /* rotate as necessar */
+ if (rot != 0)
+ gs_matrix_multiply(&(rot_mtx[rot]), pmat, pmat);
+
+ /* scale to the appropriate resolution (before print direction rotation) */
+ gs_matrix_scale( pmat,
+ inch2coord(1.0 / (floatp)pptrn->ppat_data->xres),
+ inch2coord(1.0 / (floatp)pptrn->ppat_data->yres),
+ pmat
+ );
+
+ /* avoid parameters that are slightly different from integers */
+ pmat->xx = adjust_param(pmat->xx);
+ pmat->xy = adjust_param(pmat->xy);
+ pmat->yx = adjust_param(pmat->yx);
+ pmat->yy = adjust_param(pmat->yy);
+
+ /* record the rotation used for rendering */
+ pptrn->orient = pcs->pat_orient;
+}
+
+/*
+ * Reset the pattern reference point. This should be done each time the logical
+ * page parameters change. (This would be better done via a reset, but
+ * unfortunately there was no reset created for this category of even.)
+ */
+ void
+pcl_xfm_reset_pcl_pat_ref_pt(
+ pcl_state_t * pcs
+)
+{
+ pcs->pcl_pat_ref_pt.x = 0.0;
+ pcs->pcl_pat_ref_pt.y = 0.0;
+ /* initialize the device coordinates to bogus values to guarantee
+ the pattern is reset. */
+ pcs->pat_ref_pt.x = -1;
+ pcs->pat_ref_pt.y = -1;
+ pcs->pat_orient = -1;
+ pcs->rotate_patterns = true;
+}
+
+/*
+ * Set up the pattern orientation and reference point for PCL. Note that PCL's
+ * pattern reference point is kept in logical page space.
+ */
+ void
+pcl_xfm_pcl_set_pat_ref_pt(
+ pcl_state_t * pcs
+)
+{
+ pcl_xfm_state_t * pxfmst = &(pcs->xfm_state);
+
+ gs_point_transform( pcs->pcl_pat_ref_pt.x,
+ pcs->pcl_pat_ref_pt.y,
+ &(pxfmst->lp2dev_mtx),
+ &(pcs->pat_ref_pt)
+ );
+ pcs->pat_ref_pt.x = floor(pcs->pat_ref_pt.x + 0.5);
+ pcs->pat_ref_pt.y = floor(pcs->pat_ref_pt.y + 0.5);
+ pcs->pat_orient = (pxfmst->lp_orient
+ + (pcs->rotate_patterns ? pxfmst->print_dir : 0)) & 0x3;
+}
+
+/*
+ * Set up the pattern orientatin and reference point for GL. The anchor point
+ * is taken as being in the current GL space, and the current transform is
+ * assumed properly set. The orientation is that of the logical page.
+ */
+ void
+pcl_xfm_gl_set_pat_ref_pt(
+ pcl_state_t * pcs
+)
+{
+ gs_transform( pcs->pgs,
+ pcs->g.anchor_corner.x,
+ pcs->g.anchor_corner.y,
+ &(pcs->pat_ref_pt)
+ );
+ pcs->pat_ref_pt.x = floor(pcs->pat_ref_pt.x + 0.5);
+ pcs->pat_ref_pt.y = floor(pcs->pat_ref_pt.y + 0.5);
+ pcs->pat_orient = (pcs->xfm_state.lp_orient + (pcs->g.rotation / 90)) & 0x3;
+}
+
+
+/*
+ * ESC * p # R
+ *
+ * Set pattern reference point.
+ *
+ */
+ static int
+set_pat_ref_pt(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint rotate = uint_arg(pargs);
+
+ if (rotate <= 1) {
+ pcl_break_underline(pcs);
+ gs_point_transform( (floatp)pcs->cap.x,
+ (floatp)pcs->cap.y,
+ &(pcs->xfm_state.pd2lp_mtx),
+ &(pcs->pcl_pat_ref_pt)
+ );
+ pcs->rotate_patterns = (rotate == 0);
+ }
+ return 0;
+}
+
+
+/*
+ * Initializaton and reset routines. There is currently no copy routine, as the
+ * desired transformation is reset for each object printed. No special reset
+ * routine is required, as a reset of the logical page will reset the pattern
+ * reference point as well.
+ */
+ static int
+xfm_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'p', 'R',
+ PCL_COMMAND( "Pattern Reference Point",
+ set_pat_ref_pt,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+const pcl_init_t pcl_xfm_init = { xfm_do_registration, 0, 0 };
diff --git a/pcl/pcpatxfm.h b/pcl/pcpatxfm.h
new file mode 100644
index 000000000..f12ee6064
--- /dev/null
+++ b/pcl/pcpatxfm.h
@@ -0,0 +1,83 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcpatxfm.h - interface for the pattern and general PCL transformation code */
+
+#ifndef pcpatxfm_INCLUDED
+#define pcpatxfm_INCLUDED
+
+#include "gx.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "pcstate.h"
+#include "pcommand.h"
+#include "pcpatrn.h"
+
+
+/* invert a diagonal matrix (assumed to be non-signular) */
+void pcl_invert_mtx(const gs_matrix * pmtx1, gs_matrix * pmtx2);
+
+/* transform a rectangel via a diagonal matrix */
+void pcl_transform_rect(const gs_memory_t *mem,
+ const gs_rect * prect1,
+ gs_rect * prect2,
+ const gs_matrix * pmtx
+);
+
+/*
+ * create a 90 degree rotation matrix (counter clockwise rotation) that includes
+ * the transformation required to keep the indicated rectangle in the positive
+ * quadrant (with the origin at one corner of the rectangle).
+ */
+void pcl_make_rotation(
+ int rot,
+ floatp width,
+ floatp height,
+ gs_matrix * pmtx
+);
+
+/*
+ * Form the transformation matrix required to render a pattern.
+ *
+ * Note that, though the rotation implicit in the print direction may apply
+ * to a pattern transformation, the translation never does.
+ */
+void pcl_xfm_get_pat_xfm(
+ const pcl_state_t * pcs,
+ pcl_pattern_t * pptrn,
+ gs_matrix * pmat
+);
+
+/*
+ * Reset the PCL pattern reference point. This should be done each time the
+ * logical page parameters change. (This would be better done via a reset, but
+ * unfortunately there was no reset created for this category of event.)
+ */
+void pcl_xfm_reset_pcl_pat_ref_pt(pcl_state_t * pcs);
+
+/*
+ * Set up the pattern orientation and reference point for PCL. Note that PCL's
+ * pattern reference point is kept in logical page space.
+ */
+void pcl_xfm_pcl_set_pat_ref_pt(pcl_state_t * pcs);
+
+/*
+ * Set up the pattern orientatin and reference point for GL. The anchor point
+ * is taken as being in the current GL space, and the current transform is
+ * assumed properly set. The orientation is that of the logical page.
+ */
+void pcl_xfm_gl_set_pat_ref_pt(pcl_state_t * pcs);
+
+extern const pcl_init_t pcl_xfm_init;
+
+#endif /* pcpatxfm_INCLUDED */
diff --git a/pcl/pcrect.c b/pcl/pcrect.c
new file mode 100644
index 000000000..64c54782f
--- /dev/null
+++ b/pcl/pcrect.c
@@ -0,0 +1,286 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcrect.c - PCL5 rectangular area fill commands */
+#include "math_.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcdraw.h"
+#include "pcpatrn.h"
+#include "pcbiptrn.h"
+#include "pcuptrn.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gspaint.h"
+#include "gsrop.h"
+
+
+
+/*
+ * The graphic library is, unfortunately, not equipped to produce accurate
+ * PCL rectangles on its own. These rectangles must always be rendered with
+ * the same pixel dimensions, regardless of location (ignoring clipping),
+ * in the "grid intersection" pixel placement mode, must always add one
+ * additional pixel in the "right" and "down" directions, relative to print
+ * direction 0.
+ *
+ * To accomplish these tasks, it is necessary to properly adjust the rectangle
+ * dimensions provided to the graphic layer. That task is accomplished by
+ * this routine.
+ *
+ * Note that this code is designed to work with no fill adjustment in the
+ * graphic library.
+ */
+ static int
+adjust_render_rectangle(
+ pcl_state_t * pcs
+)
+{
+ gs_state * pgs = pcs->pgs;
+ const pcl_xfm_state_t * pxfmst = &(pcs->xfm_state);
+ coord w = pcs->rectangle.x;
+ coord h = pcs->rectangle.y;
+ gs_point dims;
+ gs_rect rect;
+ gs_matrix save_mtx, ident_mtx;
+ int code = 0;
+
+ /* adjust the width and height to reflect the logical page boundaries */
+ if (pcs->cap.x + w > pxfmst->pd_size.x)
+ w = pxfmst->pd_size.x - pcs->cap.x;
+ if (pcs->cap.y + h > pxfmst->pd_size.y)
+ h = pxfmst->pd_size.y - pcs->cap.y;
+
+ /* move the current point to an integral pixel location */
+ gs_transform(pgs, (floatp)pcs->cap.x, (floatp)pcs->cap.y, &(rect.p));
+ rect.p.x = floor(rect.p.x + 0.5);
+ rect.p.y = floor(rect.p.y + 0.5);
+
+ /* set the dimensions to be a multiple of pixels */
+ gs_dtransform(pgs, (floatp)w, (floatp)h, &dims);
+ if (dims.x >= 0)
+ rect.q.x = rect.p.x + ceil(dims.x);
+ else {
+ rect.q.x = rect.p.x;
+ rect.p.x += floor(dims.x);
+ }
+ if (dims.y >= 0)
+ rect.q.y = rect.p.y + ceil(dims.y);
+ else {
+ rect.q.y = rect.p.y;
+ rect.p.y += floor(dims.y);
+ }
+
+ /*
+ * If the pixel-placement mode is 1, decrease the size of the rectangle
+ * by one pixel. Note that this occurs only if the rectangle dimension is
+ * not 0; rectangles with a zero dimension are never rendered, irrespective
+ * of pixle placement mode.
+ *
+ * This trickiest part of this increase in dimension concerns correction
+ * for the device orientation relative to print direction 0. The output
+ * produced needs to be the same for pages produced with either long-edge
+ * -feed or short-edge-feed printers, so it is not possible to add one
+ * pixel in each direction in device space.
+ */
+ if ((pcs->pp_mode == 1) && (dims.x != 0.0) && (dims.y != 0.0)) {
+ gs_matrix dflt_mtx;
+ gs_point disp;
+
+ gs_defaultmatrix(pgs, &dflt_mtx);
+ gs_distance_transform(1.0, 1.0, &dflt_mtx, &disp);
+ if (disp.x < 0.0)
+ rect.p.x += 1.0;
+ else
+ rect.q.x -= 1.0;
+ if (disp.y < 0.0)
+ rect.p.y += 1.0;
+ else
+ rect.q.y -= 1.0;
+ }
+
+ /* rectangles with 0-dimensions are never printed */
+ if ((rect.p.x == rect.q.x) || (rect.p.y == rect.q.y))
+ return 0;
+
+ /* transform back into pseudo-print-direction space */
+ gs_currentmatrix(pgs, &save_mtx);
+ gs_make_identity(&ident_mtx);
+ gs_setmatrix(pgs, &ident_mtx);
+ code = gs_rectfill(pgs, &rect, 1);
+ pcs->page_marked = true;
+ gs_setmatrix(pgs, &save_mtx);
+ return code;
+}
+
+/*
+ * ESC * c <dp> H
+ */
+ static int
+pcl_horiz_rect_size_decipoints(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->rectangle.x = any_abs(float_arg(pargs)) * 10;
+ return 0;
+}
+
+/*
+ * ESC * c <units> A
+ */
+ static int
+pcl_horiz_rect_size_units(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->rectangle.x = any_abs(int_arg(pargs)) * pcs->uom_cp;
+ return 0;
+}
+
+/*
+ * ESC * c <dp> V
+ */
+ static int
+pcl_vert_rect_size_decipoints(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->rectangle.y = any_abs(float_arg(pargs)) * 10;
+ return 0;
+}
+
+/*
+ * ESC * c B
+ */
+ static int
+pcl_vert_rect_size_units(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcs->rectangle.y = any_abs(int_arg(pargs)) * pcs->uom_cp;
+ return 0;
+}
+
+/*
+ * ESC * c <fill_enum> P
+ */
+ static int
+pcl_fill_rect_area(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcl_pattern_source_t type = (pcl_pattern_source_t)int_arg(pargs);
+ int id = pcs->pattern_id;
+ int code = 0;
+
+ /*
+ * Rectangles have a special property with respect to patterns:
+ *
+ * a non-zero, non-existent pattern specification causes the command
+ * to be ignored, UNLESS this is the current pattern. This only
+ * applies to cross-hatch and user-defined patterns, as the
+ * pattern id. is interpreted as an intensity level for shade
+ * patterns, and patterns >= 100% are considered white.
+ */
+ if (type == pcl_pattern_cross_hatch) {
+ if (pcl_pattern_get_cross(pcs, id) == 0)
+ return 0;
+ } else if (type == pcl_pattern_user_defined) {
+ if (pcl_pattern_get_pcl_uptrn(pcs, id) == 0)
+ return 0;
+ } else if (type == pcl_pattern_current_pattern) {
+ type = pcs->pattern_type;
+ id = pcs->current_pattern_id;
+ } else if (type > pcl_pattern_shading)
+ return 0;
+
+ /* set up the graphic state; render the rectangle */
+ if ( ((code = pcl_set_drawing_color(pcs, type, id, false)) >= 0) &&
+ ((code = pcl_set_graphics_state(pcs)) >= 0) )
+ code = adjust_render_rectangle(pcs);
+ return code;
+}
+
+/*
+ * Initialization
+ */
+ static int
+pcrect_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * mem
+)
+{
+ /* Register commands */
+ DEFINE_CLASS('*')
+ {
+ 'c', 'H',
+ PCL_COMMAND( "Horizontal Rectangle Size Decipoints",
+ pcl_horiz_rect_size_decipoints,
+ pca_neg_error | pca_big_error | pca_in_rtl
+ )
+ },
+ {
+ 'c', 'A',
+ PCL_COMMAND( "Horizontal Rectangle Size Units",
+ pcl_horiz_rect_size_units,
+ pca_neg_error | pca_big_error | pca_in_rtl
+ )
+ },
+ {
+ 'c', 'V',
+ PCL_COMMAND( "Vertical Rectangle Size Decipoint",
+ pcl_vert_rect_size_decipoints,
+ pca_neg_error | pca_big_error | pca_in_rtl
+ )
+ },
+ {
+ 'c', 'B',
+ PCL_COMMAND( "Vertical Rectangle Size Units",
+ pcl_vert_rect_size_units,
+ pca_neg_error | pca_big_error | pca_in_rtl
+ )
+ },
+ {
+ 'c', 'P',
+ PCL_COMMAND( "Fill Rectangular Area",
+ pcl_fill_rect_area,
+ pca_neg_ignore | pca_big_ignore | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+ static void
+pcrect_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_printer
+ | pcl_reset_overlay );
+ if ((type & mask) != 0) {
+ pcs->rectangle.x = 0;
+ pcs->rectangle.y = 0;
+ }
+}
+
+const pcl_init_t pcrect_init = { pcrect_do_registration, pcrect_do_reset, 0 };
diff --git a/pcl/pcsfont.c b/pcl/pcsfont.c
new file mode 100644
index 000000000..cc73259bf
--- /dev/null
+++ b/pcl/pcsfont.c
@@ -0,0 +1,898 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcsfont.c */
+/* PCL5 soft font creation commands */
+#include "memory_.h"
+#include "stdio_.h" /* needed for pl_load_tt_font */
+#include "math_.h"
+#include "gdebug.h"
+#include "pcommand.h"
+#include "pcfont.h"
+#include "pcursor.h"
+#include "pcpage.h"
+#include "pcstate.h"
+#include "pcfsel.h"
+#include "pcparse.h"
+#include "pjparse.h"
+#include "pldict.h"
+#include "plvalue.h"
+#include "plmain.h" /* for high_level_device...
+ hopefully this will go away soon */
+#include "gsbitops.h"
+#include "gsccode.h"
+#include "gsmatrix.h"
+#include "gsutil.h"
+#include "gxfont.h"
+#include "gxfont42.h"
+
+/* Define the downloaded character data formats. */
+typedef enum {
+ pccd_bitmap = 4,
+ pccd_intellifont = 10,
+ pccd_truetype = 15
+} pcl_character_format;
+
+/* ------ Internal procedures ------ */
+
+/* Delete a soft font. If it is the currently selected font, or the */
+/* current primary or secondary font, cause a new one to be chosen. */
+static void
+pcl_delete_soft_font(pcl_state_t *pcs, const byte *key, uint ksize,
+ void *value)
+{
+ if ( value == NULL ) {
+ if ( !pl_dict_find_no_stack(&pcs->soft_fonts, key, ksize, &value) )
+ return; /* not a defined font */
+ }
+ {
+ pl_font_t *plfontp = (pl_font_t *)value;
+ if ( pcs->font_selection[0].font == plfontp )
+ pcs->font_selection[0].font = 0;
+ if ( pcs->font_selection[1].font == plfontp )
+ pcs->font_selection[1].font = 0;
+ /* if this is permanent font we need to tell PJL we are
+ removing it */
+ if ( plfontp->storage & pcds_permanent )
+ if ( pjl_proc_register_permanent_soft_font_deletion(pcs->pjls,
+ plfontp->params.pjl_font_number) > 0 )
+ pcl_set_current_font_environment(pcs);
+ pcs->font = pcs->font_selection[pcs->font_selected].font;
+ pl_dict_undef_purge_synonyms(&pcs->soft_fonts, key, ksize);
+ }
+}
+
+/* ------ Commands ------ */
+
+static int /* ESC * c <id> D */
+pcl_assign_font_id(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint id = uint_arg(pargs);
+ id_set_value(pcs->font_id, id);
+ /* set state to use id's not strings */
+ pcs->font_id_type = numeric_id;
+ return 0;
+}
+
+/* Supports copy or assignment of resident fonts. Copying a soft font
+ involves a deep copy and a new font. Copying a resident font
+ creates a link to the original (source) font */
+
+static int
+pcl_make_resident_font_copy(pcl_state_t *pcs)
+{
+ pl_dict_enum_t dictp;
+ gs_const_string key;
+ void * value;
+ bool found = false;
+
+ /* first check for a duplicate key, if found remove it */
+ if ( pl_dict_lookup(&pcs->built_in_fonts, current_font_id, current_font_id_size,
+ &value, false, (pl_dict_t **)0) )
+ if ( pl_dict_undef(&pcs->built_in_fonts, current_font_id, current_font_id_size) == false )
+ /* shouldn't fail */
+ return -1;
+
+ /* now search for the value */
+ pl_dict_enum_begin(&pcs->built_in_fonts, &dictp);
+ while ( pl_dict_enum_next(&dictp, &key, &value ) )
+ if ( (void *)(pcs->font) == value ) {
+ found = true;
+ break;
+ }
+ if ( found == false )
+ return -1;
+ pl_dict_put_synonym(&pcs->built_in_fonts, key.data,
+ key.size, current_font_id,
+ current_font_id_size);
+ return 0;
+}
+
+
+static int /* ESC * c <fc_enum> F */
+pcl_font_control(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ gs_const_string key;
+ void *value;
+ pl_dict_enum_t denum;
+
+ switch ( uint_arg(pargs) ) {
+ case 0:
+ /* Delete all soft fonts. */
+ pcs->font = pcs->font_selection[pcs->font_selected].font;
+ pl_dict_enum_stack_begin(&pcs->soft_fonts, &denum, false);
+ while ( pl_dict_enum_next(&denum, &key, &value) ) {
+ pcl_delete_soft_font(pcs, key.data, key.size, value);
+ /* when deleting fonts we must restart the enumeration
+ each time because the last deleted font may have had
+ deleted synonyms which are not properly registered in
+ the enumeration structure. NB A similar change should
+ be made for deleting all temporary fonts. */
+ pl_dict_enum_stack_begin(&pcs->soft_fonts, &denum, false);
+ }
+ pl_dict_release(&pcs->soft_fonts);
+ break;
+ case 1:
+ /* Delete all temporary soft fonts. */
+ pl_dict_enum_stack_begin(&pcs->soft_fonts, &denum, false);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ if ( ((pl_font_t *)value)->storage == pcds_temporary )
+ pcl_delete_soft_font(pcs, key.data, key.size, value);
+ break;
+ case 2:
+ /* Delete soft font <font_id>. */
+ pcl_delete_soft_font(pcs, current_font_id, current_font_id_size, NULL);
+ /* decache the currently selected font in case we deleted it. */
+ pcl_decache_font(pcs, -1);
+
+ break;
+ case 3:
+ /* Delete character <font_id, character_code>. */
+ if ( pl_dict_find_no_stack(&pcs->soft_fonts, current_font_id, current_font_id_size, &value) )
+ pl_font_remove_glyph((pl_font_t *)value, pcs->character_code);
+ return 0;
+
+ break;
+ case 4:
+ /* Make soft font <font_id> temporary. */
+ if ( pl_dict_find_no_stack(&pcs->soft_fonts, current_font_id, current_font_id_size, &value) )
+ ((pl_font_t *)value)->storage = pcds_temporary;
+
+ break;
+ case 5:
+ /* Make soft font <font_id> permanent. */
+ if ( pl_dict_find_no_stack(&pcs->soft_fonts, current_font_id, current_font_id_size, &value) ) {
+ ((pl_font_t *)value)->storage = pcds_permanent;
+ ((pl_font_t *)value)->params.pjl_font_number =
+ pjl_proc_register_permanent_soft_font_addition(pcs->pjls);
+ }
+ break;
+ case 6:
+ {
+ int code;
+ if ( pcs->font == 0 ) {
+ code = pcl_recompute_font(pcs);
+ if ( code < 0 )
+ return code;
+ }
+ if ( pcs->font->storage == pcds_internal ) {
+ return pcl_make_resident_font_copy(pcs);
+ } else {
+ pl_font_t *plfont = pl_clone_font(pcs->font,
+ pcs->memory,
+ "pcl_font_control()");
+ if ( plfont == 0 ) {
+ dprintf("pcsfont.c clone font FIXME\n");
+ return 0;
+ }
+ code = gs_definefont(pcs->font_dir, plfont->pfont);
+ if ( code < 0 )
+ return code;
+ pcl_delete_soft_font(pcs, current_font_id, current_font_id_size, NULL);
+ plfont->storage = pcds_temporary;
+ plfont->data_are_permanent = false;
+ pl_dict_put(&pcs->soft_fonts, current_font_id, current_font_id_size, plfont);
+ }
+ }
+ break;
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+static int /* ESC ) s <count> W */
+pcl_font_header(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint count = uint_arg(pargs);
+ const byte *data = arg_data(pargs);
+ pcl_font_header_t *pfh = (pcl_font_header_t *)data;
+ uint desc_size;
+ pl_font_scaling_technology_t fst;
+ gs_memory_t *mem = pcs->memory;
+ pl_font_t *plfont;
+ byte *header;
+ int code;
+ bool has_checksum;
+ if ( count < 64 && pfh->HeaderFormat != pcfh_bitmap)
+ return e_Range; /* pcfh_bitmap defaults short headers to 0 except underline position = 5; */
+ desc_size =
+ (pfh->FontDescriptorSize[0] << 8) + pfh->FontDescriptorSize[1];
+ /* Dispatch on the header format. */
+ switch ( pfh->HeaderFormat )
+ {
+ case pcfh_bitmap:
+ case pcfh_resolution_bitmap:
+ fst = plfst_bitmap;
+ has_checksum = false;
+ break;
+ case pcfh_intellifont_bound:
+ case pcfh_intellifont_unbound:
+ fst = plfst_Intellifont;
+ /* intellifonts do have a checksum but we have seen
+ several fonts in tests that don't follow the
+ documentation. It is possible intellifonts use a
+ different offset than truetype to begin the summation.
+ We have not investigated. */
+ has_checksum = false;
+ break;
+ case pcfh_truetype:
+ case pcfh_truetype_large:
+ fst = plfst_TrueType;
+ has_checksum = true;
+ break;
+ default:
+ return_error(gs_error_invalidfont);
+ }
+
+ /* Fonts should include a final byte that makes the sum of the
+ bytes in the font 0 (mod 256). The hp documentation says
+ byte 64 and up should contribute to the checksum. All
+ known examples indicate byte 64 (index 63 of the array
+ below) is not included. */
+ if (has_checksum) {
+ ulong sum = 0;
+ int i;
+ for (i = count - 1; i >= 64; i--) {
+ sum += data[i];
+ sum %= 256;
+ }
+
+ if (sum != 0) {
+ dprintf("corrupt font\n");
+ return e_Range;
+ }
+ }
+ /* Delete any previous font with this ID. */
+ pcl_delete_soft_font(pcs, current_font_id, current_font_id_size, NULL);
+ /* Create the generic font information. */
+ plfont = pl_alloc_font(mem, "pcl_font_header(pl_font_t)");
+ header = gs_alloc_bytes(mem, count, "pcl_font_header(header)");
+ if ( plfont == 0 || header == 0 )
+ return_error(e_Memory);
+ memcpy(header, data, count);
+ plfont->storage = pcds_temporary;
+ plfont->data_are_permanent = false;
+ if (fst == plfst_Intellifont) {
+ uint gifct_offset;
+ if ( pfh->HeaderFormat == pcfh_intellifont_bound )
+ gifct_offset = 78;
+ else {
+ gifct_offset = 78 + 8; /* + 8 for the character complement */
+ /* copy in the compliment while we are here. */
+ memcpy(plfont->character_complement, &data[78], 8);
+ }
+ }
+ plfont->header = header;
+ plfont->header_size = count;
+ plfont->is_xl_format = false;
+ plfont->scaling_technology = fst;
+ plfont->font_type = (pl_font_type_t)pfh->FontType;
+ plfont->font_file = (char *)0;
+ code = pl_font_alloc_glyph_table(plfont, 256, mem,
+ "pcl_font_header(char table)");
+ if ( code < 0 )
+ return code;
+ /* Create the actual font. */
+ switch ( fst )
+ {
+ case plfst_bitmap:
+ {
+ gs_font_base *pfont;
+bitmap: pfont = gs_alloc_struct(mem, gs_font_base, &st_gs_font_base,
+ "pcl_font_header(bitmap font)");
+
+ if ( pfont == 0 )
+ return_error(e_Memory);
+ code = pl_fill_in_font((gs_font *)pfont, plfont, pcs->font_dir,
+ mem, "nameless_font");
+ if ( code < 0 )
+ return code;
+ pl_fill_in_bitmap_font(pfont, gs_next_ids(mem, 1));
+ /* Extract parameters from the font header. */
+ if ( pfh->HeaderFormat == pcfh_resolution_bitmap )
+ {
+#define pfhx ((const pcl_resolution_bitmap_header_t *)pfh)
+ plfont->resolution.x = pl_get_uint16(pfhx->XResolution);
+ plfont->resolution.y = pl_get_uint16(pfhx->YResolution);
+#undef pfhx
+ }
+ /* note that we jump to the bitmap label for type 16 - so
+ called truetype large which can also be bitmap but its
+ resolution field is filled in when scanning the
+ segments (see pl_font_scan_segments() the resolution
+ does not show up in the font header. */
+ else if ( pfh->HeaderFormat == pcfh_bitmap )
+ plfont->resolution.x = plfont->resolution.y = 300;
+ { ulong pitch_1024th_dots =
+ ((ulong)pl_get_uint16(pfh->Pitch) << 8) + pfh->PitchExtended;
+ floatp pitch_cp = (floatp)
+ (pitch_1024th_dots / 1024.0 /* dots */
+ / plfont->resolution.x /* => inches */
+ * 720.0);
+
+ pl_fp_set_pitch_cp(&plfont->params, pitch_cp);
+ }
+ {
+ uint height_quarter_dots = pl_get_uint16(pfh->Height);
+ plfont->params.height_4ths =
+ (uint)(floor((double)height_quarter_dots * 72.0 /
+ (double)(plfont->resolution.x) + 0.5));
+ }
+ break;
+ }
+ case plfst_TrueType:
+ {
+ gs_font_type42 *pfont;
+ { static const pl_font_offset_errors_t errors = {
+ gs_error_invalidfont, 0
+ };
+ code =
+ pl_font_scan_segments(mem, plfont, 70, desc_size, (ulong)count - 2,
+ pfh->HeaderFormat == pcfh_truetype_large,
+ &errors);
+ if ( code < 0 )
+ return code;
+ /* truetype large format 16 can be truetype or bitmap -
+ absurd */
+ if ( ( pfh->HeaderFormat == pcfh_truetype_large ) &&
+ ( plfont->scaling_technology == plfst_bitmap ) )
+ goto bitmap;
+
+ }
+ pfont = gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42,
+ "pcl_font_header(truetype font)");
+ if ( pfont == 0 )
+ return_error(e_Memory);
+
+ { uint num_chars = pl_get_uint16(pfh->LastCode);
+
+ if ( num_chars < 20 )
+ num_chars = 20;
+ else if ( num_chars > 300 )
+ num_chars = 300;
+ code = pl_tt_alloc_char_glyphs(plfont, num_chars, mem,
+ "pcl_font_header(char_glyphs)");
+ if ( code < 0 )
+ return code;
+ }
+ code = pl_fill_in_font((gs_font *)pfont, plfont, pcs->font_dir,
+ mem, "nameless_font");
+ if ( code < 0 )
+ return code;
+ pl_fill_in_tt_font(pfont, NULL, gs_next_ids(mem, 1));
+ { uint pitch_cp =
+ pl_get_uint16(pfh->Pitch) * 100 / pfont->data.unitsPerEm;
+ pl_fp_set_pitch_cp(&plfont->params, pitch_cp);
+ }
+ }
+ break;
+ case plfst_Intellifont:
+ {
+ gs_font_base *pfont =
+ gs_alloc_struct(mem, gs_font_base, &st_gs_font_base,
+ "pcl_font_header(bitmap font)");
+
+ if ( pfont == 0 )
+ return_error(e_Memory);
+ code = pl_fill_in_font((gs_font *)pfont, plfont, pcs->font_dir,
+ mem, "nameless_font");
+ if ( code < 0 )
+ return code;
+ pl_fill_in_intelli_font(pfont, gs_next_ids(mem, 1));
+ { uint pitch_cp =
+ pl_get_uint16(pfh->Pitch) * 100 / 8782.0;
+ pl_fp_set_pitch_cp(&plfont->params, pitch_cp);
+ }
+ break;
+ }
+ default:
+ return_error(gs_error_invalidfont); /* can't happen */
+ }
+ /* Extract common parameters from the font header. */
+ plfont->params.symbol_set = pl_get_uint16(pfh->SymbolSet);
+ plfont->params.proportional_spacing = pfh->Spacing;
+ plfont->params.style = (pfh->StyleMSB << 8) + pfh->StyleLSB;
+ plfont->params.stroke_weight = /* signed byte */
+ (int)(pfh->StrokeWeight ^ 0x80) - 0x80;
+ plfont->params.typeface_family =
+ (pfh->TypefaceMSB << 8) + pfh->TypefaceLSB;
+ pl_dict_put(&pcs->soft_fonts, current_font_id,
+ current_font_id_size, plfont);
+ plfont->pfont->procs.define_font = gs_no_define_font;
+ return gs_definefont(pcs->font_dir, plfont->pfont);
+}
+
+static int /* ESC * c <char_code> E */
+pcl_character_code(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ pcs->character_code = uint_arg(pargs);
+ return 0;
+}
+
+static int /* ESC ( s <count> W */
+pcl_character_data(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ uint count = uint_arg(pargs);
+ uint font_data_size = count;
+ const byte *data = arg_data(pargs);
+ void *value;
+ pl_font_t *plfont;
+ pcl_font_header_format_t format;
+ byte *char_data = 0;
+
+ if ( !pl_dict_find_no_stack(&pcs->soft_fonts, current_font_id,
+ current_font_id_size, &value) )
+ return 0; /* font not found */
+
+ plfont = ((pl_font_t *)value);
+
+ if ( count < 4 || data[2] > count - 2 )
+ return e_Range;
+ if ( data[1] ) /* continuation */ {
+ /* Check that we are continuing data - we know this is the
+ case if the previous download character command byte count
+ is smaller than the data indicated calculating the space
+ for the glyph */
+ if ( (pcs->soft_font_char_data == 0) )
+ return e_Range;
+ /* NB we only enable this for uncompressed bitmap
+ characters for now, since we don't have real world
+ examples for the other font file formats. */
+ if ( data[0] != pccd_bitmap && data[3] != 1 ) {
+ dprintf("continuation not implemented for this font type\n");
+ return e_Unimplemented;
+ }
+ /* append the new data to the new object */
+ memcpy(pcs->soft_font_char_data + pcs->soft_font_count, data + 2, count - 2);
+ /* update the continuation count */
+ pcs->soft_font_count += (count -2);
+ return 0;
+ } else {
+ pcs->soft_font_count = 0;
+ pcs->soft_font_char_data = 0;
+ }
+ format = (pcl_font_header_format_t)
+ ((const pcl_font_header_t *)plfont->header)->HeaderFormat;
+ switch ( data[0] )
+ {
+ case pccd_bitmap:
+ { uint width, height;
+ if ( data[2] != 14 ||
+ (format != pcfh_bitmap &&
+ format != pcfh_resolution_bitmap &&
+ format != pcfh_truetype_large)
+ )
+ return e_Range;
+ width = pl_get_uint16(data + 10);
+ height = pl_get_uint16(data + 12);
+ switch ( data[3] ) {
+ case 1: /* uncompressed bitmap */
+ font_data_size = 16 + (((width + 7) >> 3) * height);
+ break;
+ case 2: /* compressed bitmap */
+ { uint y = 0;
+ const byte *src = data + 16;
+ const byte *end = data + count;
+ uint width_bytes = (width + 7) >> 3;
+ byte *row;
+
+ char_data = gs_alloc_bytes(pcs->memory, 16 + width_bytes * height,
+ "pcl_character_data(compressed bitmap)");
+ if ( char_data == 0 )
+ return_error(e_Memory);
+ memcpy(char_data, data, 16);
+ memset(char_data + 16, 0, width_bytes * height);
+ row = char_data + 16;
+ while ( src < end && y < height ) { /* Read the next compressed row. */
+ uint x;
+ int color = 0;
+ uint reps = *src++;
+ for ( x = 0; src < end && x < width; color ^= 1 ) { /* Read the next run. */
+ uint rlen = *src++;
+
+ if ( rlen > width - x )
+ return e_Range; /* row overrun */
+ if ( color ) { /* Set the run to black. */
+ char *data = (char *)row;
+ while ( rlen-- ) {
+ data[x >> 3] |= (128 >> (x & 7));
+ x++;
+ }
+ }
+ else
+ x += rlen;
+ }
+ row += width_bytes;
+ ++y;
+ /* Replicate the row if needed. */
+ for ( ; reps > 0 && y < height;
+ --reps, ++y, row += width_bytes
+ )
+ memcpy(row, row - width_bytes, width_bytes);
+ }
+ } break;
+ default:
+ return e_Range;
+ }
+ }
+ break;
+ case pccd_intellifont:
+ if ( data[2] != 2 ||
+ (format != pcfh_intellifont_bound &&
+ format != pcfh_intellifont_unbound)
+ )
+ return e_Range;
+ switch ( data[3] )
+ {
+ case 3: /* non-compound character */
+ /* See TRM Figure 11-16 (p. 11-67) for the following. */
+ if ( count < 14 )
+ return e_Range;
+ {
+ uint data_size = pl_get_uint16(data + 4);
+ uint contour_offset = pl_get_uint16(data + 6);
+ uint metric_offset = pl_get_uint16(data + 8);
+ uint outline_offset = pl_get_uint16(data + 10);
+ uint xy_offset = pl_get_uint16(data + 12);
+ /* The contour data excludes 4 initial bytes of header */
+ /* and 2 final bytes of padding/checksum. */
+ if ( data_size != count - 6 ||
+ contour_offset < 10 ||
+ metric_offset < contour_offset ||
+ outline_offset < metric_offset ||
+ xy_offset < outline_offset ||
+ xy_offset > count - 6
+ )
+ return e_Range;
+ }
+ break;
+ case 4: /* compound character */
+ /* See TRM Figure 11-18 (p. 11-68) and 11-19 (p. 11-73) */
+ /* for the following. */
+ if ( count < 8 )
+ return e_Range;
+ { /*
+ * TRM Figure 11-18 is wrong: the number of components
+ * is a byte, not a 16-bit quantity. (It is identified
+ * correctly as a UB on p. 11-70, however.)
+ */
+ uint num_components = data[6];
+ if ( count != 8 + num_components * 6 + 2 )
+ return e_Range;
+ }
+ break;
+ default:
+ return e_Range;
+ }
+ break;
+ case pccd_truetype:
+ if ( format != pcfh_truetype && format != pcfh_truetype_large )
+ return e_Range;
+ break;
+ default:
+ return e_Range;
+ }
+ /* Register the character. */
+ /**** FREE PREVIOUS DEFINITION ****/
+ /* Compressed bitmaps have already allocated and filled in */
+ /* the character data structure. */
+ if ( char_data == 0 ) {
+ char_data = gs_alloc_bytes(pcs->memory, font_data_size,
+ "pcl_character_data");
+ memset(char_data, 0, font_data_size);
+ if ( char_data == 0 )
+ return_error(e_Memory);
+ /* if count > font_data_size extra data is ignored */
+ memcpy(char_data, data, min(count, font_data_size) );
+ /* NB we only handle continuation for uncompressed bitmap characters */
+ if ( data[0] == pccd_bitmap &&
+ data[3] == 1 &&
+ font_data_size > count /* expecting continuation */
+ ) {
+ pcs->soft_font_char_data = char_data;
+ pcs->soft_font_count = count;
+ } else {
+ pcs->soft_font_char_data = 0;
+ pcs->soft_font_count = 0;
+ }
+ }
+ /* get and set the orientation field */
+ {
+ pcl_font_header_t *header = (pcl_font_header_t *)plfont->header;
+ plfont->orient = header->Orientation;
+ }
+ return pl_font_add_glyph(plfont, pcs->character_code, char_data);
+#undef plfont
+}
+
+/* template for casting data to command */
+typedef struct alphanumeric_data_s {
+ byte operation;
+ byte string_id[512];
+} alphanumeric_data_t;
+
+typedef enum resource_type_enum {
+ macro_resource,
+ font_resource
+} resource_type_t;
+
+/* look up a macro in the macro dictionary, if it is not found search
+ on disk and add the macro to the macro dictionary */
+static void *
+pcl_find_resource(pcl_state_t *pcs,
+ const byte string_id[],
+ int string_id_size,
+ resource_type_t resource_type
+ )
+{
+ pl_dict_t *dict = (resource_type == macro_resource ?
+ &pcs->macros :
+ &pcs->soft_fonts);
+ void *value = NULL;
+f: if ( pl_dict_find(dict,
+ string_id,
+ string_id_size,
+ &value) )
+ return value;
+ {
+ /* max alpha name + NULL */
+ char alphaname[512 + 1];
+ long int size;
+ int c, code;
+ for ( c = 0; c < string_id_size; c++ )
+ alphaname[c] = string_id[c];
+ alphaname[c] = '\0';
+ size = pjl_proc_get_named_resource_size(pcs->pjls, alphaname);
+ if ( size == 0 )
+ return NULL;
+ /* allocate enough space for the macro data and the header
+ which indicates the storage type */
+ value = gs_alloc_bytes(pcs->memory,
+ size + sizeof(pcl_macro_t),
+ "disk macro");
+ if ( value == NULL )
+ return NULL;
+ ((pcl_macro_t *)value)->storage = pcds_permanent;
+ if ( pjl_proc_get_named_resource(pcs->pjls, alphaname,
+ (byte *)value + sizeof(pcl_macro_t) ) < 0 )
+ return NULL;
+ code = pl_dict_put(dict,
+ string_id,
+ string_id_size,
+ value);
+ if ( code < 0 )
+ return NULL;
+ /* now find the entry just placed in the dictionary. should not fail */
+ goto f;
+ }
+ return value;
+}
+
+static int /* ESC & n <count> W [operation][string ID] */
+pcl_alphanumeric_id_data(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ uint count = uint_arg(pargs);
+ const alphanumeric_data_t *alpha_data =
+ (const alphanumeric_data_t *)arg_data(pargs);
+ int string_id_size = (count - 1); /* size of id data size - operation size */
+ if ( count == 0 )
+ return 0;
+ if ( count < 1 || count > 512 )
+ return e_Range;
+ switch ( alpha_data->operation )
+ {
+ case 0:
+ /* Set the current font id to the given string id. */
+ {
+ char *new_id = (char *)gs_alloc_bytes(pcs->memory, string_id_size,
+ "pcl_alphanumeric_id_data");
+ if ( new_id == 0 )
+ return_error(e_Memory);
+ /* release the previous id, if necessary */
+ if ( pcs->alpha_font_id.id )
+ gs_free_object( pcs->memory,
+ pcs->alpha_font_id.id,
+ "pcl_free_string_id" );
+ /* copy in the new id from the data */
+ memcpy(new_id, alpha_data->string_id, string_id_size);
+ /* set new id and size */
+ pcs->alpha_font_id.id = (byte *)new_id;
+ pcs->alpha_font_id.size = string_id_size;
+ /* now set up the state to use string id's */
+ pcs->font_id_type = string_id;
+ }
+ break;
+ case 1:
+ {
+ /* Associates the current font's font id to the font
+ with the string id. We simply create an alias entry
+ for the current font id entry. HAS - FIXME. ... */
+ void *value;
+ if ( !pl_dict_find_no_stack(&pcs->soft_fonts,
+ alpha_data->string_id,
+ string_id_size,
+ &value) )
+ return 0;
+ pl_dict_put_synonym(&pcs->soft_fonts, alpha_data->string_id,
+ string_id_size, current_font_id,
+ current_font_id_size);
+ }
+ break;
+ case 2:
+ {
+ /* Select the fonts referred to by the String ID as
+ primary. Same as font id selection but uses the
+ string key instead of a numerical key */
+ void *value;
+ pcl_font_selection_t *pfs = &pcs->font_selection[primary];
+ if ( !pl_dict_find_no_stack(&pcs->soft_fonts,
+ alpha_data->string_id,
+ string_id_size,
+ &value) )
+ return 1;
+ /* NB wrong */
+ pcl_set_id_parameters(pcs, pfs, (pl_font_t *)value, 0);
+ pcl_decache_font(pcs, -1);
+ }
+ break;
+ case 3:
+ {
+ /* same as case 2 but sets secondary font */
+ void *value;
+ pcl_font_selection_t *pfs = &pcs->font_selection[secondary];
+ if ( !pl_dict_find_no_stack(&pcs->soft_fonts,
+ alpha_data->string_id,
+ string_id_size,
+ &value) )
+ return 1;
+ /* NB wrong */
+ pcl_set_id_parameters(pcs, pfs, (pl_font_t *)value, 0);
+ pcl_decache_font(pcs, -1);
+ }
+ break;
+ case 4:
+ {
+ /* sets the current macro id to the string id */
+ char *new_id = (char *)gs_alloc_bytes(pcs->memory, string_id_size,
+ "pcl_alphanumeric_id_data");
+ if ( new_id == 0 )
+ return_error(e_Memory);
+ /* release the previous id, if necessary */
+ if ( pcs->alpha_macro_id.id )
+ gs_free_object( pcs->memory,
+ pcs->alpha_macro_id.id,
+ "pcl_free_string_id" );
+ /* copy in the new id from the data */
+ memcpy(new_id, alpha_data->string_id, string_id_size);
+ /* set new id and size */
+ pcs->alpha_macro_id.id = (byte *)new_id;
+ pcs->alpha_macro_id.size = string_id_size;
+ /* now set up the state to use string id's */
+ pcs->macro_id_type = string_id;
+ }
+ break;
+ case 5:
+ /* associates current macro id to the supplied string id */
+ {
+ void *value;
+ value = pcl_find_resource(pcs, alpha_data->string_id, string_id_size, macro_resource);
+ if ( !value )
+ return 0;
+ pl_dict_put_synonym(&pcs->macros, alpha_data->string_id, string_id_size,
+ current_macro_id, current_macro_id_size);
+ }
+ break;
+ case 20:
+ /* deletes the font association named by the current Font ID */
+ if ( pcs->font_id_type == string_id )
+ pcl_delete_soft_font(pcs, current_font_id, current_font_id_size, NULL);
+ break;
+ case 21:
+ /* deletes the macro association named the the current macro id */
+ if ( pcs->macro_id_type == string_id )
+ pl_dict_undef(&pcs->macros, current_macro_id, current_macro_id_size);
+ break;
+ case 100:
+ /* media select */
+
+ /* this is not sufficiently specified in the PCL
+ comparison guide and interacts with the control panel
+ so we do not implement it completely. We have verified
+ the following occurs: */
+
+ pcl_end_page_if_marked(pcs);
+ pcl_home_cursor(pcs);
+ default:
+ return e_Range;
+ }
+ return 0;
+}
+
+/* Initialization */
+static int
+pcsfont_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ DEFINE_CLASS('*')
+ {'c', 'D',
+ PCL_COMMAND("Assign Font ID", pcl_assign_font_id,
+ pca_neg_error|pca_big_error)},
+ {'c', 'F',
+ PCL_COMMAND("Font Control", pcl_font_control,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ DEFINE_CLASS_COMMAND_ARGS(')', 's', 'W', "Font Header",
+ pcl_font_header, pca_bytes)
+ DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'E', "Character Code",
+ pcl_character_code, pca_neg_error|pca_big_ok)
+ DEFINE_CLASS_COMMAND_ARGS( '(', 's', 'W', "Character Data",
+ pcl_character_data, pca_bytes)
+ DEFINE_CLASS_COMMAND_ARGS('&', 'n', 'W', "Alphanumeric ID Data",
+ pcl_alphanumeric_id_data, pca_bytes)
+ return 0;
+}
+static void
+pcsfont_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{
+ if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay) ) {
+ pcs->soft_font_char_data = 0;
+ pcs->soft_font_count = 0;
+ id_set_value(pcs->font_id, 0);
+ pcs->character_code = 0;
+ pcs->font_id_type = numeric_id;
+ if ( (type & pcl_reset_printer) != 0 ) {
+ pcl_args_t args;
+ arg_set_uint(&args, 1); /* delete temporary fonts */
+ pcl_font_control(&args, pcs);
+ if ( pcs->alpha_font_id.id != 0 )
+ gs_free_object(pcs->memory,
+ pcs->alpha_font_id.id,
+ "pcsfont_do_reset");
+ }
+ pcs->alpha_font_id.id = 0;
+ }
+}
+static int
+pcsfont_do_copy(pcl_state_t *psaved, const pcl_state_t *pcs,
+ pcl_copy_operation_t operation)
+{ if ( operation & pcl_copy_after )
+ { /* Don't restore the soft font set. */
+ /**** MUST HANDLE POSSIBILITY THAT CURRENT FONT WAS DELETED. ****/
+ psaved->soft_fonts = pcs->soft_fonts;
+ }
+ return 0;
+}
+const pcl_init_t pcsfont_init = {
+ pcsfont_do_registration, pcsfont_do_reset, pcsfont_do_copy
+};
diff --git a/pcl/pcstate.h b/pcl/pcstate.h
new file mode 100644
index 000000000..bd8594de2
--- /dev/null
+++ b/pcl/pcstate.h
@@ -0,0 +1,373 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcstate.h - Definition of PCL5 state */
+
+#ifndef pcstate_INCLUDED
+# define pcstate_INCLUDED
+
+#include "gx.h"
+#include "gxdevice.h"
+#include "scommon.h"
+#include "gscspace.h"
+#include "gscolor2.h"
+#include "gscrd.h"
+#include "gsdcolor.h" /* for gx_ht_tile */
+#include "gschar.h"
+#include "pldict.h"
+#include "plfont.h"
+
+/* various components of the state structure */
+#include "pccoord.h" /* centi-point coordinate system */
+#include "pcxfmst.h" /* geometric transformation information */
+#include "pcfontst.h" /* font selection information */
+#include "pctpm.h" /* text parsing method information */
+#include "pcpattyp.h" /* pattern related structures */
+#include "pcdict.h" /* PL dictionary key structure */
+#include "rtrstst.h" /* raster state information */
+#include "pcht.h"
+#include "pcident.h"
+#include "pccsbase.h"
+
+/*#include "pgstate.h"*/ /* HP-GL/2 state, included below */
+#include "pjtop.h"
+
+/* type for string id's */
+typedef struct pcl_string_id_s {
+ byte * id;
+ int size;
+} alphanumeric_string_id_t;
+
+/* type for current state of id's, string or regular id's macros */
+typedef enum id_type_enum {
+ string_id,
+ numeric_id
+} id_type_t;
+
+/* define different language personalities for dynamic configuration */
+typedef enum personality_enum { /* NB document */
+ pcl5c,
+ pcl5e,
+ rtl,
+ hpgl
+} pcl_personality_t;
+
+/*
+ * Palette stack. This is implemented as a simple linked list. NB
+ * needs to be moved.
+ */
+typedef struct pstack_entry_s {
+ struct pstack_entry_s * pnext;
+ pcl_palette_t * ppalet;
+} pstack_entry_t;
+
+#ifndef pcl_state_DEFINED
+# define pcl_state_DEFINED
+typedef struct pcl_state_s pcl_state_t;
+#endif
+#ifndef gs_state_DEFINED
+# define gs_state_DEFINED
+typedef struct gs_state_s gs_state;
+#endif
+
+/*
+ * The routines pcl_gsave and pcl_grestore should be used instead of
+ * gs_gsave and gs_grestore. See the comment in pcdraw.c for details.
+ *
+ * The routine pcl_init_gstate_stk must be called once a boot time to
+ * intialize PCL graphics state stack tracking mechanism.
+ */
+int pcl_gsave(pcl_state_t * pcs);
+int pcl_grestore(pcl_state_t * pcs);
+void pcl_init_gstate_stk(pcl_state_t * pcs);
+void pcl_free_gstate_stk(pcl_state_t * pcs);
+/*
+ * "Cold start" initialization for the graphic state.
+ */
+void pcl_init_state(pcl_state_t * pcs, gs_memory_t * pmem);
+
+
+#include "pgstate.h" /* HP-GL/2 state */
+
+#ifndef pcl_pattern_data_DEFINED
+#define pcl_ht_builtin_dither_DEFINED
+typedef struct pcl_pattern_t pcl_pattern;
+#endif
+
+#ifndef pcl_cs_indexed_DEFINED
+#define pcl_cs_indexed_DEFINED
+typedef struct pcl_cs_indexed_s pcl_cs_indexed_t;
+#endif
+
+/*
+ * Define the entire PCL/HPGL state. The documentation for this is spread
+ * out over the PCL reference manuals, and is incomplete, inconsistent, and
+ * poorly organized. In order to have a ghost (:-)) of a chance of being
+ * able to think about it as a whole, we've organized it here by
+ * documentation chapter, just as we did the .c files.
+ *
+ * NB: If you modify this structure, be sure to also modify the routine
+ * pcl_init_state in pcommand.c.
+ */
+struct pcl_state_s {
+
+ gs_memory_t * memory;
+
+ /* hook back to client data, for callback procedures */
+ void * client_data;
+
+ /* graphics state */
+ gs_state * pgs;
+
+ /* Define an optional procedure for parsing non-ESC data. */
+ int (*parse_other)( void * parse_data,
+ pcl_state_t * pcs,
+ stream_cursor_read * pr
+ );
+ void * parse_data; /* closure data for parse_other */
+
+ /* Chapter 4 (pcjob.c) */
+ int num_copies; /* (also a device parameter) */
+ bool duplex; /* (also a device parameter) */
+ bool bind_short_edge; /* (also a device parameter) */
+ bool back_side; /* (also a device parameter) */
+ int output_bin; /* (also a device parameter) */
+ coord uom_cp; /* centipoints per PCL unit */
+
+ /* Chapter 5 (pcpage.c) */
+ int paper_source;
+ int perforation_skip;
+ pcl_margins_t margins; /* relative to print_direction */
+ pcl_xfm_state_t xfm_state;
+ bool orientation_set; /* the orientation command can
+ only be set once per page */
+ /* Chapter 6 (pcursor.c) */
+ coord hmi_cp;
+ coord vmi_cp;
+ int line_termination;
+ coord_point_t cap;
+ gs_point cursor_stk[20];
+ int cursor_stk_size;
+
+ /* Chapter 8 (pcfont.c) */
+ pcl_font_selection_t font_selection[2];
+ enum {
+ primary = 0,
+ secondary = 1
+ } font_selected;
+ pl_font_t * font; /* 0 means recompute from params */
+ pl_dict_t built_in_fonts; /* "built-in", known at start-up */
+
+ /* Internal variables */
+ gs_font_dir * font_dir; /* gs-level dictionary of fonts */
+ pl_symbol_map_t * map; /* map for current font (above) */
+
+ /* more Chapter 8 (pctext.c) */
+ bool underline_enabled;
+ bool underline_floating;
+ float underline_position; /* distance from baseline */
+
+ const pcl_text_parsing_method_t * text_parsing_method;
+
+ int text_path; /* 0, 1, -1 */
+
+ /* Internal variables */
+ float last_width; /* escapement of last char (for BS) */
+ coord_point_t underline_start; /* start point of underline */
+ bool last_was_BS; /* no printable chars since last BS */
+
+ /* Chapter 10 (pcsymbol.c) */
+ pcl_id_t symbol_set_id;
+ pl_dict_t soft_symbol_sets;
+ pl_dict_t built_in_symbol_sets;
+ pl_dict_t simm_fonts;
+ pl_dict_t cartridge_fonts;
+ int default_symbol_set_value;
+
+ /* Chapter 9 & 11 (pcsfont.c) */
+ pcl_id_t font_id;
+ uint character_code;
+ pl_dict_t soft_fonts;
+ uint soft_font_count;
+ byte * soft_font_char_data;
+ /* PCL comparison guide - alphanumeric string id */
+ alphanumeric_string_id_t alpha_font_id;
+ id_type_t font_id_type;
+
+#define current_font_id \
+ ( ((pcs->font_id_type == string_id) ? (pcs->alpha_font_id.id) \
+ : (id_key(pcs->font_id))) )
+
+#define current_font_id_size \
+ ( ((pcs->font_id_type == string_id) ? (pcs->alpha_font_id.size) : (2)) )
+
+ /* Chapter 12 (pcmacros.c) */
+ pcl_id_t macro_id;
+ pcl_id_t overlay_macro_id;
+ bool overlay_enabled;
+ int macro_level;
+ pl_dict_t macros;
+
+ bool defining_macro;
+ pcl_state_t * saved; /* saved state during execute/call/overlay */
+
+ /* Internal variables */
+ byte * macro_definition; /* for macro being defined, if any */
+ alphanumeric_string_id_t alpha_macro_id;
+ id_type_t macro_id_type;
+
+#define current_macro_id \
+ ( ((pcs->macro_id_type == string_id) ? (pcs->alpha_macro_id.id) \
+ : (id_key(pcs->macro_id))) )
+
+#define current_macro_id_size \
+ ( ((pcs->macro_id_type == string_id) ? (pcs->alpha_macro_id.size) : (2)) )
+
+ /* Chapter 13 (pcprint.c) */
+ gs_point pat_ref_pt; /* active pattern reference point,
+ * in device space */
+
+ int pat_orient; /* current pattern orientation */
+ int pattern_id;
+ int current_pattern_id;
+ pcl_pattern_source_t pattern_type; /* current source for PCL patterns */
+ gs_point pcl_pat_ref_pt; /* PCL's pattern reference point */
+ pl_dict_t pcl_patterns; /* dictionaries to hold pcl and gl/2 patterns */
+ pl_dict_t gl_patterns;
+#define PCL_NUM_SHADE_PATTERNS (7) /* pcl support 7 shades of gray */
+#define PCL_NUM_CROSSHATCH_PATTERNS (6) /* and 6 cross hatch patterns */
+ pcl_pattern * bi_pattern_array[PCL_NUM_SHADE_PATTERNS + PCL_NUM_CROSSHATCH_PATTERNS];
+ int last_pcl_uptrn_id; /* optimizations for recording last patter */
+ pcl_pattern * plast_pcl_uptrn; /* and pattern id */
+ int last_gl2_RF_indx;
+ pcl_pattern * plast_gl2_uptrn;
+ pcl_pattern * psolid_pattern; /* see documentation in pcbiptrn.c for these two */
+ pcl_pattern * punsolid_pattern;
+ bool rotate_patterns; /* rotate patterns with print direction in PCL */
+ bool source_transparent; /* (also in graphics state) */
+ bool pattern_transparent;/* (also in graphics state);
+ * PCL and GL/2 set this
+ * independenty; for GL/2 it is
+ * known as source transparent */
+ bool pcl_pattern_transparent;
+
+
+ /* Chapter 14 (pcrect.c) */
+ coord_point_t rectangle;
+
+ /* Chapter 15 & Chapter C6 (pcgmode.c) */
+ pcl_raster_state_t raster_state;
+
+ /* Chapter 16 (pcstatus.c) */
+ int location_type;
+ int location_unit;
+ struct _sb {
+ byte internal_buffer[80]; /* enough for an error message */
+ byte * buffer;
+ uint write_pos;
+ uint read_pos;
+ } status;
+
+ /* Chapter 24 (pcmisc.c) */
+ bool end_of_line_wrap;
+ bool display_functions;
+ int (*configure_appletalk)( const byte * key,
+ uint key_length,
+ const byte * value,
+ uint value_length
+ );
+
+ /* Chapter C2/C3/C4 (pcpalet.c/pcindexed.c/pccsbase.c/etc.) */
+ int sel_palette_id;
+ int ctrl_palette_id;
+ int monochrome_mode;/* 0=off */
+ int render_mode; /* raw (unmapped) render algorithm */
+ pcl_palette_t * ppalet;
+ pcl_gsid_t next_id; /* id's for palette's and foreground
+ colors see pcident.h */
+ pcl_frgrnd_t * pfrgrnd;
+ pcl_gsid_t frgnd_cache_id;
+
+ pcl_gstate_ids_t * pids;
+ /*
+ * Unlike other elements of the PCL "palette", color rendering dictionaries
+ * are for the most part not a feature that can be controlled from the language.
+ * Except for the white point, the parameters of a color rendering dictionary
+ * are determined by the output device rather than the language.
+ */
+ pcl_crd_t * pcl_default_crd;
+
+ /* internal dithers */
+ pcl_ht_builtin_dither_t ordered_dither;
+ pcl_ht_builtin_dither_t clustered_dither;
+ pcl_ht_builtin_dither_t noise_dither;
+ /*
+ * The forwarding devices to preform any necessary color mapping. There are
+ * four of these: identity mapping, snap to primaries, map black to white and
+ * all other colors to black, and monochrome mapping. The devices are all
+ * identical except for the mapping method used.
+ *
+ * Several devices are required because the rendering method used by the
+ * foreground may not be the same as that used by the current palette.
+ */
+ gs_cie_transform_proc3 dflt_TransformPQR; /* default transform PQR */
+ pcl_rend_info_t rendering_info[20]; /* rendering methods */
+ byte dflt_rendering_remap[20]; /* NB not convinced this is necessary (review) */
+ byte rendering_remap[20]; /* remap the table of rendering methods */
+ pcl_ht_t * pdflt_ht; /* default halftone */
+ pcl_cs_indexed_t *pdflt_cs_indexed;
+ pcl_cid_data_t dflt_cid_data;
+ pcl_cs_base_t * pwhite_cs;
+ pcl_frgrnd_t * pdflt_frgrnd;
+ pstack_entry_t *palette_stack;
+ pcl_palette_t *pdflt_palette; /* default palette */
+ pl_dict_t palette_store; /* dictionary to hold the palette store */
+ float color_comps[3];
+ /* Chapter C5 (pccprint.c) */
+ byte logical_op; /* (also in graphics state) */
+ byte pp_mode; /* pixel placement mode */
+ /* ---------------- HP-GL/2 state ---------------- */
+ pcl_hpgl_state_t g; /* see pgstate.h */
+ /* ---------------- PJL state -------------------- */
+ pl_interp_instance_t *pjls;
+ /* yet another poorly documented pjl variable - this should widen
+ the margins on A4 paper to support 80 10 pitch characters but
+ it appears to affect letter paper as well */
+ bool wide_a4;
+
+ /* the current language personality */
+ pcl_personality_t personality;
+
+ /* store a pointer to the command definitions for use by macros */
+ void *pcl_commands;
+
+ /* indicates page has been written to with a drawing command */
+ bool page_marked;
+
+ /* end page procedure to use */
+ int (*end_page)( pcl_state_t * pcs, int num_copies, int flush );
+ /* map device color spaces to srgb */
+ bool useciecolor;
+ bool halftone_set;
+};
+
+/* accessor functions for the pcl target device. These live in
+ pctop.c for now */
+int pcl_load_cartridge_fonts(pcl_state_t *pcs, const char *pathname);
+int pcl_load_simm_fonts(pcl_state_t *pcs, const char *pathname);
+int pcl_load_built_in_fonts(pcl_state_t *pcs, const char *pathname);
+/* implicitly exit gl/2 whenever ESC E is found */
+int pcl_implicit_gl2_finish(pcl_state_t *pcs);
+int pcl_do_printer_reset(pcl_state_t *pcs);
+int pcl_end_page_top(pcl_state_t *pcs, int num_copies, int flush);
+#endif /* pcstate_INCLUDED */
diff --git a/pcl/pcstatus.c b/pcl/pcstatus.c
new file mode 100644
index 000000000..e5091b93b
--- /dev/null
+++ b/pcl/pcstatus.c
@@ -0,0 +1,736 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcstatus.c - PCL5 status readback commands */
+
+#include "memory_.h"
+#include "stdio_.h"
+#include <stdarg.h> /* how to make this portable? */
+#include "string_.h"
+#include "gsmemory.h"
+#include "gsmalloc.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcfont.h"
+#include "pcsymbol.h"
+#include "pcparse.h"
+#include "pcpatrn.h"
+#include "pcuptrn.h"
+#include "pcpage.h"
+#include "pcursor.h"
+#include "stream.h"
+
+#define STATUS_BUFFER_SIZE 10000
+
+/* Internal routines */
+
+static int status_add_symbol_id(ushort *, int, ushort);
+
+
+/* Read out from the status buffer. */
+/* Return the number of bytes read. */
+uint
+pcl_status_read(byte *data, uint max_data, pcl_state_t *pcs)
+{ uint count = min(max_data,
+ pcs->status.write_pos - pcs->status.read_pos);
+ if ( count )
+ memcpy(data, pcs->status.buffer + pcs->status.read_pos, count);
+ pcs->status.read_pos += count;
+ if ( pcs->status.read_pos == pcs->status.write_pos )
+ { gs_free_object(pcs->memory, pcs->status.buffer, "status buffer");
+ pcs->status.write_pos = pcs->status.read_pos = 0;
+ }
+ return count;
+}
+
+/* Write a string on a stream. */
+static void
+stputs(stream *s, const char *str)
+{ uint ignore_count;
+ sputs(s, (const byte *)str, strlen(str), &ignore_count);
+}
+
+/* printf on a stream. */
+/**** THIS SHOULD BE IN THE STREAM PACKAGE. ****/
+void
+stprintf(stream *s, const char *fmt, ...)
+{ uint count;
+ va_list args;
+ char buf[1024];
+
+ va_start(args, fmt);
+ count = vsprintf(buf, fmt, args);
+ sputs(s, (const byte *)buf, count, &count);
+}
+
+/* Set up a stream for writing into the status buffer. */
+static void
+status_begin(stream *s, pcl_state_t *pcs)
+{ byte *buffer = pcs->status.buffer;
+
+ if ( pcs->status.read_pos > 0 )
+ { memmove(buffer, buffer + pcs->status.read_pos,
+ pcs->status.write_pos - pcs->status.read_pos);
+ pcs->status.write_pos -= pcs->status.read_pos;
+ pcs->status.read_pos = 0;
+ }
+ if ( buffer == 0 )
+ { buffer = gs_alloc_bytes(pcs->memory, STATUS_BUFFER_SIZE,
+ "status buffer");
+ pcs->status.buffer = buffer;
+ }
+ if ( buffer == 0 )
+ swrite_string(s, pcs->status.internal_buffer,
+ sizeof(pcs->status.internal_buffer));
+ else
+ swrite_string(s, buffer, gs_object_size(pcs->memory, buffer));
+ sseek(s, pcs->status.write_pos);
+ stputs(s, "PCL\r\n");
+}
+
+/* Add an ID to a list being written. */
+static void
+status_put_id(stream *s, const char *title, const char *id)
+{ /* HACK: we know that there's at least one character in the buffer. */
+ if ( *s->cursor.w.ptr == '\n' )
+ { /* We haven't started the list yet. */
+ stprintf(s, "%s=\"%s", title, id);
+ }
+ else
+ { stprintf(s, ",%s", id);
+ }
+}
+
+
+/* Finish writing an ID list. */
+static void
+status_end_id_list(stream *s)
+{ /* HACK: we know that there's at least one character in the buffer. */
+ if ( *s->cursor.w.ptr != '\n' )
+ stputs(s, "\"\r\n");
+}
+
+
+static void
+status_print_idlist(stream *s, const ushort *idlist, int nid, const char *title)
+{
+ int i;
+
+ for ( i = 0; i < nid; i++ )
+ { char idstr[6]; /* ddddL and a null */
+ int n, l;
+ n = idlist[i] >> 6;
+ l = (idlist[i] & 077) + 'A' - 1;
+ sprintf(idstr, "%d%c", n, l);
+ status_put_id(s, title, idstr);
+ }
+ status_end_id_list(s);
+}
+
+
+/* Output a number, at most two decimal places, but trimming trailing 0's
+ * and possibly the ".". Want to match HP's output as closely as we can. */
+static void
+status_put_floating(stream *s, double v)
+{ /* Figure the format--easier than printing and chipping out the
+ * chars we need. */
+ int vf = (int)(v * 100 + ((v < 0)? -0.5: 0.5));
+ if ( vf / 100 * 100 == vf )
+ stprintf(s, "%d", vf / 100);
+ else if ( vf / 10 * 10 == vf )
+ stprintf(s, "%.1f", v);
+ else
+ stprintf(s, "%.2f", v);
+}
+
+/* Print font status information. */
+/* font_set = -1 for font list, 0 or 1 for current font. */
+static int
+status_put_font(stream *s, pcl_state_t *pcs,
+ uint font_id, uint internal_id,
+ pl_font_t *plfont, int font_set, bool extended)
+{ char paren = (font_set > 0 ? ')' : '(');
+ bool proportional = plfont->params.proportional_spacing;
+
+ /* first escape sequence: symbol-set selection */
+ stputs(s, "SELECT=\"");
+ if ( pl_font_is_bound(plfont) || font_set > 0 )
+ { /* Bound or current font, put out the symbol set. */
+ uint symbol_set = font_set > 0?
+ pcs->font_selection[font_set].params.symbol_set:
+ plfont->params.symbol_set;
+ stprintf(s, "<Esc>%c%u%c", paren, symbol_set >> 5,
+ (symbol_set & 31) + 'A' - 1);
+ }
+
+ /* second escape sequence: font selection */
+ stprintf(s, "<Esc>%cs%dp", paren, proportional);
+ if ( plfont->scaling_technology == plfst_bitmap )
+ { /* Bitmap font */
+ status_put_floating(s, pl_fp_pitch_per_inch(&plfont->params));
+ stputs(s, "h");
+ status_put_floating(s, plfont->params.height_4ths / 4.0);
+ stputs(s, "v");
+ }
+ else
+ { /* Scalable font: output depends on whether selected */
+ if ( font_set > 0 )
+ { /* If selected, we have to cheat and reach up for info;
+ * plfont is below where the scaled values exist. */
+ if ( proportional )
+ { status_put_floating(s,
+ pcs->font_selection[font_set].params.height_4ths / 4.0);
+ stputs(s, "h");
+ }
+ else
+ { status_put_floating(s,
+ pl_fp_pitch_per_inch(&pcs->font_selection[font_set].
+ params));
+ stputs(s, "v");
+ }
+ }
+ else
+ {
+ stputs(s, proportional? "__v": "__h");
+ }
+ }
+ stprintf(s, "%ds%db%uT", plfont->params.style,
+ plfont->params.stroke_weight, plfont->params.typeface_family);
+ if ( plfont->storage & pcds_downloaded )
+ stprintf(s, "<Esc>%c%uX", paren, font_id);
+ stputs(s, "\"\r\n");
+ if ( !pl_font_is_bound(plfont) && font_set < 0 )
+ { int nid;
+ ushort *idlist;
+ pl_dict_enum_t denum;
+ gs_const_string key;
+ void *value;
+
+ idlist = (ushort *)gs_alloc_bytes(pcs->memory,
+ pl_dict_length(&pcs->soft_symbol_sets, false) +
+ pl_dict_length(&pcs->built_in_symbol_sets, false),
+ "status_fonts(idlist)");
+ if ( idlist == NULL )
+ return e_Memory;
+ nid = 0;
+ /* Current fonts show the symbol set bound to them, above. */
+
+ /* NOTE: Temporarily chain soft, built-in symbol sets. DON'T
+ * exit this section without unchaining them. */
+ pl_dict_set_parent(&pcs->soft_symbol_sets,
+ &pcs->built_in_symbol_sets);
+ pl_dict_enum_begin(&pcs->soft_symbol_sets, &denum);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ { pcl_symbol_set_t *ssp = (pcl_symbol_set_t *)value;
+ pl_glyph_vocabulary_t gx;
+
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ if ( ssp->maps[gx] != NULL &&
+ pcl_check_symbol_support(
+ ssp->maps[gx]->character_requirements,
+ plfont->character_complement) )
+ {
+ nid = status_add_symbol_id(idlist, nid,
+ (ssp->maps[gx]->id[0] << 8) + ssp->maps[gx]->id[1]);
+ break; /* one will suffice */
+ }
+ }
+ pl_dict_set_parent(&pcs->soft_symbol_sets, NULL);
+ /* Symbol sets are back to normal. */
+
+ gs_free_object(pcs->memory, (void*)idlist,
+ "status_fonts(idlist)");
+ }
+ if ( extended )
+ { /* Put out the "internal ID number". */
+ if ( plfont->storage & pcds_temporary )
+ stputs(s, "DEFID=NONE\r\n");
+ else
+ {
+ stputs(s, "DEFID=\"");
+ if ( plfont->storage & pcds_all_cartridges )
+ { int c;
+ int n = (plfont->storage & pcds_all_cartridges) >>
+ pcds_cartridge_shift;
+
+ /* pick out the bit index of the cartridge */
+ for (c = 0; (n & 1) == 0; c++)
+ n >>= 1;
+ stprintf(s, "C%d ", c);
+ }
+ else if ( plfont->storage & pcds_all_simms )
+ { int m;
+ int n = (plfont->storage & pcds_all_simms) >>
+ pcds_simm_shift;
+
+ /* pick out the bit index of the SIMM */
+ for (m = 0; (n & 1) == 0; m++)
+ n >>= 1;
+ stprintf(s, "M%d ", m);
+ }
+ else
+ /* internal _vs_ permanent soft */
+ stputs(s, (plfont->storage & pcds_internal)? "I ": "S ");
+ stprintf(s, "%d\"\r\n", internal_id);
+ }
+
+ /* XXX Put out the font name - we need a way to get the name
+ * for fonts that weren't downloaded, hence lack the known
+ * header field. */
+ if ( (plfont->storage & pcds_downloaded) &&
+ plfont->header != NULL )
+ { /* Wire in the size of the FontName field (16)--it can't
+ * change anyway, and this saves work. */
+ pcl_font_header_t *hdr = (pcl_font_header_t *)(plfont->header);
+
+ stprintf(s, "NAME=\"%.16s\"\r\n", hdr->FontName);
+ }
+ }
+ return 0;
+}
+
+/* Finish writing status. */
+/* If we overflowed the buffer, store an error message. */
+static void
+status_end(stream *s, pcl_state_t *pcs)
+{ if ( sendwp(s) )
+ { /* Overrun. Scan back to the last EOL that leaves us */
+ /* enough room for the error line. */
+ static const char *error_line = "ERROR=INTERNAL ERROR\r\n";
+ int error_size = strlen(error_line) + 1;
+ uint limit = gs_object_size(pcs->memory, pcs->status.buffer);
+ uint wpos = stell(s);
+
+ while ( limit - wpos < error_size ||
+ pcs->status.buffer[wpos - 1] != '\n'
+ )
+ --wpos;
+ s->end_status = 0; /**** SHOULDN'T BE NECESSARY ****/
+ sseek(s, wpos);
+ stputs(s, error_line);
+ }
+ sputc(s, FF);
+ pcs->status.write_pos = stell(s);
+}
+
+/* Status readouts */
+/* storage = 0 means currently selected, otherwise it is a mask. */
+
+static int
+status_do_fonts(stream *s, pcl_state_t *pcs,
+ pcl_data_storage_t storage, bool extended)
+{ gs_const_string key;
+ void *value;
+ pl_dict_enum_t denum;
+ int res;
+
+ pl_dict_enum_begin(&pcs->soft_fonts, &denum);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ { uint id = (key.data[0] << 8) + key.data[1];
+ if ( (((pl_font_t *)value)->storage & storage) != 0 ||
+ (storage == 0 && pcs->font == (pl_font_t *)value)
+ )
+ res = status_put_font(s, pcs, id, id, (pl_font_t *)value,
+ (storage != 0 ? -1 : pcs->font_selected), extended);
+ if ( res != 0 )
+ return res;
+ }
+ return 0;
+}
+
+static int
+status_fonts(stream *s, pcl_state_t *pcs,
+ pcl_data_storage_t storage)
+{ return status_do_fonts(s, pcs, storage, false);
+}
+
+static int
+status_macros(stream *s, pcl_state_t *pcs,
+ pcl_data_storage_t storage)
+{ gs_const_string key;
+ void *value;
+ pl_dict_enum_t denum;
+
+ if ( storage == 0 )
+ return 0; /* no "currently selected" macro */
+ pl_dict_enum_begin(&pcs->macros, &denum);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ if ( ((pcl_macro_t *)value)->storage & storage )
+ { char id_string[6];
+ sprintf(id_string, "%u", (key.data[0] << 8) + key.data[1]);
+ status_put_id(s, "IDLIST", id_string);
+ }
+ status_end_id_list(s);
+ return 0;
+}
+
+/*
+ * Get a list of current provided patterns in the given storage class(es).
+ * The pattern storage dictionary is now static, and provides no externally
+ * visible enumeration; hence this operation is rather crudely implemented.
+ */
+ static int
+status_patterns(
+ stream * s,
+ pcl_state_t * pcs,
+ pcl_data_storage_t storage
+)
+{
+ if (storage == 0) {
+ int id = pcs->current_pattern_id;
+ pcl_pattern_t * pptrn = pcl_pattern_get_pcl_uptrn(pcs, id);
+
+ if ((pptrn != 0) && (pcs->pattern_type == pcl_pattern_user_defined)) {
+ char id_string[6];
+
+ sprintf(id_string, "%u", id);
+ status_put_id(s, "IDLIST", id_string);
+ }
+ } else {
+ int id;
+
+ for (id = 0; id < (1L << 15) - 1; id++) {
+ pcl_pattern_t * pptrn = pcl_pattern_get_pcl_uptrn(pcs, id);
+
+ if (pptrn != 0) {
+ char id_string[6];
+
+ sprintf(id_string, "%u", id);
+ status_put_id(s, "IDLIST", id_string);
+ }
+ }
+ }
+ status_end_id_list(s);
+ return 0;
+}
+
+
+static bool /* Is this symbol map supported by any relevant font? */
+status_check_symbol_set(pcl_state_t *pcs, pl_symbol_map_t *mapp,
+ pcl_data_storage_t storage)
+{ gs_const_string key;
+ void *value;
+ pl_dict_enum_t fenum;
+
+ pl_dict_enum_begin(&pcs->soft_fonts, &fenum);
+ while ( pl_dict_enum_next(&fenum, &key, &value) )
+ { pl_font_t *fp = (pl_font_t *)value;
+
+ if ( fp->storage != storage )
+ continue;
+ if ( pcl_check_symbol_support(mapp->character_requirements,
+ fp->character_complement) )
+ return true;
+ }
+ return false;
+}
+
+static int /* add symbol set ID to list (insertion), return new length */
+status_add_symbol_id(ushort *idlist, int nid, ushort new_id)
+{ int i;
+ ushort *idp;
+ ushort t1, t2;
+
+ for ( i = 0, idp = idlist; i < nid; i++ )
+ if ( new_id <= *idp )
+ break;
+ if ( new_id == *idp ) /* duplicate item */
+ return nid;
+ /* insert new_id in front of *idp */
+ for ( t1 = new_id; i < nid; i++ )
+ {
+ t2 = *idp;
+ *idp++ = t1;
+ t1 = t2;
+ }
+ *idp = t1;
+ return nid + 1;
+}
+
+static int
+status_symbol_sets(stream *s, pcl_state_t *pcs, pcl_data_storage_t storage)
+{ gs_const_string key;
+ void *value;
+ pl_dict_enum_t denum;
+ ushort *idlist;
+ int nid;
+
+ if ( storage == 0 )
+ return 0; /* no "currently selected" symbol set */
+
+ /* Note carefully the meaning of this status inquiry. First,
+ * we return only symbol sets applicable to unbound fonts. Second,
+ * the "storage" value refers to the location of fonts. */
+
+ /* total up built-in symbol sets, downloaded ones */
+ nid = pl_dict_length(&pcs->soft_symbol_sets, false) +
+ pl_dict_length(&pcs->built_in_symbol_sets, false);
+ idlist = (ushort *)gs_alloc_bytes(pcs->memory, nid * sizeof(ushort),
+ "status_symbol_sets(idlist)");
+ if ( idlist == NULL )
+ return e_Memory;
+ nid = 0;
+
+ /* For each symbol set,
+ * for each font in appropriate storage,
+ * if the font supports that symbol set, list the symbol set
+ * and break (because we only need to find one such font). */
+
+ /* NOTE: Temporarily chain soft, built-in symbol sets. DON'T
+ * exit this section without unchaining them. */
+ pl_dict_set_parent(&pcs->soft_symbol_sets,
+ &pcs->built_in_symbol_sets);
+ pl_dict_enum_begin(&pcs->soft_symbol_sets, &denum);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ { pcl_symbol_set_t *ssp = (pcl_symbol_set_t *)value;
+ pl_glyph_vocabulary_t gx;
+
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ if ( ssp->maps[gx] != NULL &&
+ status_check_symbol_set(pcs, ssp->maps[gx], storage) )
+ {
+ nid = status_add_symbol_id(idlist, nid,
+ (ssp->maps[gx]->id[0] << 8) + ssp->maps[gx]->id[1]);
+ break; /* one will suffice */
+ }
+ }
+ pl_dict_set_parent(&pcs->soft_symbol_sets, NULL);
+ /* Symbol sets are back to normal. */
+
+ status_print_idlist(s, idlist, nid, "IDLIST");
+ gs_free_object(pcs->memory, (void*)idlist,
+ "status_symbol_sets(idlist)");
+ return 0;
+}
+
+static int
+status_fonts_extended(stream *s, pcl_state_t *pcs,
+ pcl_data_storage_t storage)
+{ return status_do_fonts(s, pcs, storage, true);
+}
+
+static int (*const status_write[])(stream *s, pcl_state_t *pcs,
+ pcl_data_storage_t storage) = {
+ status_fonts, status_macros, status_patterns, status_symbol_sets,
+ status_fonts_extended
+};
+
+/* Commands */
+
+static int /* ESC * s <enum> T */
+pcl_set_readback_loc_type(pcl_args_t *pargs, pcl_state_t *pcs)
+{ pcs->location_type = uint_arg(pargs);
+ return 0;
+}
+
+static int /* ESC * s <enum> U */
+pcl_set_readback_loc_unit(pcl_args_t *pargs, pcl_state_t *pcs)
+{ pcs->location_unit = uint_arg(pargs);
+ return 0;
+}
+
+static int /* ESC * s <enum> I */
+pcl_inquire_readback_entity(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint i = uint_arg(pargs);
+ int unit = pcs->location_unit;
+ stream st;
+ static const char *entity_types[] = {
+ "FONTS", "MACROS", "PATTERNS", "SYMBOLSETS", "FONTS EXTENDED"
+ };
+ pcl_data_storage_t storage;
+ int code = 0;
+ long pos;
+
+ if ( i > 4 )
+ return e_Range;
+ status_begin(&st, pcs);
+ stprintf(&st, "INFO %s\r\n", entity_types[i]);
+ switch ( pcs->location_type )
+ {
+ case 0: /* invalid location */
+ code = -1;
+ break;
+ case 1: /* currently selected */
+ storage = (pcl_data_storage_t)0; /* indicates currently selected */
+ break;
+ case 2: /* all locations */
+ storage = (pcl_data_storage_t)~0;
+ break;
+ case 3: /* internal */
+ if ( unit != 0 )
+ { code = -1;
+ break;
+ }
+ storage = pcds_internal;
+ break;
+ case 4: /* downloaded */
+ if ( unit > 2 )
+ code = -1;
+ else
+ { static const pcl_data_storage_t dl_masks[] =
+ { pcds_downloaded, pcds_temporary, pcds_permanent
+ };
+ storage = dl_masks[unit];
+ }
+ break;
+ case 5: /* cartridges */
+ if ( unit == 0 )
+ storage = (pcl_data_storage_t)pcds_all_cartridges;
+ else if ( unit <= pcds_cartridge_max )
+ storage = (pcl_data_storage_t)
+ (1 << (pcds_cartridge_shift + unit - 1));
+ else
+ code = -1;
+ break;
+ case 6: /* SIMMs */
+ if ( unit == 0 )
+ storage = (pcl_data_storage_t)pcds_all_simms;
+ else if ( unit <= pcds_simm_max )
+ storage = (pcl_data_storage_t)(1 << (pcds_simm_shift + unit - 1));
+ else
+ code = -1;
+ break;
+ default:
+ stputs(&st, "ERROR=INVALID ENTITY\r\n");
+ break;
+ }
+ if ( code >= 0 )
+ { pos = stell(&st);
+ code = (*status_write[i])(&st, pcs, storage);
+ if ( code >= 0 )
+ { if ( stell(&st) == pos )
+ stputs(&st, "ERROR=NONE\r\n");
+ else if ( storage == 0 ) /* currently selected */
+ stprintf(&st, "LOCTYPE=%d\r\nLOCUNIT=%d\r\n",
+ pcs->location_type, unit);
+ }
+ }
+ if ( code < 0 )
+ {
+ if ( code == e_Memory )
+ stputs(&st, "ERROR=INTERNAL ERROR\r\n");
+ else
+ stputs(&st, "ERROR=INVALID LOCATION\r\n");
+ }
+ status_end(&st, pcs);
+ return 0;
+}
+
+static int /* ESC * s 1 M */
+pcl_free_space(pcl_args_t *pargs, pcl_state_t *pcs)
+{ stream st;
+
+ status_begin(&st, pcs);
+ stprintf(&st, "INFO MEMORY\r\n");
+ if ( int_arg(pargs) != 1 )
+ stprintf(&st, "ERROR=INVALID UNIT\r\n");
+ else
+ { gs_memory_status_t mstat;
+ gs_memory_status(pcs->memory, &mstat);
+ if ( pcs->memory != pcs->memory->non_gc_memory )
+ { gs_memory_status_t dstat;
+ gs_memory_status(pcs->memory->non_gc_memory, &dstat);
+ mstat.allocated += dstat.allocated;
+ mstat.used += dstat.used;
+ }
+ stprintf(&st, "TOTAL=%ld\r\n", mstat.allocated - mstat.used);
+ /* We don't currently have an API for determining */
+ /* the largest contiguous block. */
+ /**** RETURN SOMETHING RANDOM ****/
+ stprintf(&st, "LARGEST=%ld\r\n",
+ (mstat.allocated - mstat.used) >> 2);
+ }
+ status_end(&st, pcs);
+ return 0;
+}
+
+static int /* ESC & r <bool> F */
+pcl_flush_all_pages(pcl_args_t *pargs, pcl_state_t *pcs)
+{ switch ( uint_arg(pargs) )
+ {
+ case 0:
+ { /* Flush all complete pages. */
+ /* This is a driver function.... */
+ return 0;
+ }
+ case 1:
+ { /* Flush all pages, including an incomplete one. */
+ int code = pcl_end_page_if_marked(pcs);
+
+ if (code >= 0)
+ pcl_home_cursor(pcs);
+ return code;
+ }
+ default:
+ return e_Range;
+ }
+}
+
+static int /* ESC * s <int_id> X */
+pcl_echo(pcl_args_t *pargs, pcl_state_t *pcs)
+{ stream st;
+
+ status_begin(&st, pcs);
+ stprintf(&st, "ECHO %d\r\n", int_arg(pargs));
+ status_end(&st, pcs);
+ return 0;
+}
+
+/* Initialization */
+static int
+pcstatus_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ DEFINE_CLASS('*')
+ {'s', 'T',
+ PCL_COMMAND("Set Readback Location Type",
+ pcl_set_readback_loc_type,
+ pca_neg_error|pca_big_error)},
+ {'s', 'U',
+ PCL_COMMAND("Set Readback Location Unit",
+ pcl_set_readback_loc_unit,
+ pca_neg_error|pca_big_error)},
+ {'s', 'I',
+ PCL_COMMAND("Inquire Readback Entity",
+ pcl_inquire_readback_entity,
+ pca_neg_error|pca_big_error)},
+ {'s', 'M',
+ PCL_COMMAND("Free Space", pcl_free_space,
+ pca_neg_ok|pca_big_ok)},
+ END_CLASS
+ DEFINE_CLASS_COMMAND_ARGS('&', 'r', 'F', "Flush All Pages",
+ pcl_flush_all_pages,
+ pca_neg_error|pca_big_error)
+ DEFINE_CLASS_COMMAND_ARGS('*', 's', 'X', "Echo",
+ pcl_echo, pca_neg_ok|pca_big_error)
+ return 0;
+}
+static void
+pcstatus_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{ if ( type & (pcl_reset_initial | pcl_reset_printer) )
+ { if ( type & pcl_reset_initial )
+ { pcs->status.buffer = 0;
+
+ pcs->status.write_pos = 0;
+ pcs->status.read_pos = 0;
+ }
+ pcs->location_type = 0;
+ pcs->location_unit = 0;
+ }
+}
+
+const pcl_init_t pcstatus_init = {
+ pcstatus_do_registration, pcstatus_do_reset
+};
diff --git a/pcl/pcsymbol.c b/pcl/pcsymbol.c
new file mode 100644
index 000000000..67e437de3
--- /dev/null
+++ b/pcl/pcsymbol.c
@@ -0,0 +1,330 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcsymbol.c */
+/* PCL5 user-defined symbol set commands */
+#include "stdio_.h" /* std.h + NULL */
+#include "plvalue.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcfont.h"
+#include "pcsymbol.h"
+
+
+static int /* ESC * c <id> R */
+pcl_symbol_set_id_code(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint id = uint_arg(pargs);
+ id_set_value(pcs->symbol_set_id, id);
+ return 0;
+}
+
+static int /* ESC ( f <count> W */
+pcl_define_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs)
+{ uint count = uint_arg(pargs);
+ const pl_symbol_map_t *psm = (pl_symbol_map_t *)arg_data(pargs);
+ uint header_size;
+ uint first_code, last_code;
+ gs_memory_t *mem = pcs->memory;
+ pl_symbol_map_t *header;
+ pcl_symbol_set_t *symsetp;
+ pl_glyph_vocabulary_t gv;
+
+#define psm_header_size 18
+ if ( count < psm_header_size )
+ return e_Range;
+ header_size = pl_get_uint16(psm->header_size);
+ if ( header_size < psm_header_size ||
+ psm->id[0] != id_key(pcs->symbol_set_id)[0] ||
+ psm->id[1] != id_key(pcs->symbol_set_id)[1] ||
+ psm->type > 2
+ )
+ return e_Range;
+ switch ( psm->format )
+ {
+ case 1:
+ case 3:
+ break;
+ default:
+ return e_Range;
+ }
+ first_code = pl_get_uint16(psm->first_code);
+ last_code = pl_get_uint16(psm->last_code);
+ gv = (psm->character_requirements[7] & 07)==1? plgv_Unicode: plgv_MSL;
+ { int num_codes = last_code - first_code + 1;
+ int i;
+
+ if ( num_codes <= 0 || last_code > 255 || (count != psm_header_size + num_codes * 2) )
+ return e_Range;
+
+ header =
+ (pl_symbol_map_t *)gs_alloc_bytes(mem,
+ sizeof(pl_symbol_map_t),
+ "pcl_font_header(header)");
+ if ( header == 0 )
+ return_error(e_Memory);
+ memcpy((void *)header, (void *)psm, psm_header_size);
+ /* specify that we do not allow these sets to map to and fro
+ msl and unicode */
+ header->mapping_type = PLGV_NO_MAPPING;
+ /*
+ * Byte swap the codes now, so that we don't have to byte swap
+ * them every time we access them.
+ */
+ for ( i = num_codes; --i >= 0; )
+ header->codes[i] =
+ pl_get_uint16((byte *)psm + psm_header_size + i * 2);
+ }
+#undef psm_header_size
+
+ /* Symbol set may already exist; if so, we may be replacing one of
+ * its existing maps or adding one for a new glyph vocabulary. */
+ if ( pl_dict_find(&pcs->soft_symbol_sets, id_key(pcs->symbol_set_id),
+ 2, (void **)&symsetp) )
+ {
+ if ( symsetp->maps[gv] != NULL )
+ gs_free_object(mem, symsetp->maps[gv], "symset map");
+ }
+ else
+ { pl_glyph_vocabulary_t gx;
+ symsetp = (pcl_symbol_set_t *)gs_alloc_bytes(mem,
+ sizeof(pcl_symbol_set_t), "symset dict value");
+ if ( !symsetp )
+ return_error(e_Memory);
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ symsetp->maps[gx] = NULL;
+ symsetp->storage = pcds_temporary;
+ pl_dict_put(&pcs->soft_symbol_sets, id_key(pcs->symbol_set_id),
+ 2, symsetp);
+ }
+ symsetp->maps[gv] = header;
+
+ return 0;
+}
+
+static int /* ESC * c <ssc_enum> S */
+pcl_symbol_set_control(pcl_args_t *pargs, pcl_state_t *pcs)
+{ gs_const_string key;
+ void *value;
+ pl_dict_enum_t denum;
+
+ switch ( int_arg(pargs) )
+ {
+ case 0:
+ { /* Delete all user-defined symbol sets. */
+ /* Note: When deleting symbol set(s), it is easier (safer?)
+ * to decache and reselect fonts unconditionally. (Consider,
+ * for example, deleting a downloaded overload of a built-in
+ * which might be the default ID.) */
+ pl_dict_release(&pcs->soft_symbol_sets);
+ pcl_decache_font(pcs, -1);
+ }
+ return 0;
+ case 1:
+ { /* Delete all temporary symbol sets. */
+ pl_dict_enum_stack_begin(&pcs->soft_symbol_sets, &denum, false);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ if ( ((pcl_symbol_set_t *)value)->storage == pcds_temporary )
+ pl_dict_undef(&pcs->soft_symbol_sets, key.data, key.size);
+ pcl_decache_font(pcs, -1);
+ }
+ return 0;
+ case 2:
+ { /* Delete symbol set <symbol_set_id>. */
+ pl_dict_undef(&pcs->soft_symbol_sets,
+ id_key(pcs->symbol_set_id), 2);
+ pcl_decache_font(pcs, -1);
+ }
+ return 0;
+ case 4:
+ { /* Make <symbol_set_id> temporary. */
+ if ( pl_dict_find(&pcs->soft_symbol_sets,
+ id_key(pcs->symbol_set_id), 2, &value) )
+ ((pcl_symbol_set_t *)value)->storage = pcds_temporary;
+ }
+ return 0;
+ case 5:
+ { /* Make <symbol_set_id> permanent. */
+ if ( pl_dict_find(&pcs->soft_symbol_sets,
+ id_key(pcs->symbol_set_id), 2, &value) )
+ ((pcl_symbol_set_t *)value)->storage = pcds_permanent;
+ }
+ return 0;
+ default:
+ return 0;
+ }
+}
+
+static void /* free any symbol maps as well as dict value entry */
+pcsymbol_dict_value_free(gs_memory_t *mem, void *value, client_name_t cname)
+{ pcl_symbol_set_t *ssp = (pcl_symbol_set_t *)value;
+ pl_glyph_vocabulary_t gx;
+
+ if ( ssp->storage != pcds_internal )
+ {
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ {
+ if ( ssp->maps[gx] != NULL )
+ gs_free_object(mem, (void*)ssp->maps[gx], cname);
+ }
+ }
+ gs_free_object(mem, value, cname);
+}
+
+static int
+pcl_load_built_in_symbol_sets(pcl_state_t *pcs)
+{
+ const pl_symbol_map_t **maplp;
+ pcl_symbol_set_t *symsetp;
+ pl_glyph_vocabulary_t gv;
+
+ for ( maplp = &pl_built_in_symbol_maps[0]; *maplp; maplp++ )
+ {
+ const pl_symbol_map_t *mapp = *maplp;
+ /* Create entry for symbol set if this is the first map for
+ * that set. */
+ if ( !pl_dict_find(&pcs->built_in_symbol_sets, mapp->id, 2,
+ (void **)&symsetp) )
+ { pl_glyph_vocabulary_t gx;
+ symsetp = (pcl_symbol_set_t *)gs_alloc_bytes(pcs->memory,
+ sizeof(pcl_symbol_set_t), "symset init dict value");
+ if ( !symsetp )
+ return_error(e_Memory);
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ symsetp->maps[gx] = NULL;
+ symsetp->storage = pcds_internal;
+ }
+ gv = (mapp->character_requirements[7] & 07)==1?
+ plgv_Unicode: plgv_MSL;
+ pl_dict_put(&pcs->built_in_symbol_sets, mapp->id, 2, symsetp);
+ symsetp->maps[gv] = (pl_symbol_map_t *)mapp;
+ }
+ return 0;
+}
+
+bool
+pcl_check_symbol_support(const byte *symset_req, const byte *font_sup)
+{ int i;
+
+ /* if glyph vocabularies match, following will work on the
+ * last 3 bits of last byte. Note that the font-support bits
+ * are inverted (0 means available).
+ */
+ for ( i = 0; i < 7; i++ )
+ if ( symset_req[i] & font_sup[i] )
+ return false; /* something needed, not present */
+ /* check the last byte but not the glyph vocabularies. */
+ if ((symset_req[7] >> 3) & (font_sup[7] >> 3))
+ return false;
+
+ return true;
+}
+
+
+/* Find the symbol map for a particular symbol set and glyph vocabulary,
+ * if it exists.
+ * There are two dictionaries--one for soft (downloaded) symbol sets and
+ * one for built-ins. These are searched separately. The actual maps
+ * present for a symbol set may overlap between soft and built-in. */
+pl_symbol_map_t *
+pcl_find_symbol_map(const pcl_state_t *pcs, const byte *id,
+ pl_glyph_vocabulary_t gv)
+{
+ pcl_symbol_set_t *setp;
+
+ if ( pl_dict_find((pl_dict_t *)&pcs->soft_symbol_sets,
+ id, 2, (void **)&setp) &&
+ setp->maps[gv] != NULL )
+ return setp->maps[gv];
+ if ( pl_dict_find((pl_dict_t *)&pcs->built_in_symbol_sets,
+ id, 2, (void**)&setp) ) {
+ /* simple case we found a matching symbol set */
+ if ( setp->maps[gv] != NULL )
+ return setp->maps[gv];
+ /* we requested a unicode symbol set and found an msl
+ symbol set that can be mapped to unicode */
+ if ( (gv == plgv_Unicode) &&
+ (setp->maps[plgv_MSL]) &&
+ ((setp->maps[plgv_MSL])->mapping_type == PLGV_M2U_MAPPING) )
+ return setp->maps[plgv_MSL];
+ /* we requested an msl symbol set and found a unicode
+ symbol set that can be mapped to msl */
+ if ( (gv == plgv_MSL) &&
+ (setp->maps[plgv_Unicode]) &&
+ ((setp->maps[plgv_Unicode])->mapping_type == PLGV_U2M_MAPPING) )
+ return setp->maps[plgv_Unicode];
+ }
+ return NULL;
+}
+
+/* Initialization */
+static int
+pcsymbol_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'R', "Symbol Set ID Code",
+ pcl_symbol_set_id_code,
+ pca_neg_error|pca_big_error)
+ DEFINE_CLASS_COMMAND_ARGS('(', 'f', 'W', "Define Symbol Set",
+ pcl_define_symbol_set, pca_byte_data|pca_neg_error|pca_big_clamp)
+ DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'S', "Symbol Set Control",
+ pcl_symbol_set_control,
+ pca_neg_ignore|pca_big_ignore)
+ return 0;
+}
+
+static void
+pcsymbol_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
+{
+ if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay) ) {
+ id_set_value(pcs->symbol_set_id, 0);
+ if ( type & pcl_reset_initial ) {
+ /* Don't set a parent relationship from soft to built-in
+ * symbol sets. Although it is arguably useful, it's
+ * better to avoid it and keep anyone who's looking at the
+ * soft symbol sets from mucking up the permanent ones. */
+ pl_dict_init(&pcs->soft_symbol_sets, pcs->memory,
+ pcsymbol_dict_value_free);
+ pl_dict_init(&pcs->built_in_symbol_sets, pcs->memory,
+ pcsymbol_dict_value_free);
+ /* NB. Symbol sets are require for RTL/HPGL/2 mode for
+ * stickfonts but we shouldn't load all of them. */
+ if ( pcl_load_built_in_symbol_sets(pcs) < 0 )
+ dprintf("Internal error, no symbol sets found");
+ }
+ else if ( type & pcl_reset_printer ) {
+ pcl_args_t args;
+ arg_set_uint(&args, 1); /* delete temporary symbol sets */
+ pcl_symbol_set_control(&args, pcs);
+ }
+ }
+ if ( type & pcl_reset_permanent ) {
+ pl_dict_release(&pcs->soft_symbol_sets);
+ pl_dict_release(&pcs->built_in_symbol_sets);
+ }
+}
+
+static int
+pcsymbol_do_copy(pcl_state_t *psaved, const pcl_state_t *pcs,
+ pcl_copy_operation_t operation)
+{ if ( operation & pcl_copy_after )
+ { /* Don't restore the downloaded symbol set dictionary. */
+ psaved->built_in_symbol_sets = pcs->built_in_symbol_sets;
+ }
+ return 0;
+}
+
+const pcl_init_t pcsymbol_init = {
+ pcsymbol_do_registration, pcsymbol_do_reset, pcsymbol_do_copy
+};
diff --git a/pcl/pcsymbol.h b/pcl/pcsymbol.h
new file mode 100644
index 000000000..8234b3a85
--- /dev/null
+++ b/pcl/pcsymbol.h
@@ -0,0 +1,44 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcsymbol.h */
+/* Definitions for PCL5 symbol sets */
+
+#ifndef pcsymbol_INCLUDED
+# define pcsymbol_INCLUDED
+
+#include "plsymbol.h"
+
+/* The structure for symbol sets (fig 10-1, p. 10-5 of PCL5 TRM) is in
+ * plsymbol.h, as a "symbol map". A symbol map describes the mapping
+ * from one symbol set to one glyph vocabulary. A symbol set may comprise
+ * multiple maps (currently at most two, one each for MSL and Unicode).
+ * We want a separate dictionary of symbol sets because there are various
+ * operations performed per symbol set (affecting all mappings). */
+
+typedef struct pcl_symbol_set_s {
+ pcl_data_storage_t storage;
+ pl_symbol_map_t *maps[plgv_next]; /* (these may be NULL) */
+} pcl_symbol_set_t;
+
+/* Check whether a symbol map's character requirements are supported by a
+ * font's character complement. */
+bool pcl_check_symbol_support(const byte *symset_req,
+ const byte *font_sup);
+
+/* Find a symbol map, given its ID and glyph vocabulary. */
+pl_symbol_map_t *pcl_find_symbol_map(const pcl_state_t *pcs,
+ const byte *id,
+ pl_glyph_vocabulary_t gv);
+
+#endif /* pcsymbol_INCLUDED */
diff --git a/pcl/pctext.c b/pcl/pctext.c
new file mode 100644
index 000000000..5f2a86024
--- /dev/null
+++ b/pcl/pctext.c
@@ -0,0 +1,987 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pctext.c - PCL5 text printing commands */
+
+#include "math_.h"
+#include "gx.h"
+#include "gsimage.h"
+#include "plvalue.h"
+#include "plvocab.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcdraw.h"
+#include "pcfont.h"
+#include "pcursor.h"
+#include "pcpage.h"
+#include "pcfrgrnd.h"
+#include "gdebug.h"
+#include "gscoord.h"
+#include "gsline.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsrop.h"
+#include "gsstate.h"
+#include "gxchar.h"
+#include "gxfont.h" /* for setting next_char proc */
+#include "gxstate.h"
+
+/* Define the text parsing methods. */
+static const pcl_text_parsing_method_t pcl_tpm_0 = pcl_tpm_0_data,
+ pcl_tpm_21 = pcl_tpm_21_data,
+ pcl_tpm_31 = pcl_tpm_31_data,
+ pcl_tpm_38 = pcl_tpm_38_data;
+
+/* pseudo-"dots" (actually 1/300" units) used in underline only */
+#define dots(n) ((float)(7200 / 300 * n))
+
+
+/*
+ * Install a font in the graphic state.
+ */
+ static void
+set_gs_font(
+ pcl_state_t * pcs
+)
+{
+ gs_font * pfont = (gs_font *)pcs->font->pfont;
+ gs_setfont(pcs->pgs, pfont);
+ /* font scaling is reflected directly in the ctm */
+ pfont->FontMatrix = pfont->orig_FontMatrix;
+}
+
+/* uncomment the following definition to treat map type 0 as defined
+ in the specification. The default is to use the behavior we have
+ observed on several HP devices. Map type 0 is treated as map type
+ 1. */
+
+/* #define USE_MAP_TYPE_IN_SPECIFICATION */
+
+/*
+ * Check if a character code is considered "printable" by given symbol set.
+ */
+ static bool
+is_printable(
+ const pcl_state_t * pcs,
+ gs_char chr,
+ bool literal
+)
+{
+ int map_type;
+ bool printable;
+
+ if (literal) /* transparent data */
+ printable = true;
+ else {
+ if (pcs->map != 0) {
+ /* PCL TRM 10-7
+ * symbol map type overrides, font map type
+ */
+ map_type = pcs->map->type;
+ }
+ else {
+ /* PCL TRM 11-18 */
+ map_type = pcs->font->font_type;
+ }
+
+#ifndef USE_MAP_TYPE_IN_SPECIFICATION
+ if ( map_type == 0 )
+ map_type = 1;
+#endif /* USE_MAP_TYPE_IN_SPECIFICATION */
+
+ if ( map_type == 0 )
+ printable = (chr >= ' ') && (chr <= '\177');
+ else if ( map_type == 1 ) {
+ chr &= 0x7f;
+ printable = (chr >= ' '); /* 0-31 and 128-159 are not printable */
+ }
+ else if ( map_type >= 2 ) {
+ /* 2 is correct but will force all types above 2 here */
+ if ( (chr == 0) || (chr == '\033') ||
+ ((chr >= '\007') && (chr <= '\017')) )
+ printable = false;
+ else
+ printable = true;
+ }
+ }
+ return printable;
+}
+
+/*
+ * Retrieve the next character identifier from a string.
+ *
+ * Both the string pointer and the length are modified.
+ *
+ * The final operand is true if the text was provided via the literal
+ * (transparent) text command: ESC & p <nbytes> X. This distinction is
+ * important for characters that are not considered printable by the
+ * current symbol set. Normally, such characters are ignored. But if they
+ * resulted from the literal (transparent) text command, they are handled as
+ * spaces. Characters that are mapped by the symbol set but are not in a font
+ * are always dealt with as space characters.
+ *
+ * The special handling provided for the character code 32 below is not,
+ * in fact, correct. PCL fonts may map non-space characters to code 32, and
+ * if this is done no special handling is provided for this code; in PCL,
+ * a space character is a character not present in the font. Unfortunately,
+ * some of the resident fonts used have explicit space characters, and to
+ * handle the hmi properly when these fonts are used, this code must handle
+ * fonts that have actual characters at code 32 improperly.
+ *
+ * Returns 0 on success, 2 if the string is exhausted. Note that it is not an
+ * error for the string to end in the middle of a 2-byte sequence.
+ */
+ static int
+get_next_char(
+ pcl_state_t * pcs,
+ const byte ** ppb,
+ uint * plen,
+ gs_char * pchr,
+ gs_char * porig_char,
+ bool * pis_space,
+ bool literal,
+ gs_point * pwidth
+)
+{
+ const byte * pb = *ppb;
+ int len = *plen;
+ pl_font_t * plfont = pcs->font;
+ gs_char chr;
+ if (len <= 0)
+ return 2;
+ *pis_space = false;
+ chr = *pb++;
+ len--;
+ if (pcl_char_is_2_byte(chr, pcs->text_parsing_method) && (len > 0)) {
+ chr = (chr << 8) + *pb++;
+ len--;
+ }
+ *ppb = pb;
+ *plen = len;
+ *porig_char = chr;
+ /* check if the code is considered "printable" in the current symbol set */
+ if (!is_printable(pcs, chr, literal)) {
+ *pis_space = literal;
+ *pchr = 0xffff;
+ return 0;
+ }
+
+ /* map the symbol. If it fails to map, quit now. Unless we have a
+ galley character */
+ chr = pl_map_symbol(pcs->map, chr,
+ plfont->storage == pcds_internal,
+ pl_complement_to_vocab(plfont->character_complement) == plgv_MSL, false);
+ *pchr = chr;
+ if (chr == 0xffff) {
+ *pis_space = true;
+ return 0;
+ }
+
+ /* check if the character is in the font and get the character
+ width at the same time */
+ if ( *pis_space == false )
+ if ( pl_font_char_width(plfont, (void *)(pcs->pgs), chr, pwidth) == 0 )
+ return 0;
+ /*
+ * If we get to this point deem the character an undefined
+ * character - a space in pcl.
+ */
+ *pis_space = true;
+ *pchr = 0xffff;
+ return 0;
+}
+
+/*
+ * Draw the foreground of a character. For transparent text this is the only
+ * part that must be drawn.
+ */
+static int
+show_char_foreground(
+ const pcl_state_t * pcs,
+ const gs_char * pbuff
+)
+{
+ int code = 0;
+ gs_text_enum_t *penum;
+ pl_font_t *plfont = pcs->font;
+ gs_font *pfont = plfont->pfont;
+ gs_text_params_t text;
+
+ /* set vertical writing if -1 which requires double bytes or 1 */
+ if ((pcs->text_path == -1 && ((pbuff[0] & 0xff00) != 0)) ||
+ (pcs->text_path == 1))
+ pfont->WMode = 1;
+ else
+ pfont->WMode = 0;
+ text.operation = TEXT_FROM_CHARS | TEXT_DO_DRAW | TEXT_RETURN_WIDTH;
+ text.data.chars = pbuff;
+ text.size = 1;
+ code = gs_text_begin(pcs->pgs, &text, pcs->memory, &penum);
+ if (code >= 0)
+ code = gs_text_process(penum);
+ gs_text_release(penum, "show_char_foreground");
+
+ return code;
+}
+
+/*
+ * draw the opaque background of a character.
+ *
+ * In the graphic library, characters are masks, hence they are always
+ * transparent. Not so in PCL, where characters may be either opaque or
+ * transparent.
+ *
+ * To deal with this dichotomy, opaque characters are rendered as a pair of
+ * masks. One is the normal character mask; the other is the bounding box of
+ * the character less the character itself.
+ *
+ * The manner in which the second mask is formed varies based on the font type.
+ * For bitmap fonts, the inverse mask is formed as an imagemask object, with
+ * inverted polarity. For scalable fonts (which have only provided a path),
+ * the inverse is formed by adding the bounding box rectangle as a path to
+ * the character path, and using eofill on the resultant path.
+ *
+ * Special handling is required to achieve the desired raster operation on the
+ * "background" mask. From the point of view of the graphic library, the
+ * background mask is a normal mask, and hence would utiltise the S = 0
+ * portion of the current logical operation (recall that rop's are expressed
+ * in an additive sense). The desired effect is, however, the S = 1 portion
+ * of the current rop, so the current rop must be inverted in the sense of the
+ * source to achive the desired result. In principle, the S = 1 porition of
+ * the background rop should be set to the no-op rop, but this is not necessary
+ * as the source is a mask.
+ *
+ * An additional complication arises from the specification provided by HP for
+ * handling the source opaque, pattern transparent situation. In this case,
+ * the pattern affects only for the foreground pixels of the source; the back-
+ * ground must be rendered as a solid, opaque white.
+ */
+ static int
+show_char_background(
+ pcl_state_t * pcs,
+ const gs_char * pbuff
+)
+{
+ gs_state * pgs = pcs->pgs;
+ gs_rop3_t rop = (gs_rop3_t)(pcs->logical_op);
+ const pl_font_t * plfont = pcs->font;
+ gs_font * pfont = plfont->pfont;
+ gs_point pt;
+ int code = 0;
+
+ /* save the graphic state and set the background raster operation */
+ pcl_gsave(pcs);
+ if (pcs->pattern_transparent)
+ pcl_set_drawing_color(pcs, pcl_pattern_solid_white, 0, false);
+ gs_setrasterop(pgs, (gs_rop3_t)rop3_know_S_1((int)rop));
+ gs_currentpoint(pgs, &pt);
+
+ if (plfont->scaling_technology == plfst_bitmap) {
+ gs_char chr = pbuff[0];
+ gs_glyph glyph = pfont->procs.encode_char(pfont, chr, gs_no_glyph);
+ const byte * cdata = pl_font_lookup_glyph(plfont, glyph)->data;
+ int nbytes;
+ uint used;
+ gs_image_enum * pen = 0;
+ gs_image1_t mask;
+
+ /* empty characters have no background */
+ if (cdata == 0) {
+ pcl_grestore(pcs);
+ return 0;
+ }
+
+ /* allocate the image enumerator */
+ pen = gs_image_enum_alloc(gs_state_memory(pgs), "bitmap font background");
+ if (pen == 0) {
+ pcl_grestore(pcs);
+ return e_Memory;
+ }
+
+ /* translate the origin to the ul corner of the image */
+ pt.x += (float)pl_get_int16(cdata + 6);
+ pt.y -= (float)pl_get_int16(cdata + 8);
+ gs_translate(pgs, pt.x, pt.y);
+
+ /* set up and render the image mask */
+ gs_image_t_init_mask(&mask, false);
+ mask.adjust = false;
+ mask.Width = pl_get_uint16(cdata + 10);
+ mask.Height = pl_get_uint16(cdata + 12);
+ nbytes = ((mask.Width + 7) / 8) * mask.Height;
+ gs_image_init(pen, &mask, false, pgs);
+ code = gs_image_next(pen, cdata + 16, nbytes, &used);
+
+ /* clean up */
+ gs_image_cleanup(pen, pgs);
+ gs_free_object(gs_state_memory(pgs), pen, "bitmap font background");
+
+ } else {
+ gs_text_params_t text;
+ gs_rect bbox;
+ gs_text_enum_t * penum;
+
+ /* clear the path; start the new one from the current point */
+ gs_newpath(pgs);
+ gs_moveto(pgs, pt.x, pt.y);
+ text.data.chars = pbuff;
+ text.size = 1;
+ text.operation = TEXT_FROM_CHARS | TEXT_DO_TRUE_CHARPATH | TEXT_RETURN_WIDTH;
+ code = gs_text_begin(pgs, &text, pcs->memory, &penum);
+ if (code >= 0)
+ code = gs_text_process(penum);
+ if (code >= 0) {
+ /* append the characters bounding box and use eofill */
+ gs_pathbbox(pgs, &bbox);
+ gs_rectappend(pgs, &bbox, 1);
+ gs_eofill(pgs);
+ }
+ gs_text_release(penum, "show_char_background");
+ }
+
+ pcl_grestore(pcs);
+ return code;
+}
+
+/*
+ * get the advance width.
+ */
+ static floatp
+pcl_get_width(pcl_state_t *pcs, gs_point *advance_vector, const gs_point *pscale, gs_char chr, bool is_space)
+{
+ pcl_font_selection_t * pfp = &(pcs->font_selection[pcs->font_selected]);
+ floatp width;
+ if (chr != 0xffff) {
+ if (!pfp->params.proportional_spacing || is_space)
+ width = pcl_hmi(pcs);
+ else {
+ if ( pcs->font->scaling_technology == plfst_TrueType ) {
+ floatp tmp;
+ tmp = pscale->x / (floatp)pcs->uom_cp + 0.5;
+ tmp -= fmod(tmp, (floatp)1.0);
+ tmp *= (floatp)pcs->uom_cp;
+ width = advance_vector->x * tmp;
+
+ } else
+ width = advance_vector->x * pscale->x;
+ width += (floatp)pcs->uom_cp / 2.0;
+ width -= fmod(width, (floatp)pcs->uom_cp);
+ }
+ } else if (is_space)
+ width = pcl_hmi(pcs);
+ else
+ width = 0.0;
+ /* round to nearest integral pcl units */
+ return width;
+}
+
+/*
+ * Show a string of characters. Provide a general purpose function
+ * that can be used in all cases (pcl_show_chars_slow) and a faster
+ * function (pcl_show_chars_fast) that can be used for most
+ * circumstances. The latter algorithm can print strings of
+ * characters the slow algorithm only prints one character at a time.
+ *
+ * As is the case for other parts of this code, this code is made more complex
+ * by the PostScript-centric nature of the the graphics library, and by a
+ * long standing flaw in the PostScript view of fonts. Specifically, the
+ * initial introduction of Encoding arrays into PostScript fonts, followed by
+ * composite font mechanism, very much confused the concepts of font and text
+ * parsing method.
+ *
+ * A font is an object which accepts a character identifier and returns a
+ * "rendering" of that character (which may be a bitmap, may be a path, may
+ * be an advance vector, or may be some combination of the above); it may also
+ * in some cases apply this rendering to the graphic state (which may include
+ * modifying the output). Whether or not a font caches or expects its client
+ * to handle caching is a separate issue; there are good areguments for either
+ * approach.
+ *
+ * A text parsing method is an object that accepts a character string and
+ * returns one or more character identifiers. A text parsing method is, in
+ * principle, completely independent of a font, though for historical reasons
+ * the two concepts are often linked at the application level.
+ *
+ * Because of the PostScript origins of the graphic library, its font interface
+ * handles both text parsing and rendering. To achieve flexibility, the client
+ * may provide a "get next character" procedure for the graphic library font
+ * machinery to work with, but this flexibility is not sufficient for PCL, as
+ * the latter potentially needs to perform additional operations on each
+ * character. Hence, PCL will not ask the font machiner to render more than
+ * one character at a time.
+ *
+ * Complicating this picture is the nature of memory management in the graphic
+ * library. The show class operators in PostScript generally take a string as
+ * an operand. PostScript strings have the "getinterval" property: one string
+ * may be part of another string. Hence strings cannot have headers. In a
+ * relocating memory systems, this implies that strings must be dealt with
+ * separately from other objects: they must be allocated as strings. In the
+ * case of PCL, this is not necessarily the case (see, for example, the case
+ * of transparent mode, below).
+ *
+ * The original implementation of this routine ignored this distinction and
+ * could, in principle, have failed if re-location was enabled. It was also
+ * rather hard to read, because it parsed the input string (at least) twice:
+ * once the find the character so that PCL-specific actions could be taken,
+ * then again via the font machiner.
+ *
+ *
+ * The final operand is true if the text was provided via the literal
+ * (transparent) text command: ESC & p <nbytes> X. This distinction is
+ * important for characters that are not mapped by the current symbol set. */
+
+ static int
+pcl_show_chars_slow(
+ pcl_state_t * pcs,
+ const gs_point * pscale,
+ const byte * str,
+ uint size,
+ bool literal
+)
+{
+ gs_state * pgs = pcs->pgs;
+ gs_char buff[1];
+ floatp rmargin = pcs->margins.right;
+ floatp page_size = pcs->xfm_state.pd_size.x;
+ bool source_opaque = !pcs->source_transparent;
+ bool invisible_pattern = is_invisible_pattern(pcs);
+ bool wrap = pcs->end_of_line_wrap;
+ bool is_space = false;
+ bool use_rmargin = (pcs->cap.x <= rmargin);
+ gs_char chr, orig_chr;
+ int code = 0;
+ floatp width;
+ gs_point cpt;
+ gs_point advance_vector;
+
+ cpt.x = pcs->cap.x;
+ cpt.y = pcs->cap.y;
+
+ while (get_next_char(pcs, &str, &size, &chr, &orig_chr, &is_space, literal, &advance_vector) == 0) {
+ floatp tmp_x;
+
+ /* check if a character was found */
+ buff[0] = chr;
+ /* round width to integral pcl current units */
+ width = (pcl_get_width(pcs, &advance_vector, pscale, chr, is_space));
+
+ /*
+ * Check for transitions of the left margin; this check is
+ * disabled if the immediately preceding character was a back-space.
+ * A move beyond the "right" logical page edge is also considered
+ * a margin transition.
+ *
+ * A little-known feature of PCL is the effect of the line-wrap
+ * command on the interpretation of the right margin. If line
+ * wrap is in effect, a transition of the left margin will cause
+ * a <cr><lf> operation BEFORE the current character is printed. If
+ * line-wrap is not in effect, a transition of the right margin will
+ * stop printing AFTER the current character is printed.
+ *
+ * A special case occurs in the non-wrap situation when the current
+ * position exactly equals the current margin. In that case, no
+ * character is printed.
+ */
+ if (!pcs->last_was_BS) {
+ if (wrap) {
+ if ( (use_rmargin && (cpt.x + width > rmargin)) ||
+ (cpt.x + width > page_size) ) {
+ /* update the current position for the benefit of
+ CR so it knows where to draw underlines if
+ needed then restore the position. NB don't
+ like this business of mixing floats and ints -
+ (pcs->cap and cpt). throughout this
+ function. */
+ pcs->cap.x = cpt.x;
+ pcs->cap.y = cpt.y;
+ pcl_do_CR(pcs);
+ pcl_do_LF(pcs);
+ cpt.x = pcs->cap.x;
+ cpt.y = pcs->cap.y;
+ use_rmargin = true;
+ }
+ } else {
+ if (use_rmargin && (cpt.x == rmargin))
+ break;
+ else if (cpt.x >= page_size) {
+ cpt.x = page_size;
+ break;
+ }
+ }
+ }
+
+ /*
+ * If the immediately preceding character was a BS, the code will
+ * center the current character on top of the preceding one. After
+ * the character is printed, the current point is returned to the
+ * prior point.
+ */
+ tmp_x = cpt.x;
+ if (pcs->last_was_BS) {
+ /* hack alert. It seems if the last width is large, we
+ use the horizontal dimension of the page as a guess, the
+ centering is replaced by returning to the zero
+ coordinate. It would take quite a bit of time to
+ investigate what the hp is doing in this pathological
+ case, so we have not done a detailed analysis. This
+ solution prints the tests we have correctly. */
+ if (pcs->last_width > pcs->xfm_state.pd_size.x)
+ tmp_x = 0;
+ else
+ tmp_x += (pcs->last_width - width) / 2;
+ }
+ gs_moveto(pgs, tmp_x / pscale->x, cpt.y / pscale->y);
+
+ if (chr != 0xffff) {
+ /* if source is opaque, show and opaque background */
+ if (source_opaque)
+ code = show_char_background(pcs, buff);
+ if (code >= 0)
+ if (!invisible_pattern)
+ code = show_char_foreground(pcs, buff);
+ if (code < 0)
+ break;
+ /* NB WRONG - */
+ pcl_mark_page_for_current_pos(pcs);
+ }
+
+ /*
+ * Check again for the first character following a back-space. if
+ * this is the case, go back to the original position.
+ */
+ if (pcs->last_was_BS) {
+ cpt.x += pcs->last_width;
+ pcs->last_was_BS = false;
+ } else
+ cpt.x += width;
+
+ /* check for going beyond the margin if not wrapping */
+ if (!wrap) {
+ if (use_rmargin && (cpt.x > rmargin)) {
+ cpt.x = rmargin;
+ break;
+ } else if (cpt.x >= page_size) {
+ cpt.x = page_size;
+ break;
+ }
+ }
+ }
+
+ /* record the last width */
+ pcs->last_width = width;
+
+ /* update the current position */
+ pcs->cap.x = cpt.x;
+ pcs->cap.y = cpt.y;
+
+ return code;
+}
+
+/*
+ * Set up to handle a string of text.
+ *
+ * The final operand is true if the text was provided via the literal
+ * (transparent) text command: ESC & p <nbytes> X. This distinction is
+ * important for characters that are not mapped by the current symbol set.
+ */
+ int
+pcl_text(
+ const byte * str,
+ uint size,
+ pcl_state_t * pcs,
+ bool literal
+)
+{
+ gs_state * pgs = pcs->pgs;
+ gs_matrix user_ctm;
+ gs_point scale;
+ int scale_sign;
+ int code;
+
+ /* rtl files can have text in them - we don't print any characters
+ in rtl */
+ if (pcs->personality == rtl)
+ return 0;
+ /* set up the current font and HMI */
+ if ((pcs->font == 0) && ((code = pcl_recompute_font(pcs)) < 0))
+ return code;
+
+ /* set up the graphic state */
+ code = pcl_set_drawing_color( pcs,
+ pcs->pattern_type,
+ pcs->current_pattern_id,
+ false
+ );
+ if (code >= 0)
+ code = pcl_set_graphics_state(pcs);
+ if (code < 0)
+ return code;
+ set_gs_font(pcs);
+
+ /* set up the font transformation */
+ if (pcs->font->scaling_technology == plfst_bitmap) {
+ scale.x = pcl_coord_scale / pcs->font->resolution.x;
+ scale.y = pcl_coord_scale / pcs->font->resolution.y;
+
+ /*
+ * Bitmap fonts use an inverted coordinate system,
+ * the same as the usual PCL system.
+ */
+ scale_sign = 1;
+ } else {
+ /*
+ * Outline fonts are 1-point; the font height is given in
+ * (quarter-)points. However, if the font is fixed-width,
+ * it must be scaled by pitch, not by height, relative to
+ * the nominal pitch of the outline.
+ */
+ pcl_font_selection_t * pfp = &pcs->font_selection[pcs->font_selected];
+ /* AGFA madness - 72.307 points per inch for intellifonts */
+ floatp ppi = (pfp->font->scaling_technology == plfst_Intellifont) ? 72.307 : 72.0;
+ if (pfp->font->params.proportional_spacing) {
+ scale.x = scale.y = pfp->params.height_4ths
+ * 0.25 * 7200.0 / ppi;
+ } else {
+ scale.x = scale.y = pl_fp_pitch_cp(&pfp->params)
+ * (100.0 / pl_fp_pitch_cp(&pfp->font->params))
+ * (7200.0 / (100.0 * ppi));
+
+ /* hack for a scalable lineprinter font. If a real
+ lineprinter bitmap font is available it will be handled
+ by the bitmap scaling case above */
+ if (pfp->font->params.typeface_family == 0) {
+ scale.x = scale.y = 850.0;
+ }
+
+ }
+ /*
+ * Scalable fonts use an upright coordinate system,
+ * the opposite from the usual PCL system.
+ */
+ scale_sign = -1;
+ }
+
+ /*
+ * If floating underline is on, since we're about to print a real
+ * character, track the best-underline position.
+ * XXX Until we have the font's design value for underline position,
+ * use 0.2 em. This is enough to almost clear descenders in typical
+ * fonts; it's also large enough for us to check that the mechanism
+ * works.
+ */
+ if (pcs->underline_enabled && pcs->underline_floating) {
+ float yu = scale.y / 5.0;
+
+ if (yu > pcs->underline_position)
+ pcs->underline_position = yu;
+ }
+
+ /*
+ * XXX I'm using the more general, slower approach rather than
+ * just multiplying/dividing by scale factors, in order to keep it
+ * correct through orientation changes. Various parts of this should
+ * be cleaned up when performance time rolls around.
+ */
+ gs_currentmatrix(pgs, &user_ctm);
+
+ /* possibly invert text because HP coordinate system is inverted */
+ scale.y *= scale_sign;
+ gs_scale(pgs, scale.x, scale.y);
+
+ /* it is not clear if vertical substitutes are allowed in mode -1 */
+ if (pcs->text_path != 0)
+ pcs->font->allow_vertical_substitutes = true;
+ else
+ pcs->font->allow_vertical_substitutes = false;
+
+
+ /* Print remaining characters, restore the ctm */
+ code = pcl_show_chars_slow(pcs, &scale, str, size, literal);
+ gs_setmatrix(pgs, &user_ctm);
+ if (code > 0) /* shouldn't happen */
+ code = gs_note_error(gs_error_invalidfont);
+ return code;
+}
+
+/*
+ * Individual non-command/control characters
+ */
+ int
+pcl_plain_char(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ return pcl_text((const byte *)&(pargs->command), 1, pcs, pcs->display_functions);
+}
+
+/*
+ * draw underline up to current point, adjust status
+ */
+ void
+pcl_do_underline(
+ pcl_state_t * pcs
+)
+{
+ if (pcs->underline_start.x != pcs->cap.x) {
+ gs_state * pgs = pcs->pgs;
+ float y = pcs->underline_start.y + pcs->underline_position;
+ int code;
+
+ /* save the grapics state */
+ pcl_gsave(pcs);
+
+ code = pcl_set_drawing_color( pcs,
+ pcs->pattern_type,
+ pcs->current_pattern_id,
+ false
+ );
+ if (code >= 0)
+ code = pcl_set_graphics_state(pcs);
+ if (code < 0)
+ return;
+
+ /*
+ * TRM says (8-34) that underline is 3 dots. In a victory for
+ * common sense, it's not. Rather, it's 0.01" (which *is* 3 dots
+ * at 300 dpi only)
+ */
+ gs_setlinewidth(pgs, dots(3));
+ gs_moveto(pgs, pcs->underline_start.x, y);
+ gs_lineto(pgs, pcs->cap.x, y);
+ gs_stroke(pgs);
+
+ pcl_grestore(pcs);
+ }
+
+ /*
+ * Fixed underline is 5 "dots" (actually 5/300") down. Floating
+ * will be determined on the fly.
+ */
+ pcs->underline_start = pcs->cap;
+ pcs->underline_position = pcs->underline_floating ? 0.0 : dots(5);
+}
+
+/* ------ Commands ------ */
+
+/*
+ * ESC & p <count> X
+ *
+ * Unparsed text command
+ */
+ static int
+pcl_transparent_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ return pcl_text(arg_data(pargs), uint_arg(pargs), pcs, true);
+}
+
+/*
+ * ESC & d <0|3> D
+ *
+ * Enable floating or fixed-depth underlining.
+ *
+ * NB: If underlining is already enabled, this command is ignored. Underlining
+ * must be specifically disabled to switch from fixed to floating.
+ */
+ static int
+pcl_enable_underline(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int type = int_arg(pargs);
+
+ /* ignore command if underlining is already enabled */
+ if (pcs->underline_enabled)
+ return 0;
+
+ if ((type == 0) || (type == 1)) {
+ pcs->underline_floating = false;
+ pcs->underline_position = dots(5);
+ } else if (type == 3) {
+ pcs->underline_floating = true;
+ pcs->underline_position = 0.0;
+ } else
+ return 0;
+
+ pcs->underline_enabled = true;
+ pcs->underline_start = pcs->cap;
+ return 0;
+}
+
+/*
+ * ESC & d @
+ *
+ * Disable underlining
+ */
+ static int
+pcl_disable_underline(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ /* apparently disabling underlining has the side effect of
+ flushing any pending underlines. This side effect is not
+ documented */
+ if (pcs->underline_enabled == true) {
+ pcl_do_underline(pcs);
+ pcs->underline_enabled = false;
+ }
+ return 0;
+}
+
+/* (From PCL5 Comparison Guide, p. 1-56) */
+
+/*
+ * ESC & t <method> P
+ *
+ * Select the text parsing method.
+ */
+ static int
+pcl_text_parsing_method(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ switch (int_arg(pargs)) {
+
+ case 0: case 1:
+ pcs->text_parsing_method = &pcl_tpm_0;
+ break;
+
+ case 21:
+ pcs->text_parsing_method = &pcl_tpm_21;
+ break;
+
+ case 31:
+ pcs->text_parsing_method = &pcl_tpm_31;
+ break;
+
+ case 38:
+ pcs->text_parsing_method = &pcl_tpm_38;
+ break;
+
+ default:
+ return e_Range;
+ }
+
+ return 0;
+}
+
+/* (From PCL5 Comparison Guide, p. 1-57) */
+
+/*
+ * ESC & c <direction> T
+ *
+ * Set the text path direction - not yet implemented.
+ */
+ static int
+pcl_text_path_direction(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int direction = int_arg(pargs);
+
+ switch (direction) {
+
+ case 0:
+ case 1:
+ case -1:
+ break;
+
+ default:
+ return e_Range;
+ }
+
+ pcs->text_path = direction;
+ return 0;
+}
+
+/* ------ Initialization ------ */
+ static int
+pctext_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * mem
+)
+{
+ /* Register commands */
+ DEFINE_CONTROL(0, "(plain char)", pcl_plain_char);
+
+ DEFINE_CLASS('&')
+ {
+ 'p', 'X',
+ PCL_COMMAND("Transparent Mode", pcl_transparent_mode, pca_bytes)
+ },
+ {
+ 'd', 'D',
+ PCL_COMMAND( "Enable Underline",
+ pcl_enable_underline,
+ pca_neg_ignore | pca_big_ignore
+ )
+ },
+ {
+ 'd', '@',
+ PCL_COMMAND( "Disable Underline",
+ pcl_disable_underline,
+ pca_neg_ignore | pca_big_ignore
+ )
+ },
+ END_CLASS
+
+ DEFINE_CLASS('&')
+ {
+ 't', 'P',
+ PCL_COMMAND( "Text Parsing Method",
+ pcl_text_parsing_method,
+ pca_neg_error | pca_big_error
+ )
+ },
+ {
+ 'c', 'T',
+ PCL_COMMAND( "Text Path Direction",
+ pcl_text_path_direction,
+ pca_neg_ok | pca_big_error
+ )
+ },
+ END_CLASS
+
+ DEFINE_CONTROL(1, "(plain char)", pcl_plain_char); /* default "command" */
+
+ return 0;
+}
+
+ static void
+pctext_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_printer
+ | pcl_reset_overlay );
+
+ if ((type & mask) != 0) {
+ pcs->underline_enabled = false;
+ pcs->last_was_BS = false;
+ pcs->last_width = inch2coord(1.0 / 10.0);
+ pcs->text_parsing_method = &pcl_tpm_0;
+ pcs->text_path = 0;
+ }
+}
+
+const pcl_init_t pctext_init = { pctext_do_registration, pctext_do_reset, 0 };
diff --git a/pcl/pctop.c b/pcl/pctop.c
new file mode 100644
index 000000000..ebb82643d
--- /dev/null
+++ b/pcl/pctop.c
@@ -0,0 +1,637 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* implement device switching NB */
+
+/* pctop.c - PCL5c and pcl5e top-level API */
+
+#include "malloc_.h"
+#include "math_.h"
+#include "memory_.h"
+#include "stdio_.h"
+#include "scommon.h" /* for pparse.h */
+#include "pcparse.h"
+#include "pcpage.h"
+#include "pcstate.h"
+#include "pldebug.h"
+#include "gdebug.h"
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsrop.h"
+#include "gspaint.h" /* for gs_erasepage */
+#include "gsstate.h"
+#include "gxalloc.h"
+#include "gxdevice.h"
+#include "gxstate.h"
+#include "pjparse.h"
+#include "pltop.h"
+#include "pctop.h"
+#include "pccrd.h"
+#include "pcpalet.h"
+
+
+
+/* Configuration table for modules */
+extern const pcl_init_t pcparse_init;
+extern const pcl_init_t rtmisc_init;
+extern const pcl_init_t rtraster_init;
+extern const pcl_init_t pcjob_init;
+extern const pcl_init_t pcpage_init;
+extern const pcl_init_t pcfont_init;
+extern const pcl_init_t pctext_init;
+extern const pcl_init_t pcsymbol_init;
+extern const pcl_init_t pcsfont_init;
+extern const pcl_init_t pcmacros_init;
+extern const pcl_init_t pcrect_init;
+extern const pcl_init_t pcstatus_init;
+extern const pcl_init_t pcmisc_init;
+extern const pcl_init_t pcursor_init;
+extern const pcl_init_t pcl_cid_init;
+extern const pcl_init_t pcl_color_init;
+extern const pcl_init_t pcl_udither_init;
+extern const pcl_init_t pcl_frgrnd_init;
+extern const pcl_init_t pcl_lookup_tbl_init;
+extern const pcl_init_t pcl_palette_init;
+extern const pcl_init_t pcl_pattern_init;
+extern const pcl_init_t pcl_xfm_init;
+extern const pcl_init_t pcl_upattern_init;
+extern const pcl_init_t rtgmode_init;
+extern const pcl_init_t pccprint_init;
+extern const pcl_init_t pginit_init;
+extern const pcl_init_t pgframe_init;
+extern const pcl_init_t pgconfig_init;
+extern const pcl_init_t pgvector_init;
+extern const pcl_init_t pgpoly_init;
+extern const pcl_init_t pglfill_init;
+extern const pcl_init_t pgchar_init;
+extern const pcl_init_t pglabel_init;
+extern const pcl_init_t pgcolor_init;
+extern const pcl_init_t fontpg_init;
+
+const pcl_init_t * pcl_init_table[] = {
+ &pcparse_init,
+ &rtmisc_init,
+ &rtraster_init,
+ &pcjob_init,
+ &pcpage_init,
+ &pcfont_init,
+ &pctext_init,
+ &pcsymbol_init,
+ &pcsfont_init,
+ &pcmacros_init,
+ &pcrect_init,
+ &pcstatus_init,
+ &pcmisc_init,
+ &pcursor_init,
+ &pcl_cid_init,
+ &pcl_color_init,
+ &pcl_udither_init,
+ &pcl_frgrnd_init,
+ &pcl_lookup_tbl_init,
+ &pcl_palette_init,
+ &pcl_pattern_init,
+ &pcl_xfm_init,
+ &pcl_upattern_init,
+ &rtgmode_init,
+ &pccprint_init,
+ &pginit_init,
+ &pgframe_init,
+ &pgconfig_init,
+ &pgvector_init,
+ &pgpoly_init,
+ &pglfill_init,
+ &pgchar_init,
+ &pglabel_init,
+ &pgcolor_init,
+ &fontpg_init,
+ 0
+};
+
+/*
+ * Define the gstate client procedures.
+ */
+ static void *
+pcl_gstate_client_alloc(
+ gs_memory_t * mem
+)
+{
+ /*
+ * We don't want to allocate anything here, but we don't have any way
+ * to say we want to share the client data. Since this will only ever
+ * be called once, return something random.
+ */
+ return (void *)1;
+}
+
+/*
+ * set and get for pcl's target device. This is the device at the end
+ * of the pipeline.
+ */
+ static int
+pcl_gstate_client_copy_for(
+ void * to,
+ void * from,
+ gs_state_copy_reason_t reason
+)
+{
+ return 0;
+}
+
+ static void
+pcl_gstate_client_free(
+ void * old,
+ gs_memory_t * mem
+)
+{}
+
+static const gs_state_client_procs pcl_gstate_procs = {
+ pcl_gstate_client_alloc,
+ 0, /* copy -- superseded by copy_for */
+ pcl_gstate_client_free,
+ pcl_gstate_client_copy_for
+};
+
+/************************************************************/
+/******** Language wrapper implementation (see pltop.h) *****/
+/************************************************************/
+
+/*
+ * PCL interpeter: derived from pl_interp_t
+ */
+typedef struct pcl_interp_s {
+ pl_interp_t pl; /* common part: must be first */
+ gs_memory_t *memory; /* memory allocator to use */
+} pcl_interp_t;
+
+/*
+ * PCL interpreter instance: derived from pl_interp_instance_t
+ */
+typedef struct pcl_interp_instance_s {
+ pl_interp_instance_t pl; /* common part: must be first */
+ gs_memory_t *memory; /* memory allocator to use */
+ pcl_state_t pcs; /* pcl state */
+ pcl_parser_state_t pst; /* parser state */
+ pl_page_action_t pre_page_action; /* action before page out */
+ void *pre_page_closure; /* closure to call pre_page_action with */
+ pl_page_action_t post_page_action; /* action before page out */
+ void *post_page_closure;/* closure to call post_page_action with */
+} pcl_interp_instance_t;
+
+
+/* Get implemtation's characteristics */
+const pl_interp_characteristics_t * /* always returns a descriptor */
+pcl_impl_characteristics(
+ const pl_interp_implementation_t *impl /* implementation of interpereter to alloc */
+)
+{
+#define PCLVERSION NULL
+#define PCLBUILDDATE NULL
+ static pl_interp_characteristics_t pcl_characteristics = {
+ "PCL",
+ "\033E",
+ "Artifex",
+ PCLVERSION,
+ PCLBUILDDATE,
+ 17 /* size of min buffer == sizeof UEL */
+ };
+ return &pcl_characteristics;
+}
+
+/* yuck */
+pcl_state_t *
+pcl_get_gstate(pl_interp_instance_t *instance)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ return &pcli->pcs;
+}
+
+/* Do static init of PCL interpreter, since there's nothing to allocate */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_allocate_interp(
+ pl_interp_t **interp, /* RETURNS abstract interpreter struct */
+ const pl_interp_implementation_t *impl, /* implementation of interpereter to alloc */
+ gs_memory_t *mem /* allocator to allocate interp from */
+)
+{
+ static pcl_interp_t pi; /* there's only one interpreter possible, so static */
+ /* There's only one possible PCL interp, so return the static */
+ pi.memory = mem;
+ *interp = (pl_interp_t *)&pi;
+ return 0; /* success */
+}
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_allocate_interp_instance(
+ pl_interp_instance_t **instance, /* RETURNS instance struct */
+ pl_interp_t *interp, /* dummy interpreter */
+ gs_memory_t *mem /* allocator to allocate instance from */
+)
+{
+ /* Allocate everything up front */
+ pcl_interp_instance_t *pcli /****** SHOULD HAVE A STRUCT DESCRIPTOR ******/
+ = (pcl_interp_instance_t *)gs_alloc_bytes( mem,
+ sizeof(pcl_interp_instance_t),
+ "pcl_allocate_interp_instance(pcl_interp_instance_t)"
+ );
+ gs_state *pgs = gs_state_alloc(mem);
+ /* If allocation error, deallocate & return */
+ /* HS freeing null, perhaps if one of these is null the others should be freed. Was that the intent? */
+ if (!pcli || !pgs) {
+ if (!pcli)
+ gs_free_object(mem, pcli, "pcl_allocate_interp_instance(pcl_interp_instance_t)");
+ if (!pgs)
+ gs_state_free(pgs);
+ return gs_error_VMerror;
+ }
+
+ pcli->memory = mem;
+ /* zero-init pre/post page actions for now */
+ pcli->pre_page_action = 0;
+ pcli->post_page_action = 0;
+ /* General init of pcl_state */
+ pcl_init_state(&pcli->pcs, mem);
+ pcli->pcs.client_data = pcli;
+ pcli->pcs.pgs = pgs;
+ pcli->pcs.xfm_state.paper_size = 0;
+ /* provide an end page procedure */
+ pcli->pcs.end_page = pcl_end_page_top;
+ /* Init gstate to point to pcl state */
+ gs_state_set_client(pgs, &pcli->pcs, &pcl_gstate_procs, false);
+ /* register commands */
+ {
+ int code = pcl_do_registrations(&pcli->pcs, &pcli->pst);
+ if ( code < 0 )
+ return(code);
+ }
+
+ /* Return success */
+ *instance = (pl_interp_instance_t *)pcli;
+ return 0;
+}
+
+/* Set a client language into an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_set_client_instance(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_interp_instance_t *client, /* client to set */
+ pl_interp_instance_clients_t which_client
+)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+
+ if ( which_client == PJL_CLIENT )
+ pcli->pcs.pjls = client;
+ /* ignore unknown clients */
+ return 0;
+}
+
+/* Set an interpreter instance's pre-page action */
+static int /* ret 0 ok, else -ve err */
+pcl_impl_set_pre_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute (rets 1 to abort w/o err) */
+ void *closure /* closure to call action with */
+)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ pcli->pre_page_action = action;
+ pcli->pre_page_closure = closure;
+ return 0;
+}
+
+/* Set an interpreter instance's post-page action */
+static int /* ret 0 ok, else -ve err */
+pcl_impl_set_post_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute */
+ void *closure /* closure to call action with */
+)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ pcli->post_page_action = action;
+ pcli->post_page_closure = closure;
+ return 0;
+}
+
+/* if the device option string PCL is not given, the default
+ arrangement is 1 bit devices use pcl5e other devices use pcl5c. */
+static pcl_personality_t
+pcl_set_personality(pl_interp_instance_t *instance, gx_device *device)
+{
+ if ( !strcmp(instance->pcl_personality, "PCL5C" ) )
+ return pcl5c;
+ else if ( !strcmp(instance->pcl_personality, "PCL5E" ) )
+ return pcl5e;
+ else if ( !strcmp(instance->pcl_personality, "RTL" ) )
+ return rtl;
+ else if ( device->color_info.depth == 1 )
+ return pcl5e;
+ else
+ return pcl5c;
+}
+
+#include "plmain.h"
+
+/* Set a device into an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_set_device(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gx_device *device /* device to set (open or closed) */
+)
+{
+ /* NB REVIEW ME -- ROUGH DRAFT */
+ int code;
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ enum {Sbegin, Ssetdevice, Sinitg, Sgsave1, Spclgsave, Sreset, Serase, Sdone} stage;
+
+ stage = Sbegin;
+ /* set personality - pcl5c, pcl5e, or rtl */
+ pcli->pcs.personality = pcl_set_personality(instance, device);
+ /* Set the device into the pcl_state & gstate */
+ stage = Ssetdevice;
+ if ((code = gs_setdevice_no_erase(pcli->pcs.pgs, device)) < 0) /* can't erase yet */
+ goto pisdEnd;
+
+ stage = Sinitg;
+ /* Do inits of gstate that may be reset by setdevice */
+ /* PCL no longer uses the graphic library transparency mechanism */
+ gs_setsourcetransparent(pcli->pcs.pgs, false);
+ gs_settexturetransparent(pcli->pcs.pgs, false);
+ gs_setaccuratecurves(pcli->pcs.pgs, true); /* All H-P languages want accurate curves. */
+ stage = Sgsave1;
+ if ( (code = gs_gsave(pcli->pcs.pgs)) < 0 )
+ goto pisdEnd;
+ stage = Serase;
+ if ( (code = gs_erasepage(pcli->pcs.pgs)) < 0 )
+ goto pisdEnd;
+ /* Do device-dependent pcl inits */
+ stage = Sreset;
+ if ((code = pcl_do_resets(&pcli->pcs, pcl_reset_initial)) < 0 )
+ goto pisdEnd;
+ /* provide a PCL graphic state we can return to */
+ stage = Spclgsave;
+ if ( (code = pcl_gsave(&pcli->pcs)) < 0 )
+ goto pisdEnd;
+ stage = Sdone; /* success */
+ /* Unwind any errors */
+ pisdEnd:
+ switch (stage) {
+ case Sdone: /* don't undo success */
+ case Sinitg: /* can't happen removes warning */
+ break;
+
+ case Spclgsave: /* 2nd gsave failed */
+ /* fall thru to next */
+ case Sreset: /* pcl_do_resets failed */
+ case Serase: /* gs_erasepage failed */
+ /* undo 1st gsave */
+ gs_grestore_only(pcli->pcs.pgs); /* destroys gs_save stack */
+ /* fall thru to next */
+
+ case Sgsave1: /* 1st gsave failed */
+ /* undo setdevice */
+ gs_nulldevice(pcli->pcs.pgs);
+ /* fall thru to next */
+
+ case Ssetdevice: /* gs_setdevice failed */
+ case Sbegin: /* nothing left to undo */
+ break;
+ }
+ return code;
+}
+
+static int
+pcl_impl_get_device_memory(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gs_memory_t **pmem)
+{
+ return 0;
+}
+
+
+/* Prepare interp instance for the next "job" */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_init_job(
+ pl_interp_instance_t *instance /* interp instance to start job in */
+)
+{
+ int code = 0;
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ pcl_process_init(&pcli->pst);
+ return code;
+}
+
+/* Parse a cursor-full of data */
+static int /* ret 0 or +ve if ok, else -ve error code */
+pcl_impl_process(
+ pl_interp_instance_t *instance, /* interp instance to process data job in */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ int code = pcl_process(&pcli->pst, &pcli->pcs, cursor);
+ return code;
+}
+
+/* Skip to end of job ret 1 if done, 0 ok but EOJ not found, else -ve error code */
+static int
+pcl_impl_flush_to_eoj(
+ pl_interp_instance_t *instance, /* interp instance to flush for */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ const byte *p = cursor->ptr;
+ const byte *rlimit = cursor->limit;
+
+ /* Skip to, but leave UEL in buffer for PJL to find later */
+ for (; p < rlimit; ++p)
+ if (p[1] == '\033') {
+ uint avail = rlimit - p;
+
+ if (memcmp(p + 1, "\033%-12345X", min(avail, 9)))
+ continue;
+ if (avail < 9)
+ break;
+ cursor->ptr = p;
+ return 1; /* found eoj */
+ }
+ cursor->ptr = p;
+ return 0; /* need more data */
+}
+
+/* Parser action for end-of-file */
+static int /* ret 0 or +ve if ok, else -ve error code */
+pcl_impl_process_eof(
+ pl_interp_instance_t *instance /* interp instance to process data job in */
+)
+{
+ int code;
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ pcl_process_init(&pcli->pst);
+ code = pcl_end_page_if_marked(&pcli->pcs);
+ if ( code < 0 )
+ return code;
+ /* force restore & cleanup if unexpected data end was encountered */
+ return 0;
+}
+
+/* Report any errors after running a job */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_report_errors(
+ pl_interp_instance_t *instance, /* interp instance to wrap up job in */
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ byte buf[200];
+ uint count;
+
+ while ( (count = pcl_status_read(buf, sizeof(buf), &pcli->pcs)) != 0 )
+ errwrite(buf, count);
+
+ return 0;
+}
+
+/* Wrap up interp instance after a "job" */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_dnit_job(
+ pl_interp_instance_t *instance /* interp instance to wrap up job in */
+)
+{
+ return 0;
+}
+
+/* Remove a device from an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_remove_device(
+ pl_interp_instance_t *instance /* interp instance to use */
+)
+{
+ int code;
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+
+ /* NB use the PXL code */
+ /* return to the original graphic state w/color mapper, bbox, target */
+ code = pcl_grestore(&pcli->pcs);
+ if (code < 0 )
+ dprintf1("error code %d restoring gstate, continuing\n", code );
+ /* return to original gstate w/bbox, target */
+ code = gs_grestore_only(pcli->pcs.pgs); /* destroys gs_save stack */
+ if (code < 0 )
+ dprintf1("error code %d destroying gstate, continuing\n", code );
+
+ /* Deselect bbox. Bbox has been prevented from auto-closing/deleting */
+ code = gs_nulldevice(pcli->pcs.pgs);
+ if ( code < 0 )
+ dprintf1("error code %d installing nulldevice, continuing\n", code );
+ return pcl_do_resets(&pcli->pcs, pcl_reset_permanent);
+}
+
+/* Deallocate a interpreter instance */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_deallocate_interp_instance(
+ pl_interp_instance_t *instance /* instance to dealloc */
+)
+{
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)instance;
+ gs_memory_t *mem = pcli->memory;
+ /* free memory used by the parsers */
+ if ( pcl_parser_shutdown(&pcli->pst, mem ) < 0 ) {
+ dprintf("Undefined error shutting down parser, continuing\n" );
+ }
+ /* this should have a shutdown procedure like pcl above */
+ gs_free_object(mem,
+ pcli->pst.hpgl_parser_state,
+ "pcl_deallocate_interp_instance(pcl_interp_instance_t)");
+
+ /* free default, pdflt_* objects */
+ pcl_free_default_objects( mem, &pcli->pcs);
+
+ /* free halftone cache in gs state */
+ gs_state_free(pcli->pcs.pgs);
+ /* remove pcl's gsave grestore stack */
+ pcl_free_gstate_stk(&pcli->pcs);
+ gs_free_object(mem, pcli,
+ "pcl_deallocate_interp_instance(pcl_interp_instance_t)");
+ return 0;
+}
+
+/* Do static deinit of PCL interpreter */
+static int /* ret 0 ok, else -ve error code */
+pcl_impl_deallocate_interp(
+ pl_interp_t *interp /* interpreter to deallocate */
+)
+{
+ /* Deinit interp */
+ return 0;
+}
+
+/*
+ * End-of-page called back by PCL - NB now exported.
+ */
+ int
+pcl_end_page_top(
+ pcl_state_t * pcs,
+ int num_copies,
+ int flush
+)
+{
+
+ pcl_interp_instance_t *pcli = (pcl_interp_instance_t *)(pcs->client_data);
+ pl_interp_instance_t *instance = (pl_interp_instance_t *)pcli;
+ int code = 0;
+ /* do pre-page action */
+ if (pcli->pre_page_action) {
+ code = pcli->pre_page_action(instance, pcli->pre_page_closure);
+ if ( code < 0 )
+ return code;
+ if ( code > 0 )
+ /* don't print case */
+ return 0;
+ }
+
+ /* output the page */
+ code = gs_output_page(pcs->pgs, num_copies, flush);
+ if (code < 0)
+ return code;
+ /* do post-page action */
+ if (pcli->post_page_action) {
+ code = pcli->post_page_action(instance, pcli->post_page_closure);
+ if (code < 0)
+ return code;
+ }
+ return 0;
+}
+
+/* Parser implementation descriptor */
+const pl_interp_implementation_t pcl_implementation = {
+ pcl_impl_characteristics,
+ pcl_impl_allocate_interp,
+ pcl_impl_allocate_interp_instance,
+ pcl_impl_set_client_instance,
+ pcl_impl_set_pre_page_action,
+ pcl_impl_set_post_page_action,
+ pcl_impl_set_device,
+ pcl_impl_init_job,
+ pcl_impl_process,
+ pcl_impl_flush_to_eoj,
+ pcl_impl_process_eof,
+ pcl_impl_report_errors,
+ pcl_impl_dnit_job,
+ pcl_impl_remove_device,
+ pcl_impl_deallocate_interp_instance,
+ pcl_impl_deallocate_interp,
+ pcl_impl_get_device_memory
+};
diff --git a/pcl/pctop.h b/pcl/pctop.h
new file mode 100644
index 000000000..d77610854
--- /dev/null
+++ b/pcl/pctop.h
@@ -0,0 +1,23 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pctop.h */
+/* Interface to main program utilities for PCL5 interpreter */
+
+#ifndef pctop_INCLUDED
+# define pctop_INCLUDED
+
+pcl_state_t * pcl_get_gstate(pl_interp_instance_t *instance);
+
+
+#endif /* pctop_INCLUDED */
diff --git a/pcl/pctpm.h b/pcl/pctpm.h
new file mode 100644
index 000000000..37257b58b
--- /dev/null
+++ b/pcl/pctpm.h
@@ -0,0 +1,45 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pctpm.h - structures of PCL's text parsing methods */
+
+#ifndef pctpm_INCLUDED
+#define pctpm_INCLUDED
+
+#include "gx.h"
+
+typedef struct pcl_text_parsing_method_s {
+ byte min1, max1;
+ byte min2, max2;
+} pcl_text_parsing_method_t;
+
+#define pcl_char_is_2_byte(ch, tpm) \
+ ( ((ch) >= (tpm)->min1) && \
+ ((ch) <= (tpm)->max2) && \
+ (((ch) <= (tpm)->max1) || ((ch) >= (tpm)->min2)) )
+
+#define pcl_tpm_is_single_byte(tpm) ((tpm)->max1 == 0)
+
+/* Single-byte only */
+#define pcl_tpm_0_data { 0xff, 0, 0xff, 0 }
+
+/* 0x21-0xff are double-byte */
+#define pcl_tpm_21_data { 0x21, 0xff, 0x21, 0xff }
+
+/* 0x81-0x9f, 0xe0-0xfc are double-byte */
+#define pcl_tpm_31_data { 0x81, 0x9f, 0xe0, 0xfc }
+
+/* 0x80-0xff are double-byte */
+#define pcl_tpm_38_data { 0x80, 0xff, 0x80, 0xff }
+
+#endif /* pctpm_INCLUDED */
diff --git a/pcl/pcuptrn.c b/pcl/pcuptrn.c
new file mode 100644
index 000000000..644e79e0d
--- /dev/null
+++ b/pcl/pcuptrn.c
@@ -0,0 +1,589 @@
+/* Portions Copyright (C) 2001, 2005 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcuptrn.c - code for PCL and GL/2 user defined patterns */
+
+#include "string_.h"
+#include "gx.h"
+#include "gsuid.h"
+#include "gscsel.h"
+#include "gsdevice.h"
+#include "gxdevice.h"
+#include "gscspace.h"
+#include "gxdcolor.h"
+#include "gxcolor2.h"
+#include "gxpcolor.h"
+#include "pldict.h"
+#include "pcindxed.h"
+#include "pcpatrn.h"
+#include "pcbiptrn.h"
+#include "pcuptrn.h"
+
+/*
+ * GC routines.
+ */
+private_st_pattern_data_t();
+private_st_pattern_t();
+
+/*
+ * Free routine for pattern data structure.
+ */
+ static void
+free_pattern_data(
+ gs_memory_t * pmem,
+ void * pvpat_data,
+ client_name_t cname
+)
+{
+ pcl_pattern_data_t * ppat_data = (pcl_pattern_data_t *)pvpat_data;
+
+ if ((ppat_data->storage != pcds_internal) && (ppat_data->pixinfo.data != 0))
+ gs_free_object(pmem, ppat_data->pixinfo.data, cname);
+ gs_free_object(pmem, pvpat_data, cname);
+}
+
+/*
+ * Build a pattern data structure. This routine is static as pattern
+ * data structures may only be built as part of a pattern.
+ *
+ * All pattern data structure are built as "temporary". Routines that build
+ * internal patterns should modify this as soon as the pattern is built.
+ *
+ * Returns 0 on success, < 0 in the event of an error. In the latter case,
+ * *pppat_data will be set to NULL.
+ */
+ static int
+build_pattern_data(
+ pcl_pattern_data_t ** pppat_data,
+ const gs_depth_bitmap * ppixinfo,
+ pcl_pattern_type_t type,
+ int xres,
+ int yres,
+ gs_memory_t * pmem
+)
+{
+ pcl_pattern_data_t * ppat_data = 0;
+
+ *pppat_data = 0;
+ rc_alloc_struct_1( ppat_data,
+ pcl_pattern_data_t,
+ &st_pattern_data_t,
+ pmem,
+ return e_Memory,
+ "allocate PCL pattern data"
+ );
+ ppat_data->rc.free = free_pattern_data;
+
+ ppat_data->pixinfo = *ppixinfo;
+ ppat_data->storage = pcds_temporary;
+ ppat_data->type = type;
+ ppat_data->xres = xres;
+ ppat_data->yres = yres;
+
+ *pppat_data = ppat_data;
+ return 0;
+}
+
+/*
+ * Free the rendered portion of a pattern.
+ */
+static void
+free_pattern_rendering(const gs_memory_t *mem,
+ pcl_pattern_t * pptrn
+)
+{
+ if (pptrn->pcol_ccolor != 0) {
+ pcl_ccolor_release(pptrn->pcol_ccolor);
+ pptrn->pcol_ccolor = 0;
+ }
+ if (pptrn->pmask_ccolor != 0) {
+ pcl_ccolor_release(pptrn->pmask_ccolor);
+ pptrn->pmask_ccolor = 0;
+ }
+}
+
+/*
+ * Free routine for patterns. This is exported for the benefit of the code
+ * that handles PCL built-in patterns.
+ */
+ void
+pcl_pattern_free_pattern(
+ gs_memory_t * pmem,
+ void * pvptrn,
+ client_name_t cname
+)
+{
+ pcl_pattern_t * pptrn = (pcl_pattern_t *)pvptrn;
+
+ free_pattern_rendering(pmem, pptrn);
+ if (pptrn->ppat_data != 0)
+ pcl_pattern_data_release(pptrn->ppat_data);
+ gs_free_object(pmem, pvptrn, cname);
+}
+
+/*
+ * Build a PCL pattern.
+ *
+ * This is expoorted for use by the routines that create the "built in"
+ * patterns.
+ *
+ * Returns 0 if successful, < 0 in the event of an error. In the latter case,
+ * *ppptrn will be set to null.
+ */
+ int
+pcl_pattern_build_pattern(
+ pcl_pattern_t ** ppptrn,
+ const gs_depth_bitmap * ppixinfo,
+ pcl_pattern_type_t type,
+ int xres,
+ int yres,
+ gs_memory_t * pmem
+)
+{
+ pcl_pattern_t * pptrn = 0;
+ int code = 0;
+
+ *ppptrn = 0;
+ pptrn = gs_alloc_struct( pmem,
+ pcl_pattern_t,
+ &st_pattern_t,
+ "create PCL pattern"
+ );
+ if (pptrn == 0)
+ return e_Memory;
+
+ pptrn->pcol_ccolor = 0;
+ pptrn->pmask_ccolor = 0;
+ pptrn->orient = 0;
+ /* provide a sentinel to guarantee the initial pattern is
+ rendered */
+ pptrn->ref_pt.x = pptrn->ref_pt.y = -1.0;
+ code = build_pattern_data( &(pptrn->ppat_data),
+ ppixinfo,
+ type,
+ xres,
+ yres,
+ pmem
+ );
+ if (code < 0) {
+ pcl_pattern_free_pattern(pmem, pptrn, "create PCL pattern");
+ return code;
+ }
+
+ *ppptrn = pptrn;
+ return 0;
+}
+
+/*
+ * Get a PCL user-defined pattern. A null return indicates the pattern is
+ * not defined.
+ */
+ pcl_pattern_t *
+pcl_pattern_get_pcl_uptrn( pcl_state_t *pcs, int id )
+{
+ if (pcs->last_pcl_uptrn_id != id) {
+ pcl_id_t key;
+
+ pcs->last_pcl_uptrn_id = id;
+ id_set_value(key, id);
+ if ( !pl_dict_lookup( &pcs->pcl_patterns,
+ id_key(key),
+ 2,
+ (void **)&pcs->plast_pcl_uptrn,
+ false,
+ NULL
+ ) )
+ pcs->plast_pcl_uptrn = 0;
+ }
+
+ return pcs->plast_pcl_uptrn;
+}
+
+/*
+ * Define a PCL user-defined pattern. This procedure updates the cached
+ * information, hence it should be used for all definitions. To undefine
+ * an entry, set the second operard to null.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+define_pcl_ptrn(
+ pcl_state_t * pcs,
+ int id,
+ pcl_pattern_t * pptrn
+)
+{
+ pcl_id_t key;
+
+ id_set_value(key, id);
+ if (pptrn == 0)
+ pl_dict_undef(&pcs->pcl_patterns, id_key(key), 2);
+ else if (pl_dict_put(&pcs->pcl_patterns, id_key(key), 2, pptrn) < 0)
+ return e_Memory;
+
+ if (pcs->last_pcl_uptrn_id == id)
+ pcs->plast_pcl_uptrn = pptrn;
+
+ return 0;
+}
+
+/*
+ * Delete all temporary patterns or all patterns, based on the value of
+ * the operand.
+ */
+ static void
+delete_all_pcl_ptrns(
+ bool renderings,
+ bool tmp_only,
+ pcl_state_t * pcs
+)
+{
+ pcl_pattern_t * pptrn;
+ pl_dict_enum_t denum;
+ gs_const_string plkey;
+
+ pl_dict_enum_begin(&pcs->pcl_patterns, &denum);
+ while (pl_dict_enum_next(&denum, &plkey, (void **)&pptrn)) {
+ if (!tmp_only || (pptrn->ppat_data->storage == pcds_temporary)) {
+ pcl_id_t key;
+
+ id_set_key(key, plkey.data);
+ define_pcl_ptrn(pcs, id_value(key), NULL);
+ } else if (renderings)
+ free_pattern_rendering(pcs->memory, pptrn);
+ }
+}
+
+/*
+ * Get a GL/2 user defined pattern. A null return indicates there is no pattern
+ * defined for the index.
+ */
+ pcl_pattern_t *
+pcl_pattern_get_gl_uptrn(pcl_state_t *pcs, int indx)
+{
+ if (pcs->last_gl2_RF_indx != indx) {
+ pcl_id_t key;
+
+ pcs->last_gl2_RF_indx = indx;
+ id_set_value(key, indx);
+ if ( !pl_dict_lookup( &pcs->gl_patterns,
+ id_key(key),
+ 2,
+ (void **)(&pcs->plast_gl2_uptrn),
+ false,
+ NULL
+ ) )
+ pcs->plast_gl2_uptrn = 0;
+ }
+
+ return pcs->plast_gl2_uptrn;
+}
+
+/*
+ * Create and define a GL/2 user-define pattern. This is the only pattern-
+ * control like facility provided for GL/2. To undefine patterns, use null
+ * as the second operand. See pcpatrn.h for further information.
+ *
+ * Note that RF patterns may be either colored or uncolored. At the GL/2 level
+ * the determination is made based on whether or not they contain pen indices
+ * other than 0 or 1. At this level the determination is based on the depth
+ * of the data pixmap: 1 for uncolored, 8 for colored.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_pattern_RF(
+ int indx,
+ const gs_depth_bitmap * ppixmap,
+ pcl_state_t * pcs
+)
+{
+ pcl_id_t key;
+ pcl_pattern_t * pptrn = 0;
+
+ id_set_value(key, indx);
+
+ if (ppixmap != 0) {
+ pcl_pattern_type_t type = ( ppixmap->pix_depth == 1
+ ? pcl_pattern_uncolored
+ : pcl_pattern_colored );
+ /* RF appears to use the resolution of the device contrary to
+ what the pcl documentation implies */
+ gx_device *pdev = gs_currentdevice(pcs->pgs);
+ int code = pcl_pattern_build_pattern( &pptrn,
+ ppixmap,
+ type,
+ pdev->HWResolution[0],
+ pdev->HWResolution[1],
+ pcs->memory
+ );
+
+ if (code < 0)
+ return code;
+
+ if (pl_dict_put(&pcs->gl_patterns, id_key(key), 2, pptrn) < 0) {
+ pcl_pattern_free_pattern( pcs->memory,
+ pptrn,
+ "create GL/2 RF pattern"
+ );
+ return e_Memory;
+ }
+
+ } else
+ pl_dict_undef(&pcs->gl_patterns, id_key(key), 2);
+
+ if (pcs->last_gl2_RF_indx == indx)
+ pcs->plast_gl2_uptrn = pptrn;
+
+ return 0;
+}
+
+
+/*
+ * The PCL user-define pattern type. For memory management reasons, this has
+ * a transitory existence.
+ *
+ * This object comes in two forms, with and without resolution. Which form
+ * applies is determined based on the size of the received data array as
+ * compared to that indicated by the height, width, and depth fields
+ *
+ * Note: These structures are defined by HP.
+ */
+typedef struct pcl_upattern0_s {
+ byte format; /* actually pcl_pattern_type_t */
+ byte cont; /* continuation; currently unused */
+ byte depth; /* bits per pixel; 1 or 8 */
+ byte dummy; /* reserved - currently unused */
+ byte height[2]; /* height in pixels */
+ byte width[2]; /* width in pixels */
+ byte data[1]; /* actual size derived from hgiht, width, and bits */
+} pcl_upattern0_t;
+
+typedef struct pcl_upattern1_s {
+ byte format; /* actually pcl_pattern_type_t */
+ byte cont; /* continuation; currently unused */
+ byte depth; /* bits per pixel; 1 or 8 */
+ byte dummy; /* reserved - currently unused */
+ byte height[2]; /* height in pixels */
+ byte width[2]; /* width in pixels */
+ byte xres[2]; /* width resolution */
+ byte yres[2]; /* height resolution */
+ byte data[1]; /* actual size derived from hgiht, width, and bits */
+} pcl_upattern1_t;
+
+/*
+ * ESC * c # W
+ *
+ * Download Pattern
+ */
+ static int
+download_pcl_pattern(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint count = arg_data_size(pargs);
+ const pcl_upattern0_t * puptrn0 = (pcl_upattern0_t *)arg_data(pargs);
+ uint format, depth, rsize, patsize, ndsize, dsize;
+ gs_depth_bitmap pixinfo;
+ int xres = 300, yres = 300;
+ pcl_pattern_t * pptrn = 0;
+ int code = 0;
+ int i;
+
+ if (count < 8)
+ return e_Range;
+
+ format = puptrn0->format;
+ /* non data size - the size of the parameters that describe the data */
+ ndsize = (format == 20 ? sizeof(pcl_upattern1_t) : sizeof(pcl_upattern0_t)) - 1;
+ pixinfo.num_comps = 1;
+ pixinfo.size.x = (((uint)puptrn0->width[0]) << 8) + puptrn0->width[1];
+ pixinfo.size.y = (((uint)puptrn0->height[0]) << 8) + puptrn0->height[1];
+ depth = puptrn0->depth & 0xf;
+ pixinfo.pix_depth = depth;
+ pixinfo.raster = (pixinfo.size.x * depth + 7) / 8;
+ rsize = pixinfo.raster * pixinfo.size.y;
+ dsize = min(count - ndsize, rsize);
+ patsize = (((pixinfo.size.y) * (pixinfo.size.x) * depth) + 7) / 8;
+
+ /* check for legitimate format */
+ if ((format == 0) || (format == 20)) {
+ if (depth != 1)
+ return e_Range;
+ } else if ( (format != 1) ||
+ ((depth != 1) && (depth != 8)) ||
+ (pixinfo.size.x == 0) ||
+ (pixinfo.size.y == 0) )
+ return e_Range;
+
+ if (rsize == 0)
+ return e_Range;
+
+ /* allocate space for the array */
+ pixinfo.data = gs_alloc_bytes(pcs->memory, rsize, "download PCL pattern");
+
+ if (pixinfo.data == 0)
+ return e_Memory;
+
+
+ if (format == 20) {
+ pcl_upattern1_t * puptrn1 = (pcl_upattern1_t *)puptrn0;
+
+ xres = (((uint)puptrn1->xres[0]) << 8) + puptrn1->xres[1];
+ yres = (((uint)puptrn1->yres[0]) << 8) + puptrn1->yres[1];
+ memcpy(pixinfo.data, puptrn1->data, dsize);
+ } else {
+ memcpy(pixinfo.data, puptrn0->data, dsize);
+ }
+ if (dsize < rsize)
+ memset(pixinfo.data + dsize, 0, rsize - dsize);
+
+ /* build the pattern */
+ code = pcl_pattern_build_pattern( &(pptrn),
+ &pixinfo,
+ (format == 1 ? pcl_pattern_colored
+ : pcl_pattern_uncolored),
+ xres,
+ yres,
+ pcs->memory
+ );
+
+ /* place the pattern into the pattern dictionary */
+ if ( (code < 0) ||
+ ((code = define_pcl_ptrn(pcs, pcs->pattern_id, pptrn)) < 0) ) {
+ if (pptrn != 0)
+ pcl_pattern_free_pattern(pcs->memory, pptrn, "download PCL pattern");
+ else
+ gs_free_object( pcs->memory,
+ (void *)pixinfo.data,
+ "download PCL pattern"
+ );
+ }
+
+ return code;
+}
+
+/*
+ * ESC * c # Q
+ *
+ * Pattern contorl.
+ */
+ static int
+pattern_control(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcl_pattern_t * pptrn = 0;
+
+ switch (int_arg(pargs)) {
+
+ /* delete all patterns */
+ case 0:
+ delete_all_pcl_ptrns(false, false, pcs);
+ break;
+
+ /* delete all temporary patterns */
+ case 1:
+ delete_all_pcl_ptrns(false, true, pcs);
+ break;
+
+ /* delete last specified pattern */
+ case 2:
+ define_pcl_ptrn(pcs, pcs->pattern_id, NULL);
+
+ /* make last specified pattern temporary */
+ case 4:
+ pptrn = pcl_pattern_get_pcl_uptrn(pcs, pcs->pattern_id);
+ if (pptrn != 0)
+ pptrn->ppat_data->storage = pcds_temporary;
+ break;
+
+ /* make last specified pattern permanent */
+ case 5:
+ pptrn = pcl_pattern_get_pcl_uptrn(pcs, pcs->pattern_id);
+ if (pptrn != 0)
+ pptrn->ppat_data->storage = pcds_permanent;
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int
+upattern_do_copy(pcl_state_t *psaved, const pcl_state_t *pcs,
+ pcl_copy_operation_t operation)
+{
+ int i;
+ /* copy back any patterns created during macro invocation. NB
+ this should be incorporated in a built in pattern reset and
+ copy function in pcbiptrn.c along with
+ pcl_pattern_clear_bi_patterns() below */
+ for(i = 0; i < countof(pcs->bi_pattern_array); i++)
+ psaved->bi_pattern_array[i] = pcs->bi_pattern_array[i];
+ psaved->gl_patterns = pcs->gl_patterns;
+ psaved->pcl_patterns = pcs->pcl_patterns;
+ return 0;
+}
+
+/*
+ * Initialization and reset routines.
+ */
+ static int
+upattern_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'c', 'W',
+ PCL_COMMAND("Download Pattern", download_pcl_pattern, pca_bytes)
+ },
+ {
+ 'c', 'Q',
+ PCL_COMMAND( "Pattern Control",
+ pattern_control,
+ pca_neg_ignore | pca_big_ignore
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+ static void
+upattern_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ if ((type & pcl_reset_initial) != 0) {
+ pl_dict_init(&pcs->pcl_patterns, pcs->memory, pcl_pattern_free_pattern);
+ pl_dict_init(&pcs->gl_patterns, pcs->memory, pcl_pattern_free_pattern);
+ pcs->last_pcl_uptrn_id = -1;
+ pcs->plast_pcl_uptrn = 0;
+ pcs->last_gl2_RF_indx = -1;
+ pcs->plast_gl2_uptrn = 0;
+
+ } else if ((type & (pcl_reset_cold | pcl_reset_printer | pcl_reset_permanent)) != 0) {
+ delete_all_pcl_ptrns(true, !(type & pcl_reset_permanent) , pcs);
+ pcl_pattern_clear_bi_patterns(pcs);
+ /* GL's IN command takes care of the GL patterns */
+ }
+}
+
+const pcl_init_t pcl_upattern_init = { upattern_do_registration, upattern_do_reset, upattern_do_copy };
diff --git a/pcl/pcuptrn.h b/pcl/pcuptrn.h
new file mode 100644
index 000000000..341186106
--- /dev/null
+++ b/pcl/pcuptrn.h
@@ -0,0 +1,65 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcuptrn.h - interface for PCL and GL/2 user defined patterns */
+
+#ifndef pcuptrn_INCLUDED
+#define pcuptrn_INCLUDED
+
+#include "gx.h"
+#include "pcommand.h"
+#include "pcpatrn.h"
+
+/*
+ * Free routine for patterns. This is exported for the benefit of the code
+ * that handles PCL built-in patterns.
+ */
+void pcl_pattern_free_pattern(
+ gs_memory_t * pmem,
+ void * pvptrn,
+ client_name_t cname
+);
+
+/*
+ * Build a PCL pattern. This is exported for use by the routines supporting
+ * built-in patterns.
+ */
+int pcl_pattern_build_pattern(
+ pcl_pattern_t ** pppat_data,
+ const gs_depth_bitmap * ppixmap,
+ pcl_pattern_type_t type,
+ int xres,
+ int yres,
+ gs_memory_t * pmem
+);
+
+/*
+ * Get a PCL user-defined pattern. A null return indicates the pattern is
+ * not defined.
+ */
+pcl_pattern_t * pcl_pattern_get_pcl_uptrn(pcl_state_t *pcs, int id);
+
+/*
+ * Get a GL/2 user defined pattern. A null return indicates there is no pattern
+ * defined for the index.
+ */
+extern pcl_pattern_t * pcl_pattern_get_gl_uptrn(pcl_state_t *pcs, int indx);
+
+/* pcl_pattern_RF is in pcpatrn.h */
+
+/*
+ * External access to the user defined pattern related operators.
+ */
+extern const pcl_init_t pcl_upattern_init;
+
+#endif /* pcuptrn_INCLUDED */
diff --git a/pcl/pcursor.c b/pcl/pcursor.c
new file mode 100644
index 000000000..b0700b7b6
--- /dev/null
+++ b/pcl/pcursor.c
@@ -0,0 +1,892 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcursor.c - PCL5 cursor positioning commands */
+
+#include "std.h"
+#include "math_.h"
+#include "pcommand.h"
+#include "pcstate.h"
+#include "pcdraw.h"
+#include "pcpatxfm.h"
+#include "pcfont.h"
+#include "pcursor.h"
+#include "pcpage.h"
+#include "gscoord.h"
+#include "pjtop.h"
+
+/*
+ * Hoizontal and vertical movement.
+ *
+ * This is one of the most confusing areas of PCL because the individual
+ * movement commands and margins evolved at different times in the history
+ * of PCL, and thus have different behavior. In the dicussion below, we
+ * divide the various horizontal and vertical motion commands into groups,
+ * and identify the interaction of each group with the corresponding horizontal
+ * or vertical boundaries. (Note that, if the current print direciton is not
+ * zero, what is called the "left" logical page boundary would, from the
+ * point of view of the logical page, be given a different label.)
+ *
+ * Horizontal motion commmands (note: a movement "transitions" a boundary if
+ * the current point before and after the movement is on opposite sides of
+ * the boundary):
+ *
+ * a. Horizontal position by column, decipoint, or PCL unit, in absolute
+ * or relative mode, and horizontal motion due to rasters:
+ *
+ * "left" logical page boundary is used as origin for absolute positions
+ * movement to the left of the left logical page boundary is clamped
+ * to that boundary
+ * left text boundary is ignored
+ * right text boundary is ignored
+ * movement beyond the "right" logical page boundary is clamped to
+ * that boundary
+ *
+ * b. Tab (always relative)
+ *
+ * "left" logical boundary is irrelevant
+ * left text boundary is used as the origin for tab stops
+ * movement that transitions the right text boundary is clamped to
+ * that boundary
+ * movement beyond the "right" logical page boundary is clamped
+ * to that boundary
+ *
+ * c. Character or space (code legal in symbol set up not occupied by a
+ * printable character; motion always relative)
+ *
+ * "left" logical page boundary is irrelevant
+ * left text boundary is ignored
+ * if the character WOULD transition the right text boundary, ignore
+ * the character or issue a CR/LF sequence BEFORE printing the
+ * character, base on whether or not end-of-line wrapping is
+ * enabled (with one exception; see below)
+ * if the character WOULD transition the "right" logical page boundary,
+ * ignore the character or issue a CR/LF sequence BEFORE printing
+ * the character, base on whether or not end-of-line wrapping is
+ * enabled
+ *
+ * Note that only one of the latter two operations will be preformed if
+ * the logical and text margins are the same.
+ *
+ * An exception is made in third case above in the event that a back-
+ * space was received immediately before the character to be rendered.
+ * In that case, the character is rendered regardless of the transition
+ * of the right text boundary.
+ *
+ * d. Carriage return (always absolute)
+ *
+ * "left" logical page boundary is irrelevant
+ * left text boundary is used as the new horizontal location
+ * right text boundary is irrelevant
+ * "right" logical page boundary is irrelevant
+ *
+ * e. Back space
+ *
+ * movement beyond the "left" logical page boundary is clamped to
+ * that boundary
+ * movement that would transition the left text boundary is clamped
+ * to that boundary
+ * right text boundary is ignored (this is contrary to HP's
+ * documentation, but empirically verified on several machines)
+ * "right" logical page boundary is irrelevant
+ *
+ * In addtion, any horizontal movement to the left will "break" the current
+ * underline (this is significant for floating underlines).
+ *
+ * Vertical motion commands:
+ *
+ * f. Vertical cursor position by decipoints or PCL units (but NOT by
+ * rows), both absolute and relative
+ *
+ * movement beyond the "top" logical page boundary is clamped to
+ * that boundary
+ * top text boundary is used as the origin for absolute moves
+ * bottom text margin is ignored
+ * movement beyond the "bottom" logical page boundary is clamped to
+ * that boundary
+ *
+ * g. Absolute (NOT relative) vertical cursor position by rows
+ *
+ * "top" logical page boundary is irrelevant (can only be reached by
+ * relative moves)
+ * top text boundary, offset by 75% of the VMI distance, is used as
+ * the origin
+ * bottom text margin is ignored
+ * movement beyond the "bottom" logical page boundary is clamped to
+ * that boundary
+ *
+ * h. Relative (NOT absolute) vertical cursor position by rows, and both
+ * line-feed and half line-feed when perforation skip is disabled
+ *
+ * movement beyond the "top" logical page boundary is clamped to
+ * that boundary
+ * if and advance of n rows (n == 1 for LF) is requested, and only
+ * m additional rows can be accommodated on the current page,
+ * an implicit page ejection occurs and the cursor is positioned
+ * n - m rows below the "top" logical page boundary on the
+ * subsequent page; if the subsequent page will not accommodate
+ * n - m rows, the process is repeated
+ * after an implicit page eject (see below), the cursor is positioned
+ * 75% of the VMI distance below the "top" logical page boundary plus
+ *
+ * top text boundary is ignored
+ * bottom text boundary is ignored
+ * movement beyond the "bottom" page boundary causes an implicit
+ * page eject
+ *
+ * i. Line-feed and halft line feed, when perforation skip is enabled
+ *
+ * "top" logical page boundary is irrelevant
+ * after an implicit page eject (see below), the cursor is set 75% of
+ * the VMI distance below the top text boundary
+ * any movement that ends below the bottom text boundary causes a
+ * page eject (NB: this does not require a transition of the
+ * boundary, as is the case for the right text boundary)
+ * the "bottom" logical page boundary is irrelevant
+ *
+ * j. Form feed
+ *
+ * "top" logical page boundary is irrelevant
+ * the cursor is positioned 75% of the VMI distance below the top
+ * text boundary
+ * bottom text boundary is irrelevant
+ * "bottom" logical page boundary is irrelevant
+ *
+ *
+ * k. for a relative vertical motion command relative movement can extend
+ * to the next logical page's lower boundary, where it is clamped.
+ * This should could be grouped with item h.
+ *
+ * Wow - 11 different forms to accommodate.
+ *
+ * The special handling required by character and space induced horizontal
+ * movement is handled in pctext.c (pcl_show_chars); all other movement is
+ * handled in this file.
+ */
+
+#define HOME_X(pcs) (pcs->margins.left)
+#define DEFAULT_Y_START(pcs) ((3L * pcs->vmi_cp) / 4L)
+#define HOME_Y(pcs) (pcs->margins.top + DEFAULT_Y_START(pcs))
+
+ void
+pcl_set_cap_x(
+ pcl_state_t * pcs,
+ coord x,
+ bool relative,
+ bool use_margins
+)
+{
+ coord old_x = pcs->cap.x;
+
+ if (relative)
+ x += pcs->cap.x;
+
+ /* the horizontal text margins are only interesting in transition */
+ if (use_margins) {
+ coord min_x = pcs->margins.left;
+ coord max_x = pcs->margins.right;
+
+ if ((old_x >= min_x) && (x < min_x))
+ x = min_x;
+ else if ((old_x <= max_x) && (x > max_x))
+ x = max_x;
+ }
+
+ /* the logical page bounds always apply */
+ x = ( x > pcs->xfm_state.pd_size.x ? pcs->xfm_state.pd_size.x
+ : (x < 0L ? 0L : x) );
+
+ /* leftward motion "breaks" an underline */
+ if (x < old_x) {
+ pcl_break_underline(pcs);
+ pcs->cap.x = x;
+ pcl_continue_underline(pcs);
+ } else
+ pcs->cap.x = x;
+}
+
+ int
+pcl_set_cap_y(
+ pcl_state_t * pcs,
+ coord y,
+ bool relative,
+ bool use_margins,
+ bool by_row,
+ bool by_row_command
+)
+{
+ coord lim_y = pcs->xfm_state.pd_size.y;
+ coord max_y = pcs->margins.top + pcs->margins.length;
+ bool page_eject = by_row && relative;
+
+ /* this corresponds to rule 'k' above. */
+ if (relative && by_row_command) {
+ /* calculate the advance to the next logical page bound. Note
+ margins are false if by_row_command is true. */
+ coord advance_max = 2 * lim_y - pcs->cap.y;
+ /* clamp */
+ y = (y < advance_max ? y : advance_max + HOME_Y(pcs));
+ }
+
+ /* adjust the vertical position provided */
+ if (relative)
+ y += pcs->cap.y;
+ else
+ y += (by_row ? HOME_Y(pcs) : pcs->margins.top);
+
+ /* vertical moves always "break" underlines */
+ pcl_break_underline(pcs);
+
+ max_y = (use_margins ? max_y : lim_y);
+ if (y < 0L)
+ pcs->cap.y = 0L;
+ else if (y <= max_y)
+ pcs->cap.y = y;
+ else if (!page_eject)
+ pcs->cap.y = (y <= lim_y ? y : lim_y);
+ else {
+ coord vmi_cp = pcs->vmi_cp;
+ coord y0 = pcs->cap.y;
+
+ while (y > max_y) {
+ int code = pcl_end_page_always(pcs);
+
+ if (code < 0)
+ return code;
+ y -= (y0 <= max_y ? max_y : y0);
+ y0 = (use_margins ? HOME_Y(pcs) : DEFAULT_Y_START(pcs));
+
+ /* if one VMI distance or less remains, always exit */
+ if ((vmi_cp == 0) || (y <= vmi_cp)) {
+ y = y0;
+ break;
+ }
+
+ /* otherwise, round to a multiple of VMI distance */
+ y += y0 - 1 - ((y - 1) % vmi_cp);
+ }
+ pcs->cap.y = y;
+ }
+
+ pcl_continue_underline(pcs);
+ return 0;
+}
+
+static inline float
+motion_args(pcl_args_t *pargs, bool truncate)
+{
+ float arg = float_arg(pargs);
+ if (truncate)
+ arg = floor(arg);
+ return arg;
+}
+
+/* some convenient short-hand for the cursor movement commands */
+
+static inline void
+do_horiz_motion(
+ pcl_args_t *pargs,
+ pcl_state_t *pcs,
+ coord mul,
+ bool truncate_arg
+)
+{
+ pcl_set_cap_x(pcs, motion_args(pargs, truncate_arg) * mul, arg_is_signed(pargs), false);
+ return;
+}
+
+
+static inline int
+do_vertical_move(pcl_state_t *pcs, pcl_args_t *pargs, float mul,
+ bool use_margins, bool by_row, bool by_row_command, bool truncate_arg)
+{
+ return pcl_set_cap_y(pcs, motion_args(pargs, truncate_arg) * mul,
+ arg_is_signed(pargs), use_margins, by_row,
+ by_row_command);
+}
+
+/*
+ * Control character action implementation.
+ *
+ * These routines perform just the individual actions. The control character
+ * routines may invoke several of these, based on the selected line termination
+ * setting.
+ *
+ * do_CR and do_LF are exported for use by the text manipulation routines and
+ * the display functions.
+ *
+ * Note: CR always "breaks" an underline, even if it is a movement to the right.
+ */
+ void
+pcl_do_CR(
+ pcl_state_t * pcs
+)
+{
+ pcl_break_underline(pcs);
+ pcl_set_cap_x(pcs, pcs->margins.left, false, false);
+ pcl_continue_underline(pcs);
+}
+
+ int
+pcl_do_LF(
+ pcl_state_t * pcs
+)
+{
+ return pcl_set_cap_y( pcs,
+ pcs->vmi_cp,
+ true,
+ (pcs->perforation_skip == 1),
+ true,
+ false
+ );
+}
+
+/*
+ * Unconditionally feed a page, and move the the "home" verical position on
+ * the followin page.
+ */
+ int
+pcl_do_FF(
+ pcl_state_t * pcs
+)
+{
+ int code = pcl_end_page_always(pcs);
+
+ if (code >= 0) {
+ code = pcl_set_cap_y(pcs, 0L, false, false, true, false);
+ pcl_continue_underline(pcs); /* (after adjusting y!) */
+ }
+ return code;
+}
+
+/*
+ * Return the cursor to its "home" position
+ */
+ void
+pcl_home_cursor(
+ pcl_state_t * pcs
+)
+{
+ pcl_set_cap_x(pcs, pcs->margins.left, false, false);
+ pcl_set_cap_y(pcs, 0L, false, false, true, false);
+}
+
+/*
+ * Update the HMI by recomputing it from the font.
+ */
+ coord
+pcl_updated_hmi(
+ pcl_state_t * pcs
+)
+{
+ coord hmi;
+ const pcl_font_selection_t * pfs =
+ &(pcs->font_selection[pcs->font_selected]);
+ int code = pcl_recompute_font(pcs);
+ const pl_font_t * plfont = pcs->font;
+
+ if (code < 0)
+ return pcs->hmi_cp; /* bad news; don't mark the HMI as valid. */
+
+ /* we check for typeface == 0 here (lineprinter) because we
+ frequently simulate lineprinter with a scalable truetype
+ font */
+ if (pl_font_is_scalable(plfont) && plfont->params.typeface_family != 0) {
+ if (plfont->params.proportional_spacing)
+ /* Scale the font's pitch by the requested height. */
+ hmi = pl_fp_pitch_cp(&plfont->params) * pfs->params.height_4ths / 4;
+ else
+ hmi = pl_fp_pitch_cp(&(pfs->params));
+ } else
+ hmi = pl_fp_pitch_cp(&(plfont->params)) * 10.0;
+
+ /*
+ * Round to a multiple of the unit of measure (see the "PCL 5 Printer
+ * LanguageTechnical Reference Manual", October 1992 ed., page 5-22.
+ */
+ hmi = hmi + pcs->uom_cp / 2;
+ return pcs->hmi_cp = hmi - (hmi % pcs->uom_cp);
+}
+
+
+/* Commands */
+
+/*
+ * ESC & k <x> H
+ *
+ * Set horizontal motion index.
+ */
+ static int
+set_horiz_motion_index(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ /* HMI in 120 units converted to 7200 units with roundup */
+ pcs->hmi_cp = (coord)((fabs(float_arg(pargs)) * 60.0) + 0.5);
+ return 0;
+}
+
+/*
+ * ESC & l <y> C
+ *
+ * Set vertical motion index.
+ *
+ * Contrary to HP's documentation ("PCL 5 Printer Language Technical Reference
+ * Manual", October 1992 ed., p. 5-24), this command is NOT ignored if the
+ * requested VMI is greater than the page length.
+ *
+ * Apparently this problem has been fixed in the Color Laserjet 4600.
+ * For the old behavior undefine the next definition.
+ */
+
+#define HP_VERT_MOTION_NEW
+ static int
+set_vert_motion_index(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ /* LMI :== 48.0 / lpi; ie 0.16 = 48/300;
+ * convert to pcl_coord_scale (7200), roundup the float prior to truncation.
+ */
+ coord vcp = ((fabs(float_arg(pargs)) * 7200.0 / 48.0) + 0.5);
+#ifdef HP_VERT_MOTION_NEW
+ if (vcp <= pcs->xfm_state.pd_size.y)
+#endif
+ pcs->vmi_cp = vcp;
+ return 0;
+}
+
+#undef HP_VERT_MOTION_NEW
+
+/*
+ * ESC & l <lpi> D
+ *
+ * Set line spacing. Though it is not documented anywhere, various HP devices
+ * agree that a zero operand specifies 12 lines per inch (NOT the default).
+ */
+ static int
+set_line_spacing(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint lpi = uint_arg(pargs);
+
+ if (lpi == 0) /* 0 ==> 12 lines per inch */
+ lpi = 12;
+ if ((48 % lpi) == 0) /* lpi must divide 48 */
+ pcs->vmi_cp = inch2coord(1.0 / lpi);
+ return 0;
+}
+
+/*
+ * ESC & k G
+ */
+ static int
+set_line_termination(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint ui = uint_arg(pargs);
+
+ if (ui <= 3)
+ pcs->line_termination = ui;
+ return 0;
+}
+
+
+/*
+ * ESC & a <cols> C
+ */
+ static int
+horiz_cursor_pos_columns(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ do_horiz_motion(pargs, pcs, pcl_hmi(pcs), false);
+ return 0;
+}
+
+/*
+ * ESC & a <dp> H
+ */
+ static int
+horiz_cursor_pos_decipoints(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ do_horiz_motion(pargs, pcs, 10.0, false);
+ return 0;
+}
+
+/*
+ * ESC * p <units> X
+ */
+ static int
+horiz_cursor_pos_units(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == rtl )
+ dprintf("Warning: device/resolution dependent units used\n" );
+ do_horiz_motion(pargs, pcs, pcs->uom_cp, true);
+ return 0;
+}
+
+/*
+ * CR
+ */
+ static int
+cmd_CR(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ pcl_do_CR(pcs);
+ return ((pcs->line_termination & 1) != 0 ? pcl_do_LF(pcs) : 0);
+}
+
+/*
+ * BS
+ */
+ static int
+cmd_BS(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ pcl_set_cap_x(pcs, -pcs->last_width, true, true);
+ pcs->last_was_BS = true;
+ return 0;
+}
+
+/*
+ * HT
+ *
+ * Tabs occur at ever 8 columns, measure from the left text margin.
+ */
+ static int
+cmd_HT(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ coord x = pcs->cap.x - pcs->margins.left;
+ coord tab;
+
+ if (x < 0)
+ x = -x;
+ else if ((tab = 8 * pcl_hmi(pcs)) > 0)
+ x = tab - (x % tab);
+ else
+ x = 0L;
+ pcl_set_cap_x(pcs, x, true, true);
+ return 0;
+}
+
+
+/*
+ * ESC & a <rows> R
+ */
+ static int
+vert_cursor_pos_rows(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ return do_vertical_move(pcs, pargs, pcs->vmi_cp, false, true, true, false);
+}
+
+/*
+ * ESC & a <dp> V
+ */
+ static int
+vert_cursor_pos_decipoints(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ return do_vertical_move(pcs, pargs, 10.0, false, false, false, false);
+}
+
+/*
+ * ESC * p <units> Y
+ */
+ static int
+vert_cursor_pos_units(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if ( pcs->personality == rtl )
+ dprintf("Warning: device/resolution dependent units used\n" );
+ return do_vertical_move(pcs, pargs, pcs->uom_cp, false, false, false, true);
+}
+
+/*
+ * ESC =
+ */
+ static int
+half_line_feed(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ return pcl_set_cap_y( pcs,
+ pcs->vmi_cp / 2,
+ true,
+ (pcs->perforation_skip == 1),
+ true,
+ false
+ );
+}
+
+/*
+ * LF
+ */
+ static int
+cmd_LF(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ if ((pcs->line_termination & 2) != 0)
+ pcl_do_CR(pcs);
+ return pcl_do_LF(pcs);
+}
+
+/*
+ * FF
+ */
+ static int
+cmd_FF(
+ pcl_args_t * pargs, /* ignored */
+ pcl_state_t * pcs
+)
+{
+ if ((pcs->line_termination & 2) != 0)
+ pcl_do_CR(pcs);
+ return pcl_do_FF(pcs);
+}
+
+
+/*
+ * ESC & f <pp_enum> S
+ *
+ * Contrary to what is indicated in the "PCL 5 Printer Language Technical
+ * Reference Manual", October 1992 ed., p. 6-16, pushd cursors are stored
+ * in logical page space, not device space.
+ */
+ static int
+push_pop_cursor(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int type = uint_arg(pargs);
+
+ if ((type == 0) && (pcs->cursor_stk_size < countof(pcs->cursor_stk))) {
+ gs_point * ppt = &(pcs->cursor_stk[pcs->cursor_stk_size++]);
+
+ ppt->x = (double)pcs->cap.x;
+ ppt->y = (double)pcs->cap.y;
+ gs_point_transform( ppt->x, ppt->y, &(pcs->xfm_state.pd2lp_mtx), ppt);
+
+ } else if ((type == 1) && (pcs->cursor_stk_size > 0)) {
+ gs_point * ppt = &(pcs->cursor_stk[--pcs->cursor_stk_size]);
+ gs_matrix lp2pd;
+
+ pcl_invert_mtx(&(pcs->xfm_state.pd2lp_mtx), &lp2pd);
+ gs_point_transform(ppt->x, ppt->y, &lp2pd, ppt);
+ pcl_set_cap_x(pcs, (coord)ppt->x, false, false);
+ pcl_set_cap_y( pcs,
+ (coord)ppt->y - pcs->margins.top,
+ false,
+ false,
+ false,
+ false
+ );
+ }
+
+ return 0;
+}
+
+static int
+pcursor_do_copy(pcl_state_t *psaved,
+ const pcl_state_t *pcs, pcl_copy_operation_t operation)
+{
+ int i;
+
+ /* don't restore the current cap. The cap is not part of the
+ state */
+ if ( operation & pcl_copy_after ) {
+ psaved->cap = pcs->cap;
+
+ /* cursor stack isn't part of the state, either */
+ for (i = 0; i < pcs->cursor_stk_size; ++i) {
+ psaved->cursor_stk[i] = pcs->cursor_stk[i];
+ }
+ psaved->cursor_stk_size = pcs->cursor_stk_size;
+
+ /* NB doesn't belong here */
+ psaved->page_marked = pcs->page_marked;
+ }
+ return 0;
+}
+
+/*
+ * Initialization
+ */
+ static int
+pcursor_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem
+)
+{
+
+ DEFINE_CLASS('&')
+ {
+ 'k', 'H',
+ PCL_COMMAND( "Horizontal Motion Index",
+ set_horiz_motion_index,
+ pca_neg_ok | pca_big_clamp
+ )
+ },
+ {
+ 'l', 'C',
+ PCL_COMMAND( "Vertical Motion Index",
+ set_vert_motion_index,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'l', 'D',
+ PCL_COMMAND( "Line Spacing",
+ set_line_spacing,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'k', 'G',
+ PCL_COMMAND( "Line Termination",
+ set_line_termination,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ {
+ 'a', 'C',
+ PCL_COMMAND( "Horizontal Cursor Position Columns",
+ horiz_cursor_pos_columns,
+ pca_neg_ok | pca_big_ok
+ )
+ },
+ {
+ 'a', 'H',
+ PCL_COMMAND( "Horizontal Cursor Position Decipoints",
+ horiz_cursor_pos_decipoints,
+ pca_neg_ok | pca_big_ok
+ )
+ },
+ {
+ 'a', 'R',
+ PCL_COMMAND( "Vertical Cursor Position Rows",
+ vert_cursor_pos_rows,
+ pca_neg_ok | pca_big_clamp
+ )
+ },
+ {
+ 'a', 'V',
+ PCL_COMMAND( "Vertical Cursor Position Decipoints",
+ vert_cursor_pos_decipoints,
+ pca_neg_ok | pca_big_ok
+ )
+ },
+ {
+ 'f', 'S',
+ PCL_COMMAND( "Push/Pop Cursor",
+ push_pop_cursor,
+ pca_neg_ok | pca_big_ignore
+ )
+ },
+ END_CLASS
+
+ DEFINE_CLASS('*')
+ {
+ 'p', 'X',
+ PCL_COMMAND( "Horizontal Cursor Position Units",
+ horiz_cursor_pos_units,
+ pca_neg_ok | pca_big_ok | pca_in_rtl
+ )
+ },
+ {
+ 'p', 'Y',
+ PCL_COMMAND( "Vertical Cursor Position Units",
+ vert_cursor_pos_units,
+ pca_neg_ok | pca_big_ok | pca_in_rtl
+ )
+ },
+ END_CLASS
+
+ DEFINE_CONTROL(CR, "CR", cmd_CR)
+ DEFINE_CONTROL(BS, "BS", cmd_BS)
+ DEFINE_CONTROL(HT, "HT", cmd_HT)
+ DEFINE_ESCAPE('=', "Half Line Feed", half_line_feed)
+ DEFINE_CONTROL(LF, "LF", cmd_LF)
+ DEFINE_CONTROL(FF, "FF", cmd_FF)
+
+ return 0;
+}
+
+ static void
+pcursor_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_printer
+ | pcl_reset_overlay );
+
+ if ((type & mask) == 0)
+ return;
+
+ pcs->line_termination = 0;
+ pcs->hmi_cp = HMI_DEFAULT;
+ pcs->vmi_cp = pcs->margins.length
+ / pjl_proc_vartoi(pcs->pjls, pjl_proc_get_envvar(pcs->pjls, "formlines"));
+ if ( (type & pcl_reset_overlay) == 0 ) {
+ pcs->cursor_stk_size = 0;
+
+ /*
+ * If this is an initial reset, make sure underlining is
+ * disabled (homing the cursor may cause an underline to be
+ * put out. And provide reasonable initial values for the
+ * cap.
+ */
+ if ((type & pcl_reset_initial) != 0) {
+ pcs->underline_enabled = false;
+ /* WRONG why is the cap set to 0 and then the
+ pcl_home_cursor(pcs) */
+ pcs->cap.x = pcs->cap.y = 0;
+ }
+ }
+ pcl_home_cursor(pcs);
+}
+
+const pcl_init_t pcursor_init = { pcursor_do_registration, pcursor_do_reset, pcursor_do_copy };
diff --git a/pcl/pcursor.h b/pcl/pcursor.h
new file mode 100644
index 000000000..85d42a86c
--- /dev/null
+++ b/pcl/pcursor.h
@@ -0,0 +1,67 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcursor.h - interface to the PCL cursor positioning code */
+
+#ifndef pcursor_INCLUDED
+#define pcursor_INCLUDED
+
+#include "gx.h"
+#include "pcstate.h"
+#include "pcommand.h"
+
+/*
+ * Default values for HMI and VMI. The use of -1 for HMI indicates "not set".
+ */
+#define HMI_DEFAULT -1L
+#define VMI_DEFAULT inch2coord(8.0 / 48)
+
+/*
+ * Horizontal and vertical cursor movement routines. x and y are in
+ * centipoints.
+ *
+ * NB: absolute vertical positions passed to pcl_set_cap_y are in full
+ * page direction space, not the "pseudo" page directions space in
+ * which the pcs->cap is maintained. If passing coordinates in the
+ * latter space, BE SURE TO SUBTRACT THE CURRENT TOP MARGIN.
+ */
+void pcl_set_cap_x(
+ pcl_state_t * pcs,
+ coord x, /* position or distance */
+ bool relative, /* x is distance (else position) */
+ bool use_margins /* apply text margins */
+);
+
+int pcl_set_cap_y(
+ pcl_state_t * pcs,
+ coord y, /* position or distance */
+ bool relative, /* y is distance (else position) */
+ bool use_margins, /* apply text margins */
+ bool by_row, /* LF, half LF */
+ bool by_row_command /* ESC & a <rows> R special case. */
+);
+
+void pcl_do_CR(pcl_state_t * pcs);
+int pcl_do_FF(pcl_state_t * pcs);
+int pcl_do_LF(pcl_state_t * pcs);
+void pcl_home_cursor(pcl_state_t * pcs);
+
+/* Get the HMI. This may require recomputing it from the font. */
+coord pcl_updated_hmi(pcl_state_t * pcs);
+
+#define pcl_hmi(pcs) \
+ ((pcs)->hmi_cp == HMI_DEFAULT ? pcl_updated_hmi(pcs) : (pcs)->hmi_cp)
+
+extern const pcl_init_t pcursor_init;
+
+#endif /* pcursor_INCLUDED */
diff --git a/pcl/pcwhtidx.c b/pcl/pcwhtidx.c
new file mode 100644
index 000000000..93ac41836
--- /dev/null
+++ b/pcl/pcwhtidx.c
@@ -0,0 +1,387 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcwhtidx.c - code to find index of white in a palette */
+
+#include "pcstate.h"
+#include "pcpalet.h"
+#include "pcindxed.h"
+#include "pcwhtidx.h"
+
+/*
+ * Find the first white point in a palette. If none are found, the palette
+ * size is returned.
+ */
+ static int
+find_first_white(
+ const byte * ptbl,
+ int num_entries
+)
+{
+ int i;
+
+ for (i = 0; i < 3 * num_entries; i += 3) {
+ if ( (ptbl[i] == 255) && (ptbl[i + 1] == 255) && (ptbl[i + 2] == 255))
+ break;
+ }
+ return i / 3;
+}
+
+/*
+ * Create a palette index re-map array, assuming that the number of bits per
+ * pixel divides 8. This allows parallel mapping of multiple pixels.
+ *
+ * It is also assumed that ptbl points to a table of at least 256 entries.
+ */
+ static void
+build_remap_array8(
+ byte * pmap, /* existing (general) re-map array */
+ int num_entries, /* number of entries in re-map array */
+ int b_per_p /* bits per pixel */
+)
+{
+ byte tmp_map[256];
+ int i;
+ int pix_per_byte = 8 / b_per_p;
+ uint mask = (1 << b_per_p) - 1;
+
+ /* create the "parallel" mapping table */
+ for (i = 0; i < 256; i++) {
+ int j;
+
+ tmp_map[i] = 0;
+ for (j = 0; j < pix_per_byte; j++)
+ tmp_map[i] |= pmap[((i >> (j * b_per_p)) & mask)] << (j * b_per_p);
+ }
+
+ /* copy into the orignal table */
+ memcpy(pmap, tmp_map, 256);
+}
+
+/*
+ * Create a palette index re-map array, which maps all non-white entries to
+ * themselves and all white entries to the first white entry.
+ *
+ * If for_pattern is true, this code will always create a re-map array if
+ * (1 << b_per_p) > num_entries, in which case pixel index values larger than
+ * the palette are possible. A map is necessary in this case so that these
+ * "out of range" pixel values are interpreted modulo the palette size. The
+ * map is not necessary for the case of rasters, as for these the actual
+ * pixel values will never be larger than the palette, even though b_per_p is
+ * set to 8 in some cases to facilitate subsequent processing.
+ *
+ * Returns true if a re-map table formed and remapping is required, false
+ * otherwise.
+ */
+ static bool
+build_remap_array(
+ const byte * ptbl,
+ int num_entries,
+ byte * pmap,
+ int * pfirst_white,
+ int b_per_p,
+ bool for_pattern
+)
+{
+ int first_white;
+ int second_white;
+ int map_size = (1 << b_per_p);
+ bool must_map = (map_size > num_entries);
+ int i;
+
+ /* limit consideration to those indices that can be achieved */
+ if (num_entries > map_size)
+ num_entries = map_size;
+
+ /* if there is no white and we don't absolutely need a map, quit now */
+ first_white = find_first_white(ptbl, num_entries);
+ *pfirst_white = first_white;
+ if ((first_white == num_entries) && !must_map)
+ return false;
+
+ /* get the next white; if no other white, quit if possible */
+ second_white = find_first_white( ptbl + 3 * (first_white + 1),
+ num_entries - first_white - 1
+ ) + first_white + 1;
+ if ((second_white == num_entries) && !must_map)
+ return false;
+
+ /* build the re-map table */
+ for (i = 0; i < second_white; i++)
+ pmap[i] = i;
+
+ if (second_white != num_entries)
+ pmap[i++] = first_white;
+
+ for (; i < map_size; i++) {
+ int j = i & (num_entries - 1); /* in case map_size > num_entries */
+
+ if ( (ptbl[3 * j] == 255) &&
+ (ptbl[3 * j + 1] == 255) &&
+ (ptbl[3 * j + 2] == 255) )
+ pmap[i] = first_white;
+ else
+ pmap[i] = j;
+ }
+ /* check if a special "parallel map" can be used */
+ if ( (b_per_p < 8) &&
+ ((8 % b_per_p) == 0) &&
+ (pcl_cs_indexed_palette_size >= 8) )
+ build_remap_array8(pmap, num_entries, b_per_p);
+
+ return true;
+}
+
+/*
+ * Special case for mapping rasters when the number of bits per pixel divides
+ * 8 (i.e.: there is an integral number of pixels in a byte). In this case
+ * all pixels within a byte can be mapped at once.
+ */
+ static void
+remap_raster_ary8(
+ const byte * inp, /* array to read from */
+ byte * outp, /* array to write to; may be same as inp */
+ int npixels, /* number of pixels in raster */
+ int b_per_p, /* bits per pixel */
+ const byte * pmap /* re-map table */
+)
+{
+ int nbytes = (npixels * b_per_p) / 8;
+
+ while (nbytes-- > 0)
+ *outp++ = pmap[*inp++];
+}
+
+/*
+ * Remap one raster array into another, using the re-map table provided. The
+ * two arrays may be the same.
+ *
+ * This will work for any number of bits per pixel <= 8.
+ */
+ static void
+remap_raster_ary(
+ const byte * inp, /* array to read from */
+ byte * outp, /* array to write to; may be same as inp */
+ int npixels, /* number of pixels in raster */
+ int b_per_p, /* bits per pixel */
+ const byte * pmap /* re-map table */
+)
+{
+ int nbytes = (npixels * b_per_p + 7) / 8;
+ ulong mask = (1UL << b_per_p) - 1;
+ ulong in_accum = 0L;
+ int in_nbits = 0;
+ ulong out_accum = 0L;
+ int out_nbits = 0;
+
+ /* check if the the simpler case can be used */
+ if (8 % b_per_p == 0) {
+ remap_raster_ary8(inp, outp, npixels, b_per_p, pmap);
+ return;
+ }
+
+ while (npixels-- > 0) {
+ int val;
+
+ if (in_nbits < b_per_p) {
+ while ((nbytes-- > 0) && (in_nbits <= 8 * (sizeof(ulong) - 1))) {
+ in_accum <<= 8;
+ in_accum |= *inp++;
+ in_nbits += 8;
+ }
+ }
+
+ val = (in_accum >> (in_nbits - b_per_p)) & mask;
+ in_accum <<= b_per_p;
+ in_nbits -= b_per_p;
+
+ out_accum <<= b_per_p;
+ out_accum |= pmap[val];
+ out_nbits += b_per_p;
+
+ if (out_nbits > 8 * sizeof(ulong) - b_per_p) {
+ while (out_nbits >= 8) {
+
+ *outp++ = (out_accum >> (out_nbits - 8)) & 0xff;
+ out_nbits -= 8;
+ out_accum <<= 8;
+ }
+ }
+ }
+
+ while (out_nbits > 0) {
+ if (out_nbits < 8)
+ out_accum <<= 8 - out_nbits;
+ *outp++ = (out_accum >> (out_nbits - 8)) & 0xff;
+ out_nbits -= 8;
+ out_accum <<= 8;
+ }
+}
+
+/*
+ * Determine the white entry in the color palette of an indexed color space,
+ * and perform any remapping that is required.
+ *
+ * The must_copy operand indicates if the raster data can be overwritten in
+ * place (false) or if a new array must be allocated.
+ *
+ * Colored patterns are always provided at either 1 or 8-bits per pixel. In
+ * the latter case, the palette size may be smaller than the number of bits
+ * per pixel. In this case, values should be interpreted modulo the palette
+ * size. The graphic library does not support such an interpretation, so
+ * remapping is required at this level. The code in build_remap_ary will detect
+ * this situation and create a re=-map array even if one is not otherwise
+ * required.
+ *
+ * Returns 0 if successful, < 0 in the event of an error.
+ */
+ int
+pcl_cmap_map_raster(
+ const pcl_cs_indexed_t * pindexed,
+ int * pfirst_white,
+ const gs_depth_bitmap * pin_pixinfo,
+ gs_depth_bitmap * pout_pixinfo,
+ bool must_copy,
+ gs_memory_t * pmem
+)
+{
+ byte remap[pcl_cs_indexed_palette_size];
+ const byte * pin_rast = 0;
+ byte * pout_rast = 0;
+ int pix_depth = pin_pixinfo->pix_depth;
+ bool fast_mode = ( (pix_depth < 8) &&
+ (8 % pix_depth == 0) );
+ int npixels = pin_pixinfo->size.x;
+ int i;
+
+ /* see if any remapping is necessary */
+ *pout_pixinfo = *pin_pixinfo;
+ if ( !build_remap_array( pindexed->palette.data,
+ pindexed->num_entries,
+ remap,
+ pfirst_white,
+ pix_depth,
+ true
+ ) )
+ return 0;
+
+ /* allocate a new raster if necessary (pack scanlines) */
+ if (must_copy) {
+ long nbytes = pin_pixinfo->size.x * pin_pixinfo->pix_depth;
+
+ nbytes = ((nbytes + 7) / 8);
+ pout_pixinfo->raster = nbytes;
+ pout_rast = gs_alloc_bytes( pmem,
+ nbytes * pin_pixinfo->size.y,
+ "re-map colored pattern raster"
+ );
+ if (pout_rast == 0)
+ return e_Memory;
+ pout_pixinfo->data = pout_rast;
+
+ } else
+ pout_rast = (byte *)pin_pixinfo->data;
+
+ /* remap one scanline at a time */
+ pin_rast = pin_pixinfo->data;
+ for (i = 0; i < pin_pixinfo->size.y; i++) {
+ if (fast_mode)
+ remap_raster_ary8(pin_rast, pout_rast, npixels, pix_depth, remap);
+ else
+ remap_raster_ary(pin_rast, pout_rast, npixels, pix_depth, remap);
+ pin_rast += pin_pixinfo->raster;
+ pout_rast += pout_pixinfo->raster;
+ }
+
+ return 0;
+}
+
+/*
+ * Create a re-map array to be used with raster, if inecessary. For such an
+ * array to be necessary, all of the following must hold:
+ *
+ * source transparency on
+ * pixel encoding is indexed by plane or indexed by pixel
+ * there is more than one "white" color in the palette
+ *
+ * If all of these conditions hold, a point to a remapping array is retuned;
+ * otherwise a null pointer is returned. The routne pcl_free_remap_ary should
+ * be used to free this memory.
+ *
+ * To simplify processing, data received in the indexed by plane pixel encoding
+ * format are consolidated into an indexed-by-pixel form with 8 bits/pixel,
+ * irrespective of the specified number of bits per index (so long as the latter
+ * number if > 1). This convention can make it appear that (1 << b_per_p) is
+ * larger than the number of entries in the palette, though no pixel index
+ * values are ever larger than the palette size.
+ */
+ const void *
+pcl_cmap_create_remap_ary(
+ pcl_state_t * pcs,
+ int * pfirst_white
+)
+{
+ byte tmp_remap[pcl_cs_indexed_palette_size];
+ byte * pmap = 0;
+ pcl_cs_indexed_t * pindexed = pcs->ppalet->pindexed;
+ int b_per_p;
+
+ /* if a re-map array might be required, build it on the stack first */
+ *pfirst_white = pindexed->num_entries;
+
+ if ( (!pcs->source_transparent && !pcs->pattern_transparent) ||
+ (pcl_cs_indexed_get_encoding(pindexed) > pcl_penc_indexed_by_pixel) )
+ return 0;
+ b_per_p = pcl_cs_indexed_get_bits_per_index(pindexed);
+ if ( !build_remap_array( pindexed->palette.data,
+ pindexed->num_entries,
+ tmp_remap,
+ pfirst_white,
+ b_per_p,
+ false
+ ) )
+ return 0;
+
+ /* a re-mapping array is necessary; copy the temprorary one to the heap */
+ pmap = gs_alloc_bytes( pcs->memory,
+ pcl_cs_indexed_palette_size,
+ "create PCL raster remapping array"
+ );
+ memcpy(pmap, tmp_remap, pcl_cs_indexed_palette_size);
+
+ return (const void *)pmap;
+}
+
+/*
+ * Apply the remapping array to one raster scanline.
+ *
+ * This routine is normally accessed via the pcl_cmap_apply_remap_ary macro,
+ * which checks for a null remap array. However, and additional check is
+ * performed here for safety purposes. Similarly, for rasters it is always
+ * the case that 8 % bits_per_pixel == 0, but an explicit check is performed
+ * in any case.
+ */
+ void
+pcl_cmap_int_apply_ary(
+ const void * vpmap, /* remap array pointer */
+ byte * prast, /* array of bytes to be mapped */
+ int b_per_p, /* bits per pixel */
+ int npixels
+)
+{
+ if (8 % b_per_p == 0)
+ remap_raster_ary8(prast, prast, npixels, b_per_p, (const byte *)vpmap);
+ else
+ remap_raster_ary(prast, prast, npixels, b_per_p, (const byte *)vpmap);
+
+}
diff --git a/pcl/pcwhtidx.h b/pcl/pcwhtidx.h
new file mode 100644
index 000000000..c5c438292
--- /dev/null
+++ b/pcl/pcwhtidx.h
@@ -0,0 +1,126 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcwhtindx.c - interface to code for finding white index of a palette */
+
+#ifndef pcwhtindx_INCLUDED
+#define pcwhtindx_INCLUDED
+
+#include "gx.h"
+#include "gsbitmap.h"
+#include "pcindxed.h"
+
+/*
+ * To implement transparency in PCL colored patterns and rasters, it is
+ * necessary to identify those pixels which should be considered white, as
+ * those are the pixels which should be transparent.
+ *
+ * "White" in the sense of PCL means white in the device color space, just
+ * prior to dithering. Hence, the effect of normalization, color lookup tables,
+ * and conversion from the source to device color lookup table are taken into
+ * account before determining if a given pixel is (potentially) transparent.
+ *
+ * Such a mechanism is, unfortunately, not easily implemented via the existing
+ * graphic library, as raster transparency is implemented via PostScript
+ * ImageType 4 images. For these images, the single color or range of colors
+ * required that identify pixels as transparent are specified in the source
+ * color space, before any conversion.
+ *
+ * In this implementation, normalization of colors for black and white
+ * reference points occurs before the raw data is ever considered a color,
+ * so at least that part of the problem is handled correctly. Beyond this
+ * canonical white--(1.0, 1.0, 1.0) in all color spaces--is assumed to yield
+ * white; if it does not (due to color lookup tables), the results will be
+ * incorrect.
+ *
+ * Where appropriate, this implementation also uses the graphic library's
+ * support for indexed color spaces. Creating potentially transparent rasters
+ * with these color spaces requires us to identify which entries in the
+ * color palette are white. When there is only one such entry, this is simple.
+ * When several palette entries are involved, life is more difficult. It is
+ * then necessary to remap all raster values which map to a white palette
+ * entry to the same white entry.
+ *
+ * For straight rasters, this is can be done in-place, as the raster will
+ * never be rendered with another color space. Patterns are not so easily
+ * handled, as they may be rendered subsequently with other color spaces.
+ * Hence, for those it is necessary to copy the data.
+ */
+
+/*
+ * Determine the white entry in the color palette of an indexed color space,
+ * and perform any remapping that is required.
+ *
+ * The must_copy operand indicates if the raster data can be overwritten in
+ * place (false) or if a new array must be allocated.
+ *
+ * Returns 0 if successful, < 0 in the event of an error.
+ */
+int pcl_cmap_map_raster(
+ const pcl_cs_indexed_t * pindexed,
+ int * pfirst_white,
+ const gs_depth_bitmap * pin_pixinfo,
+ gs_depth_bitmap * pout_pixinfo,
+ bool must_copy,
+ gs_memory_t * pmem
+);
+
+/*
+ * An alternative interface to the remapping capability, this one more suited
+ * to working with rasters.
+ *
+ * Because rasters are provided in a large number of pieces (typically one
+ * sanline is an individual piece), and all pieces are rendered using the
+ * the same color palette, it does not make sense to re-derive the mapping
+ * table for each raster. Consequently, the code below can be used to get
+ * the mapping table once, re-use it for each piece, and then free it.
+ *
+ * This code is specifically intended for rasters, and will only create a
+ * remap table if:
+ *
+ * source transparency is required
+ * the current palette uses an indexed pixel encoding (by plane or
+ * by pixel)
+ * there is more than one "white" in the current palette.
+ *
+ * Note that the macros for apply and free a remapping array will check for
+ * a null-pointer inline. Hence, the caller need not provide any other check
+ * of whether or nor remapping is necessary.
+ */
+const void * pcl_cmap_create_remap_ary(
+ pcl_state_t * pcs,
+ int * pfirst_white
+);
+
+void pcl_cmap_int_apply_ary(
+ const void * vpmap, /* remap array pointer */
+ byte * prast, /* array of bytes to be mapped */
+ int b_per_p, /* bits per pixel */
+ int npixels
+);
+
+#define pcl_cmap_apply_remap_ary(pmap, prast, b_per_p, npixels) \
+ BEGIN \
+ if ((pmap) != 0) \
+ pcl_cmap_int_apply_ary((pmap), (prast), (b_per_p), (npixels)); \
+ END
+
+#define pcl_cmap_free_remap_ary(pmap, pcs) \
+ BEGIN \
+ if ((pmap) != 0) \
+ gs_free_object( (pcs)->memory, \
+ (void *)(pmap), \
+ "pcl_cmap_free_remap_ary"); \
+ END
+
+#endif /* pcwhtindx_INCLUDED */
diff --git a/pcl/pcxfmst.h b/pcl/pcxfmst.h
new file mode 100644
index 000000000..624a71aa7
--- /dev/null
+++ b/pcl/pcxfmst.h
@@ -0,0 +1,155 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcxfmst.h - transformation information structures in the PCL state */
+
+#ifndef pcxfmst_INCLUDED
+#define pcxfmst_INCLUDED
+
+#include "gx.h"
+#include "gsmatrix.h"
+#include "gxfixed.h"
+#include "pccoord.h"
+
+/*
+ * Structure for paper size parameters. Note that these values are all coords
+ * (centipoints).
+ */
+typedef struct pcl_paper_size_s {
+ coord width, height; /* physical page size */
+ coord offset_portrait; /* offset of logical page left edge from
+ * the physical page in portrait orientations */
+ coord offset_landscape; /* ditto for landscape orientations */
+} pcl_paper_size_t;
+
+/*
+ * Geometric transformation structure for PCL.
+ *
+ * Except for GL/2, PCL deals strictly in diagonal transformations: all
+ * transformations are compositions of 90 degree rotations, scaling, and
+ * translations. Thus, maintaining a full matrix representation is overkill.
+ * For the most part, however, any gains in performance from use of a simpler
+ * representation would be lost due ot the non-general nature of the code,
+ * so a normal matrix representations and set of matrix operations is used.
+ *
+ * Because orientation plays such a significant role in PCL, both the logical
+ * page orientation and the orientation of the print direction relative to
+ * the logical page are kept separately, even though this information is
+ * implicit in the transformations.
+ *
+ * For all of the transformations used here, units are centi-points.
+ *
+ * For historical reasons, the print direction coordinate system identified by
+ * the pd2lp_mtx field does not include any translation. Hence the origin of
+ * of the coordinate space is at the intersection of two logical page boundaries
+ * (one of which is also a physical page boundary) rather than at the
+ * intersection of a logical page boundary and the top margin. We term this
+ * the "pseudo print direction" space.
+ *
+ * The page space to device space transformation, which is established by the
+ * output device, is not kept here. It is the default transformation of the
+ * graphic state, and thus does not need to be kept separately. This code
+ * makes the implicit assumption that this transformation matrix is also
+ * diagonal, which is the case for all reasonable devices.
+ *
+ * This structure also maintains a copy of the printable region rectangle in
+ * logical page space and device space (the latter in gs_fixed_rect format).
+ * The raster module uses the former to calculate default raster destination
+ * dimensions and usable raster source dimensions; the latter is needed
+ * frequently as the clip window must be re-established prior to each object
+ * printed.
+ *
+ * fields:
+ *
+ * left_offset_cp left and top offset registrations, in centipoints;
+ * top_offset_cp these move the logical page on the physica page but
+ * do not change the logical page size
+ *
+ * paper_size pointer to a structure describing the current paper
+ * size (including logical page offsets)
+ *
+ * lp_orient logical page orientation, 0..3
+ *
+ * print_dir print direction (relative to logical page), divided
+ * by 90 (thus in the range 0..3)
+ *
+ * lp2pg_mtx logical page space to page space transformation
+ *
+ * lp2dev_mtx logical page to device space transformation; this is
+ * used as the current matrix in some situations, and
+ * for conversion of pattern reference points
+ *
+ * pd2lp_mtx "pseudo print direction" space to logical page space
+ * transformation
+ *
+ * pd2dev_mtx "pseudo print direction" space to device space
+ * transformation; the is commonly used as the current
+ * transformation for PCL objects (other than rasters)
+ *
+ * lp_size dimensions of the logical page in logical pace
+ * space
+ *
+ * pd_size dimensions of the logical page in print direction
+ * space
+ *
+ * lp_print_rect printable region rectangle, in logical page space
+ *
+ * dev_print_rect printable region rectangle, in device space
+ */
+typedef struct pcl_xfm_state_s {
+
+ float left_offset_cp;
+ float top_offset_cp;
+
+ const pcl_paper_size_t * paper_size;
+ byte lp_orient;
+ byte print_dir;
+
+ /* the remaining fields are filled in by update_xfm_state() */
+ gs_matrix lp2pg_mtx;
+ gs_matrix lp2dev_mtx;
+ gs_matrix pd2lp_mtx;
+ gs_matrix pd2dev_mtx;
+
+ /* height and width of logical page, in centipoints */
+ coord_point_t lp_size;
+ coord_point_t pd_size;
+
+ /* printable region in logical page and device space */
+ gs_rect lp_print_rect;
+ gs_fixed_rect dev_print_rect;
+
+} pcl_xfm_state_t;
+
+/*
+ * Convert a point from "semi print direction" space to logical page space.
+ */
+#define pcl_xfm_to_logical_page_space(pcs, ppt) \
+ gs_point_transform( (ppt)->x, \
+ (ppt)->y, \
+ &((pcs)->xfm_state.pd2lp_mtx), \
+ ppt \
+ )
+
+/*
+ * Structure for text region margins. These are all in centipoint relative
+ * to the current "pseudo print direction" space.
+ */
+typedef struct pcl_margins_s {
+ coord left; /* measured from left edge */
+ coord right; /* measured from *left* edge */
+ coord top; /* measured from top */
+ coord length; /* text_length, distance from top to bottom */
+} pcl_margins_t;
+
+#endif /* pcxfmst_INCLUDED */
diff --git a/pcl/pgchar.c b/pcl/pgchar.c
new file mode 100644
index 000000000..68dce6461
--- /dev/null
+++ b/pcl/pgchar.c
@@ -0,0 +1,562 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgchar.c */
+/* HP-GL/2 font and character commands */
+#include "math_.h"
+#include "stdio_.h" /* for gdebug.h */
+#include "gdebug.h"
+#include "pcparse.h"
+#include "pgmand.h"
+#include "pgdraw.h"
+#include "pginit.h"
+#include "pggeom.h"
+#include "pgmisc.h"
+#include "pcfsel.h"
+#include "pcpalet.h"
+
+/* ------ Internal procedures ------ */
+
+/* Define font parameters (AD, SD). */
+static int
+hpgl_font_definition(hpgl_args_t *pargs, hpgl_state_t *pgls, int index)
+{ /*
+ * Since these commands take an arbitrary number of arguments,
+ * we reset the argument bookkeeping after each group.
+ * We reset phase to 1, 2, or 3 after seeing the first pair,
+ * so we can tell whether there were any arguments at all.
+ * (1 means no parameter changed, >1 means some parameter changed.)
+ */
+ pcl_font_selection_t *pfs = &pgls->g.font_selection[index];
+#define pfp (&pfs->params)
+ int kind;
+ pfs->selected_id = (uint)-1;
+ for ( ; hpgl_arg_c_int(pgls->memory, pargs, &kind); pargs->phase |= 1 )
+ switch ( kind )
+ {
+ case 1: /* symbol set */
+ { int32 sset;
+ if ( !hpgl_arg_int(pgls->memory, pargs, &sset) )
+ return e_Range;
+ if ( pfp->symbol_set != (uint)sset )
+ pfp->symbol_set = (uint)sset,
+ pargs->phase |= 2;
+ }
+ break;
+ case 2: /* spacing */
+ { int spacing;
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &spacing) )
+ return e_Range;
+ if ( ((spacing == 1) || (spacing == 0)) && (pfp->proportional_spacing != spacing) )
+ pfp->proportional_spacing = spacing,
+ pargs->phase |= 2;
+ }
+ break;
+ case 3: /* pitch */
+ { hpgl_real_t pitch;
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &pitch) )
+ return e_Range;
+ if ( (pl_fp_pitch_per_inch(pfp) != pitch) &&
+ (pitch >= 0) && (pitch < 32768.0) ) {
+ pl_fp_set_pitch_per_inch(pfp, pitch > 7200.0 ? 7200.0 : pitch);
+ pargs->phase |= 2;
+ }
+
+ }
+ break;
+ case 4: /* height */
+ {
+ hpgl_real_t height;
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &height) )
+ return e_Range;
+ if ( (pfp->height_4ths != (uint)(height * 4)) && (height >= 0)) {
+ /* minimum height for practical purposes is one
+ quarter point. The HP Spec says 0 is legal
+ but does not specify what a height of zero
+ means. The previous code truncated height,
+ it probably should be rounded as in pcl but
+ doing so would change a lot of files for no
+ compelling reason so for now truncate. */
+ uint trunc_height_4ths = (uint)(height * 4);
+ pfp->height_4ths = (trunc_height_4ths == 0 ? 1 : trunc_height_4ths);
+ pargs->phase |= 2;
+ }
+ }
+ break;
+ case 5: /* posture */
+ { int posture;
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &posture) )
+ return e_Range;
+ if ( pfp->style != posture )
+ pfp->style = posture,
+ pargs->phase |= 2;
+
+ }
+ break;
+ case 6: /* stroke weight */
+ { int weight;
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &weight) )
+ return e_Range;
+ if ( pfp->stroke_weight != weight )
+ if ( ((weight >= -7 ) && (weight <= 7)) || (weight == 9999 ) )
+ pfp->stroke_weight = weight,
+ pargs->phase |= 2;
+ }
+ break;
+ case 7: /* typeface */
+ { int32 face;
+ if ( !hpgl_arg_int(pgls->memory, pargs, &face) )
+ return e_Range;
+ if ( pfp->typeface_family != (uint)face )
+ pfp->typeface_family = (uint)face,
+ pargs->phase |= 2;
+ }
+ break;
+ default:
+ return e_Range;
+ }
+ /* If there were no arguments at all, default all values. */
+ if ( !pargs->phase )
+ hpgl_default_font_params(pfs);
+ if ( pargs->phase != 1 )
+ { /* A value changed, or we are defaulting. Decache the font. */
+ pfs->font = 0;
+ if ( index == pgls->g.font_selected )
+ pgls->g.font = 0;
+ }
+ return 0;
+}
+/* Define label drawing direction (DI, DR). */
+static int
+hpgl_label_direction(hpgl_args_t *pargs, hpgl_state_t *pgls, bool relative)
+{ hpgl_real_t run = 1, rise = 0;
+
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &run) )
+ { if ( !hpgl_arg_c_real(pgls->memory, pargs, &rise) || (run == 0 && rise == 0) )
+ return e_Range;
+ { double hyp = hypot(run, rise);
+ run /= hyp;
+ rise /= hyp;
+ }
+ }
+ pgls->g.character.direction.x = run;
+ pgls->g.character.direction.y = rise;
+ pgls->g.character.direction_relative = relative;
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* forward declaration */
+static int hpgl_select_font(hpgl_state_t *pgls, int index);
+
+/* Select font by ID (FI, FN). */
+static int
+hpgl_select_font_by_id(hpgl_args_t *pargs, hpgl_state_t *pgls, int index)
+{ pcl_font_selection_t *pfs = &pgls->g.font_selection[index];
+ int32 id;
+ int code;
+
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &id) || id < 0 )
+ return e_Range;
+ code = pcl_select_font_by_id(pfs, id, pgls /****** NOTA BENE ******/);
+ switch ( code )
+ {
+ default: /* error */
+ return code;
+ case 1: /* ID not found, no effect */
+ return 0;
+ case 0: /* ID found */
+ break;
+ }
+ pgls->g.font_selection[index].font = pfs->font;
+ pgls->g.font_selection[index].map = pfs->map;
+ /*
+ * If we just selected a bitmap font, force the equivalent of SB1.
+ * See TRM 23-65 and 23-81.
+ */
+ if ( pfs->font->scaling_technology == plfst_bitmap ) {
+ hpgl_args_t args;
+ hpgl_args_setup(&args);
+ hpgl_args_add_int(&args, 1);
+ hpgl_SB(&args, pgls);
+ }
+ /* note pcltrm 23-54 - only select if the table (primary or
+ secondary) matches the currently selected table. */
+ if (index == pgls->g.font_selected) {
+ hpgl_select_font(pgls, index);
+ }
+ return 0;
+}
+
+/* Select font (SA, SS). */
+static int
+hpgl_select_font(hpgl_state_t *pgls, int index)
+{
+ pgls->g.font_selected = index;
+ pgls->g.font = pgls->g.font_selection[index].font;
+ pgls->g.map = pgls->g.font_selection[index].map;
+ return 0;
+}
+
+/* ------ Commands ------ */
+
+/* AD [kind,value...]; */
+ int
+hpgl_AD(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_font_definition(pargs, pgls, 1);
+}
+
+#define CHAR_EDGE_PEN_UNSET -1
+
+/* return the current edge pen based on whethere or not the interpreter specifically set the pen */
+ int32
+hpgl_get_character_edge_pen(
+ hpgl_state_t * pgls
+)
+{
+ /* if the character edge pen has not been set then we return the
+ current pen number, otherwise the state value as set in the CF
+ command is used. (see hpgl_CF) */
+ return (pgls->g.character.edge_pen == CHAR_EDGE_PEN_UNSET ?
+ hpgl_get_selected_pen(pgls) :
+ pgls->g.character.edge_pen);
+
+}
+
+/*
+ * CF [mode[,pen]];
+ */
+ int
+hpgl_CF(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int mode = 0;
+ int npen = pcl_palette_get_num_entries(pgls->ppalet);
+ int32 pen = 0;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &mode)) {
+ if ((mode & ~3) != 0)
+ return e_Range;
+ /* With only 1 argument, we "unset" the current pen. This
+ causes the drawing machinery to use the current pen when
+ the stroke is rendered (i.e. a subsequent SP will change
+ the character edge pen */
+ if (hpgl_arg_int(pgls->memory, pargs, &pen)) {
+ if ((pen < 0) || (pen >= npen))
+ return e_Range;
+ } else
+ pen = CHAR_EDGE_PEN_UNSET;
+ }
+ pgls->g.character.fill_mode = mode;
+ pgls->g.character.edge_pen = pen;
+ return 0;
+}
+
+#undef CHAR_EDGE_PEN_UNSET
+
+/* DI [run,rise]; */
+ int
+hpgl_DI(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_label_direction(pargs, pgls, false);
+}
+
+/* DR [run,rise]; */
+ int
+hpgl_DR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_label_direction(pargs, pgls, true);
+}
+
+/* DT terminator[,mode]; */
+ int
+hpgl_DT(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+ byte ch = (byte)pargs->phase;
+ int mode = 1;
+
+ /* We use phase to remember the terminator character */
+ /* in case we had to restart execution. */
+ if ( p >= rlimit )
+ return e_NeedData;
+ if ( !ch )
+ switch ( (ch = *++p) )
+ {
+ case ';':
+ pargs->source.ptr = p;
+ pgls->g.label.terminator = 3;
+ pgls->g.label.print_terminator = false;
+ return 0;
+ case 0: case 5: case 27:
+ return e_Range;
+ default:
+ if ( p >= rlimit )
+ return e_NeedData;
+ if ( *++p ==',' )
+ { pargs->source.ptr = p;
+ pargs->phase = ch;
+ }
+ }
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
+ return e_Range;
+ pgls->g.label.terminator = ch;
+ pgls->g.label.print_terminator = !mode;
+ return 0;
+}
+
+/* DV [path[,line]]; */
+ int
+hpgl_DV(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int path = 0, line = 0;
+
+ hpgl_arg_c_int(pgls->memory, pargs, &path);
+ hpgl_arg_c_int(pgls->memory, pargs, &line);
+ if ( (path & ~3) | (line & ~1) )
+ return e_Range;
+ pgls->g.character.text_path = path;
+ pgls->g.character.line_feed_direction = (line ? -1 : 1);
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* ES [width[,height]]; */
+ int
+hpgl_ES(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t width = 0, height = 0;
+
+ hpgl_arg_c_real(pgls->memory, pargs, &width);
+ hpgl_arg_c_real(pgls->memory, pargs, &height);
+ pgls->g.character.extra_space.x = width;
+ pgls->g.character.extra_space.y = height;
+ return 0;
+}
+
+/* FI fontid; */
+ int
+hpgl_FI(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_select_font_by_id(pargs, pgls, 0);
+}
+
+/* FN fontid; */
+ int
+hpgl_FN(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_select_font_by_id(pargs, pgls, 1);
+}
+
+/* The following is an extension documented in the Comparison Guide. */
+/* LM [mode[, row number]]; */
+ int
+hpgl_LM(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int mode = 0, row_number = 0;
+ int old_mode =
+ (pgls->g.label.double_byte ? 1 : 0) +
+ (pgls->g.label.write_vertical ? 2 : 0);
+
+ hpgl_arg_c_int(pgls->memory, pargs, &mode);
+ hpgl_arg_c_int(pgls->memory, pargs, &row_number);
+ pgls->g.label.row_offset =
+ (row_number < 0 ? 0 : row_number > 255 ? 255 : row_number) << 8;
+ mode &= 3;
+ pgls->g.label.double_byte = (mode & 1) != 0;
+ pgls->g.label.write_vertical = (mode & 2) != 0;
+ /*
+ * The documentation says "When LM switches modes, it turns off
+ * symbol mode." We take this literally: LM only turns off
+ * symbol mode if the new label mode differs from the old one.
+ */
+ if ( mode != old_mode )
+ pgls->g.symbol_mode = 0;
+ return 0;
+}
+
+/* LO [origin]; */
+ int
+hpgl_LO(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int origin = 1;
+
+ hpgl_arg_c_int(pgls->memory, pargs, &origin);
+ if ( origin < 1 || origin == 10 || origin == 20 || origin > 21 )
+ return e_Range;
+ pgls->g.label.origin = origin;
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* SA; */
+ int
+hpgl_SA(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_select_font(pgls, 1);
+}
+
+/* SB [mode]; */
+ int
+hpgl_SB(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int mode = 0;
+
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
+ return e_Range;
+ { int i;
+
+ pgls->g.bitmap_fonts_allowed = mode;
+ /*
+ * A different set of fonts is now available for consideration.
+ * Decache any affected font(s): those selected by parameter,
+ * and bitmap fonts selected by ID if bitmap fonts are now
+ * disallowed.
+ */
+ for ( i = 0; i < countof(pgls->g.font_selection); ++i ) {
+ pcl_font_selection_t *pfs = &pgls->g.font_selection[i];
+ if ( ((int)pfs->selected_id < 0) ||
+ (!mode && pfs->font != 0 &&
+ pfs->font->scaling_technology == plfst_bitmap)
+ )
+ { pfs->font = 0;
+ }
+ }
+ pgls->g.font = 0;
+ pgls->g.map = 0;
+ }
+ return 0;
+}
+
+/* SD [kind,value...]; */
+ int
+hpgl_SD(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_font_definition(pargs, pgls, 0);
+}
+
+/* SI [width,height]; */
+ int
+hpgl_SI(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t width_cm, height_cm;
+
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &width_cm) )
+ { if ( !hpgl_arg_c_real(pgls->memory, pargs, &height_cm) )
+ return e_Range;
+ /* this isn't documented but HP seems to ignore the
+ command (retains previous value) if either parameter is
+ zero. NB probably should use epsilon have not tested. */
+ if (width_cm == 0.0 || height_cm == 0.0)
+ return e_Range;
+ pgls->g.character.size.x = mm_2_plu(width_cm * 10);
+ pgls->g.character.size.y = mm_2_plu(height_cm * 10);
+ pgls->g.character.size_mode = hpgl_size_absolute;
+ }
+ else
+ pgls->g.character.size_mode = hpgl_size_not_set;
+ return 0;
+}
+
+#define MAX_SL_TANGENT 114.5887
+/* SL [slant]; */
+ int
+hpgl_SL(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t slant = 0;
+
+ hpgl_arg_c_real(pgls->memory, pargs, &slant);
+ /* clamp to 89.5 degrees of char slant, avoids math issues around
+ * tan 90degrees == infinity. Visually close to HP,
+ * performance decrease as slant approaches tan(90).
+ */
+
+ pgls->g.character.slant = slant > MAX_SL_TANGENT ?
+ MAX_SL_TANGENT : slant < -MAX_SL_TANGENT ?
+ -MAX_SL_TANGENT : slant;
+ return 0;
+}
+#undef MAX_SL_TANGENT
+
+/* SR [width,height]; */
+ int
+hpgl_SR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t width_pct, height_pct;
+
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &width_pct) ) {
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &height_pct) )
+ return e_Range;
+ /* this isn't documented but HP seems to ignore the
+ command (retains previous value) if either parameter is
+ zero. NB probably should use epsilon have not tested. */
+ if (width_pct == 0.0 || height_pct == 0.0)
+ return e_Range;
+ pgls->g.character.size.x = width_pct / 100;
+ pgls->g.character.size.y = height_pct / 100;
+ }
+ else
+ { pgls->g.character.size.x = 0.0075;
+ pgls->g.character.size.y = 0.015;
+ }
+ pgls->g.character.size_mode = hpgl_size_relative;
+ return 0;
+}
+
+/* SS; */
+ int
+hpgl_SS(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return hpgl_select_font(pgls, 0);
+}
+
+/* TD [mode]; */
+ int
+hpgl_TD(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int mode = 0;
+
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
+ return e_Range;
+ pgls->g.transparent_data = mode;
+ return 0;
+}
+
+/* Initialization */
+static int
+pgchar_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem)
+{ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ HPGL_COMMAND('A', 'D', hpgl_AD, hpgl_cdf_pcl_rtl_both), /* kind/value pairs */
+ HPGL_COMMAND('C', 'F', hpgl_CF, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'I', hpgl_DI, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'R', hpgl_DR, hpgl_cdf_pcl_rtl_both),
+ /* DT has special argument parsing, so it must handle skipping */
+ /* in polygon mode itself. */
+ HPGL_COMMAND('D', 'T', hpgl_DT, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'V', hpgl_DV, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('E', 'S', hpgl_ES, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('F', 'I', hpgl_FI, hpgl_cdf_pcl),
+ HPGL_COMMAND('F', 'N', hpgl_FN, hpgl_cdf_pcl),
+ HPGL_COMMAND('L', 'M', hpgl_LM, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('L', 'O', hpgl_LO, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'A', hpgl_SA, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'B', hpgl_SB, hpgl_cdf_pcl),
+ HPGL_COMMAND('S', 'D', hpgl_SD, hpgl_cdf_pcl_rtl_both), /* kind/value pairs */
+ HPGL_COMMAND('S', 'I', hpgl_SI, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'L', hpgl_SL, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'R', hpgl_SR, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'S', hpgl_SS, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('T', 'D', hpgl_TD, hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
+}
+const pcl_init_t pgchar_init = {
+ pgchar_do_registration, 0
+};
diff --git a/pcl/pgcolor.c b/pcl/pgcolor.c
new file mode 100644
index 000000000..30f6602c9
--- /dev/null
+++ b/pcl/pgcolor.c
@@ -0,0 +1,116 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgcolor.c - HP-GL/2 color vector graphics commands */
+
+#include "std.h"
+#include "pcparse.h"
+#include "pgmand.h"
+#include "pginit.h"
+#include "pgmisc.h"
+#include "pgdraw.h"
+#include "gsstate.h" /* for gs_setfilladjust */
+#include "pcpalet.h"
+
+/* ------ Commands ------ */
+
+/*
+ * PC [pen[,primary1,primary2,primary3];
+ */
+ static int
+hpgl_PC(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int32 pen;
+ int32 npen = pcl_palette_get_num_entries(pgls->ppalet);
+
+ if ( pgls->personality == pcl5e )
+ return 0;
+
+ /* output any current path */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+
+ if (hpgl_arg_int(pgls->memory, pargs, &pen)) {
+ hpgl_real_t primary[3];
+
+ if ((pen < 0) || (pen >= npen))
+ return e_Range;
+
+ if (hpgl_arg_c_real(pgls->memory, pargs, &primary[0])) {
+ float comps[3];
+
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &primary[1]) ||
+ !hpgl_arg_c_real(pgls->memory, pargs, &primary[2]) )
+ return e_Range;
+ comps[0] = primary[0];
+ comps[1] = primary[1];
+ comps[2] = primary[2];
+ return pcl_palette_set_color(pgls, pen, comps);
+ } else
+ return pcl_palette_set_default_color(pgls, pen);
+ } else {
+ int i;
+ int code;
+
+ for (i = 0; i < npen; ++i) {
+ if ((code = pcl_palette_set_default_color(pgls, i)) < 0)
+ return code;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * NP [n];
+ */
+ int
+hpgl_NP(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int32 n = 8;
+
+ if ( pgls->personality == pcl5e )
+ return 0;
+
+ /* output any current path */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+
+ if ( hpgl_arg_int(pgls->memory, pargs, &n) && ((n < 2) || (n > 32768)) )
+ return e_Range;
+ return pcl_palette_NP(pgls, n);
+}
+
+/*
+ * Initialization. There is no reset or copy command, as those operations are
+ * carried out by the palette mechanism.
+ */
+ static int
+pgcolor_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{
+ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ HPGL_COMMAND('N', 'P', hpgl_NP, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'C', hpgl_PC, hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
+}
+
+const pcl_init_t pgcolor_init = { pgcolor_do_registration, 0, 0 };
diff --git a/pcl/pgconfig.c b/pcl/pgconfig.c
new file mode 100644
index 000000000..87b53901e
--- /dev/null
+++ b/pcl/pgconfig.c
@@ -0,0 +1,726 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgconfig.c */
+/* HP-GL/2 configuration and status commands */
+#include "gx.h"
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsmemory.h" /* for gsstate.h */
+#include "gsstate.h" /* for gscoord.h */
+#include "gscoord.h"
+#include "pgmand.h"
+#include "pcparse.h"
+#include "pgdraw.h"
+#include "pginit.h"
+#include "pggeom.h"
+#include "pgmisc.h"
+#include "pcursor.h"
+#include "pcpage.h"
+#include "pcpalet.h"
+#include "pcdraw.h"
+
+/* contrary to the documentation HP also seems to parse CO.*; as a
+ legitimate comment as well as a string enclosed in quotation marks. */
+int
+hpgl_CO(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+
+ while ( p < rlimit ) {
+ if ( !pargs->phase ) {
+ switch ( *++p ) {
+ case ' ':
+ /* Ignore spaces between command and opening ". */
+ continue;
+ case '"':
+ pargs->phase = 1;
+ break;
+ default:
+ /* Search for semicolon */
+ pargs->phase = 2;
+ break;
+
+ }
+ } else {
+ /* Scanning for closing " or closing ';' */
+ switch ( pargs->phase ) {
+ case 1:
+ if ( *++p == '"' ) {
+ pargs->source.ptr = p;
+ return 0;
+ }
+ /* syntax error on some hp devices */
+ if ( *p == '\\' ) {
+ pargs->source.ptr = p;
+ return 0;
+ }
+ break;
+ case 2:
+ if ( *++p == ';' ) {
+ pargs->source.ptr = p;
+ return 0;
+ }
+ break;
+ default:
+ dprintf("HPGL CO automata is in an unknown state\n" );
+ pargs->source.ptr = p;
+ return 0;
+ }
+ }
+ }
+ pargs->source.ptr = p;
+ return e_NeedData;
+}
+
+#ifdef DEBUG
+
+/* debug hpgl/2 operator equivalent to using -Z on the command line.
+ This is useful for systems that don't have access to the debugging
+ command line options. Sets debug flags until a terminating ";" is
+ received. GL/2 example: IN;SP1;ZZPB; is equivalent to running the
+ interpreter with the option -ZPB which turns on debug trace for
+ paths and bitmaps */
+
+int
+hpgl_ZZ(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+ while ( p < rlimit ) {
+ byte ch = *++p;
+ /* ; terminates the command */
+ if ( ch == ';' ) {
+ pargs->source.ptr = p;
+ return 0;
+ }
+ else {
+ gs_debug[(int)ch] = 1;
+ }
+ }
+ pargs->source.ptr = p;
+ return e_NeedData;
+}
+#endif
+/* The part of the DF command applicable for overlay macros */
+int
+hpgl_reset_overlay(hpgl_state_t *pgls)
+{ hpgl_args_t args;
+ hpgl_args_setup(&args);
+ hpgl_AC(&args, pgls);
+ hpgl_args_setup(&args);
+ pgls->g.font_selected = 0;
+ hpgl_AD(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_SD(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_CF(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_args_add_int(&args, 1);
+ hpgl_args_add_int(&args, 0);
+ hpgl_DI(&args, pgls);
+ /* HAS -- Figure out some way to do this so that it is consistant */
+ pgls->g.label.terminator = 3;
+ pgls->g.label.print_terminator = false;
+ hpgl_args_setup(&args);
+ hpgl_DV(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_ES(&args, pgls);
+ pgls->g.label.write_vertical = false;
+ pgls->g.label.double_byte = false;
+ hpgl_args_setup(&args);
+ hpgl_LM(&args, pgls);
+ hpgl_args_set_int(&args, 1);
+ hpgl_LO(&args, pgls);
+ /* we do this instead of calling SC directly */
+ if ( pgls->g.scaling_type != hpgl_scaling_none ) {
+ gs_point dpt, pt; /* device point and user point */
+ hpgl_call(hpgl_get_current_position(pgls, &pt));
+ hpgl_call(gs_transform(pgls->pgs, pt.x, pt.y, &dpt));
+ pgls->g.scaling_type = hpgl_scaling_none;
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(gs_itransform(pgls->pgs, dpt.x, dpt.y, &pt));
+ hpgl_call(hpgl_set_current_position(pgls, &pt));
+ }
+ pgls->g.fill_type = hpgl_even_odd_rule;
+ hpgl_args_set_int(&args,0);
+ hpgl_PM(&args, pgls);
+ hpgl_args_set_int(&args,2);
+ hpgl_PM(&args, pgls);
+ pgls->g.bitmap_fonts_allowed = 0;
+ hpgl_args_setup(&args);
+ hpgl_SI(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_SL(&args, pgls);
+ /* We initialize symbol mode directly because hpgl_SM parses
+ its argument differently than most other commands */
+ pgls->g.symbol_mode = 0;
+ hpgl_args_setup(&args);
+ hpgl_SS(&args, pgls);
+ hpgl_args_set_int(&args,1);
+ hpgl_TR(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_TD(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_MC(&args, pgls);
+#ifdef LJ6_COMPAT
+ /* LJ6 seems to reset PP with an IN command the Color Laserjet
+ does not. NB this needs to be handled with dynamic
+ configuration */
+ hpgl_args_setup(&args);
+ hpgl_PP(&args, pgls);
+#endif
+ return 0;
+}
+
+/* DF; sets programmable features except P1 and P2 */
+int
+hpgl_DF(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_args_t args;
+ hpgl_call(hpgl_reset_overlay(pgls));
+
+ hpgl_args_setup(&args);
+ hpgl_FT(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_IW(&args, pgls);
+ hpgl_set_line_attribute_defaults(pgls);
+ hpgl_args_setup(&args);
+ hpgl_LA(&args, pgls);
+ hpgl_set_line_pattern_defaults(pgls);
+ hpgl_args_setup(&args);
+ hpgl_RF(&args, pgls);
+ hpgl_args_set_int(&args, 0);
+ hpgl_SV(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_UL(&args, pgls);
+ hpgl_args_setup(&args);
+ hpgl_SB(&args, pgls);
+ return 0;
+}
+
+/*
+ * The "implicit" portion of the IN command.
+ *
+ * With the advent of PCL 5c, both PCL and GL want to reset the current
+ * palette. The difficulty is that they want to reset it to different things.
+ *
+ * The proper way to handle this would be to implement IN as a reset type,
+ * create a single palette reset routine, and have it do different things
+ * depending on the nature of the reset.
+ *
+ * At the time this comment was written, such a change was larger than could
+ * be easily accommodated. Hence, a less drastic alternative was employed:
+ * split the IN command into implicit and explicit portions, and only use the
+ * latter when the IN command is explicitly invoked.
+ */
+ int
+hpgl_IN_implicit(
+ hpgl_state_t * pgls\
+)
+{
+ hpgl_args_t args;
+
+ /* cancel rotation */
+ pgls->g.rotation = 0;
+ /* restore defaults */
+ hpgl_DF(&args, pgls);
+
+ /* if in RTL mode provided initial values for PS */
+ if ( pgls->personality == rtl ) {
+ hpgl_args_setup(&args);
+ hpgl_PS(&args, pgls);
+ }
+
+ /* defaults P1 and P2 */
+ hpgl_args_setup(&args);
+ hpgl_IP(&args, pgls);
+
+ /* pen width units - metric, also resets pen widths. */
+ hpgl_args_setup(&args);
+ hpgl_WU(&args, pgls);
+
+
+ /*
+ * pen up-absolute position and set gl/2 current positon to
+ * 0,0 or the lower left of the picture frame. Simply sets
+ * the gl/2 state, we subsequently clear the path because we
+ * do not want to create a live gs path.
+ */
+ hpgl_args_set_real2(&args, 0.0, 0.0);
+ hpgl_PU(&args, pgls);
+ hpgl_args_set_real2(&args, 0.0, 0.0);
+ hpgl_PA(&args, pgls);
+ hpgl_call(hpgl_clear_current_path(pgls));
+
+ return 0;
+}
+
+/*
+ * IN = DF (see below)
+ */
+ int
+hpgl_IN(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int code = 0;
+ hpgl_args_t args;
+
+ /* handle the work or an implicit reset */
+ code = hpgl_IN_implicit(pgls);
+
+ /* set up the default palette (8 entries, not-fixed) */
+ if (code == 0)
+ code = pcl_palette_IN(pgls);
+
+ /* pen width units - metric, also reset pen widths. This is also
+ done in hpgl_IN_implicit() above but we have to set the pen
+ widths again in the case a new palette was created. The
+ default width values in a fresh palette do not account for
+ scaling effects of the hpgl/2 picture frame. */
+ hpgl_args_setup(&args);
+ hpgl_WU(&args, pgls);
+
+ return code;
+}
+
+/* derive the current picture frame coordinates */
+
+static int
+hpgl_picture_frame_coords(hpgl_state_t *pgls, gs_int_rect *gl2_win)
+{
+ gs_rect dev_win; /* device window */
+ hpgl_real_t x1 = pgls->g.picture_frame.anchor_point.x;
+ hpgl_real_t y1 = pgls->g.picture_frame.anchor_point.y;
+ hpgl_real_t x2 = x1 + pgls->g.picture_frame_width;
+ hpgl_real_t y2 = y1 + pgls->g.picture_frame_height;
+
+ pcl_set_ctm(pgls, false);
+ hpgl_call(gs_transform(pgls->pgs, x1, y1, &dev_win.p));
+ hpgl_call(gs_transform(pgls->pgs, x2, y2, &dev_win.q));
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+ /*
+ * gs_bbox_transform_inverse puts the resulting points in the
+ * correct order, with p < q.
+ */
+ { gs_matrix mat;
+ gs_rect pcl_win; /* pcl window */
+
+ gs_currentmatrix(pgls->pgs, &mat);
+ hpgl_call(gs_bbox_transform_inverse(&dev_win, &mat, &pcl_win));
+/* Round all coordinates to the nearest integer. */
+#define set_round(e) gl2_win->e = (int)floor(pcl_win.e + 0.5)
+ set_round(p.x);
+ set_round(p.y);
+ set_round(q.x);
+ set_round(q.y);
+#undef set_round
+ }
+ /* restore the ctm */
+ hpgl_call(hpgl_set_ctm(pgls));
+ return 0;
+}
+
+/* IP p1x,p1y[,p2x,p2y]; */
+/* IP; */
+int
+hpgl_IP(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int32 ptxy[4];
+ int i;
+ gs_int_rect win;
+
+ /* draw the current path */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ /* get the default picture frame coordinates */
+ hpgl_call(hpgl_picture_frame_coords(pgls, &win));
+
+ /* round the picture frame coordinates */
+ ptxy[0] = win.p.x; ptxy[1] = win.p.y;
+ ptxy[2] = win.q.x; ptxy[3] = win.q.y;
+ for ( i = 0; i < 4 && hpgl_arg_int(pgls->memory, pargs, &ptxy[i]); ++i )
+ ;
+ if ( i & 1 )
+ return e_Range;
+
+ if ( i == 2 )
+ {
+ pgls->g.P2.x = (ptxy[0] - pgls->g.P1.x) +
+ pgls->g.P2.x;
+ pgls->g.P2.y = (ptxy[1] - pgls->g.P1.y) +
+ pgls->g.P2.y;
+ pgls->g.P1.x = ptxy[0];
+ pgls->g.P1.y = ptxy[1];
+ }
+ else
+ {
+ pgls->g.P1.x = ptxy[0];
+ pgls->g.P1.y = ptxy[1];
+ pgls->g.P2.x = ptxy[2];
+ pgls->g.P2.y = ptxy[3];
+ }
+
+ /* if either coordinate is equal it is incremented by 1 */
+ if ( pgls->g.P1.x == pgls->g.P2.x ) pgls->g.P2.x++;
+ if ( pgls->g.P1.y == pgls->g.P2.y ) pgls->g.P2.y++;
+
+ return 0;
+}
+
+/* IR r1x,r1y[,r2x,r2y]; */
+/* IR; */
+int
+hpgl_IR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t rptxy[4];
+ int i;
+ hpgl_args_t args;
+ gs_int_rect win;
+
+ for ( i = 0; i < 4 && hpgl_arg_c_real(pgls->memory, pargs, &rptxy[i]); ++i )
+ ;
+ if ( i & 1 )
+ return e_Range;
+
+ /* get the PCL picture frame coordinates */
+ hpgl_call(hpgl_picture_frame_coords(pgls, &win));
+ hpgl_args_setup(&args);
+ hpgl_args_add_int(&args, win.p.x + (win.q.x - win.p.x) *
+ rptxy[0] / 100.0);
+
+ hpgl_args_add_int(&args, win.p.y + (win.q.y - win.p.y) *
+ rptxy[1] / 100.0);
+
+ if ( i == 4 )
+ {
+ hpgl_args_add_int(&args, win.p.x + (win.q.x - win.p.x) *
+ rptxy[2] / 100.0);
+
+ hpgl_args_add_int(&args, win.p.y + (win.q.y - win.p.y) *
+ rptxy[3] / 100.0);
+ }
+ hpgl_IP( &args, pgls );
+ return 0;
+}
+
+/* IW llx,lly,urx,ury; */
+/* IW; */
+int
+hpgl_IW(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t wxy[4];
+ int i;
+ gs_int_rect win;
+
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ /* get the default picture frame coordinates. */
+ hpgl_call(hpgl_picture_frame_coords(pgls, &win));
+ wxy[0] = win.p.x;
+ wxy[1] = win.p.y;
+ wxy[2] = win.q.x;
+ wxy[3] = win.q.y;
+ for ( i = 0; i < 4 && hpgl_arg_units(pgls->memory, pargs, &wxy[i]); ++i )
+ ;
+ if ( i & 3 )
+ return e_Range;
+
+ /* no args case disables the soft clip window */
+ if ( i == 0 ) {
+ pgls->g.soft_clip_window.active = false;
+ pgls->g.soft_clip_window.isbound = false;
+ return 0;
+ }
+ /* HAS needs error checking */
+ pgls->g.soft_clip_window.rect.p.x = wxy[0];
+ pgls->g.soft_clip_window.rect.p.y = wxy[1];
+ pgls->g.soft_clip_window.rect.q.x = wxy[2];
+ pgls->g.soft_clip_window.rect.q.y = wxy[3];
+ pgls->g.soft_clip_window.active = true;
+ return 0;
+}
+
+/* PG; */
+int
+hpgl_PG(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ if ( pgls->personality == rtl ) {
+ int dummy;
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ /* with parameter always feed, without parameter feed if marked */
+ if ( pcl_page_marked(pgls) || hpgl_arg_c_int(pgls->memory, pargs, &dummy) )
+ hpgl_call(pcl_do_FF(pgls));
+ }
+ return 0;
+}
+
+/* enable cutter - not supported */
+int
+hpgl_EC(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return e_Unimplemented;
+}
+
+/* PS; NB this is only a partial implementation. */
+int
+hpgl_PS(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_real_t page_dims[2];
+ /* we use the pcl paper handling machinery to set the plot size */
+ pcl_paper_size_t paper;
+ int i;
+
+ if ( pgls->personality != rtl )
+ return 0;
+
+ /* PS return an error if the page is dirty */
+ if ( pcl_page_marked(pgls) )
+ return e_Range;
+
+ /* check for pjl override of the arguments - this is custom code
+ for a customer and is not the normal interaction between PCL &
+ PJL */
+ if (!pjl_proc_compare(pgls->pjls, pjl_proc_get_envvar(pgls->pjls, "plotsizeoverride"), "on")) {
+ page_dims[0] = pjl_proc_vartof(pgls->pjls, pjl_proc_get_envvar(pgls->pjls, "plotsize1"));
+ page_dims[1] = pjl_proc_vartof(pgls->pjls, pjl_proc_get_envvar(pgls->pjls, "plotsize2"));
+ } else {
+ for ( i = 0; i < 2 && hpgl_arg_real(pgls->memory, pargs, &page_dims[i]); ++i )
+ ; /* NOTHING */
+ if ( i == 1 )
+ page_dims[1] = page_dims[0];
+ else if ( i != 2 )
+ return e_Range;
+ }
+ paper.height = plu_2_coord(page_dims[0]);
+ paper.width = plu_2_coord(page_dims[1]);
+ paper.offset_portrait = 0;
+ paper.offset_landscape = 0;
+ new_logical_page(pgls, 0, &paper, false, false);
+ return 0;
+}
+
+/* RO angle; */
+/* RO; */
+int
+hpgl_RO(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ int angle=0;
+ gs_point point, dev_pt;
+
+ /* this business is used by both SC and RO -- perhaps it needs
+ a new home */
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(hpgl_get_current_position(pgls, &point));
+ hpgl_call(gs_transform(pgls->pgs, point.x, point.y, &dev_pt));
+
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &angle) )
+ switch ( angle )
+ {
+ case 0: case 90: case 180: case 270:
+ break;
+ default:
+ return e_Range;
+ }
+
+ if ( angle != pgls->g.rotation )
+ {
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ pgls->g.rotation = angle;
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(gs_itransform(pgls->pgs, dev_pt.x, dev_pt.y, &point));
+ hpgl_call(hpgl_set_current_position(pgls, &point));
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ }
+ return 0;
+}
+
+/* RP; */
+int
+hpgl_RP(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ return e_Unimplemented;
+}
+
+/* SC xmin,xmax,ymin,ymax[,type=0]; */
+/* SC xmin,xmax,ymin,ymax,type=1[,left,bottom]; */
+/* SC xmin,xfactor,ymin,yfactor,type=2; */
+/* SC; */
+int
+hpgl_SC(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t xy[4];
+ int i;
+ int type;
+ hpgl_scaling_params_t scale_params;
+ gs_point point, dev_pt, dev_anchor;
+
+ scale_params = pgls->g.scaling_params;
+ hpgl_call(hpgl_get_current_position(pgls, &point));
+ hpgl_call(gs_transform(pgls->pgs, point.x, point.y, &dev_pt));
+ hpgl_call(gs_transform(pgls->pgs, pgls->g.anchor_corner.x,
+ pgls->g.anchor_corner.y, &dev_anchor));
+ for ( i = 0; i < 4 && hpgl_arg_real(pgls->memory, pargs, &xy[i]); ++i )
+ ;
+ switch ( i )
+ {
+ case 0: /* set defaults */
+ {
+ /* a naked SC implies the soft clip window is bound
+ to plotter units. */
+ gs_matrix umat;
+ type = hpgl_scaling_none;
+ hpgl_compute_user_units_to_plu_ctm(pgls, &umat);
+ /* in-place */
+ hpgl_call(gs_bbox_transform(&pgls->g.soft_clip_window.rect,
+ &umat,
+ &pgls->g.soft_clip_window.rect));
+ pgls->g.soft_clip_window.isbound = true;
+ break;
+ }
+ default:
+ return e_Range;
+ case 4:
+ type = hpgl_scaling_anisotropic;
+ hpgl_arg_c_int(pgls->memory, pargs, &type);
+ switch ( type )
+ {
+ case hpgl_scaling_anisotropic: /* 0 */
+ if ( xy[0] == xy[1] || xy[2] == xy[3] )
+ return e_Range;
+pxy: scale_params.pmin.x = xy[0];
+ scale_params.pmax.x = xy[1];
+ scale_params.pmin.y = xy[2];
+ scale_params.pmax.y = xy[3];
+ break;
+ case hpgl_scaling_isotropic: /* 1 */
+ if ( xy[0] == xy[1] || xy[2] == xy[3] )
+ return e_Range;
+ { hpgl_real_t left = 50, bottom = 50;
+ if ( (hpgl_arg_c_real(pgls->memory, pargs, &left) &&
+ (left < 0 || left > 100 ||
+ !hpgl_arg_c_real(pgls->memory, pargs, &bottom) ||
+ bottom < 0 || bottom > 100))
+ )
+ return e_Range;
+ scale_params.left = left;
+ scale_params.bottom = bottom;
+ }
+ goto pxy;
+ case hpgl_scaling_point_factor: /* 2 */
+ if ( xy[1] == 0 || xy[3] == 0 )
+ return e_Range;
+ scale_params.pmin.x = xy[0];
+ scale_params.factor.x = xy[1];
+ scale_params.pmin.y = xy[2];
+ scale_params.factor.y = xy[3];
+ break;
+ default:
+ return e_Range;
+ }
+ }
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ pgls->g.scaling_params = scale_params;
+ pgls->g.scaling_type = type;
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(gs_itransform(pgls->pgs, dev_pt.x, dev_pt.y, &point));
+ hpgl_call(hpgl_set_current_position(pgls, &point));
+ hpgl_call(gs_itransform(pgls->pgs, dev_anchor.x, dev_anchor.y,
+ &pgls->g.anchor_corner));
+
+ /* PCLTRM 23-7 (commands the update cr position) does not list
+ SC but PCL updates the position */
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* BP - Begin Plot
+*/
+static int
+hpgl_BP(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_args_t args;
+ int32 command = 0;
+ int32 value = 0;
+ bool more = true;
+
+
+ while (more) {
+ more = hpgl_arg_int(pgls->memory, pargs, &command);
+ if (!more)
+ break;
+ if (command == 1) {
+ /* parse string */
+ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+ while ( p < rlimit ) {
+ switch ( *++p ) {
+ case ' ':
+ /* Ignore spaces between command and opening ". */
+ continue;
+ case '"':
+ if ( !pargs->phase ) {
+ /* begin string */
+ pargs->phase = 1;
+ continue;
+ }
+ else /* end string */
+ break;
+ default:
+ if ( !pargs->phase )
+ break; /* ill formed command exit */
+ else
+ continue; /* character inside of string */
+ }
+ break; /* error or trailing " exits */
+ }
+ pargs->source.ptr = p;
+ }
+ else {
+ more = hpgl_arg_int(pgls->memory, pargs, &value);
+ /* BP command value pair is currently ignored */
+ }
+ }
+
+ hpgl_args_setup(&args);
+ hpgl_IN(&args, pgls);
+ return 0;
+}
+
+/* Initialization */
+static int
+pgconfig_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ /* CO has special argument parsing, so it must handle skipping */
+ /* in polygon mode itself. */
+ HPGL_COMMAND('C', 'O', hpgl_CO, hpgl_cdf_polygon | hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'F', hpgl_DF, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('I', 'N', hpgl_IN, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('I', 'P', hpgl_IP, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('I', 'R', hpgl_IR, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('I', 'W', hpgl_IW, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'G', hpgl_PG, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'S', hpgl_PS, hpgl_cdf_rtl),
+ HPGL_COMMAND('E','C', hpgl_EC, hpgl_cdf_rtl),
+ HPGL_COMMAND('R', 'O', hpgl_RO, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('R', 'P', hpgl_RP, hpgl_cdf_rtl),
+ HPGL_COMMAND('S', 'C', hpgl_SC, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('B', 'P', hpgl_BP, hpgl_cdf_pcl_rtl_both),
+#ifdef DEBUG
+ HPGL_COMMAND('Z', 'Z', hpgl_ZZ, hpgl_cdf_pcl_rtl_both),
+#endif
+ END_HPGL_COMMANDS
+ return 0;
+}
+const pcl_init_t pgconfig_init = {
+ pgconfig_do_registration, 0
+};
diff --git a/pcl/pgdraw.c b/pcl/pgdraw.c
new file mode 100644
index 000000000..108108e61
--- /dev/null
+++ b/pcl/pgdraw.c
@@ -0,0 +1,1642 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgdraw.c - HP-GL/2 line drawing/path building routines. */
+
+#include "stdio_.h"
+#include "math_.h"
+#include "gdebug.h"
+#include "gstypes.h" /* for gsstate.h */
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsmemory.h" /* for gsstate.h */
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gspath.h"
+#include "gspaint.h"
+#include "gsrop.h" /* for gs_setrasterop */
+#include "gxfarith.h" /* for sincos */
+#include "gxfixed.h"
+#include "pgmand.h"
+#include "pgdraw.h"
+#include "pggeom.h"
+#include "pgmisc.h"
+#include "pcdraw.h"
+#include "pcpalet.h"
+#include "pcpatrn.h"
+#include "pcpage.h"
+
+
+
+/* hack to quiet compiler warnings */
+#ifndef abs
+extern int abs( int );
+#endif
+
+#define round(x) (((x) < 0.0) ? (ceil ((x) - 0.5)) : (floor ((x) + 0.5)))
+
+
+static inline gs_point
+hpgl_picture_frame_scale(hpgl_state_t *pgls)
+{
+ gs_point scale;
+ scale.x = scale.y = 0;
+
+ /* this should not happen in a real system */
+ if ( (pgls->g.picture_frame_height == 0) ||
+ (pgls->g.picture_frame_width == 0) ||
+ (pgls->g.plot_width == 0) ||
+ (pgls->g.plot_height == 0) ) {
+ dprintf("bad picture frame coordinates\n");
+ } else {
+ scale.x = (pgls->g.plot_size_horizontal_specified) ?
+ ((hpgl_real_t)pgls->g.picture_frame_width /
+ (hpgl_real_t)pgls->g.plot_width) :
+ 1.0;
+ scale.y = (pgls->g.plot_size_vertical_specified) ?
+ ((hpgl_real_t)pgls->g.picture_frame_height /
+ (hpgl_real_t)pgls->g.plot_height) :
+ 1.0;
+ }
+ return scale;
+}
+
+static int
+hpgl_set_picture_frame_scaling(hpgl_state_t *pgls)
+{
+ if ( pgls->g.scaling_type != hpgl_scaling_point_factor ) {
+ gs_point scale = hpgl_picture_frame_scale(pgls);
+ hpgl_call(gs_scale(pgls->pgs, scale.x, scale.y));
+ }
+ return 0;
+}
+
+hpgl_real_t
+hpgl_width_scale(hpgl_state_t *pgls)
+{
+ gs_point sc = hpgl_picture_frame_scale(pgls);
+ return min(sc.x, sc.y);
+}
+
+/* ctm to translate from pcl space to plu space */
+ int
+hpgl_set_pcl_to_plu_ctm(hpgl_state_t *pgls)
+{
+ hpgl_real_t swap_temp;
+ hpgl_real_t fw_plu = (coord_2_plu(pgls->g.picture_frame_width));
+ hpgl_real_t fh_plu = (coord_2_plu(pgls->g.picture_frame_height));
+
+ hpgl_call(pcl_set_ctm(pgls, false));
+ if ( pgls->personality == rtl ) {
+ /* If plot length >= width, y increases across the short
+ edge and x increases down the plot. Rotate the pcl
+ coordinate system -90, scale and flip the x axis. Else
+ for plot width > length the origin is in the upper
+ right and x increases going to the left and y increases
+ going down, translate the pcl coordinate system by the
+ picture frame width, scale and flip x.
+ PLOTSIZEROTATE==OFF forces -90 rotation, top/left 0,0
+ not legal pcl default is ON */
+ if ( pgls->g.picture_frame_height >= pgls->g.picture_frame_width ||
+ !pjl_proc_compare(pgls->pjls,
+ pjl_proc_get_envvar(pgls->pjls, "plotsizerotate"), "on")) {
+ hpgl_call(gs_rotate(pgls->pgs, -90));
+ /* swap picture frame height and width
+ * for the translation portion of the next RO cmd rotation.
+ */
+ swap_temp = fw_plu;
+ fw_plu = fh_plu;
+ fh_plu = swap_temp;
+ }
+ else
+ hpgl_call(gs_translate(pgls->pgs, pgls->g.picture_frame_width, 0));
+ hpgl_call(gs_scale(pgls->pgs, -(7200.0/1016.0), (7200.0/1016.0)));
+ } else {
+ hpgl_call(gs_translate(pgls->pgs,
+ pgls->g.picture_frame.anchor_point.x,
+ pgls->g.picture_frame.anchor_point.y));
+ /* move the origin */
+ hpgl_call(gs_translate(pgls->pgs, 0, pgls->g.picture_frame_height));
+ /* scale to plotter units and a flip for y */
+ hpgl_call(gs_scale(pgls->pgs, (7200.0/1016.0), -(7200.0/1016.0)));
+ /* account for rotated coordinate system */
+ }
+ hpgl_call(gs_rotate(pgls->pgs, pgls->g.rotation));
+ {
+ switch (pgls->g.rotation)
+ {
+ case 0 :
+ hpgl_call(gs_translate(pgls->pgs, 0, 0));
+ break;
+ case 90 :
+ hpgl_call(gs_translate(pgls->pgs, 0, -fw_plu));
+ break;
+ case 180 :
+ hpgl_call(gs_translate(pgls->pgs, -fw_plu, -fh_plu));
+ break;
+ case 270 :
+ hpgl_call(gs_translate(pgls->pgs, -fh_plu, 0));
+ break;
+ }
+ }
+ hpgl_call(hpgl_set_picture_frame_scaling(pgls));
+ {
+ gs_matrix mat;
+ gs_currentmatrix(pgls->pgs, &mat);
+ mat.ty = floor(mat.ty); mat.tx = floor(mat.tx);
+ gs_setmatrix(pgls->pgs, &mat);
+ }
+ hpgl_call(gs_setdotorientation(pgls->pgs));
+ return 0;
+}
+
+/* Set the CTM to map PLU to device units, regardless of scaling. */
+/* (We need this for labels when scaling is on.) */
+ int
+hpgl_set_plu_ctm(hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_set_pcl_to_plu_ctm(pgls));
+ return 0;
+}
+
+ int
+hpgl_compute_user_units_to_plu_ctm(const hpgl_state_t *pgls, gs_matrix *pmat)
+{ floatp origin_x = pgls->g.P1.x, origin_y = pgls->g.P1.y;
+
+ switch ( pgls->g.scaling_type )
+ {
+ case hpgl_scaling_none:
+ gs_make_identity(pmat);
+ break;
+ case hpgl_scaling_point_factor:
+ hpgl_call(gs_make_translation(origin_x, origin_y, pmat));
+ hpgl_call(gs_matrix_scale(pmat, pgls->g.scaling_params.factor.x,
+ pgls->g.scaling_params.factor.y, pmat));
+ hpgl_call(gs_matrix_translate(pmat,
+ -pgls->g.scaling_params.pmin.x,
+ -pgls->g.scaling_params.pmin.y, pmat));
+ break;
+ default:
+ /*case hpgl_scaling_anisotropic:*/
+ /*case hpgl_scaling_isotropic:*/
+ {
+ floatp window_x = pgls->g.P2.x - origin_x,
+ range_x = pgls->g.scaling_params.pmax.x -
+ pgls->g.scaling_params.pmin.x,
+ scale_x = window_x / range_x;
+ floatp window_y = pgls->g.P2.y - origin_y,
+ range_y = pgls->g.scaling_params.pmax.y -
+ pgls->g.scaling_params.pmin.y,
+ scale_y = window_y / range_y;
+#define SIGN(x) ((x) < 0 ? -1.0 : 1.0)
+
+ if ( pgls->g.scaling_type == hpgl_scaling_isotropic ) {
+ if ( fabs(scale_x) > fabs(scale_y) ) { /* Reduce the X scaling. */
+ origin_x += SIGN(scale_x) * (range_x * (fabs(scale_x) - fabs(scale_y)) *
+ (pgls->g.scaling_params.left / 100.0));
+ scale_x = SIGN(scale_x) * fabs(scale_y);
+ } else { /* Reduce the Y scaling. */
+ origin_y += SIGN(scale_y) * (range_y * (fabs(scale_y) - fabs(scale_x)) *
+ (pgls->g.scaling_params.bottom / 100.0));
+ scale_y = SIGN(scale_y) * fabs(scale_x);
+ }
+ }
+
+ hpgl_call(gs_make_translation(origin_x, origin_y, pmat));
+ hpgl_call(gs_matrix_scale(pmat, scale_x, scale_y, pmat));
+ hpgl_call(gs_matrix_translate(pmat,
+ -pgls->g.scaling_params.pmin.x,
+ -pgls->g.scaling_params.pmin.y, pmat));
+ break;
+ }
+ }
+ return 0;
+
+}
+
+/* set up ctm's. Uses the current render mode to figure out which ctm
+ is appropriate */
+ int
+hpgl_set_ctm(hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+ if ( pgls->g.scaling_type != hpgl_scaling_none ) {
+ gs_matrix mat;
+ hpgl_call(hpgl_compute_user_units_to_plu_ctm(pgls, &mat));
+ hpgl_call(gs_concat(pgls->pgs, &mat));
+ hpgl_call(gs_currentmatrix(pgls->pgs, &mat));
+ mat.tx = round(mat.tx);
+ mat.ty = round(mat.ty);
+ hpgl_call(gs_setmatrix(pgls->pgs, &mat));
+ }
+ return 0;
+}
+
+/* Compute the pattern length. Normally, if the pattern length is
+ relative it is 4% of the diagonal distance from P1 to P2, for
+ isotropic scaling we need 4% of the distance of the plotter unit
+ equivalent of the scaling SC coordinates xmin, xmax, ymin, and
+ ymax.. */
+static floatp
+hpgl_get_line_pattern_length(hpgl_state_t *pgls)
+{
+ /* dispense with the unusual "isotropic relative" case first. The
+ normal calculation afterward is straightforward */
+ if ( (pgls->g.line.current.pattern_length_relative == 0) &&
+ (pgls->g.scaling_type == hpgl_scaling_isotropic) ) {
+ /* the box in user space */
+ gs_rect isotropic_user_box;
+ /* box in plotter units we compute 4% of the diagonal of this box */
+ gs_rect isotropic_plu_box;
+ gs_matrix user_to_plu_mat;
+
+ hpgl_call(hpgl_compute_user_units_to_plu_ctm(pgls, &user_to_plu_mat));
+
+ isotropic_user_box.p = pgls->g.scaling_params.pmin;
+ isotropic_user_box.q = pgls->g.scaling_params.pmax;
+
+ hpgl_call(gs_bbox_transform(&isotropic_user_box,
+ &user_to_plu_mat,
+ &isotropic_plu_box));
+
+ return (pgls->g.line.current.pattern_length / 100.0) *
+ hpgl_compute_distance(isotropic_plu_box.p.x,
+ isotropic_plu_box.p.y,
+ isotropic_plu_box.q.x,
+ isotropic_plu_box.q.y);
+ }
+
+ /* simple case 4% of the diagonal of P1 and P2 or absolute in millimeters */
+ return ((pgls->g.line.current.pattern_length_relative == 0) ?
+ ((pgls->g.line.current.pattern_length / 100.0) *
+ hpgl_compute_distance(pgls->g.P1.x,
+ pgls->g.P1.y,
+ pgls->g.P2.x,
+ pgls->g.P2.y) *
+ hpgl_width_scale(pgls)) :
+ (mm_2_plu(pgls->g.line.current.pattern_length)));
+}
+
+static int
+hpgl_set_graphics_dash_state(hpgl_state_t *pgls)
+{
+ int entry = abs(pgls->g.line.current.type);
+ bool adaptive;
+ const hpgl_line_type_t *pat;
+ float length;
+ float pattern[20];
+ float offset;
+ int count;
+ int i;
+
+ /* handle the simple case (no dash) and return */
+ if ( pgls->g.line.current.is_solid )
+ {
+ /* use a 0 count pattern to turn off dashing in case it is
+ set, and allow drawing dots */
+ hpgl_call(gs_setdash(pgls->pgs, pattern, 0, 0));
+ hpgl_call(gs_setdotlength(pgls->pgs, 0.00098, true));
+ return 0;
+ }
+
+ hpgl_call(gs_setdotlength(pgls->pgs, 0.0, false));
+ if ( entry == 0 )
+ {
+ /* dot length NOTE this is in absolute 1/72" units not
+ user space */
+ /* Use an adaptive pattern with an infinitely long segment length
+ to get the dots drawn just at the ends of lines. */
+ pattern[0] = 0;
+ pattern[1] = 1.0e6; /* "infinity" */
+ hpgl_call(gs_setdash(pgls->pgs, pattern, 2, 0));
+ gs_setdashadapt(pgls->pgs, true);
+ return 0;
+ }
+
+ adaptive = ( pgls->g.line.current.type < 0 );
+ pat = ((adaptive) ?
+ (&pgls->g.adaptive_line_type[entry - 1]) :
+ (&pgls->g.fixed_line_type[entry - 1]));
+
+ length = hpgl_get_line_pattern_length(pgls);
+ gs_setdashadapt(pgls->pgs, adaptive);
+ /*
+ * The graphics library interprets odd pattern counts differently
+ * from GL: if the pattern count is odd, we need to do something
+ * a little special.
+ */
+ count = pat->count;
+ for ( i = 0; i < count; i++ )
+ pattern[i] = length * pat->gap[i];
+ offset = pgls->g.line.current.pattern_offset * hpgl_get_line_pattern_length(pgls);
+ if ( count & 1 )
+ {
+ /*
+ * Combine the last gap with the first one, and change the
+ * offset to compensate. NOTE: this doesn't work right with
+ * adaptive line type: we may need to change the library to
+ * make this work properly.
+ */
+ --count;
+ pattern[0] += pattern[count];
+ offset += pattern[count];
+ }
+
+ hpgl_call(gs_setdash(pgls->pgs, pattern, count, offset));
+
+ return 0;
+}
+
+/* catch pen not being in the palette */
+ int
+hpgl_get_selected_pen(hpgl_state_t *pgls)
+{
+ /* get the current pen */
+ int pen = pgls->g.pen.selected;
+ /* 0 is the first pen */
+ int num_entries = pcl_palette_get_num_entries(pgls->ppalet);
+ /* this is bad */
+ if ((pen < 0) || (pen >= num_entries)) {
+ pen %= num_entries;
+ if (pen < 0)
+ pen += num_entries;
+ }
+ return pen;
+}
+
+/*
+ * set up joins, caps, miter limit, and line width
+ */
+static int
+hpgl_set_graphics_line_attribute_state(
+ hpgl_state_t * pgls,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ const gs_line_cap cap_map[] = { gs_cap_butt, /* 0 not supported */
+ gs_cap_butt, /* 1 butt end */
+ gs_cap_square, /* 2 square end */
+ gs_cap_triangle, /* 3 triag. end */
+ gs_cap_round /* 4 round cap */
+ };
+
+ const gs_line_join join_map[] = { gs_join_none, /* 0 not supported */
+ gs_join_miter, /* 1 mitered */
+ gs_join_miter, /* 2 mitrd/bevld */
+ gs_join_triangle, /* 3 triag. join */
+ gs_join_round, /* 4 round join */
+ gs_join_bevel, /* 5 bevel join */
+ gs_join_none /* 6 no join */
+ };
+ const float * widths = pcl_palette_get_pen_widths(pgls->ppalet);
+ floatp pen_wid = widths[hpgl_get_selected_pen(pgls)];
+
+ gs_setfilladjust(pgls->pgs, 0.0, 0.0);
+
+ /* character mode has already set up all of this information in
+ the build character routine for the font */
+ if ( render_mode == hpgl_rm_character )
+ return 0;
+ /*
+ * HP appears to use default line attributes if the the pen
+ * width is less than or equal to .35mm or 14.0 plu. This
+ * is not documented PCLTRM. Pen widths are maintained in
+ * plotter units
+ */
+ if ( render_mode != hpgl_rm_character && pen_wid <= 14.0 ) {
+ hpgl_call(gs_setlinejoin(pgls->pgs, gs_join_miter));
+ hpgl_call(gs_setlinecap(pgls->pgs, gs_cap_butt));
+ hpgl_call(gs_setlinewidth(pgls->pgs, pen_wid));
+ hpgl_call(gs_setmiterlimit(pgls->pgs, 5.0));
+ return 0;
+ }
+
+ switch (render_mode) {
+
+ case hpgl_rm_character:
+ case hpgl_rm_polygon:
+ case hpgl_rm_clip_and_fill_polygon:
+ hpgl_call(gs_setlinejoin(pgls->pgs, gs_join_round));
+ hpgl_call(gs_setlinecap(pgls->pgs, gs_cap_round));
+ break;
+
+ case hpgl_rm_vector_fill:
+ case hpgl_rm_vector:
+vector:
+ hpgl_call(gs_setlinejoin(pgls->pgs, join_map[pgls->g.line.join]));
+ hpgl_call(gs_setlinecap(pgls->pgs, cap_map[pgls->g.line.cap]));
+ hpgl_call(gs_setlinewidth(pgls->pgs, pen_wid));
+ break;
+
+ default:
+ /* shouldn't happen; we must have a mode to properly parse hpgl file. */
+ dprintf("warning no hpgl rendering mode set using vector mode\n");
+ goto vector;
+ }
+
+#ifdef COMMENT
+ /* I do not remember the rational for the large miter */
+ hpgl_call(gs_setmiterlimit( pgls->pgs,
+ (pgls->g.line.join == 1)
+ ? 5000.0
+ : pgls->g.miter_limit
+ ) );
+#endif
+ hpgl_call(gs_setmiterlimit(pgls->pgs, pgls->g.miter_limit));
+ return 0;
+}
+
+/*
+ * A bounding box for the current polygon -- used for HPGL/2 vector
+ * fills.
+ */
+static int
+hpgl_polyfill_bbox(
+ hpgl_state_t * pgls,
+ gs_rect * bbox
+)
+{
+ /* get the bounding box for the current path / polygon */
+ hpgl_call(gs_pathbbox(pgls->pgs, bbox));
+ return 0;
+}
+
+/* set up an hpgl clipping region -- intersection of IW command and
+ picture frame. */
+ int
+hpgl_set_clipping_region(hpgl_state_t *pgls, hpgl_rendering_mode_t render_mode)
+{
+ /* if we are doing vector fill a clipping path has already
+ been set up using the last polygon */
+ if ( render_mode == hpgl_rm_vector_fill )
+ return 0;
+ else
+ {
+ gs_fixed_rect fixed_box;
+ gs_rect pcl_clip_box;
+ gs_rect dev_clip_box;
+ gs_matrix save_ctm;
+ gs_matrix pcl_ctm;
+
+ /* get pcl to device ctm and restore the current ctm */
+ hpgl_call(gs_currentmatrix(pgls->pgs, &save_ctm));
+ hpgl_call(pcl_set_ctm(pgls, false));
+ hpgl_call(gs_currentmatrix(pgls->pgs, &pcl_ctm));
+ hpgl_call(gs_setmatrix(pgls->pgs, &save_ctm));
+ /* find the clipping region defined by the picture frame
+ which is defined in pcl coordinates */
+ pcl_clip_box.p.x = pgls->g.picture_frame.anchor_point.x;
+ pcl_clip_box.p.y = pgls->g.picture_frame.anchor_point.y;
+ pcl_clip_box.q.x = pcl_clip_box.p.x + pgls->g.picture_frame_width;
+ pcl_clip_box.q.y = pcl_clip_box.p.y + pgls->g.picture_frame_height;
+
+ hpgl_call(gs_bbox_transform(&pcl_clip_box,
+ &pcl_ctm,
+ &dev_clip_box));
+ /* the clip box defined by the picture frame appears to be
+ open and the clip box defined by IW is closed */
+ dev_clip_box.q.x += 1.0;
+ dev_clip_box.q.y += 1.0;
+ /* if the clipping window is active calculate the new clip
+ box derived from IW and the intersection of the device
+ space boxes replace the current box. Note that IW
+ coordinates are in current units and and the picture
+ frame in pcl coordinates. */
+ if ( pgls->g.soft_clip_window.active ) {
+ gs_rect dev_soft_window_box;
+ gs_matrix ctm;
+ if (pgls->g.soft_clip_window.isbound) {
+ /* we need the plotter unit matrix */
+ hpgl_call(gs_currentmatrix(pgls->pgs, &save_ctm));
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+ hpgl_call(gs_currentmatrix(pgls->pgs, &ctm));
+ hpgl_call(gs_setmatrix(pgls->pgs, &save_ctm));
+ } else {
+ hpgl_call(gs_currentmatrix(pgls->pgs, &ctm));
+ }
+ hpgl_call(gs_bbox_transform(&pgls->g.soft_clip_window.rect,
+ &ctm,
+ &dev_soft_window_box));
+ /* Enlarge IW by 1 device dot to compensate for it's
+ 'on the line' is not clipped behavior. */
+ dev_clip_box.p.x = max(dev_clip_box.p.x, dev_soft_window_box.p.x - 1.0);
+ dev_clip_box.p.y = max(dev_clip_box.p.y, dev_soft_window_box.p.y - 1.0);
+ dev_clip_box.q.x = min(dev_clip_box.q.x, dev_soft_window_box.q.x + 1.0);
+ dev_clip_box.q.y = min(dev_clip_box.q.y, dev_soft_window_box.q.y + 1.0);
+
+ }
+ /* convert intersection box to fixed point and clip */
+ fixed_box.p.x = float2fixed(floor(dev_clip_box.p.x));
+ fixed_box.p.y = float2fixed(floor(dev_clip_box.p.y));
+ fixed_box.q.x = float2fixed(ceil(dev_clip_box.q.x));
+ fixed_box.q.y = float2fixed(ceil(dev_clip_box.q.y));
+ /* intersect with pcl clipping region */
+ fixed_box.p.x = max(fixed_box.p.x, pgls->xfm_state.dev_print_rect.p.x);
+ fixed_box.p.y = max(fixed_box.p.y, pgls->xfm_state.dev_print_rect.p.y);
+ fixed_box.q.x = min(fixed_box.q.x, pgls->xfm_state.dev_print_rect.q.x);
+ fixed_box.q.y = min(fixed_box.q.y, pgls->xfm_state.dev_print_rect.q.y);
+ hpgl_call(gx_clip_to_rectangle(pgls->pgs, &fixed_box));
+ }
+ return 0;
+}
+
+/* Plot one vector for vector fill all these use absolute coordinates. */
+static int
+hpgl_draw_vector_absolute(
+ hpgl_state_t * pgls,
+ hpgl_real_t x0,
+ hpgl_real_t y0,
+ hpgl_real_t x1,
+ hpgl_real_t y1,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ bool set_ctm = (render_mode != hpgl_rm_character);
+
+ hpgl_call(hpgl_add_point_to_path( pgls,
+ x0,
+ y0,
+ hpgl_plot_move_absolute,
+ set_ctm
+ ) );
+ hpgl_call(hpgl_add_point_to_path( pgls,
+ x1,
+ y1,
+ hpgl_plot_draw_absolute,
+ set_ctm
+ ) );
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector_fill));
+ return 0;
+}
+
+static int
+hpgl_get_adjusted_corner(
+ hpgl_real_t x_fill_increment,
+ hpgl_real_t y_fill_increment,
+ gs_rect * bbox,
+ gs_point * current_anchor_corner,
+ gs_point * adjusted_anchor_corner
+)
+{
+ adjusted_anchor_corner->x = current_anchor_corner->x;
+ adjusted_anchor_corner->y = current_anchor_corner->y;
+ /* account for anchor corner greater than origin */
+ if (x_fill_increment != 0) {
+ while (adjusted_anchor_corner->x > bbox->p.x)
+ adjusted_anchor_corner->x -= x_fill_increment;
+ } else if (adjusted_anchor_corner->x > bbox->p.x)
+ adjusted_anchor_corner->x = bbox->p.x;
+ if (y_fill_increment != 0) {
+ while (adjusted_anchor_corner->y > bbox->p.y)
+ adjusted_anchor_corner->y -= y_fill_increment;
+ } else if (adjusted_anchor_corner->y > bbox->p.y)
+ adjusted_anchor_corner->y = bbox->p.y;
+ return 0;
+}
+
+static void
+hpgl_alternate_line_pattern_offset(hpgl_state_t *pgls, uint lines_filled)
+{
+ if ( lines_filled & 1 )
+ pgls->g.line.current.pattern_offset = 0.5;
+ else
+ pgls->g.line.current.pattern_offset = 0.0;
+}
+
+/* this definition is used to factor out the effect of the orientation
+ of the pcl logical page. HP printers prior to the 4500 series
+ oriented the hpgl/2 fill lines relative to the logical page
+ orientation (expected result), later printers do not. Comment out
+ the following definition to support the old (expected) behavior. */
+#define FILL_IGNORES_PCL_ORIENTATION
+
+/*
+ * HAS should replicate lines beginning at the anchor corner to +X and
+ * +Y. Not quite right - anchor corner not yet supported.
+ * pgls->g.anchor_corner needs to be used to set dash offsets
+ */
+static int
+hpgl_polyfill(
+ hpgl_state_t * pgls,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ hpgl_real_t diag_mag, endx, endy;
+ gs_sincos_t sincos;
+ gs_point start;
+
+#define sin_dir sincos.sin
+#define cos_dir sincos.cos
+
+ gs_rect bbox;
+ gs_matrix user_to_plu_mat;
+ hpgl_pen_state_t saved_pen_state;
+ hpgl_real_t x_fill_increment, y_fill_increment;
+ hpgl_FT_pattern_source_t type = pgls->g.fill.type;
+ bool cross = (type == hpgl_FT_pattern_two_lines);
+ const hpgl_hatch_params_t * params = (cross ? &pgls->g.fill.param.crosshatch
+ : &pgls->g.fill.param.hatch);
+ gs_point spacing;
+#ifdef FILL_IGNORES_PCL_ORIENTATION
+ hpgl_real_t direction =
+ params->angle + pgls->xfm_state.lp_orient * 90;
+#else
+ hpgl_real_t direction = params->angle;
+#endif
+
+ hpgl_real_t unscaled_direction;
+ float saved_line_pattern_offset = pgls->g.line.current.pattern_offset;
+ int lines_filled;
+
+ /* spacing is always relevant to the scaling of the x-axis. It
+ can be specified in user space if provided to FT or by default
+ it is 1% of the distance from P1 to P2 */
+ spacing.x = params->spacing;
+ /* save the pen position */
+ hpgl_save_pen_state(pgls, &saved_pen_state, hpgl_pen_pos);
+ hpgl_call(hpgl_compute_user_units_to_plu_ctm(pgls, &user_to_plu_mat));
+ if (params->spacing == 0) {
+ /* Per TRM 22-12, use 1% of the P1/P2 distance. */
+
+ spacing.x = 0.01 * hpgl_compute_distance( pgls->g.P1.x,
+ pgls->g.P1.y,
+ pgls->g.P2.x,
+ pgls->g.P2.y
+ );
+
+ /* 1% is in plu, convert back to user units */
+ spacing.y = spacing.x / fabs(user_to_plu_mat.yy);
+ spacing.x /= fabs(user_to_plu_mat.xx);
+ }
+ else {
+ /* set spacing.y based on ratio of x/y scaling, still in user units */
+ spacing.y = spacing.x * fabs(user_to_plu_mat.xx) / fabs(user_to_plu_mat.yy);
+ }
+ /* get the bounding box */
+ hpgl_call(hpgl_polyfill_bbox(pgls, &bbox));
+ /*
+ * if the line width exceeds the spacing we use the line width
+ * to avoid overlapping of the fill lines. HAS this can be
+ * integrated with the logic above for spacing as not to
+ * duplicate alot of code.
+ */
+ {
+ const float * widths = pcl_palette_get_pen_widths(pgls->ppalet);
+ hpgl_real_t line_width = widths[hpgl_get_selected_pen(pgls)];
+
+ line_width /= min(fabs(user_to_plu_mat.xx), fabs(user_to_plu_mat.yy));
+ if (line_width >= spacing.x || line_width >= spacing.y) {
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_polygon));
+ return 0;
+ }
+ }
+
+ /* get rid of the current path */
+
+ hpgl_call(hpgl_clear_current_path(pgls));
+
+
+ start: /* Change direction, come back and draw crosshatch lines. */
+
+ /* hatch angles are isotropic; ie 45degrees is not affected by y scale != x scale.
+ unscaled_direction ::= user requested angle
+ direction ::= the angle that when scaled will generate user requested angle */
+
+ /* save unscaled angle */
+ unscaled_direction = direction;
+
+ /* not necessery if direction is orthogonal */
+ if ( !equal(fmod( direction, 90 ), 0 ) ) {
+ hpgl_real_t slope, scaled_slope;
+ gs_sincos_degrees(direction, &sincos);
+ /* take the tangent by dividing sin by cos. Since we know
+ the angle is non-orthogonal the cosine is non-zero */
+ slope = sin_dir / cos_dir;
+ /* scale the slope by the ratio of the scaling factors */
+ scaled_slope = (user_to_plu_mat.xx / user_to_plu_mat.yy) * slope;
+ /* preserved angle in user space */
+ direction = radians_to_degrees * atan(scaled_slope);
+ }
+
+ lines_filled = 0;
+
+ /* spacing is done with the unscaled angle
+ spacing.x .y is already scaled hence the unscaled angle is used.
+ scale * spacing * sin(unscaled_angle) */
+ gs_sincos_degrees(unscaled_direction, &sincos);
+ if (sin_dir < 0)
+ sin_dir = -sin_dir, cos_dir = -cos_dir; /* ensure y_inc >= 0 */
+ x_fill_increment = (sin_dir != 0) ? fabs(spacing.x / sin_dir) : 0;
+ y_fill_increment = (cos_dir != 0) ? fabs(spacing.y / cos_dir) : 0;
+
+ /* scaled angle is used for end point calculation
+ distance * sin( scaled_angle )
+ scale is applyed once and only once per calculation */
+ gs_sincos_degrees(direction, &sincos);
+ if (sin_dir < 0)
+ sin_dir = -sin_dir, cos_dir = -cos_dir; /* ensure y_inc >= 0 */
+
+ hpgl_call(hpgl_get_adjusted_corner( x_fill_increment,
+ y_fill_increment,
+ &bbox,
+ &pgls->g.anchor_corner,
+ &start
+ ) );
+
+ /*
+ * calculate the diagonals magnitude. Note we clip this
+ * latter in the library. If desired we could clip to the
+ * actual bbox here to save processing time. For now we simply
+ * draw all fill lines using the diagonals magnitude
+ */
+ diag_mag = hpgl_compute_distance(start.x, start.y, bbox.q.x, bbox.q.y);
+ endx = (diag_mag * cos_dir) + start.x;
+ endy = (diag_mag * sin_dir) + start.y;
+ hpgl_alternate_line_pattern_offset(pgls, lines_filled++);
+ hpgl_call(hpgl_draw_vector_absolute( pgls,
+ start.x,
+ start.y,
+ endx,
+ endy,
+ render_mode
+ ) );
+ /* Travel along +x using current spacing. */
+ if (x_fill_increment != 0) {
+ while ( endx += x_fill_increment,
+ (start.x += x_fill_increment) <= bbox.q.x ) {
+
+ hpgl_alternate_line_pattern_offset(pgls, lines_filled++);
+ hpgl_call(hpgl_draw_vector_absolute( pgls,
+ start.x,
+ start.y,
+ endx,
+ endy,
+ render_mode
+ ) );
+ }
+ }
+
+ /* Travel along +Y similarly. */
+ if (y_fill_increment != 0) {
+ /*
+ * If the slope is negative, we have to travel along the right
+ * edge of the box rather than the left edge. Fortuitously,
+ * the X loop left everything set up exactly right for this case.
+ */
+ if (cos_dir >= 0) {
+ hpgl_call(hpgl_get_adjusted_corner( x_fill_increment,
+ y_fill_increment,
+ &bbox,
+ &pgls->g.anchor_corner,
+ &start
+ ) );
+ endx = (diag_mag * cos_dir) + start.x;
+ endy = (diag_mag * sin_dir) + start.y;
+ } else
+ start.y -= y_fill_increment, endy -= y_fill_increment;
+
+ while ( endy += y_fill_increment,
+ (start.y += y_fill_increment) <= bbox.q.y ) {
+ hpgl_alternate_line_pattern_offset(pgls, lines_filled++);
+ hpgl_call(hpgl_draw_vector_absolute( pgls,
+ start.x,
+ start.y,
+ endx,
+ endy,
+ render_mode
+ ) );
+ }
+
+ }
+ if (cross) {
+ /* go back and draw the perpendicular lines, +90degress */
+ cross = false;
+ direction = unscaled_direction + 90;
+ if ( direction >= 180 )
+ direction -= 180;
+ goto start;
+ }
+ hpgl_restore_pen_state(pgls, &saved_pen_state, hpgl_pen_pos);
+ pgls->g.line.current.pattern_offset = saved_line_pattern_offset;
+ return 0;
+
+#undef sin_dir
+#undef cos_dir
+
+}
+
+/* gl/2 vector filled objects always have a white background. It can
+ be either a transparent or white. In the former case we don't have
+ to do anything. We expect the fill area of the object to already
+ be defined in the graphics state. */
+static int
+hpgl_fill_polyfill_background(hpgl_state_t *pgls)
+{
+ /* conditionally mark page as dirty */
+ pcl_mark_page_for_path(pgls);
+ /* if we are drawing on a transparent background */
+ if ( pgls->g.source_transparent )
+ return 0;
+ /* preserve the current foreground color */
+ hpgl_call(hpgl_gsave(pgls));
+ /* fill a white region. */
+ hpgl_call(gs_setgray(pgls->pgs, 1.0));
+ hpgl_call(gs_fill(pgls->pgs));
+ /* restore the foreground color */
+ hpgl_call(hpgl_grestore(pgls));
+ return 0;
+}
+
+static int
+hpgl_polyfill_using_current_line_type(
+ hpgl_state_t * pgls,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ /* gsave and grestore used to preserve the clipping region */
+ hpgl_call(hpgl_gsave(pgls));
+
+ /*
+ * Use the current path to set up a clipping path
+ * beginning at the anchor corner replicate lines
+ */
+ if (pgls->g.fill_type == hpgl_even_odd_rule)
+ hpgl_call(gs_eoclip(pgls->pgs));
+ else
+ hpgl_call(gs_clip(pgls->pgs));
+ hpgl_call(hpgl_fill_polyfill_background(pgls));
+ hpgl_call(hpgl_polyfill(pgls, render_mode));
+ hpgl_call(hpgl_grestore(pgls));
+ return 0;
+}
+
+static gs_rop3_t
+hpgl_rop(hpgl_state_t *pgls, hpgl_rendering_mode_t render_mode)
+{
+ gs_rop3_t rop = pgls->logical_op;
+ if ( render_mode == hpgl_rm_vector || render_mode == hpgl_rm_vector_fill) {
+ if ( rop == 0 || rop == 160 || rop == 170 || rop == 240 || rop == 250 || rop == 255 ) {
+ return rop;
+ } else {
+ return rop3_default;
+ }
+ }
+ return rop;
+}
+
+
+ int
+hpgl_set_drawing_color(
+ hpgl_state_t * pgls,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ int code = 0;
+ pcl_pattern_set_proc_t set_proc;
+ byte pixel_placement_mode = 0;
+ switch (render_mode) {
+
+ case hpgl_rm_clip_and_fill_polygon:
+ hpgl_call(hpgl_polyfill_using_current_line_type(pgls, render_mode));
+ return 0;
+
+ case hpgl_rm_character:
+ switch (pgls->g.character.fill_mode) {
+
+ case hpgl_char_solid_edge: /* fall through */
+ case hpgl_char_edge:
+ set_proc = pcl_pattern_get_proc_FT(hpgl_FT_pattern_solid_pen1);
+ code = set_proc(pgls, hpgl_get_selected_pen(pgls), false);
+ break;
+
+ case hpgl_char_fill:
+ case hpgl_char_fill_edge:
+ if ( (pgls->g.fill.type == hpgl_FT_pattern_one_line) ||
+ (pgls->g.fill.type == hpgl_FT_pattern_two_lines) ) {
+ hpgl_call(hpgl_polyfill_using_current_line_type( pgls,
+ render_mode
+ ) );
+ return 0;
+ } else
+ goto fill;
+
+ default:
+ dprintf("hpgl_set_drawing_color: internal error illegal fill\n");
+ return 0;
+ }
+ break;
+
+ /* fill like a polygon */
+ case hpgl_rm_polygon:
+fill:
+ /* pixel placement mode is only relevant to polygon fills */
+ pixel_placement_mode = pgls->pp_mode;
+ set_proc = pcl_pattern_get_proc_FT(pgls->g.fill.type);
+ switch (pgls->g.fill.type) {
+
+ case hpgl_FT_pattern_solid_pen1:
+ case hpgl_FT_pattern_solid_pen2:
+ /*
+ * this is documented incorrectly PCLTRM 22-12 says
+ * these should be solid black but they are actually
+ * set to the value of the current pen - (i.e pen 0 is
+ * solid white
+ */
+ code = set_proc(pgls, hpgl_get_selected_pen(pgls), false);
+ break;
+
+ case hpgl_FT_pattern_one_line:
+ case hpgl_FT_pattern_two_lines:
+ set_proc = pcl_pattern_get_proc_FT(hpgl_FT_pattern_solid_pen1);
+ code = set_proc(pgls, hpgl_get_selected_pen(pgls), false);
+ break;
+
+ case hpgl_FT_pattern_cross_hatch:
+ code = set_proc( pgls,
+ pgls->g.fill.param.pattern_type,
+ hpgl_get_selected_pen(pgls)
+ );
+ break;
+
+ case hpgl_FT_pattern_shading:
+ code = set_proc( pgls,
+ pgls->g.fill.param.shading,
+ hpgl_get_selected_pen(pgls)
+ );
+ break;
+
+ case hpgl_FT_pattern_user_defined:
+ code = set_proc( pgls,
+ pgls->g.fill.param.pattern_id,
+ hpgl_get_selected_pen(pgls)
+ );
+ break;
+
+ case hpgl_FT_pattern_RF:
+ /* pcl5e does not care about the current pen it always uses black (1). */
+ if ( pgls->personality == pcl5e )
+ code = set_proc( pgls,
+ pgls->g.fill.param.user_defined.pattern_index,
+ 1 );
+ else
+ code = set_proc( pgls,
+ pgls->g.fill.param.user_defined.pattern_index,
+ (pgls->g.fill.param.user_defined.use_current_pen
+ ? hpgl_get_selected_pen(pgls)
+ : -hpgl_get_selected_pen(pgls))
+ );
+
+ break;
+ default:
+ dprintf("hpgl_set_drawing_color: internal error illegal fill\n");
+ break;
+ }
+ break;
+
+ case hpgl_rm_vector:
+ case hpgl_rm_vector_fill:
+ set_proc = pcl_pattern_get_proc_SV(pgls->g.screen.type);
+ switch(pgls->g.screen.type) {
+
+ case hpgl_SV_pattern_solid_pen:
+ code = set_proc(pgls, hpgl_get_selected_pen(pgls), false);
+ break;
+
+ case hpgl_SV_pattern_shade:
+ code = set_proc( pgls,
+ pgls->g.screen.param.shading,
+ hpgl_get_selected_pen(pgls)
+ );
+ break;
+
+ case hpgl_SV_pattern_cross_hatch:
+ code = set_proc( pgls,
+ pgls->g.screen.param.pattern_type,
+ hpgl_get_selected_pen(pgls)
+ );
+ break;
+
+ case hpgl_SV_pattern_RF:
+ code = set_proc( pgls,
+ pgls->g.screen.param.user_defined.pattern_index,
+ (pgls->g.screen.param.user_defined.use_current_pen
+ ? hpgl_get_selected_pen(pgls)
+ : -hpgl_get_selected_pen(pgls))
+ );
+ break;
+
+ case hpgl_SV_pattern_user_defined:
+ code = set_proc( pgls,
+ pgls->g.screen.param.pattern_id,
+ hpgl_get_selected_pen(pgls)
+ );
+ break;
+
+ default:
+ dprintf("hpgl_set_drawing_color: internal error illegal fill\n");
+ break;
+ }
+ break;
+
+ default:
+ dprintf("hpgl_set_drawing_color: internal error illegal mode\n");
+ break;
+ }
+
+ if (code >= 0) {
+ gs_setrasterop(pgls->pgs, hpgl_rop(pgls, render_mode));
+ }
+ return code;
+}
+
+static int
+hpgl_set_drawing_state(
+ hpgl_state_t * pgls,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ /* do dash stuff. */
+ hpgl_call(hpgl_set_graphics_dash_state(pgls));
+
+ /* joins, caps, and line width. */
+ hpgl_call(hpgl_set_graphics_line_attribute_state(pgls, render_mode));
+
+ /* set up a clipping region */
+ hpgl_call(hpgl_set_clipping_region(pgls, render_mode));
+
+ /* set up the hpgl fills (GL's source transp. is PCL's pattern trasp. */
+ pgls->pattern_transparent = pgls->g.source_transparent;
+ hpgl_call(hpgl_set_drawing_color(pgls, render_mode));
+
+ return 0;
+}
+
+ int
+hpgl_get_current_position(
+ hpgl_state_t * pgls,
+ gs_point * pt
+)
+{
+ *pt = pgls->g.pos;
+ return 0;
+}
+
+ int
+hpgl_update_carriage_return_pos(hpgl_state_t *pgls)
+{
+ pgls->g.carriage_return_pos = pgls->g.pos;
+ return 0;
+}
+
+ int
+hpgl_set_current_position(
+ hpgl_state_t * pgls,
+ gs_point * pt
+)
+{
+ pgls->g.pos = *pt;
+ return 0;
+}
+
+ int
+hpgl_add_point_to_path(
+ hpgl_state_t * pgls,
+ floatp x,
+ floatp y,
+ hpgl_plot_function_t func,
+ bool set_ctm
+)
+{
+ static int (*const gs_procs[])(gs_state *, floatp, floatp)
+ = { hpgl_plot_function_procedures };
+
+ /* HP lunacy... if we are starting a polygon path the path
+ machinery (hpgl_plot()) has already made sure the first point
+ is a pen up - if we are drawing for some other reason the flag
+ is moot - so we set it to false. */
+ pgls->g.subpolygon_started = false;
+ if (gx_path_is_null(gx_current_path(pgls->pgs))) {
+ /* Start a new GL/2 path. */
+ gs_point current_pt;
+
+ if (set_ctm)
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(gs_newpath(pgls->pgs));
+
+ /* moveto the current position */
+ hpgl_call(hpgl_get_current_position(pgls, &current_pt));
+ hpgl_call_check_lost( gs_moveto( pgls->pgs,
+ current_pt.x,
+ current_pt.y
+ ) );
+ }
+ {
+ int code = (*gs_procs[func])(pgls->pgs, x, y);
+ if (code < 0) {
+ if (code == gs_error_limitcheck)
+ hpgl_set_lost_mode(pgls, hpgl_lost_mode_entered);
+ } else {
+ gs_point point;
+
+ if (hpgl_plot_is_absolute(func))
+ hpgl_set_lost_mode(pgls, hpgl_lost_mode_cleared);
+
+ /* update hpgl's state position */
+ if (hpgl_plot_is_absolute(func)) {
+ point.x = x;
+ point.y = y;
+ } else {
+ hpgl_call(hpgl_get_current_position(pgls, &point));
+ point.x += x; point.y += y;
+ }
+ hpgl_call(hpgl_set_current_position(pgls, &point));
+ }
+ }
+ return 0;
+}
+
+/* destroy the current path. */
+ int
+hpgl_clear_current_path(hpgl_state_t *pgls)
+{
+ hpgl_call(gs_newpath(pgls->pgs));
+ return 0;
+}
+
+/* closes the current path, making the first point and last point coincident */
+ int
+hpgl_close_current_path(hpgl_state_t *pgls)
+{
+ hpgl_call(gs_closepath(pgls->pgs));
+ return 0;
+}
+
+/* converts pcl coordinate to device space and back to hpgl space */
+ int
+hpgl_add_pcl_point_to_path(hpgl_state_t *pgls, const gs_point *pcl_pt)
+{
+ gs_point dev_pt, hpgl_pt;
+
+ hpgl_call(hpgl_clear_current_path(pgls));
+ pcl_set_ctm(pgls, true);
+ hpgl_call(gs_transform(pgls->pgs, pcl_pt->x, pcl_pt->y, &dev_pt));
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(gs_itransform(pgls->pgs, dev_pt.x, dev_pt.y, &hpgl_pt));
+ hpgl_call(hpgl_add_point_to_path(pgls, hpgl_pt.x, hpgl_pt.y,
+ hpgl_plot_move_absolute, true));
+ return 0;
+}
+
+static floatp
+compute_chord_angle(floatp chord_angle)
+{
+ floatp ca = fmod(chord_angle, 360);
+ if (ca >= 0) {
+ if (ca > 180)
+ ca = 360 - ca;
+ if (ca < 5)
+ ca = 5;
+ } else /* negative ca */ {
+ if (ca > -5)
+ ca = -5;
+ }
+ return ca;
+}
+
+ int
+hpgl_add_arc_to_path(hpgl_state_t *pgls, floatp center_x, floatp center_y,
+ floatp radius, floatp start_angle, floatp sweep_angle,
+ floatp chord_angle, bool start_moveto, hpgl_plot_function_t draw,
+ bool set_ctm)
+{
+ floatp num_chordsf = sweep_angle / compute_chord_angle(chord_angle);
+ int num_chords = (int)(num_chordsf >= 0.0 ? ceil(num_chordsf) : floor(num_chordsf));
+ floatp integral_chord_angle = fabs(sweep_angle / num_chords);
+ int i;
+ floatp arccoord_x, arccoord_y;
+
+ (void)hpgl_compute_arc_coords(radius, center_x, center_y,
+ start_angle,
+ &arccoord_x, &arccoord_y);
+ hpgl_call(hpgl_add_point_to_path(pgls, arccoord_x, arccoord_y,
+ (draw && !start_moveto ?
+ hpgl_plot_draw_absolute :
+ hpgl_plot_move_absolute), set_ctm));
+
+ for ( i = 0; i < abs(num_chords); i++ ) {
+ if (sweep_angle > 0)
+ start_angle += integral_chord_angle;
+ else
+ start_angle -= integral_chord_angle;
+ hpgl_compute_arc_coords(radius, center_x, center_y,
+ start_angle, &arccoord_x, &arccoord_y);
+ hpgl_call(hpgl_add_point_to_path(pgls, arccoord_x, arccoord_y,
+ (draw ? hpgl_plot_draw_absolute :
+ hpgl_plot_move_absolute), set_ctm));
+ }
+ /* NB this is suspicious - why not any +- multiple of 360 if this
+ is correct at all. */
+ if (sweep_angle - 360.0 > -0.0001)
+ hpgl_call(hpgl_close_current_path(pgls));
+ return 0;
+}
+
+/* add a 3 point arc to the path */
+ int
+hpgl_add_arc_3point_to_path(hpgl_state_t *pgls, floatp start_x, floatp
+ start_y, floatp inter_x, floatp inter_y,
+ floatp end_x, floatp end_y, floatp chord_angle,
+ hpgl_plot_function_t draw)
+{
+ /* handle unusual cases as per pcltrm */
+ if ( hpgl_3_same_points(start_x, start_y,
+ inter_x, inter_y,
+ end_x, end_y) )
+ {
+ hpgl_call(hpgl_add_point_to_path(pgls, start_x, start_y, draw, true));
+ return 0;
+ }
+ if ( hpgl_3_no_intermediate(start_x, start_y,
+ inter_x, inter_y,
+ end_x, end_y) )
+ {
+ hpgl_call(hpgl_add_point_to_path(pgls, start_x, start_y, draw, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, end_x, end_y, draw, true));
+ return 0;
+ }
+ if ( hpgl_3_same_endpoints(start_x, start_y,
+ inter_x, y_inter,
+ end_x, end_y) )
+ {
+ hpgl_call(hpgl_add_arc_to_path(pgls, (start_x + inter_x) / 2.0,
+ (start_y + inter_y) / 2.0,
+ (hypot((inter_x - start_x),
+ (inter_y - start_y)) / 2.0),
+ 0.0, 360.0, chord_angle, false,
+ draw, true));
+ return 0;
+ }
+
+ if ( hpgl_3_colinear_points(start_x, start_y, inter_x, inter_y, end_x, end_y) )
+ {
+ if ( hpgl_3_intermediate_between(start_x, start_y,
+ inter_x, inter_y,
+ end_x, end_y) )
+ {
+ hpgl_call(hpgl_add_point_to_path(pgls, start_x, start_y, draw, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, end_x, end_x, draw, true));
+ }
+ else
+ {
+ hpgl_call(hpgl_add_point_to_path(pgls, start_x, start_y, draw, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, inter_x, inter_y, draw, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, end_x, end_y, draw, true));
+ }
+ return 0;
+ }
+
+ /* normal 3 point arc case */
+ {
+ hpgl_real_t center_x, center_y, radius;
+ hpgl_real_t start_angle, inter_angle, end_angle;
+ hpgl_real_t sweep_angle;
+
+ hpgl_call(hpgl_compute_arc_center(start_x, start_y,
+ inter_x, inter_y,
+ end_x, end_y,
+ &center_x, &center_y));
+
+ radius = hypot(start_x - center_x, start_y - center_y);
+ start_angle = radians_to_degrees *
+ hpgl_compute_angle(start_x - center_x, start_y - center_y);
+
+ inter_angle = radians_to_degrees *
+ hpgl_compute_angle(inter_x - center_x, inter_y - center_y);
+
+ end_angle = radians_to_degrees *
+ hpgl_compute_angle(end_x - center_x, end_y - center_y);
+ sweep_angle = end_angle - start_angle;
+
+ /*
+ * Figure out which direction to draw the arc, depending on the
+ * relative position of start, inter, and end. Case analysis
+ * shows that we should draw the arc counter-clockwise from S to
+ * E iff exactly 2 of S<I, I<E, and E<S are true, and clockwise
+ * if exactly 1 of these relations is true. (These are the only
+ * possible cases if no 2 of the points coincide.)
+ */
+
+ if ( (start_angle < inter_angle) + (inter_angle < end_angle) +
+ (end_angle < start_angle) == 1
+ )
+ {
+ if ( sweep_angle > 0 )
+ sweep_angle -= 360;
+ }
+ else
+ {
+ if ( sweep_angle < 0 )
+ sweep_angle += 360;
+ }
+
+ hpgl_call(hpgl_add_arc_to_path(pgls, center_x, center_y,
+ radius, start_angle, sweep_angle,
+ (sweep_angle < 0.0 ) ?
+ -chord_angle : chord_angle, false,
+ draw, true));
+ return 0;
+ }
+}
+
+/* Bezier's are handled a bit differently than arcs as we use the
+ gs_curveto() operator directly in lieue of flattening and using
+ gs_moveto() and gs_lineto(). */
+
+ int
+hpgl_add_bezier_to_path(hpgl_state_t *pgls, floatp x1, floatp y1,
+ floatp x2, floatp y2, floatp x3, floatp y3,
+ floatp x4, floatp y4, hpgl_plot_function_t draw)
+{
+ gx_path * ppath = gx_current_path(pgls->pgs);
+ /* Don't add superflous points in polygon mode */
+ if ( ( !pgls->g.polygon_mode ) ||
+ ( !ppath->current_subpath ) )
+ hpgl_call(hpgl_add_point_to_path(pgls, x1, y1,
+ draw ?
+ hpgl_plot_draw_absolute :
+ hpgl_plot_move_absolute, true));
+ if ( draw )
+ hpgl_call(gs_curveto(pgls->pgs, x2, y2, x3, y3, x4, y4));
+ /* update hpgl's state position to last point of the curve. */
+ {
+ gs_point point;
+ point.x = x4; point.y = y4;
+ hpgl_call(hpgl_set_current_position(pgls, &point));
+ }
+ return 0;
+}
+
+/*
+ * an implicit gl/2 style closepath. If the first and last point are
+ * the same the path gets closed. HAS - eliminate CSE gx_current_path
+ */
+ int
+hpgl_close_path(
+ hpgl_state_t * pgls
+)
+{
+ gs_point first, last;
+ gs_fixed_point first_device;
+ gx_path *ppath = gx_current_path(pgls->pgs);
+ if (!ppath->current_subpath)
+ return 0;
+ /* if we do not have a subpath there is nothing to do, get the
+ first points of the path in device space and convert to floats */
+ if ( gx_path_subpath_start_point(gx_current_path(pgls->pgs),
+ &first_device) < 0 )
+ return 0;
+ first.x = fixed2float(first_device.x);
+ first.y = fixed2float(first_device.y);
+ /* get gl/2 current position -- always current units */
+ hpgl_call(hpgl_get_current_position(pgls, &last));
+ /* convert to device space using the current ctm */
+ hpgl_call(gs_transform(pgls->pgs, last.x, last.y, &last));
+ /*
+ * if the first and last are the same close the path (i.e
+ * force gs to apply join and miter)
+ */
+ if (equal(first.x, last.x) && equal(first.y, last.y))
+ hpgl_call(gs_closepath(pgls->pgs));
+ return 0;
+}
+
+
+/* To implement centered we move the points in the path to a pixel boundary.
+ Note this routine is sensitive to the orientation of the device.
+ Since rounding 0.5 is used here and 0.5 fill adjust this can fail to reduce and
+ object in size by 1 pixel left/bottom for some user scale factors. This is not a
+ grave concern as the objects will still seam together. */
+
+int
+hpgl_set_special_pixel_placement(hpgl_state_t *pgls, hpgl_rendering_mode_t render_mode)
+{
+ if ( pgls->pp_mode == 1 ) {
+ gs_matrix default_matrix;
+ gs_point distance, adjust;
+ gx_path *ppath = gx_current_path(pgls->pgs);
+ /* arbitrary just need the signs after transformation to
+ device space */
+ gs_setfilladjust(pgls->pgs, 0, 0);
+ adjust.x = -1;
+ adjust.y = -1;
+ /* determine the adjustment in device space */
+ hpgl_call(gs_defaultmatrix(pgls->pgs, &default_matrix));
+ hpgl_call(gs_distance_transform(adjust.x, adjust.y, &default_matrix, &distance));
+ /* modify the path but first it should be "unshared" so the
+ translation (next statement) does not update the polygon
+ buffer */
+ hpgl_call(gx_path_unshare(ppath));
+
+ /* translate all points in the path by the adjustment. */
+ hpgl_call(gx_path_translate(ppath,
+ float2fixed(distance.x / fabs(distance.x)),
+ float2fixed(distance.y / fabs(distance.y))));
+ }
+ return 0;
+}
+
+/*
+ * Draw (stroke or fill) the current path.
+ */
+ int
+hpgl_draw_current_path(
+ hpgl_state_t * pgls,
+ hpgl_rendering_mode_t render_mode
+)
+{
+ gs_state * pgs = pgls->pgs;
+ pcl_pattern_set_proc_t set_proc;
+ int code = 0;
+ gx_path * ppath = gx_current_path(pgls->pgs);
+
+ /* check if we have a current path - we don't need the current
+ point */
+ if (!ppath->current_subpath) {
+ hpgl_call(hpgl_clear_current_path(pgls));
+ return 0;
+ }
+
+ if ( render_mode == hpgl_rm_vector_no_close )
+ render_mode = hpgl_rm_vector;
+ else
+ hpgl_call(hpgl_close_path(pgls));
+
+ hpgl_call(hpgl_set_drawing_state(pgls, render_mode));
+
+ switch (render_mode) {
+ case hpgl_rm_character:
+ {
+ /* HAS need to set attributes in set_drawing color (next 2) */
+
+ /* Intellifonts require eofill, but TrueType require fill. */
+ /****** HACK: look at the scaling technology of ******/
+ /****** the current font to decide. ******/
+ int (*fill)(gs_state *);
+
+ if (pgls->g.font->scaling_technology == plfst_Intellifont)
+ fill = gs_eofill;
+ else
+ fill = gs_fill;
+
+ switch (pgls->g.character.fill_mode) {
+
+ case hpgl_char_solid_edge:
+ set_proc = pcl_pattern_get_proc_FT(hpgl_FT_pattern_solid_pen1);
+ if ((code = set_proc(pgls, hpgl_get_selected_pen(pgls), false)) < 0)
+ return code;
+ hpgl_call((*fill)(pgs));
+ /* falls through */
+
+ case hpgl_char_edge:
+ if (pgls->g.bitmap_fonts_allowed)
+ break; /* no edging */
+ set_proc = pcl_pattern_get_proc_FT(hpgl_FT_pattern_solid_pen1);
+ if ((code = set_proc(pgls, hpgl_get_character_edge_pen(pgls), false)) < 0)
+ return code;
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+ {
+ gs_point scale = hpgl_current_char_scale(pgls);
+ /* NB fix and comment */
+ hpgl_call(gs_setlinewidth(pgls->pgs, min(scale.x, scale.y) * 0.0375 * 0.2835));
+ }
+ pcl_mark_page_for_path(pgls);
+ hpgl_call(gs_stroke(pgls->pgs));
+ break;
+
+ case hpgl_char_fill:
+ /* the fill has already been done if the fill type is
+ hpgl/2 vector fills. This was handled when we set
+ the drawing color */
+ if ((pgls->g.fill.type != hpgl_FT_pattern_one_line) &&
+ (pgls->g.fill.type != hpgl_FT_pattern_two_lines))
+ hpgl_call((*fill)(pgs));
+ else
+ hpgl_call(hpgl_clear_current_path(pgls));
+ break;
+ case hpgl_char_fill_edge:
+ /* the fill has already been done if the fill type is
+ hpgl/2 vector fills. This was handled when we set
+ the drawing color. gsave to preserve the path for
+ subsequent edging */
+ if ((pgls->g.fill.type != hpgl_FT_pattern_one_line) &&
+ (pgls->g.fill.type != hpgl_FT_pattern_two_lines)) {
+ hpgl_call(hpgl_gsave(pgls));
+ /* all character fills appear to have 0 fill adjustment */
+ gs_setfilladjust(pgls->pgs, 0, 0);
+ hpgl_call((*fill)(pgs));
+ hpgl_call(hpgl_grestore(pgls));
+ }
+ if (pgls->g.bitmap_fonts_allowed) /* no edging */
+ hpgl_call(hpgl_clear_current_path(pgls));
+ else {
+ set_proc = pcl_pattern_get_proc_FT(hpgl_FT_pattern_solid_pen1);
+ if ((code = set_proc(pgls, hpgl_get_character_edge_pen(pgls), false)) < 0)
+ return code;
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+ /* use the default raster operation for the edge. It
+ is automaticall restored next drawing operation */
+ hpgl_call(gs_setrasterop(pgls->pgs, (gs_rop3_t)252));
+ hpgl_call(gs_setlinewidth(pgls->pgs,
+ pgls->g.font_selection[pgls->g.font_selected].params.height_4ths * 0.0375));
+ hpgl_call(gs_stroke(pgls->pgs));
+ }
+ break;
+
+ }
+ break;
+ }
+ break;
+ case hpgl_rm_polygon:
+ hpgl_set_special_pixel_placement(pgls, hpgl_rm_polygon);
+ pcl_mark_page_for_path(pgls);
+ if (pgls->g.fill_type == hpgl_even_odd_rule)
+ hpgl_call(gs_eofill(pgs));
+ else /* hpgl_winding_number_rule */
+ hpgl_call(gs_fill(pgs));
+ break;
+
+ case hpgl_rm_clip_and_fill_polygon:
+ /*
+ * A bizarre HPISM - If the pen is white we do a solid
+ * white fill this is true for *all* fill types (arg!) as
+ * tested on the 6mp. If pen 1 (black)
+ * hpgl_set_drawing_color() handles this case by drawing
+ * the lines that comprise the vector fill
+ */
+ if (hpgl_get_selected_pen(pgls) == 0) {
+ pcl_mark_page_for_path(pgls);
+ hpgl_call(gs_fill(pgls->pgs));
+ }
+ hpgl_call(hpgl_clear_current_path(pgls));
+ break;
+
+ case hpgl_rm_vector:
+ case hpgl_rm_vector_fill:
+ /*
+ * we reset the ctm before stroking to preserve the line width
+ * information, then restore the ctm.
+ */
+ {
+ gs_matrix save_ctm;
+ int save_scaling_type = pgls->g.scaling_type;
+
+ hpgl_call(gs_currentmatrix(pgs, &save_ctm));
+
+ /* force no picture frame scaling */
+ pgls->g.scaling_type = hpgl_scaling_point_factor;
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+ pgls->g.scaling_type = save_scaling_type;
+
+ /* NB: what does reversing the path do? Currently DEAD code see pglfill.c */
+ if ( !pgls->g.line.current.is_solid && (pgls->g.line.current.type == 0) )
+ hpgl_call(gs_reversepath(pgls->pgs));
+ pcl_mark_page_for_path(pgls);
+ hpgl_call(gs_stroke(pgls->pgs));
+ gs_setmatrix(pgs, &save_ctm);
+ break;
+ }
+ default :
+ dprintf("unknown render mode\n");
+ }
+
+ return 0;
+}
+
+ int
+hpgl_copy_current_path_to_polygon_buffer(
+ hpgl_state_t * pgls
+)
+{
+ gx_path * ppath = gx_current_path(pgls->pgs);
+ gx_path_assign_preserve(&pgls->g.polygon.buffer.path, ppath);
+ return 0;
+}
+
+ int
+hpgl_copy_polygon_buffer_to_current_path(
+ hpgl_state_t * pgls
+)
+{
+ gx_path * ppath = gx_current_path(pgls->pgs);
+ gx_path_assign_preserve(ppath, &pgls->g.polygon.buffer.path);
+ return 0;
+}
diff --git a/pcl/pgdraw.h b/pcl/pgdraw.h
new file mode 100644
index 000000000..ff4e7112e
--- /dev/null
+++ b/pcl/pgdraw.h
@@ -0,0 +1,117 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgdraw.h */
+/* Definitions for HP-GL/2 line drawing/path building routines */
+
+#ifndef pgdraw_INCLUDED
+# define pgdraw_INCLUDED
+
+/* set plu ctm, exported only so that labels can ignore scaling */
+int hpgl_set_plu_ctm(hpgl_state_t *pgls);
+
+/* compute the scaling transformation from plu to user units */
+int hpgl_compute_user_units_to_plu_ctm(const hpgl_state_t *pgls,
+ gs_matrix *pmat);
+
+/* The following 2 functions can be used together to calculate a ctm
+ without picture frame scaling. */
+int hpgl_set_pcl_to_plu_ctm(hpgl_state_t *pgls);
+
+int hpgl_set_user_units_to_plu_ctm(const hpgl_state_t *pgls);
+
+/* set (user units) ctm */
+int hpgl_set_ctm(hpgl_state_t *pgls);
+
+int hpgl_get_selected_pen(hpgl_state_t *pgls);
+
+/* set the hpgl/2 clipping region accounting for pcl picture frame and
+ gl/2 soft clip window */
+ int
+hpgl_set_clipping_region(hpgl_state_t *pgls, hpgl_rendering_mode_t render_mode);
+
+/* function set up the current drawing attributes this is only used by
+ the character code since it does most of it's own graphic's state
+ bookkeeping */
+int hpgl_set_drawing_color(hpgl_state_t *pgls, hpgl_rendering_mode_t render_mode);
+
+/* function to get the current hpgl/2 state position */
+int hpgl_get_current_position(hpgl_state_t *pgls, gs_point *pt);
+
+/* update the carriage return position to the current gl/2 positiion */
+ int
+hpgl_update_carriage_return_pos(hpgl_state_t *pgls);
+
+/* function to set the current hpgl/2 state position */
+int hpgl_set_current_position(hpgl_state_t *pgls, gs_point *pt);
+
+/* puts a point into the path using the operation specified by func */
+int hpgl_add_point_to_path(hpgl_state_t *pgls, floatp x, floatp y,
+ hpgl_plot_function_t func, bool set_ctm);
+
+/* puts an arc into the current path. start moveto indicates that we
+ use moveto to go from the arc center to arc circumference. */
+int hpgl_add_arc_to_path(hpgl_state_t *pgls, floatp center_x,
+ floatp center_y, floatp radius,
+ floatp start_angle, floatp sweep_angle,
+ floatp chord_angle, bool start_moveto,
+ hpgl_plot_function_t draw, bool set_ctm);
+
+/* puts a 3 point arc into the current path. Note that the
+ decomposition is a bit different for 3 point arcs since the polygon
+ wedge routines use this function as well */
+int hpgl_add_arc_3point_to_path(hpgl_state_t *pgls, floatp start_x, floatp
+ start_y, floatp inter_x, floatp inter_y,
+ floatp end_x, floatp end_y, floatp chord_angle,
+ hpgl_plot_function_t draw);
+
+int hpgl_close_path(hpgl_state_t *pgls);
+
+/* put bezier into the current path */
+int hpgl_add_bezier_to_path(hpgl_state_t *pgls, floatp x1,
+ floatp y1, floatp x2, floatp y2,
+ floatp x3, floatp y3, floatp x4,
+ floatp y4, hpgl_plot_function_t draw);
+
+/* clears the current path with stroke or fill */
+int hpgl_draw_current_path(hpgl_state_t *pgls,
+ hpgl_rendering_mode_t render_mode);
+
+/* save/restore gs graphics state + HPGL/2's first moveto state */
+#define hpgl_gsave(pgls) pcl_gsave(pgls)
+#define hpgl_grestore(pgls) pcl_grestore(pgls)
+
+/* path copying for polygons rendering */
+int hpgl_copy_polygon_buffer_to_current_path(hpgl_state_t *pgls);
+
+int hpgl_copy_current_path_to_polygon_buffer(hpgl_state_t *pgls);
+
+/* draw the current path with stroke or fill, but do not clear */
+int hpgl_draw_and_preserve_path(hpgl_state_t *pgls,
+ hpgl_rendering_mode_t render_mode);
+
+/* destroy the current path */
+int hpgl_clear_current_path(hpgl_state_t *pgls);
+
+/* closes the current path, making the first point and last point coincident */
+int hpgl_close_current_path(hpgl_state_t *pgls);
+
+/* adds a pcl point to the current path */
+int hpgl_add_pcl_point_to_path(hpgl_state_t *pgls, const gs_point *pcl_point);
+
+/* closes a subpolygon; PM1 or CI */
+int hpgl_close_subpolygon(hpgl_state_t *pgls);
+
+hpgl_real_t hpgl_width_scale(hpgl_state_t *pgls);
+
+#endif /* pgdraw_INCLUDED */
diff --git a/pcl/pgfdata.c b/pcl/pgfdata.c
new file mode 100644
index 000000000..69ba3c7f6
--- /dev/null
+++ b/pcl/pgfdata.c
@@ -0,0 +1,5166 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgfdata.c */
+/* HP-GL/2 stick and arc font data */
+#include "std.h"
+#include "gstypes.h"
+#include "gsccode.h"
+#include "gsstate.h"
+#include "gspath.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gxarith.h" /* for any_abs */
+#include "pgfdata.h"
+
+
+/* Font data consists of instructions for each character.
+ Fonts are on a 1024x1024 grid. */
+
+#define FNT_MOVETO 1
+#define FNT_LINETO 2
+#define FNT_CURVETO 3
+
+const short int stick_font_data[] = {
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 32, 0,
+ FNT_LINETO, 32, 65,
+ FNT_LINETO, 0, 65,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 32, 992,
+ FNT_LINETO, 32, 319,
+
+ FNT_MOVETO, 449, 1056,
+ FNT_LINETO, 449, 768,
+ FNT_MOVETO, 191, 768,
+ FNT_LINETO, 191, 1056,
+
+ FNT_MOVETO, 672, 352,
+ FNT_LINETO, 0, 352,
+ FNT_MOVETO, 672, 640,
+ FNT_LINETO, 0, 640,
+ FNT_MOVETO, 352, 992,
+ FNT_LINETO, 96, 0,
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 352, 0,
+
+ FNT_MOVETO, 640, 800,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 512, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 32, 575,
+ FNT_LINETO, 128, 512,
+ FNT_LINETO, 544, 480,
+ FNT_LINETO, 640, 416,
+ FNT_LINETO, 672, 319,
+ FNT_LINETO, 672, 191,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 0, 193,
+ FNT_MOVETO, 321, 1089,
+ FNT_LINETO, 321, -128,
+
+ FNT_MOVETO, 384, 96,
+ FNT_LINETO, 416, 32,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 577, 0,
+ FNT_LINETO, 640, 32,
+ FNT_LINETO, 672, 96,
+ FNT_LINETO, 672, 224,
+ FNT_LINETO, 640, 288,
+ FNT_LINETO, 575, 321,
+ FNT_LINETO, 480, 321,
+ FNT_LINETO, 416, 288,
+ FNT_LINETO, 384, 224,
+ FNT_LINETO, 384, 96,
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 640, 928,
+ FNT_MOVETO, 0, 703,
+ FNT_LINETO, 32, 640,
+ FNT_LINETO, 96, 608,
+ FNT_LINETO, 193, 608,
+ FNT_LINETO, 256, 640,
+ FNT_LINETO, 288, 705,
+ FNT_LINETO, 288, 833,
+ FNT_LINETO, 256, 896,
+ FNT_LINETO, 191, 928,
+ FNT_LINETO, 96, 928,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 831,
+ FNT_LINETO, 0, 703,
+
+ FNT_MOVETO, 160, 577,
+ FNT_LINETO, 32, 480,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 0, 191,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 224, 0,
+ FNT_LINETO, 449, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 672, 224,
+ FNT_LINETO, 672, 384,
+ FNT_MOVETO, 608, 768,
+ FNT_LINETO, 608, 864,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 224, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 96, 864,
+ FNT_LINETO, 96, 703,
+ FNT_LINETO, 128, 608,
+ FNT_LINETO, 672, 0,
+
+ FNT_MOVETO, 321, 768,
+ FNT_LINETO, 384, 833,
+ FNT_LINETO, 384, 992,
+ FNT_LINETO, 319, 992,
+ FNT_LINETO, 319, 928,
+ FNT_LINETO, 384, 928,
+
+ FNT_MOVETO, 705, 1184,
+ FNT_LINETO, 608, 1056,
+ FNT_LINETO, 544, 896,
+ FNT_LINETO, 512, 736,
+ FNT_LINETO, 512, 319,
+ FNT_LINETO, 544, 160,
+ FNT_LINETO, 608, 0,
+ FNT_LINETO, 705, -128,
+
+ FNT_MOVETO, 0, 1184,
+ FNT_LINETO, 96, 1056,
+ FNT_LINETO, 160, 896,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 193, 319,
+ FNT_LINETO, 160, 160,
+ FNT_LINETO, 96, 0,
+ FNT_LINETO, 0, -128,
+
+ FNT_MOVETO, 672, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 577, 896,
+ FNT_LINETO, 96, 128,
+ FNT_MOVETO, 577, 128,
+ FNT_LINETO, 96, 896,
+
+ FNT_MOVETO, 672, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 321, 896,
+ FNT_LINETO, 321, 128,
+
+ FNT_MOVETO, 0, -160,
+ FNT_LINETO, 65, -96,
+ FNT_LINETO, 65, 65,
+ FNT_LINETO, 0, 65,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 65, 0,
+
+ FNT_MOVETO, 672, 480,
+ FNT_LINETO, 0, 480,
+
+ FNT_MOVETO, 320, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 384, 65,
+ FNT_LINETO, 319, 65,
+ FNT_LINETO, 320, 0,
+
+ FNT_MOVETO, 672, 1088,
+ FNT_LINETO, 0, -128,
+
+ FNT_MOVETO, 640, 352,
+ FNT_LINETO, 640, 640,
+ FNT_LINETO, 608, 800,
+ FNT_LINETO, 544, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 384, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 160, 959,
+ FNT_LINETO, 96, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 256, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 608, 193,
+ FNT_LINETO, 640, 352,
+
+ FNT_MOVETO, 416, 0,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 160, 608,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 160, 0,
+
+ FNT_MOVETO, 32, 800,
+ FNT_LINETO, 65, 896,
+ FNT_LINETO, 160, 961,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 449, 992,
+ FNT_LINETO, 544, 959,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 672, 800,
+ FNT_LINETO, 672, 608,
+ FNT_LINETO, 640, 512,
+ FNT_LINETO, 544, 447,
+ FNT_LINETO, 319, 416,
+ FNT_LINETO, 128, 352,
+ FNT_LINETO, 63, 288,
+ FNT_LINETO, 32, 224,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 672, 0,
+
+ FNT_MOVETO, 449, 512,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 640, 416,
+ FNT_LINETO, 672, 319,
+ FNT_LINETO, 672, 191,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 575, 32,
+ FNT_LINETO, 447, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 0, 128,
+ FNT_MOVETO, 256, 512,
+ FNT_LINETO, 449, 512,
+ FNT_LINETO, 544, 544,
+ FNT_LINETO, 608, 608,
+ FNT_LINETO, 640, 705,
+ FNT_LINETO, 640, 800,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 224, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 32, 864,
+
+ FNT_MOVETO, 672, 224,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 577, 992,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 577, 32,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 672, 193,
+ FNT_LINETO, 672, 449,
+ FNT_LINETO, 640, 544,
+ FNT_LINETO, 575, 608,
+ FNT_LINETO, 480, 640,
+ FNT_LINETO, 191, 640,
+ FNT_LINETO, 96, 608,
+ FNT_LINETO, 0, 480,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 640, 992,
+
+ FNT_MOVETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 191, 992,
+ FNT_LINETO, 96, 959,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 768,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 577, 32,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 672, 193,
+ FNT_LINETO, 672, 384,
+ FNT_LINETO, 640, 480,
+ FNT_LINETO, 575, 544,
+ FNT_LINETO, 480, 577,
+ FNT_LINETO, 191, 577,
+ FNT_LINETO, 96, 544,
+ FNT_LINETO, 32, 480,
+ FNT_LINETO, 0, 384,
+
+ FNT_MOVETO, 160, 0,
+ FNT_LINETO, 672, 992,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 0, 321,
+ FNT_LINETO, 0, 191,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 577, 32,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 672, 193,
+ FNT_LINETO, 672, 321,
+ FNT_LINETO, 640, 416,
+ FNT_LINETO, 575, 480,
+ FNT_LINETO, 480, 512,
+ FNT_LINETO, 191, 512,
+ FNT_LINETO, 96, 480,
+ FNT_LINETO, 32, 416,
+ FNT_LINETO, 0, 321,
+ FNT_MOVETO, 449, 512,
+ FNT_LINETO, 544, 544,
+ FNT_LINETO, 608, 608,
+ FNT_LINETO, 640, 705,
+ FNT_LINETO, 640, 800,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 447, 992,
+ FNT_LINETO, 224, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 32, 703,
+ FNT_LINETO, 65, 608,
+ FNT_LINETO, 128, 544,
+ FNT_LINETO, 224, 512,
+
+ FNT_MOVETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 577, 32,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 672, 224,
+ FNT_LINETO, 672, 768,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 191, 992,
+ FNT_LINETO, 96, 959,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 800,
+ FNT_LINETO, 0, 608,
+ FNT_LINETO, 32, 512,
+ FNT_LINETO, 96, 447,
+ FNT_LINETO, 193, 416,
+ FNT_LINETO, 480, 416,
+ FNT_LINETO, 577, 449,
+ FNT_LINETO, 640, 512,
+ FNT_LINETO, 672, 608,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 65, 0,
+ FNT_LINETO, 65, 65,
+ FNT_LINETO, 0, 65,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 672,
+ FNT_LINETO, 65, 672,
+ FNT_LINETO, 65, 736,
+ FNT_LINETO, 0, 736,
+ FNT_LINETO, 0, 672,
+
+ FNT_MOVETO, 0, -160,
+ FNT_LINETO, 65, -96,
+ FNT_LINETO, 65, 65,
+ FNT_LINETO, 0, 65,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 65, 0,
+ FNT_MOVETO, 0, 672,
+ FNT_LINETO, 65, 672,
+ FNT_LINETO, 65, 736,
+ FNT_LINETO, 0, 736,
+ FNT_LINETO, 0, 672,
+
+ FNT_MOVETO, 672, 160,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 672, 864,
+
+ FNT_MOVETO, 672, 608,
+ FNT_LINETO, 0, 608,
+ FNT_MOVETO, 672, 352,
+ FNT_LINETO, 0, 352,
+
+ FNT_MOVETO, 0, 160,
+ FNT_LINETO, 672, 512,
+ FNT_LINETO, 0, 864,
+
+ FNT_MOVETO, 160, 0,
+ FNT_LINETO, 224, 0,
+ FNT_LINETO, 224, 65,
+ FNT_LINETO, 160, 65,
+ FNT_LINETO, 160, 0,
+ FNT_MOVETO, 193, 288,
+ FNT_LINETO, 193, 384,
+ FNT_LINETO, 256, 449,
+ FNT_LINETO, 449, 544,
+ FNT_LINETO, 480, 640,
+ FNT_LINETO, 480, 833,
+ FNT_LINETO, 447, 928,
+ FNT_LINETO, 319, 992,
+ FNT_LINETO, 160, 992,
+ FNT_LINETO, 32, 928,
+ FNT_LINETO, 0, 831,
+
+ FNT_MOVETO, 672, 577,
+ FNT_LINETO, 608, 672,
+ FNT_LINETO, 512, 705,
+ FNT_LINETO, 352, 705,
+ FNT_LINETO, 256, 672,
+ FNT_LINETO, 191, 575,
+ FNT_LINETO, 191, 384,
+ FNT_LINETO, 256, 288,
+ FNT_LINETO, 352, 256,
+ FNT_LINETO, 512, 256,
+ FNT_LINETO, 608, 288,
+ FNT_LINETO, 672, 384,
+ FNT_LINETO, 672, 768,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 447, 992,
+ FNT_LINETO, 224, 992,
+ FNT_LINETO, 96, 959,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 768,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 224, 0,
+ FNT_LINETO, 608, 0,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+
+ FNT_MOVETO, 0, 992,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 480, 512,
+ FNT_LINETO, 544, 544,
+ FNT_LINETO, 608, 608,
+ FNT_LINETO, 640, 705,
+ FNT_LINETO, 640, 800,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 480, 512,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 640, 416,
+ FNT_LINETO, 672, 319,
+ FNT_LINETO, 672, 191,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 575, 32,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 512,
+
+ FNT_MOVETO, 640, 768,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 224,
+
+ FNT_MOVETO, 0, 992,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 577, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 800,
+ FNT_LINETO, 575, 896,
+ FNT_LINETO, 512, 961,
+ FNT_LINETO, 384, 992,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 544, 512,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 512, 512,
+
+ FNT_MOVETO, 640, 800,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 577, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 449,
+ FNT_LINETO, 352, 449,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 672, 512,
+ FNT_LINETO, 0, 512,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 992,
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 608, 0,
+ FNT_LINETO, 96, 0,
+
+ FNT_MOVETO, 0, 384,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 577, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 384,
+ FNT_LINETO, 672, 992,
+
+ FNT_MOVETO, 0, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 224, 512,
+ FNT_LINETO, 640, 992,
+ FNT_MOVETO, 224, 512,
+ FNT_LINETO, 672, 0,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 672, 992,
+ FNT_LINETO, 352, 256,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+
+ FNT_MOVETO, 0, 416,
+ FNT_LINETO, 480, 416,
+ FNT_LINETO, 577, 449,
+ FNT_LINETO, 640, 512,
+ FNT_LINETO, 672, 608,
+ FNT_LINETO, 672, 800,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 416, 384,
+
+ FNT_MOVETO, 0, 416,
+ FNT_LINETO, 480, 416,
+ FNT_LINETO, 577, 449,
+ FNT_LINETO, 640, 512,
+ FNT_LINETO, 672, 608,
+ FNT_LINETO, 672, 800,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 672, 224,
+ FNT_LINETO, 640, 321,
+ FNT_LINETO, 575, 384,
+ FNT_LINETO, 480, 416,
+
+ FNT_MOVETO, 672, 800,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 191, 992,
+ FNT_LINETO, 96, 959,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 800,
+ FNT_LINETO, 0, 703,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 544,
+ FNT_LINETO, 193, 512,
+ FNT_LINETO, 480, 480,
+ FNT_LINETO, 577, 447,
+ FNT_LINETO, 640, 384,
+ FNT_LINETO, 672, 288,
+ FNT_LINETO, 672, 191,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 575, 32,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 0, 193,
+
+ FNT_MOVETO, 352, 992,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 640, 191,
+ FNT_LINETO, 575, 96,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 32, 193,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 575, 0,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 96, 0,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 640, 0,
+ FNT_LINETO, 32, 992,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 416,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 352, 416,
+ FNT_LINETO, 672, 992,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 640, 992,
+ FNT_LINETO, 32, 992,
+
+ FNT_MOVETO, 672, -128,
+ FNT_LINETO, 447, -128,
+ FNT_LINETO, 447, 1088,
+ FNT_LINETO, 672, 1088,
+
+ FNT_MOVETO, 0, 1088,
+ FNT_LINETO, 672, -128,
+
+ FNT_MOVETO, 0, -128,
+ FNT_LINETO, 224, -128,
+ FNT_LINETO, 224, 1088,
+ FNT_LINETO, 0, 1088,
+
+ FNT_MOVETO, 480, 896,
+ FNT_LINETO, 288, 1089,
+ FNT_LINETO, 63, 896,
+
+ FNT_MOVETO, 1024, -193,
+ FNT_LINETO, 0, -193,
+
+ FNT_MOVETO, 449, 896,
+ FNT_LINETO, 224, 1120,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 321,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 193,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 992,
+
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 992,
+
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 384,
+ FNT_LINETO, 0, 384,
+
+ FNT_MOVETO, 544, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 352, 928,
+ FNT_LINETO, 288, 864,
+ FNT_LINETO, 256, 768,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 96, 640,
+ FNT_LINETO, 544, 640,
+
+ FNT_MOVETO, 577, 288,
+ FNT_LINETO, 544, 191,
+ FNT_LINETO, 480, 96,
+ FNT_LINETO, 384, 63,
+ FNT_LINETO, 191, 63,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 32, 193,
+ FNT_LINETO, 0, 288,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 288,
+ FNT_MOVETO, 577, 288,
+ FNT_LINETO, 577, 0,
+ FNT_LINETO, 544, -128,
+ FNT_LINETO, 480, -224,
+ FNT_LINETO, 384, -256,
+ FNT_LINETO, 160, -256,
+ FNT_LINETO, 32, -191,
+ FNT_MOVETO, 577, 512,
+ FNT_LINETO, 577, 736,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 0, 480,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 447,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 384, 0,
+ FNT_LINETO, 384, 672,
+ FNT_LINETO, 128, 672,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 128, 0,
+ FNT_MOVETO, 288, 928,
+ FNT_LINETO, 288, 992,
+
+ FNT_MOVETO, 128, -256,
+ FNT_LINETO, 224, -256,
+ FNT_LINETO, 288, -224,
+ FNT_LINETO, 352, -160,
+ FNT_LINETO, 384, -63,
+ FNT_LINETO, 384, 672,
+ FNT_LINETO, 128, 672,
+ FNT_MOVETO, 288, 928,
+ FNT_LINETO, 288, 992,
+
+ FNT_MOVETO, 0, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 384,
+ FNT_LINETO, 128, 384,
+ FNT_LINETO, 544, 736,
+ FNT_MOVETO, 128, 384,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 384, 0,
+ FNT_LINETO, 384, 992,
+ FNT_LINETO, 128, 992,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 128, 0,
+
+ FNT_MOVETO, 0, 736,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 32, 640,
+ FNT_LINETO, 65, 705,
+ FNT_LINETO, 128, 736,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 256, 703,
+ FNT_LINETO, 288, 640,
+ FNT_LINETO, 321, 544,
+ FNT_LINETO, 321, 0,
+ FNT_MOVETO, 321, 544,
+ FNT_LINETO, 352, 640,
+ FNT_LINETO, 384, 705,
+ FNT_LINETO, 449, 736,
+ FNT_LINETO, 544, 736,
+ FNT_LINETO, 608, 703,
+ FNT_LINETO, 640, 640,
+ FNT_LINETO, 672, 544,
+ FNT_LINETO, 672, 0,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 480,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 447,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_MOVETO, 0, -224,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_MOVETO, 577, -224,
+ FNT_LINETO, 577, 736,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 480,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+
+ FNT_MOVETO, 577, 608,
+ FNT_LINETO, 544, 672,
+ FNT_LINETO, 512, 705,
+ FNT_LINETO, 416, 736,
+ FNT_LINETO, 160, 736,
+ FNT_LINETO, 63, 703,
+ FNT_LINETO, 32, 672,
+ FNT_LINETO, 0, 608,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 447,
+ FNT_LINETO, 65, 416,
+ FNT_LINETO, 160, 384,
+ FNT_LINETO, 416, 384,
+ FNT_LINETO, 512, 352,
+ FNT_LINETO, 544, 319,
+ FNT_LINETO, 577, 256,
+ FNT_LINETO, 577, 128,
+ FNT_LINETO, 544, 63,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 0, 160,
+
+ FNT_MOVETO, 512, 672,
+ FNT_LINETO, 0, 672,
+ FNT_MOVETO, 577, 63,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 256, 32,
+ FNT_LINETO, 191, 96,
+ FNT_LINETO, 160, 193,
+ FNT_LINETO, 160, 992,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 512, 96,
+ FNT_LINETO, 447, 32,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 736,
+
+ FNT_MOVETO, 577, 736,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 672, 736,
+ FNT_LINETO, 544, 0,
+ FNT_LINETO, 319, 544,
+ FNT_LINETO, 128, 0,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 544, 736,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 32, 736,
+
+ FNT_MOVETO, 321, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 96, -256,
+ FNT_LINETO, 160, -256,
+ FNT_LINETO, 224, -224,
+ FNT_LINETO, 256, -160,
+ FNT_LINETO, 577, 736,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 544, 736,
+ FNT_LINETO, 32, 736,
+
+ FNT_MOVETO, 672, 1088,
+ FNT_LINETO, 608, 1088,
+ FNT_LINETO, 575, 1056,
+ FNT_LINETO, 544, 992,
+ FNT_LINETO, 544, 640,
+ FNT_LINETO, 512, 544,
+ FNT_LINETO, 480, 512,
+ FNT_LINETO, 416, 480,
+ FNT_LINETO, 480, 447,
+ FNT_LINETO, 512, 416,
+ FNT_LINETO, 544, 319,
+ FNT_LINETO, 544, -32,
+ FNT_LINETO, 577, -96,
+ FNT_LINETO, 608, -128,
+ FNT_LINETO, 672, -128,
+
+ FNT_MOVETO, 0, -128,
+ FNT_LINETO, 0, 1088,
+
+ FNT_MOVETO, 32, 1088,
+ FNT_LINETO, 96, 1088,
+ FNT_LINETO, 128, 1056,
+ FNT_LINETO, 160, 992,
+ FNT_LINETO, 160, 640,
+ FNT_LINETO, 193, 544,
+ FNT_LINETO, 224, 512,
+ FNT_LINETO, 288, 480,
+ FNT_LINETO, 224, 447,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 160, 319,
+ FNT_LINETO, 160, -32,
+ FNT_LINETO, 128, -96,
+ FNT_LINETO, 96, -128,
+ FNT_LINETO, 32, -128,
+
+ FNT_MOVETO, 577, 1056,
+ FNT_LINETO, 480, 928,
+ FNT_LINETO, 416, 896,
+ FNT_LINETO, 352, 896,
+ FNT_LINETO, 224, 1056,
+ FNT_LINETO, 160, 1056,
+ FNT_LINETO, 96, 1024,
+ FNT_LINETO, 0, 896,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 128, 1408,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+ FNT_MOVETO, 128, 1152,
+ FNT_LINETO, 352, 1345,
+ FNT_LINETO, 544, 1152,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 544, 512,
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 128, 1408,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 544, 512,
+ FNT_MOVETO, 128, 1152,
+ FNT_LINETO, 352, 1345,
+ FNT_LINETO, 544, 1152,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 544, 512,
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 992,
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 608, 0,
+ FNT_LINETO, 96, 0,
+ FNT_MOVETO, 128, 1152,
+ FNT_LINETO, 352, 1344,
+ FNT_LINETO, 544, 1152,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 992,
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 608, 0,
+ FNT_LINETO, 96, 0,
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 128, 1408,
+
+ FNT_MOVETO, 128, 1152,
+ FNT_LINETO, 352, 1344,
+ FNT_LINETO, 544, 1152,
+
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 672, 1312,
+ FNT_LINETO, 575, 1184,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 447, 1152,
+ FNT_LINETO, 224, 1312,
+ FNT_LINETO, 160, 1312,
+ FNT_LINETO, 96, 1280,
+ FNT_LINETO, 0, 1152,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 640, 191,
+ FNT_LINETO, 575, 96,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 32, 193,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 128, 1408,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 640, 191,
+ FNT_LINETO, 575, 96,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 32, 193,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 128, 1152,
+ FNT_LINETO, 352, 1345,
+ FNT_LINETO, 544, 1152,
+
+ FNT_MOVETO, 672, 128,
+ FNT_LINETO, 640, 63,
+ FNT_LINETO, 575, 0,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 416, 32,
+ FNT_LINETO, 256, 224,
+ FNT_LINETO, 191, 256,
+ FNT_LINETO, 128, 256,
+ FNT_LINETO, 63, 224,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 0, 96,
+ FNT_LINETO, 65, 32,
+ FNT_LINETO, 128, 0,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 256, 32,
+ FNT_LINETO, 321, 128,
+ FNT_LINETO, 352, 256,
+ FNT_LINETO, 352, 800,
+ FNT_LINETO, 384, 896,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 544, 992,
+ FNT_LINETO, 608, 959,
+ FNT_LINETO, 672, 864,
+ FNT_MOVETO, 512, 608,
+ FNT_LINETO, 191, 608,
+
+ FNT_MOVETO, 1024, 1152,
+ FNT_LINETO, 0, 1152,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 416,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 352, 416,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 321, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 96, -256,
+ FNT_LINETO, 160, -256,
+ FNT_LINETO, 224, -224,
+ FNT_LINETO, 256, -160,
+ FNT_LINETO, 577, 736,
+ FNT_MOVETO, 447, 1152,
+ FNT_LINETO, 160, 896,
+
+ FNT_MOVETO, 352, 896,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 1056,
+ FNT_LINETO, 352, 1120,
+ FNT_LINETO, 256, 1120,
+ FNT_LINETO, 191, 1056,
+ FNT_LINETO, 191, 959,
+ FNT_LINETO, 256, 896,
+ FNT_LINETO, 352, 896,
+
+ FNT_MOVETO, 288, 0,
+ FNT_LINETO, 416, -160,
+ FNT_LINETO, 319, -256,
+ FNT_MOVETO, 640, 768,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 224,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 352, -160,
+ FNT_LINETO, 256, -256,
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 608, 1312,
+ FNT_LINETO, 512, 1184,
+ FNT_LINETO, 447, 1152,
+ FNT_LINETO, 384, 1152,
+ FNT_LINETO, 224, 1312,
+ FNT_LINETO, 160, 1312,
+ FNT_LINETO, 96, 1280,
+ FNT_LINETO, 0, 1152,
+
+ FNT_MOVETO, 577, 1056,
+ FNT_LINETO, 480, 928,
+ FNT_LINETO, 416, 896,
+ FNT_LINETO, 352, 896,
+ FNT_LINETO, 224, 1056,
+ FNT_LINETO, 160, 1056,
+ FNT_LINETO, 96, 1024,
+ FNT_LINETO, 0, 896,
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 480,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 704,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 447,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 672, 736,
+ FNT_LINETO, 640, 736,
+ FNT_LINETO, 640, 672,
+ FNT_LINETO, 672, 672,
+ FNT_LINETO, 672, 736,
+ FNT_MOVETO, 672, -256,
+ FNT_LINETO, 672, 416,
+
+ FNT_MOVETO, 416, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 352, 672,
+ FNT_LINETO, 416, 672,
+ FNT_LINETO, 416, 736,
+ FNT_MOVETO, 384, 447,
+ FNT_LINETO, 352, 352,
+ FNT_LINETO, 319, 288,
+ FNT_LINETO, 160, 256,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 0, 96,
+ FNT_LINETO, 0, -96,
+ FNT_LINETO, 32, -193,
+ FNT_LINETO, 160, -256,
+ FNT_LINETO, 321, -256,
+ FNT_LINETO, 449, -191,
+ FNT_LINETO, 480, -96,
+
+ FNT_MOVETO, 0, 384,
+ FNT_LINETO, 0, 577,
+ FNT_LINETO, 32, 672,
+ FNT_LINETO, 96, 768,
+ FNT_LINETO, 224, 833,
+ FNT_LINETO, 449, 833,
+ FNT_LINETO, 577, 768,
+ FNT_LINETO, 640, 672,
+ FNT_LINETO, 672, 575,
+ FNT_LINETO, 672, 384,
+ FNT_LINETO, 640, 288,
+ FNT_LINETO, 575, 191,
+ FNT_LINETO, 447, 128,
+ FNT_LINETO, 224, 128,
+ FNT_LINETO, 96, 193,
+ FNT_LINETO, 32, 288,
+ FNT_LINETO, 0, 384,
+ FNT_MOVETO, 96, 191,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 577, 193,
+ FNT_LINETO, 672, 0,
+ FNT_MOVETO, 575, 768,
+ FNT_LINETO, 672, 961,
+ FNT_MOVETO, 96, 768,
+ FNT_LINETO, 0, 961,
+
+ FNT_MOVETO, 672, 128,
+ FNT_LINETO, 640, 63,
+ FNT_LINETO, 575, 0,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 416, 32,
+ FNT_LINETO, 256, 224,
+ FNT_LINETO, 191, 256,
+ FNT_LINETO, 128, 256,
+ FNT_LINETO, 63, 224,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 0, 96,
+ FNT_LINETO, 65, 32,
+ FNT_LINETO, 128, 0,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 256, 32,
+ FNT_LINETO, 321, 128,
+ FNT_LINETO, 352, 256,
+ FNT_LINETO, 352, 800,
+ FNT_LINETO, 384, 896,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 544, 992,
+ FNT_LINETO, 608, 959,
+ FNT_LINETO, 672, 864,
+ FNT_MOVETO, 512, 608,
+ FNT_LINETO, 191, 608,
+
+ FNT_MOVETO, 288, 0,
+ FNT_LINETO, 288, 672,
+ FNT_LINETO, 0, 1089,
+ FNT_MOVETO, 288, 672,
+ FNT_LINETO, 577, 1089,
+ FNT_MOVETO, 577, 672,
+ FNT_LINETO, 0, 672,
+ FNT_MOVETO, 577, 447,
+ FNT_LINETO, 0, 447,
+
+ FNT_MOVETO, 480, 160,
+ FNT_LINETO, 577, 193,
+ FNT_LINETO, 640, 288,
+ FNT_LINETO, 672, 384,
+ FNT_LINETO, 640, 480,
+ FNT_LINETO, 191, 800,
+ FNT_LINETO, 128, 864,
+ FNT_LINETO, 96, 961,
+ FNT_LINETO, 96, 1056,
+ FNT_LINETO, 160, 1152,
+ FNT_LINETO, 256, 1217,
+ FNT_LINETO, 416, 1217,
+ FNT_LINETO, 512, 1184,
+ FNT_LINETO, 577, 1087,
+ FNT_LINETO, 640, 959,
+ FNT_MOVETO, 191, 800,
+ FNT_LINETO, 96, 768,
+ FNT_LINETO, 32, 672,
+ FNT_LINETO, 0, 575,
+ FNT_LINETO, 32, 480,
+ FNT_LINETO, 480, 160,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 0,
+ FNT_LINETO, 577, -96,
+ FNT_LINETO, 512, -193,
+ FNT_LINETO, 416, -256,
+ FNT_LINETO, 256, -256,
+ FNT_LINETO, 160, -224,
+ FNT_LINETO, 96, -128,
+ FNT_LINETO, 32, 0,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 32, -96,
+ FNT_LINETO, 65, -128,
+ FNT_LINETO, 96, -160,
+ FNT_LINETO, 160, -160,
+ FNT_LINETO, 224, -128,
+ FNT_LINETO, 288, -63,
+ FNT_LINETO, 321, 32,
+ FNT_LINETO, 321, 800,
+ FNT_LINETO, 352, 896,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 544, 992,
+ FNT_LINETO, 608, 959,
+ FNT_LINETO, 640, 928,
+ FNT_LINETO, 672, 831,
+ FNT_MOVETO, 544, 575,
+ FNT_LINETO, 128, 575,
+
+ FNT_MOVETO, 577, 128,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 416, 736,
+ FNT_LINETO, 512, 703,
+ FNT_LINETO, 577, 608,
+ FNT_MOVETO, 288, -160,
+ FNT_LINETO, 288, 864,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 321,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 193,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+ FNT_MOVETO, 63, 896,
+ FNT_LINETO, 288, 1089,
+ FNT_LINETO, 480, 896,
+
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 384,
+ FNT_LINETO, 0, 384,
+ FNT_MOVETO, 65, 896,
+ FNT_LINETO, 288, 1089,
+ FNT_LINETO, 480, 896,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_MOVETO, 63, 896,
+ FNT_LINETO, 288, 1089,
+ FNT_LINETO, 480, 896,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 512, 96,
+ FNT_LINETO, 447, 32,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 736,
+ FNT_MOVETO, 63, 896,
+ FNT_LINETO, 288, 1089,
+ FNT_LINETO, 480, 896,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 321,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 193,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+ FNT_MOVETO, 447, 1152,
+ FNT_LINETO, 160, 896,
+
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 384,
+ FNT_LINETO, 0, 384,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 160, 896,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_MOVETO, 447, 1152,
+ FNT_LINETO, 160, 896,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 512, 96,
+ FNT_LINETO, 447, 32,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 736,
+ FNT_MOVETO, 447, 1152,
+ FNT_LINETO, 160, 896,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 321,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 193,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+ FNT_MOVETO, 447, 896,
+ FNT_LINETO, 191, 1152,
+
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 384,
+ FNT_LINETO, 0, 384,
+ FNT_MOVETO, 449, 896,
+ FNT_LINETO, 191, 1152,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_MOVETO, 447, 896,
+ FNT_LINETO, 191, 1152,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 512, 96,
+ FNT_LINETO, 447, 32,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 736,
+ FNT_MOVETO, 447, 896,
+ FNT_LINETO, 191, 1152,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 321,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 193,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+ FNT_MOVETO, 128, 896,
+ FNT_LINETO, 193, 896,
+ FNT_LINETO, 193, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 128, 896,
+ FNT_MOVETO, 416, 896,
+ FNT_LINETO, 480, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 896,
+
+ FNT_MOVETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 384,
+ FNT_LINETO, 0, 384,
+ FNT_MOVETO, 128, 896,
+ FNT_LINETO, 193, 896,
+ FNT_LINETO, 193, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 128, 896,
+ FNT_MOVETO, 416, 896,
+ FNT_LINETO, 480, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 896,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_MOVETO, 128, 896,
+ FNT_LINETO, 193, 896,
+ FNT_LINETO, 193, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 128, 896,
+ FNT_MOVETO, 416, 896,
+ FNT_LINETO, 480, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 896,
+
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 512, 96,
+ FNT_LINETO, 447, 32,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 736,
+ FNT_MOVETO, 128, 896,
+ FNT_LINETO, 193, 896,
+ FNT_LINETO, 193, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 128, 896,
+ FNT_MOVETO, 416, 896,
+ FNT_LINETO, 480, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 896,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 449, 1217,
+ FNT_LINETO, 449, 1312,
+ FNT_LINETO, 384, 1376,
+ FNT_LINETO, 288, 1376,
+ FNT_LINETO, 224, 1312,
+ FNT_LINETO, 224, 1215,
+ FNT_LINETO, 288, 1152,
+ FNT_LINETO, 384, 1152,
+
+ FNT_MOVETO, 384, 0,
+ FNT_LINETO, 384, 672,
+ FNT_LINETO, 128, 672,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 128, 0,
+ FNT_MOVETO, 96, 896,
+ FNT_LINETO, 321, 1089,
+ FNT_LINETO, 512, 896,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 288, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 352, 992,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 672, 0,
+ FNT_MOVETO, 160, 512,
+ FNT_LINETO, 672, 512,
+
+ FNT_MOVETO, 352, 896,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 1056,
+ FNT_LINETO, 352, 1120,
+ FNT_LINETO, 256, 1120,
+ FNT_LINETO, 192, 1056,
+ FNT_LINETO, 192, 959,
+ FNT_LINETO, 256, 896,
+ FNT_LINETO, 352, 896,
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 321,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 193,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 384, 0,
+ FNT_LINETO, 384, 672,
+ FNT_LINETO, 128, 672,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 128, 0,
+ FNT_MOVETO, 416, 1152,
+ FNT_LINETO, 160, 896,
+
+ FNT_MOVETO, 577, 736,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+
+ FNT_MOVETO, 352, 128,
+ FNT_LINETO, 319, 32,
+ FNT_LINETO, 224, 0,
+ FNT_LINETO, 128, 0,
+ FNT_LINETO, 32, 32,
+ FNT_LINETO, 0, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 65, 321,
+ FNT_LINETO, 224, 384,
+ FNT_LINETO, 352, 416,
+ FNT_LINETO, 672, 416,
+ FNT_LINETO, 672, 608,
+ FNT_LINETO, 608, 705,
+ FNT_LINETO, 544, 736,
+ FNT_LINETO, 447, 736,
+ FNT_LINETO, 384, 703,
+ FNT_LINETO, 352, 608,
+ FNT_LINETO, 352, 128,
+ FNT_LINETO, 384, 32,
+ FNT_LINETO, 449, 0,
+ FNT_LINETO, 577, 0,
+ FNT_LINETO, 672, 65,
+ FNT_MOVETO, 352, 608,
+ FNT_LINETO, 319, 705,
+ FNT_LINETO, 256, 736,
+ FNT_LINETO, 96, 736,
+ FNT_LINETO, 0, 672,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 384, 0,
+ FNT_LINETO, 384, 672,
+ FNT_LINETO, 128, 672,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 128, 0,
+ FNT_MOVETO, 449, 896,
+ FNT_LINETO, 191, 1152,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 640, 191,
+ FNT_LINETO, 575, 96,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 32, 193,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 992,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 544, 512,
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 384, 0,
+ FNT_LINETO, 384, 672,
+ FNT_LINETO, 128, 672,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 128, 0,
+ FNT_MOVETO, 128, 896,
+ FNT_LINETO, 193, 896,
+ FNT_LINETO, 193, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 128, 896,
+ FNT_MOVETO, 416, 896,
+ FNT_LINETO, 480, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 896,
+
+ FNT_MOVETO, 288, 512,
+ FNT_LINETO, 352, 512,
+ FNT_LINETO, 449, 544,
+ FNT_LINETO, 512, 608,
+ FNT_LINETO, 544, 705,
+ FNT_LINETO, 544, 768,
+ FNT_LINETO, 512, 864,
+ FNT_LINETO, 447, 928,
+ FNT_LINETO, 352, 961,
+ FNT_LINETO, 256, 961,
+ FNT_LINETO, 160, 928,
+ FNT_LINETO, 96, 864,
+ FNT_LINETO, 63, 768,
+ FNT_LINETO, 32, 640,
+ FNT_LINETO, 32, 0,
+ FNT_MOVETO, 384, 512,
+ FNT_LINETO, 512, 447,
+ FNT_LINETO, 577, 384,
+ FNT_LINETO, 608, 288,
+ FNT_LINETO, 608, 191,
+ FNT_LINETO, 575, 96,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 191, 32,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 128, 1152,
+ FNT_LINETO, 352, 1344,
+ FNT_LINETO, 544, 1152,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 352, 992,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 256,
+ FNT_LINETO, 577, 256,
+ FNT_MOVETO, 672, 1312,
+ FNT_LINETO, 575, 1184,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 447, 1152,
+ FNT_LINETO, 224, 1312,
+ FNT_LINETO, 160, 1312,
+ FNT_LINETO, 96, 1280,
+ FNT_LINETO, 0, 1152,
+
+ FNT_MOVETO, 577, 1056,
+ FNT_LINETO, 480, 928,
+ FNT_LINETO, 416, 896,
+ FNT_LINETO, 352, 896,
+ FNT_LINETO, 224, 1056,
+ FNT_LINETO, 160, 1056,
+ FNT_LINETO, 96, 1024,
+ FNT_LINETO, 0, 896,
+ FNT_MOVETO, 577, 256,
+ FNT_LINETO, 544, 320,
+ FNT_LINETO, 480, 384,
+ FNT_LINETO, 384, 416,
+ FNT_LINETO, 191, 416,
+ FNT_LINETO, 96, 384,
+ FNT_LINETO, 32, 319,
+ FNT_LINETO, 0, 256,
+ FNT_LINETO, 0, 160,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 193, 0,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 577, 192,
+ FNT_MOVETO, 32, 672,
+ FNT_LINETO, 96, 704,
+ FNT_LINETO, 224, 736,
+ FNT_LINETO, 352, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 480,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 96, 992,
+ FNT_LINETO, 96, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 800,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 256, 480,
+ FNT_LINETO, 0, 480,
+
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 577, 992,
+ FNT_MOVETO, 672, 864,
+ FNT_LINETO, 416, 864,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 992,
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 608, 0,
+ FNT_LINETO, 96, 0,
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 992,
+ FNT_MOVETO, 608, 992,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 608, 0,
+ FNT_LINETO, 96, 0,
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 128, 1408,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 384, 1152,
+ FNT_LINETO, 128, 1408,
+
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 608, 96,
+ FNT_LINETO, 640, 193,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 672, 640,
+ FNT_LINETO, 640, 833,
+ FNT_LINETO, 608, 896,
+ FNT_LINETO, 544, 961,
+ FNT_LINETO, 416, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 128, 959,
+ FNT_LINETO, 63, 896,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 0, 640,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 32, 191,
+ FNT_LINETO, 65, 96,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 672, 1312,
+ FNT_LINETO, 575, 1184,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 447, 1152,
+ FNT_LINETO, 224, 1312,
+ FNT_LINETO, 160, 1312,
+ FNT_LINETO, 96, 1280,
+ FNT_LINETO, 0, 1152,
+
+ FNT_MOVETO, 577, 1056,
+ FNT_LINETO, 480, 928,
+ FNT_LINETO, 416, 896,
+ FNT_LINETO, 352, 896,
+ FNT_LINETO, 224, 1056,
+ FNT_LINETO, 160, 1056,
+ FNT_LINETO, 96, 1024,
+ FNT_LINETO, 0, 896,
+ FNT_MOVETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 704,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 703,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+
+ FNT_MOVETO, 672, 800,
+ FNT_LINETO, 640, 896,
+ FNT_LINETO, 575, 961,
+ FNT_LINETO, 480, 992,
+ FNT_LINETO, 191, 992,
+ FNT_LINETO, 96, 959,
+ FNT_LINETO, 32, 896,
+ FNT_LINETO, 0, 800,
+ FNT_LINETO, 0, 703,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 544,
+ FNT_LINETO, 193, 512,
+ FNT_LINETO, 480, 480,
+ FNT_LINETO, 577, 447,
+ FNT_LINETO, 640, 384,
+ FNT_LINETO, 672, 288,
+ FNT_LINETO, 672, 191,
+ FNT_LINETO, 640, 96,
+ FNT_LINETO, 575, 32,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 0, 193,
+ FNT_MOVETO, 128, 1344,
+ FNT_LINETO, 352, 1152,
+ FNT_LINETO, 544, 1344,
+
+ FNT_MOVETO, 577, 608,
+ FNT_LINETO, 544, 672,
+ FNT_LINETO, 512, 705,
+ FNT_LINETO, 416, 736,
+ FNT_LINETO, 160, 736,
+ FNT_LINETO, 63, 703,
+ FNT_LINETO, 32, 672,
+ FNT_LINETO, 0, 608,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 32, 447,
+ FNT_LINETO, 65, 416,
+ FNT_LINETO, 160, 384,
+ FNT_LINETO, 416, 384,
+ FNT_LINETO, 512, 352,
+ FNT_LINETO, 544, 319,
+ FNT_LINETO, 577, 256,
+ FNT_LINETO, 577, 128,
+ FNT_LINETO, 544, 63,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 96,
+ FNT_LINETO, 0, 160,
+ FNT_MOVETO, 65, 1089,
+ FNT_LINETO, 288, 896,
+ FNT_LINETO, 480, 1089,
+
+ FNT_MOVETO, 672, 992,
+ FNT_LINETO, 672, 352,
+ FNT_LINETO, 640, 191,
+ FNT_LINETO, 575, 96,
+ FNT_LINETO, 512, 32,
+ FNT_LINETO, 416, 0,
+ FNT_LINETO, 288, 0,
+ FNT_LINETO, 160, 32,
+ FNT_LINETO, 96, 96,
+ FNT_LINETO, 32, 193,
+ FNT_LINETO, 0, 352,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 512, 1408,
+
+ FNT_MOVETO, 352, 0,
+ FNT_LINETO, 352, 416,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 352, 416,
+ FNT_LINETO, 672, 992,
+ FNT_MOVETO, 160, 1152,
+ FNT_LINETO, 224, 1152,
+ FNT_LINETO, 224, 1217,
+ FNT_LINETO, 160, 1217,
+ FNT_LINETO, 160, 1152,
+ FNT_MOVETO, 449, 1152,
+ FNT_LINETO, 512, 1152,
+ FNT_LINETO, 512, 1217,
+ FNT_LINETO, 448, 1217,
+ FNT_LINETO, 449, 1152,
+
+ FNT_MOVETO, 321, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 96, -256,
+ FNT_LINETO, 160, -256,
+ FNT_LINETO, 224, -224,
+ FNT_LINETO, 256, -160,
+ FNT_LINETO, 577, 736,
+ FNT_MOVETO, 128, 896,
+ FNT_LINETO, 193, 896,
+ FNT_LINETO, 193, 961,
+ FNT_LINETO, 128, 961,
+ FNT_LINETO, 128, 896,
+ FNT_MOVETO, 416, 896,
+ FNT_LINETO, 480, 896,
+ FNT_LINETO, 480, 961,
+ FNT_LINETO, 416, 961,
+ FNT_LINETO, 416, 896,
+
+ FNT_MOVETO, 96, 128,
+ FNT_LINETO, 480, 128,
+ FNT_LINETO, 577, 160,
+ FNT_LINETO, 640, 224,
+ FNT_LINETO, 672, 321,
+ FNT_LINETO, 672, 416,
+ FNT_LINETO, 640, 512,
+ FNT_LINETO, 575, 577,
+ FNT_LINETO, 480, 608,
+ FNT_LINETO, 96, 608,
+ FNT_MOVETO, 96, -256,
+ FNT_LINETO, 96, 992,
+ FNT_MOVETO, 256, 992,
+ FNT_LINETO, 0, 992,
+ FNT_MOVETO, 256, -256,
+ FNT_LINETO, 0, -256,
+
+ FNT_MOVETO, 0, 992,
+ FNT_LINETO, 0, -256,
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 32, 608,
+ FNT_LINETO, 96, 705,
+ FNT_LINETO, 193, 736,
+ FNT_LINETO, 384, 736,
+ FNT_LINETO, 480, 704,
+ FNT_LINETO, 544, 608,
+ FNT_LINETO, 577, 512,
+ FNT_LINETO, 577, 224,
+ FNT_LINETO, 544, 128,
+ FNT_LINETO, 480, 32,
+ FNT_LINETO, 384, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 96, 32,
+ FNT_LINETO, 32, 128,
+ FNT_LINETO, 0, 224,
+
+ FNT_MOVETO, 352, 480,
+ FNT_LINETO, 384, 480,
+ FNT_LINETO, 384, 512,
+ FNT_LINETO, 352, 512,
+ FNT_LINETO, 352, 480,
+
+ FNT_MOVETO, 0, -256,
+ FNT_LINETO, 65, 736,
+ FNT_MOVETO, 672, 160,
+ FNT_LINETO, 640, 32,
+ FNT_LINETO, 575, 0,
+ FNT_LINETO, 544, 32,
+ FNT_LINETO, 512, 128,
+ FNT_LINETO, 512, 256,
+ FNT_LINETO, 544, 736,
+ FNT_MOVETO, 512, 256,
+ FNT_LINETO, 480, 128,
+ FNT_LINETO, 416, 32,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 128, 32,
+ FNT_LINETO, 63, 128,
+ FNT_LINETO, 32, 224,
+
+ FNT_MOVETO, 321, 544,
+ FNT_LINETO, 224, 544,
+ FNT_LINETO, 128, 577,
+ FNT_LINETO, 63, 640,
+ FNT_LINETO, 32, 705,
+ FNT_LINETO, 32, 800,
+ FNT_LINETO, 65, 864,
+ FNT_LINETO, 128, 928,
+ FNT_LINETO, 224, 961,
+ FNT_LINETO, 608, 961,
+ FNT_MOVETO, 319, 961,
+ FNT_LINETO, 319, 0,
+ FNT_MOVETO, 512, 961,
+ FNT_LINETO, 512, 0,
+
+ FNT_MOVETO, 672, 352,
+ FNT_LINETO, 0, 352,
+ FNT_MOVETO, 577, -256,
+ FNT_LINETO, 128, -256,
+ FNT_LINETO, 449, 193,
+ FNT_LINETO, 449, -352,
+ FNT_MOVETO, 256, 864,
+ FNT_LINETO, 384, 864,
+ FNT_LINETO, 480, 831,
+ FNT_LINETO, 512, 768,
+ FNT_LINETO, 512, 640,
+ FNT_LINETO, 480, 575,
+ FNT_LINETO, 416, 544,
+ FNT_LINETO, 224, 544,
+ FNT_LINETO, 160, 576,
+ FNT_LINETO, 128, 640,
+ FNT_MOVETO, 384, 864,
+ FNT_LINETO, 449, 896,
+ FNT_LINETO, 480, 960,
+ FNT_LINETO, 480, 1088,
+ FNT_LINETO, 447, 1152,
+ FNT_LINETO, 384, 1184,
+ FNT_LINETO, 256, 1184,
+ FNT_LINETO, 191, 1152,
+ FNT_LINETO, 160, 1087,
+
+ FNT_MOVETO, 672, 480,
+ FNT_LINETO, 0, 480,
+
+ FNT_MOVETO, 672, 480,
+ FNT_LINETO, 0, 480,
+ FNT_MOVETO, 224, 961,
+ FNT_LINETO, 416, 1217,
+ FNT_LINETO, 416, 672,
+ FNT_MOVETO, 608, -128,
+ FNT_LINETO, 160, -128,
+ FNT_LINETO, 480, 321,
+ FNT_LINETO, 480, -224,
+
+ FNT_MOVETO, 672, 480,
+ FNT_LINETO, 0, 480,
+ FNT_MOVETO, 224, 961,
+ FNT_LINETO, 416, 1217,
+ FNT_LINETO, 416, 672,
+ FNT_MOVETO, 191, 256,
+ FNT_LINETO, 224, 288,
+ FNT_LINETO, 288, 320,
+ FNT_LINETO, 416, 320,
+ FNT_LINETO, 480, 288,
+ FNT_LINETO, 544, 191,
+ FNT_LINETO, 544, 96,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 256, -96,
+ FNT_LINETO, 191, -160,
+ FNT_LINETO, 160, -256,
+ FNT_LINETO, 544, -256,
+
+ FNT_MOVETO, 672, 193,
+ FNT_LINETO, 0, 193,
+ FNT_MOVETO, 544, 352,
+ FNT_LINETO, 544, 800,
+ FNT_LINETO, 512, 896,
+ FNT_LINETO, 447, 961,
+ FNT_LINETO, 384, 992,
+ FNT_LINETO, 256, 992,
+ FNT_LINETO, 160, 959,
+ FNT_MOVETO, 544, 640,
+ FNT_LINETO, 512, 705,
+ FNT_LINETO, 416, 736,
+ FNT_LINETO, 288, 736,
+ FNT_LINETO, 224, 703,
+ FNT_LINETO, 160, 640,
+ FNT_LINETO, 128, 575,
+ FNT_LINETO, 128, 512,
+ FNT_LINETO, 160, 447,
+ FNT_LINETO, 224, 384,
+ FNT_LINETO, 288, 352,
+ FNT_LINETO, 416, 352,
+ FNT_LINETO, 512, 384,
+ FNT_LINETO, 544, 449,
+
+ FNT_MOVETO, 672, 193,
+ FNT_LINETO, 0, 193,
+ FNT_MOVETO, 288, 352,
+ FNT_LINETO, 384, 352,
+ FNT_LINETO, 449, 384,
+ FNT_LINETO, 512, 480,
+ FNT_LINETO, 544, 577,
+ FNT_LINETO, 544, 768,
+ FNT_LINETO, 512, 864,
+ FNT_LINETO, 447, 961,
+ FNT_LINETO, 384, 992,
+ FNT_LINETO, 288, 992,
+ FNT_LINETO, 224, 959,
+ FNT_LINETO, 160, 864,
+ FNT_LINETO, 128, 768,
+ FNT_LINETO, 128, 575,
+ FNT_LINETO, 160, 480,
+ FNT_LINETO, 224, 384,
+ FNT_LINETO, 288, 352,
+
+ FNT_MOVETO, 672, 768,
+ FNT_LINETO, 319, 384,
+ FNT_LINETO, 672, 0,
+ FNT_MOVETO, 384, 768,
+ FNT_LINETO, 0, 384,
+ FNT_LINETO, 352, 0,
+
+ FNT_MOVETO, 0, 736,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 672, 0,
+ FNT_LINETO, 672, 736,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 0, 768,
+ FNT_LINETO, 352, 384,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 288, 768,
+ FNT_LINETO, 672, 384,
+ FNT_LINETO, 319, 0,
+
+ FNT_MOVETO, 672, 96,
+ FNT_LINETO, 0, 96,
+ FNT_MOVETO, 672, 577,
+ FNT_LINETO, 0, 577,
+ FNT_MOVETO, 352, 928,
+ FNT_LINETO, 352, 224
+};
+
+/* offsets are array index into fontData for each beginning of character,
+ data goes until next index (NB. there's an extra entry for end of data)
+ (character codes start with 32) Roman-8 encoding for table indexes
+*/
+const short int stick_font_offsets[] = {
+ 0,
+ 0,
+ 21,
+ 33,
+ 57,
+ 117,
+ 201,
+ 267,
+ 285,
+ 309,
+ 333,
+ 351,
+ 363,
+ 381,
+ 387,
+ 402,
+ 408,
+ 471,
+ 486,
+ 537,
+ 606,
+ 618,
+ 669,
+ 738,
+ 747,
+ 846,
+ 915,
+ 945,
+ 978,
+ 987,
+ 999,
+ 1008,
+ 1056,
+ 1131,
+ 1146,
+ 1209,
+ 1263,
+ 1302,
+ 1320,
+ 1335,
+ 1398,
+ 1416,
+ 1434,
+ 1467,
+ 1488,
+ 1497,
+ 1512,
+ 1524,
+ 1587,
+ 1620,
+ 1689,
+ 1737,
+ 1809,
+ 1821,
+ 1857,
+ 1866,
+ 1881,
+ 1893,
+ 1908,
+ 1920,
+ 1932,
+ 1938,
+ 1950,
+ 1959,
+ 1965,
+ 1971,
+ 2043,
+ 2097,
+ 2139,
+ 2193,
+ 2244,
+ 2268,
+ 2346,
+ 2379,
+ 2400,
+ 2427,
+ 2448,
+ 2463,
+ 2523,
+ 2556,
+ 2607,
+ 2661,
+ 2715,
+ 2745,
+ 2817,
+ 2844,
+ 2877,
+ 2886,
+ 2901,
+ 2913,
+ 2934,
+ 2946,
+ 2991,
+ 2997,
+ 3042,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3066,
+ 3087,
+ 3111,
+ 3135,
+ 3162,
+ 3210,
+ 3237,
+ 3285,
+ 3291,
+ 3297,
+ 3306,
+ 3336,
+ 3360,
+ 3402,
+ 3447,
+ 3525,
+ 3531,
+ 3552,
+ 3579,
+ 3606,
+ 3669,
+ 3720,
+ 3756,
+ 3813,
+ 3834,
+ 3885,
+ 3960,
+ 4038,
+ 4065,
+ 4155,
+ 4209,
+ 4257,
+ 4338,
+ 4398,
+ 4458,
+ 4500,
+ 4578,
+ 4635,
+ 4692,
+ 4731,
+ 4809,
+ 4866,
+ 4923,
+ 4962,
+ 5064,
+ 5145,
+ 5226,
+ 5289,
+ 5331,
+ 5355,
+ 5424,
+ 5448,
+ 5547,
+ 5568,
+ 5625,
+ 5706,
+ 5751,
+ 5772,
+ 5865,
+ 5931,
+ 5955,
+ 6000,
+ 6075,
+ 6147,
+ 6168,
+ 6207,
+ 6303,
+ 6348,
+ 6408,
+ 6432,
+ 6456,
+ 6525,
+ 6594,
+ 6681,
+ 6756,
+ 6837,
+ 6918,
+ 6960,
+ 7005,
+ 7056,
+ 7104,
+ 7158,
+ 7173,
+ 7224,
+ 7266,
+ 7341,
+ 7347,
+ 7374,
+ 7425,
+ 7494,
+ 7551,
+ 7569,
+ 7584,
+ 7602,
+ 7620,
+ 7620
+};
+
+const short int arc_font_data[] = {
+ FNT_MOVETO, 20, 1014,
+ FNT_LINETO, 20, 362,
+ FNT_MOVETO, 22, 0,
+ FNT_CURVETO, 36, 0, 42, 17, 42, 32,
+ FNT_CURVETO, 42, 47, 36, 65, 22, 65,
+ FNT_CURVETO, 6, 63, 0, 47, 0, 32,
+ FNT_CURVETO, 0, 17, 6, 0, 22, 0,
+
+ FNT_MOVETO, 193, 1120,
+ FNT_LINETO, 193, 852,
+ FNT_MOVETO, 0, 852,
+ FNT_LINETO, 0, 1120,
+
+ FNT_MOVETO, 544, 368,
+ FNT_LINETO, 0, 368,
+ FNT_MOVETO, 544, 640,
+ FNT_LINETO, 0, 640,
+ FNT_MOVETO, 278, 1024,
+ FNT_LINETO, 63, 0,
+ FNT_MOVETO, 492, 1024,
+ FNT_LINETO, 278, 0,
+
+ FNT_MOVETO, 256, 1152,
+ FNT_LINETO, 256, -128,
+ FNT_MOVETO, 490, 800,
+ FNT_CURVETO, 480, 928, 352, 1024, 256, 1024,
+ FNT_CURVETO, 128, 1024, 14, 922, 14, 762,
+ FNT_CURVETO, 14, 658, 75, 589, 160, 558,
+ FNT_LINETO, 256, 523,
+ FNT_CURVETO, 425, 462, 512, 430, 512, 256,
+ FNT_CURVETO, 512, 96, 416, 0, 256, 0,
+ FNT_CURVETO, 96, 0, 0, 96, 0, 256,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 530, 1024,
+ FNT_MOVETO, 297, 170,
+ FNT_CURVETO, 297, 82, 354, 0, 416, 0,
+ FNT_CURVETO, 478, 0, 535, 82, 535, 170,
+ FNT_CURVETO, 535, 258, 478, 340, 416, 340,
+ FNT_CURVETO, 354, 340, 297, 258, 297, 170,
+ FNT_MOVETO, 0, 854,
+ FNT_CURVETO, 0, 766, 57, 684, 119, 684,
+ FNT_CURVETO, 181, 684, 238, 766, 238, 854,
+ FNT_CURVETO, 238, 942, 181, 1024, 119, 1024,
+ FNT_CURVETO, 57, 1024, 0, 942, 0, 854,
+
+ FNT_MOVETO, 512, 416,
+ FNT_CURVETO, 512, 384, 416, 0, 191, 0,
+ FNT_CURVETO, 96, 0, 22, 128, 22, 256,
+ FNT_CURVETO, 22, 384, 74, 467, 202, 595,
+ FNT_CURVETO, 231, 625, 342, 726, 342, 854,
+ FNT_CURVETO, 342, 918, 305, 1021, 224, 1024,
+ FNT_CURVETO, 141, 1027, 96, 934, 96, 854,
+ FNT_CURVETO, 96, 726, 161, 679, 202, 595,
+ FNT_CURVETO, 330, 371, 423, 233, 544, 0,
+
+ FNT_MOVETO, 0, 896,
+ FNT_CURVETO, 65, 992, 53, 1152, 53, 1152,
+ FNT_MOVETO, 32, 1120,
+ FNT_CURVETO, 47, 1120, 53, 1137, 53, 1152,
+ FNT_CURVETO, 53, 1167, 47, 1184, 32, 1184,
+ FNT_CURVETO, 17, 1184, 11, 1167, 11, 1152,
+ FNT_CURVETO, 11, 1137, 17, 1120, 32, 1120,
+
+ FNT_MOVETO, 160, 1142,
+ FNT_CURVETO, 63, 982, 0, 768, 0, 512,
+ FNT_CURVETO, 0, 256, 65, 32, 160, -118,
+
+ FNT_MOVETO, 0, 1142,
+ FNT_CURVETO, 96, 982, 160, 768, 160, 512,
+ FNT_CURVETO, 160, 256, 96, 32, 0, -118,
+
+ FNT_MOVETO, 512, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 416, 864,
+ FNT_LINETO, 96, 160,
+ FNT_MOVETO, 416, 160,
+ FNT_LINETO, 96, 864,
+
+ FNT_MOVETO, 544, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 272, 896,
+ FNT_LINETO, 272, 128,
+
+ FNT_MOVETO, 0, -224,
+ FNT_CURVETO, 65, -128, 53, 32, 53, 32,
+ FNT_MOVETO, 32, 0,
+ FNT_CURVETO, 47, 0, 53, 17, 53, 32,
+ FNT_CURVETO, 53, 47, 47, 63, 32, 63,
+ FNT_CURVETO, 17, 64, 11, 47, 11, 32,
+ FNT_CURVETO, 11, 17, 17, 0, 32, 0,
+
+ FNT_MOVETO, 544, 512,
+ FNT_LINETO, 0, 512,
+
+ FNT_MOVETO, 22, 0,
+ FNT_CURVETO, 36, 0, 42, 17, 42, 32,
+ FNT_CURVETO, 42, 47, 36, 65, 22, 65,
+ FNT_CURVETO, 6, 63, 0, 47, 0, 32,
+ FNT_CURVETO, 0, 17, 6, 0, 22, 0,
+
+ FNT_MOVETO, 384, 1088,
+ FNT_LINETO, 0, -65,
+
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 66, -12, 256, -12,
+ FNT_CURVETO, 449, -12, 512, 256, 512, 512,
+ FNT_CURVETO, 512, 768, 449, 1036, 256, 1036,
+ FNT_CURVETO, 63, 1036, 0, 768, 0, 512,
+
+ FNT_MOVETO, 176, 0,
+ FNT_LINETO, 176, 1024,
+ FNT_CURVETO, 160, 928, 96, 800, 0, 800,
+
+ FNT_MOVETO, 16, 768,
+ FNT_CURVETO, 46, 978, 168, 1036, 232, 1036,
+ FNT_CURVETO, 296, 1036, 436, 992, 436, 768,
+ FNT_CURVETO, 436, 575, 305, 512, 145, 352,
+ FNT_CURVETO, 17, 225, 0, 128, 0, 0,
+ FNT_LINETO, 449, 0,
+
+ FNT_MOVETO, 256, 570,
+ FNT_CURVETO, 408, 560, 480, 396, 480, 268,
+ FNT_CURVETO, 480, 148, 400, -13, 240, -13,
+ FNT_CURVETO, 145, -13, 50, 66, 0, 172,
+ FNT_MOVETO, 193, 570,
+ FNT_LINETO, 256, 570,
+ FNT_CURVETO, 367, 567, 435, 672, 435, 800,
+ FNT_CURVETO, 435, 992, 307, 1036, 214, 1036,
+ FNT_CURVETO, 157, 1036, 90, 990, 39, 904,
+
+ FNT_MOVETO, 577, 288,
+ FNT_LINETO, 0, 288,
+ FNT_LINETO, 449, 1036,
+ FNT_LINETO, 449, 0,
+
+ FNT_MOVETO, 0, 193,
+ FNT_CURVETO, 40, 60, 150, 0, 209, 0,
+ FNT_CURVETO, 313, 0, 454, 96, 454, 352,
+ FNT_CURVETO, 454, 549, 352, 648, 237, 648,
+ FNT_CURVETO, 141, 648, 68, 588, 18, 512,
+ FNT_LINETO, 54, 1024,
+ FNT_LINETO, 433, 1024,
+
+ FNT_MOVETO, 416, 928,
+ FNT_CURVETO, 416, 928, 352, 1036, 256, 1036,
+ FNT_CURVETO, 128, 1036, 16, 928, 16, 512,
+ FNT_CURVETO, 16, 422, 32, 319, 32, 319,
+ FNT_CURVETO, 65, 63, 160, -12, 256, -12,
+ FNT_CURVETO, 384, -12, 480, 128, 480, 321,
+ FNT_CURVETO, 480, 480, 384, 640, 256, 640,
+ FNT_CURVETO, 160, 640, 32, 512, 32, 319,
+
+ FNT_MOVETO, 128, -32,
+ FNT_CURVETO, 128, 640, 449, 1024, 449, 1024,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 0, 288,
+ FNT_CURVETO, 0, 129, 108, -12, 240, -12,
+ FNT_CURVETO, 373, -12, 480, 129, 480, 288,
+ FNT_CURVETO, 480, 447, 373, 577, 240, 577,
+ FNT_CURVETO, 108, 577, 0, 447, 0, 288,
+ FNT_MOVETO, 288, 572,
+ FNT_CURVETO, 378, 584, 432, 682, 432, 800,
+ FNT_CURVETO, 432, 924, 367, 1036, 240, 1036,
+ FNT_CURVETO, 112, 1036, 48, 924, 48, 800,
+ FNT_CURVETO, 48, 683, 93, 587, 193, 572,
+
+ FNT_MOVETO, 80, 96,
+ FNT_CURVETO, 80, 96, 112, -12, 240, -12,
+ FNT_CURVETO, 368, -12, 480, 96, 480, 512,
+ FNT_CURVETO, 480, 602, 464, 705, 464, 705,
+ FNT_CURVETO, 432, 961, 336, 1036, 240, 1036,
+ FNT_CURVETO, 112, 1036, 16, 896, 16, 703,
+ FNT_CURVETO, 16, 544, 112, 384, 240, 384,
+ FNT_CURVETO, 336, 384, 464, 512, 464, 705,
+
+ FNT_MOVETO, 22, 0,
+ FNT_CURVETO, 36, 0, 42, 17, 42, 32,
+ FNT_CURVETO, 42, 47, 36, 65, 22, 65,
+ FNT_CURVETO, 6, 63, 0, 47, 0, 32,
+ FNT_CURVETO, 0, 17, 6, 0, 22, 0,
+ FNT_MOVETO, 22, 671,
+ FNT_CURVETO, 36, 671, 42, 689, 42, 705,
+ FNT_CURVETO, 42, 719, 36, 736, 22, 736,
+ FNT_CURVETO, 6, 736, 0, 719, 0, 703,
+ FNT_CURVETO, 0, 689, 6, 671, 22, 671,
+
+ FNT_MOVETO, 0, -224,
+ FNT_CURVETO, 65, -128, 53, 32, 53, 32,
+ FNT_MOVETO, 32, 0,
+ FNT_CURVETO, 47, 0, 53, 17, 53, 32,
+ FNT_CURVETO, 53, 47, 47, 63, 32, 63,
+ FNT_CURVETO, 17, 64, 11, 47, 11, 32,
+ FNT_CURVETO, 11, 17, 17, 0, 32, 0,
+ FNT_MOVETO, 32, 671,
+ FNT_CURVETO, 47, 671, 53, 689, 53, 705,
+ FNT_CURVETO, 53, 719, 47, 736, 32, 736,
+ FNT_CURVETO, 17, 736, 11, 719, 11, 703,
+ FNT_CURVETO, 11, 689, 17, 671, 32, 671,
+
+ FNT_MOVETO, 512, 148,
+ FNT_LINETO, 0, 512,
+ FNT_LINETO, 512, 876,
+
+ FNT_MOVETO, 522, 660,
+ FNT_LINETO, 0, 660,
+ FNT_MOVETO, 522, 372,
+ FNT_LINETO, 0, 372,
+
+ FNT_MOVETO, 0, 148,
+ FNT_LINETO, 512, 512,
+ FNT_LINETO, 0, 876,
+
+ FNT_MOVETO, 181, 0,
+ FNT_CURVETO, 196, 0, 202, 17, 202, 32,
+ FNT_CURVETO, 202, 47, 196, 65, 181, 65,
+ FNT_CURVETO, 166, 63, 160, 47, 160, 32,
+ FNT_CURVETO, 160, 17, 166, 0, 181, 0,
+ FNT_MOVETO, 182, 256,
+ FNT_CURVETO, 182, 256, 193, 438, 288, 534,
+ FNT_CURVETO, 362, 608, 384, 677, 384, 768,
+ FNT_CURVETO, 384, 896, 316, 1024, 191, 1024,
+ FNT_CURVETO, 68, 1024, 0, 864, 0, 768,
+
+ FNT_MOVETO, 432, 768,
+ FNT_LINETO, 432, 352,
+ FNT_CURVETO, 432, 316, 455, 293, 490, 293,
+ FNT_CURVETO, 577, 293, 608, 499, 608, 577,
+ FNT_CURVETO, 608, 768, 512, 1024, 319, 1024,
+ FNT_CURVETO, 128, 1024, 0, 768, 0, 512,
+ FNT_CURVETO, 0, 256, 128, 0, 321, 0,
+ FNT_CURVETO, 432, 0, 480, 32, 544, 65,
+ FNT_MOVETO, 432, 672,
+ FNT_CURVETO, 432, 672, 382, 758, 319, 758,
+ FNT_CURVETO, 224, 758, 150, 640, 150, 512,
+ FNT_CURVETO, 150, 394, 224, 256, 321, 256,
+ FNT_CURVETO, 352, 256, 416, 288, 432, 352,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+
+ FNT_MOVETO, 0, 1024,
+ FNT_LINETO, 0, 575,
+ FNT_LINETO, 321, 575,
+ FNT_CURVETO, 416, 575, 480, 683, 480, 800,
+ FNT_CURVETO, 480, 928, 393, 1024, 304, 1024,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 321, 575,
+ FNT_CURVETO, 480, 512, 512, 352, 512, 288,
+ FNT_CURVETO, 512, 160, 465, 0, 304, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 577,
+
+ FNT_MOVETO, 630, 736,
+ FNT_CURVETO, 575, 928, 480, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 736, 0, 512,
+ FNT_CURVETO, 0, 288, 128, -20, 321, -20,
+ FNT_CURVETO, 480, -20, 577, 96, 630, 288,
+
+ FNT_MOVETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 224, 0,
+ FNT_CURVETO, 416, 0, 544, 256, 544, 512,
+ FNT_CURVETO, 544, 764, 447, 1024, 224, 1024,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 480, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 480, 1024,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 449, 544,
+
+ FNT_MOVETO, 416, 1024,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 384, 544,
+
+ FNT_MOVETO, 630, 736,
+ FNT_CURVETO, 575, 928, 480, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 736, 0, 512,
+ FNT_CURVETO, 0, 288, 128, -20, 321, -20,
+ FNT_CURVETO, 480, -20, 586, 96, 640, 288,
+ FNT_MOVETO, 640, 0,
+ FNT_LINETO, 640, 480,
+ FNT_LINETO, 384, 480,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 512, 0,
+ FNT_LINETO, 512, 1024,
+ FNT_MOVETO, 512, 544,
+ FNT_LINETO, 0, 544,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 0, 256,
+ FNT_LINETO, 0, 191,
+ FNT_CURVETO, 0, 63, 65, -32, 160, -32,
+ FNT_CURVETO, 321, -32, 352, 96, 352, 224,
+ FNT_LINETO, 352, 1024,
+
+ FNT_MOVETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 352,
+ FNT_LINETO, 480, 1024,
+ FNT_MOVETO, 191, 608,
+ FNT_LINETO, 512, 0,
+
+ FNT_MOVETO, 416, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 672, 0,
+ FNT_LINETO, 672, 1024,
+ FNT_LINETO, 352, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 534, 1024,
+ FNT_LINETO, 534, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, -20, 321, -20,
+ FNT_CURVETO, 544, -20, 662, 256, 662, 512,
+ FNT_CURVETO, 662, 768, 544, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 768, 0, 512,
+
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 256, 512,
+ FNT_CURVETO, 384, 512, 449, 608, 449, 768,
+ FNT_CURVETO, 449, 928, 384, 1024, 256, 1024,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 608, -32,
+ FNT_LINETO, 447, 224,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, 0, 321, 0,
+ FNT_CURVETO, 512, 0, 640, 256, 640, 512,
+ FNT_CURVETO, 640, 768, 512, 1024, 319, 1024,
+ FNT_CURVETO, 128, 1024, 0, 768, 0, 512,
+
+ FNT_MOVETO, 0, 512,
+ FNT_LINETO, 288, 512,
+ FNT_CURVETO, 416, 512, 480, 608, 480, 768,
+ FNT_CURVETO, 480, 928, 416, 1024, 288, 1024,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 288, 512,
+ FNT_CURVETO, 384, 512, 416, 480, 449, 416,
+ FNT_CURVETO, 480, 352, 480, 224, 480, 224,
+ FNT_LINETO, 490, 0,
+
+ FNT_MOVETO, 490, 854,
+ FNT_CURVETO, 447, 992, 352, 1044, 256, 1044,
+ FNT_CURVETO, 128, 1044, 22, 959, 22, 800,
+ FNT_CURVETO, 22, 705, 74, 605, 160, 575,
+ FNT_LINETO, 256, 544,
+ FNT_CURVETO, 427, 487, 512, 431, 512, 256,
+ FNT_CURVETO, 512, 96, 416, -21, 256, -21,
+ FNT_CURVETO, 96, -21, 0, 96, 0, 256,
+
+ FNT_MOVETO, 272, 1024,
+ FNT_LINETO, 272, 0,
+ FNT_MOVETO, 544, 1024,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 512, 256,
+ FNT_CURVETO, 512, 96, 384, -21, 256, -21,
+ FNT_CURVETO, 128, -21, 0, 96, 0, 256,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 256, 0,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 833, 1024,
+ FNT_LINETO, 608, 0,
+ FNT_LINETO, 416, 1024,
+ FNT_LINETO, 224, 0,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 544, 0,
+ FNT_LINETO, 32, 1024,
+
+ FNT_MOVETO, 272, 0,
+ FNT_LINETO, 272, 416,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 272, 416,
+ FNT_LINETO, 544, 1024,
+
+ FNT_MOVETO, 544, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 512, 1024,
+ FNT_LINETO, 32, 1024,
+
+ FNT_MOVETO, 182, -108,
+ FNT_LINETO, 0, -108,
+ FNT_LINETO, 0, 1131,
+ FNT_LINETO, 182, 1131,
+
+ FNT_MOVETO, 0, 1056,
+ FNT_LINETO, 384, -65,
+
+ FNT_MOVETO, 0, -108,
+ FNT_LINETO, 182, -108,
+ FNT_LINETO, 182, 1131,
+ FNT_LINETO, 0, 1131,
+
+ FNT_MOVETO, 321, 938,
+ FNT_LINETO, 160, 1142,
+ FNT_LINETO, 0, 938,
+
+ FNT_MOVETO, 1080, -160,
+ FNT_CURVETO, 1083, -160, 0, -160, 0, -160,
+
+ FNT_MOVETO, 193, 928,
+ FNT_LINETO, 42, 1120,
+
+ FNT_MOVETO, 394, 577,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+
+ FNT_MOVETO, 0, 577,
+ FNT_CURVETO, 32, 640, 96, 736, 193, 736,
+ FNT_CURVETO, 352, 736, 426, 575, 426, 352,
+ FNT_CURVETO, 426, 160, 352, 0, 191, 0,
+ FNT_CURVETO, 96, 0, 32, 96, 0, 160,
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 426, 577,
+ FNT_CURVETO, 394, 640, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 368,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+
+ FNT_MOVETO, 426, 577,
+ FNT_CURVETO, 394, 640, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 575, 0, 352,
+ FNT_CURVETO, 0, 160, 74, 0, 234, 0,
+ FNT_CURVETO, 330, 0, 394, 96, 426, 160,
+ FNT_MOVETO, 426, 0,
+ FNT_LINETO, 426, 1024,
+
+ FNT_MOVETO, 12, 394,
+ FNT_LINETO, 449, 394,
+ FNT_CURVETO, 449, 650, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 384,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+
+ FNT_MOVETO, 246, 1024,
+ FNT_LINETO, 214, 1024,
+ FNT_CURVETO, 182, 1024, 118, 992, 118, 896,
+ FNT_LINETO, 118, 0,
+ FNT_MOVETO, 0, 704,
+ FNT_LINETO, 256, 704,
+
+ FNT_MOVETO, 436, 577,
+ FNT_CURVETO, 404, 640, 340, 736, 244, 736,
+ FNT_CURVETO, 84, 736, 10, 575, 10, 352,
+ FNT_CURVETO, 10, 160, 84, 0, 244, 0,
+ FNT_CURVETO, 340, 0, 404, 96, 436, 160,
+ FNT_MOVETO, 106, -224,
+ FNT_CURVETO, 138, -256, 178, -277, 234, -277,
+ FNT_CURVETO, 384, -277, 436, -160, 436, -32,
+ FNT_LINETO, 436, 736,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 65, 736, 160, 736, 193, 736,
+ FNT_CURVETO, 288, 736, 352, 672, 352, 480,
+ FNT_LINETO, 352, 0,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 714,
+ FNT_MOVETO, 0, 961,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 0, -256,
+ FNT_CURVETO, 96, -256, 138, -191, 138, -128,
+ FNT_LINETO, 138, 714,
+ FNT_MOVETO, 138, 961,
+ FNT_LINETO, 138, 1024,
+
+ FNT_MOVETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 256,
+ FNT_LINETO, 336, 736,
+ FNT_MOVETO, 160, 480,
+ FNT_LINETO, 384, 0,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 65, 736, 144, 736, 176, 736,
+ FNT_CURVETO, 256, 736, 321, 672, 321, 480,
+ FNT_LINETO, 321, 0,
+ FNT_MOVETO, 321, 512,
+ FNT_CURVETO, 384, 736, 464, 736, 496, 736,
+ FNT_CURVETO, 577, 736, 640, 672, 640, 480,
+ FNT_LINETO, 640, 0,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 65, 736, 160, 736, 193, 736,
+ FNT_CURVETO, 288, 736, 352, 672, 352, 480,
+ FNT_LINETO, 352, 0,
+
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 406, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 406, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+
+ FNT_MOVETO, 0, 577,
+ FNT_CURVETO, 32, 640, 96, 736, 193, 736,
+ FNT_CURVETO, 352, 736, 426, 575, 426, 352,
+ FNT_CURVETO, 426, 160, 352, 0, 191, 0,
+ FNT_CURVETO, 96, 0, 32, 96, 0, 160,
+ FNT_MOVETO, 0, -256,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 426, 577,
+ FNT_CURVETO, 394, 640, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 575, 0, 352,
+ FNT_CURVETO, 0, 160, 74, 0, 234, 0,
+ FNT_CURVETO, 330, 0, 394, 96, 426, 160,
+ FNT_MOVETO, 426, -256,
+ FNT_LINETO, 426, 736,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 480,
+ FNT_CURVETO, 32, 705, 160, 736, 224, 736,
+
+ FNT_MOVETO, 336, 618,
+ FNT_CURVETO, 309, 707, 248, 746, 176, 746,
+ FNT_CURVETO, 90, 746, 20, 678, 20, 558,
+ FNT_CURVETO, 20, 486, 70, 412, 160, 401,
+ FNT_LINETO, 204, 396,
+ FNT_CURVETO, 313, 384, 368, 319, 368, 191,
+ FNT_CURVETO, 368, 72, 295, -10, 175, -10,
+ FNT_CURVETO, 111, -10, 35, 26, 0, 112,
+
+ FNT_MOVETO, 240, 672,
+ FNT_LINETO, 0, 672,
+ FNT_MOVETO, 256, 0,
+ FNT_LINETO, 191, 0,
+ FNT_CURVETO, 128, 0, 96, 64, 96, 160,
+ FNT_LINETO, 96, 992,
+
+ FNT_MOVETO, 352, 736,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 352, 224,
+ FNT_CURVETO, 288, 0, 191, 0, 160, 0,
+ FNT_CURVETO, 96, 0, 0, 64, 0, 256,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 384, 736,
+ FNT_LINETO, 191, 0,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 640, 736,
+ FNT_LINETO, 480, 0,
+ FNT_LINETO, 319, 736,
+ FNT_LINETO, 160, 0,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 394, 736,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 428, 0,
+ FNT_LINETO, 42, 736,
+
+ FNT_MOVETO, 193, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 16, -256,
+ FNT_CURVETO, 96, -256, 117, -215, 160, -128,
+ FNT_LINETO, 384, 736,
+
+ FNT_MOVETO, 416, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 394, 736,
+ FNT_LINETO, 32, 736,
+
+ FNT_MOVETO, 224, 1130,
+ FNT_LINETO, 191, 1130,
+ FNT_CURVETO, 128, 1130, 96, 1087, 96, 1024,
+ FNT_LINETO, 96, 672,
+ FNT_CURVETO, 96, 608, 96, 544, 0, 512,
+ FNT_CURVETO, 96, 480, 96, 416, 96, 352,
+ FNT_LINETO, 96, 0,
+ FNT_CURVETO, 96, -65, 128, -107, 193, -107,
+ FNT_LINETO, 224, -107,
+
+ FNT_MOVETO, 0, -118,
+ FNT_LINETO, 0, 1130,
+
+ FNT_MOVETO, 0, 1130,
+ FNT_LINETO, 32, 1130,
+ FNT_CURVETO, 96, 1130, 128, 1087, 128, 1024,
+ FNT_LINETO, 128, 672,
+ FNT_CURVETO, 128, 608, 128, 544, 224, 512,
+ FNT_CURVETO, 128, 480, 128, 416, 128, 352,
+ FNT_LINETO, 128, 0,
+ FNT_CURVETO, 128, -65, 96, -107, 32, -107,
+ FNT_LINETO, 0, -107,
+
+ FNT_MOVETO, 577, 598,
+ FNT_CURVETO, 512, 470, 480, 416, 416, 416,
+ FNT_CURVETO, 352, 416, 319, 480, 288, 512,
+ FNT_CURVETO, 256, 544, 224, 608, 160, 608,
+ FNT_CURVETO, 96, 608, 63, 544, 0, 426,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+ FNT_MOVETO, 352, 1184,
+ FNT_LINETO, 160, 1440,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+ FNT_MOVETO, 128, 1184,
+ FNT_LINETO, 288, 1376,
+ FNT_LINETO, 449, 1184,
+
+ FNT_MOVETO, 480, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 480, 1024,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 449, 544,
+ FNT_MOVETO, 352, 1184,
+ FNT_LINETO, 160, 1440,
+
+ FNT_MOVETO, 480, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 480, 1024,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 449, 544,
+ FNT_MOVETO, 63, 1184,
+ FNT_LINETO, 224, 1376,
+ FNT_LINETO, 384, 1184,
+
+ FNT_MOVETO, 480, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 480, 1024,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 449, 544,
+ FNT_MOVETO, 96, 1184,
+ FNT_CURVETO, 111, 1184, 117, 1201, 117, 1217,
+ FNT_CURVETO, 117, 1231, 111, 1248, 96, 1248,
+ FNT_CURVETO, 81, 1248, 75, 1231, 75, 1215,
+ FNT_CURVETO, 75, 1201, 81, 1184, 96, 1184,
+ FNT_MOVETO, 373, 1184,
+ FNT_CURVETO, 388, 1184, 395, 1201, 395, 1217,
+ FNT_CURVETO, 395, 1231, 388, 1248, 373, 1248,
+ FNT_CURVETO, 358, 1248, 353, 1231, 353, 1215,
+ FNT_CURVETO, 353, 1201, 359, 1184, 373, 1184,
+
+ FNT_MOVETO, 160, 0,
+ FNT_LINETO, 160, 1024,
+ FNT_MOVETO, 0, 1184,
+ FNT_LINETO, 160, 1376,
+ FNT_LINETO, 321, 1184,
+
+ FNT_MOVETO, 144, 0,
+ FNT_LINETO, 144, 1024,
+ FNT_MOVETO, 22, 1184,
+ FNT_CURVETO, 36, 1184, 42, 1201, 42, 1217,
+ FNT_CURVETO, 42, 1231, 36, 1248, 22, 1248,
+ FNT_CURVETO, 6, 1248, 0, 1231, 0, 1215,
+ FNT_CURVETO, 0, 1201, 6, 1184, 22, 1184,
+ FNT_MOVETO, 288, 1184,
+ FNT_CURVETO, 303, 1184, 309, 1201, 309, 1217,
+ FNT_CURVETO, 309, 1231, 303, 1248, 288, 1248,
+ FNT_CURVETO, 273, 1248, 267, 1231, 267, 1215,
+ FNT_CURVETO, 267, 1201, 273, 1184, 288, 1184,
+
+ FNT_MOVETO, 0, 1184,
+ FNT_LINETO, 193, 1440,
+
+ FNT_MOVETO, 193, 1184,
+ FNT_LINETO, 0, 1440,
+
+ FNT_MOVETO, 0, 1184,
+ FNT_LINETO, 160, 1376,
+ FNT_LINETO, 321, 1184,
+
+ FNT_MOVETO, 22, 1184,
+ FNT_CURVETO, 36, 1184, 42, 1201, 42, 1216,
+ FNT_CURVETO, 42, 1231, 36, 1248, 22, 1248,
+ FNT_CURVETO, 6, 1248, 0, 1231, 0, 1215,
+ FNT_CURVETO, 0, 1201, 6, 1184, 22, 1184,
+ FNT_MOVETO, 299, 1184,
+ FNT_CURVETO, 314, 1184, 320, 1201, 320, 1216,
+ FNT_CURVETO, 319, 1231, 314, 1248, 299, 1248,
+ FNT_CURVETO, 284, 1248, 279, 1231, 278, 1215,
+ FNT_CURVETO, 278, 1201, 284, 1184, 299, 1184,
+
+ FNT_MOVETO, 411, 1312,
+ FNT_CURVETO, 357, 1215, 325, 1192, 293, 1192,
+ FNT_CURVETO, 261, 1192, 236, 1218, 204, 1251,
+ FNT_CURVETO, 172, 1283, 140, 1312, 108, 1312,
+ FNT_CURVETO, 76, 1312, 54, 1288, 0, 1192,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 512, 256,
+ FNT_CURVETO, 512, 96, 384, -21, 256, -21,
+ FNT_CURVETO, 128, -21, 0, 96, 0, 256,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 352, 1184,
+ FNT_LINETO, 160, 1440,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 512, 256,
+ FNT_CURVETO, 512, 96, 384, -21, 256, -21,
+ FNT_CURVETO, 128, -21, 0, 96, 0, 256,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 96, 1184,
+ FNT_LINETO, 256, 1376,
+ FNT_LINETO, 416, 1184,
+
+ FNT_MOVETO, 577, 128,
+ FNT_CURVETO, 560, 96, 512, -12, 416, -12,
+ FNT_CURVETO, 319, -12, 271, 82, 256, 128,
+ FNT_CURVETO, 224, 224, 191, 288, 96, 288,
+ FNT_CURVETO, 32, 288, 0, 192, 0, 160,
+ FNT_CURVETO, 0, 63, 32, 0, 96, 0,
+ FNT_CURVETO, 160, 0, 193, 32, 256, 128,
+ FNT_CURVETO, 256, 128, 272, 193, 272, 256,
+ FNT_LINETO, 272, 800,
+ FNT_CURVETO, 272, 896, 321, 1024, 416, 1024,
+ FNT_CURVETO, 480, 1024, 544, 959, 544, 831,
+ FNT_MOVETO, 416, 512,
+ FNT_LINETO, 128, 512,
+ FNT_MOVETO, 416, 656,
+ FNT_LINETO, 128, 656,
+
+ FNT_MOVETO, 833, 1184,
+ FNT_CURVETO, 830, 1184, 0, 1184, 0, 1184,
+
+ FNT_MOVETO, 272, 0,
+ FNT_LINETO, 272, 416,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 272, 416,
+ FNT_LINETO, 544, 1024,
+ FNT_MOVETO, 160, 1184,
+ FNT_LINETO, 352, 1440,
+
+ FNT_MOVETO, 193, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 16, -256,
+ FNT_CURVETO, 96, -256, 117, -215, 160, -128,
+ FNT_LINETO, 384, 736,
+ FNT_MOVETO, 160, 928,
+ FNT_LINETO, 288, 1120,
+
+ FNT_MOVETO, 56, 1020,
+ FNT_CURVETO, 96, 1020, 115, 1065, 115, 1106,
+ FNT_CURVETO, 115, 1148, 96, 1192, 56, 1192,
+ FNT_CURVETO, 15, 1192, -3, 1147, -3, 1106,
+ FNT_CURVETO, -3, 1065, 15, 1020, 56, 1020,
+
+ FNT_MOVETO, 336, -28,
+ FNT_LINETO, 433, -138,
+ FNT_LINETO, 335, -310,
+ FNT_MOVETO, 586, 854,
+ FNT_CURVETO, 512, 960, 447, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 736, 0, 512,
+ FNT_CURVETO, 0, 288, 128, -21, 321, -21,
+ FNT_CURVETO, 512, -21, 608, 160, 630, 288,
+
+ FNT_MOVETO, 234, -2,
+ FNT_LINETO, 310, -138,
+ FNT_LINETO, 212, -278,
+ FNT_MOVETO, 426, 577,
+ FNT_CURVETO, 394, 640, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 368,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+
+ FNT_MOVETO, 470, 1312,
+ FNT_CURVETO, 416, 1215, 384, 1192, 352, 1192,
+ FNT_CURVETO, 319, 1192, 295, 1218, 263, 1251,
+ FNT_CURVETO, 231, 1283, 199, 1312, 167, 1312,
+ FNT_CURVETO, 135, 1312, 113, 1288, 59, 1192,
+ FNT_MOVETO, 534, 1024,
+ FNT_LINETO, 534, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 0, 0,
+
+ FNT_MOVETO, 0, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 65, 736, 160, 736, 193, 736,
+ FNT_CURVETO, 288, 736, 352, 672, 352, 480,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 374, 1048,
+ FNT_CURVETO, 319, 952, 288, 928, 256, 928,
+ FNT_CURVETO, 224, 928, 199, 955, 167, 987,
+ FNT_CURVETO, 135, 1019, 103, 1048, 71, 1048,
+ FNT_CURVETO, 39, 1048, 17, 1024, -37, 928,
+
+ FNT_MOVETO, 16, -278,
+ FNT_LINETO, 16, 394,
+ FNT_MOVETO, 22, 736,
+ FNT_CURVETO, 36, 736, 42, 719, 42, 703,
+ FNT_CURVETO, 42, 689, 36, 672, 22, 672,
+ FNT_CURVETO, 6, 672, 0, 689, 0, 705,
+ FNT_CURVETO, 0, 719, 6, 736, 22, 736,
+
+ FNT_MOVETO, 213, 738,
+ FNT_CURVETO, 198, 738, 191, 721, 191, 706,
+ FNT_CURVETO, 193, 691, 198, 674, 213, 674,
+ FNT_CURVETO, 228, 674, 234, 721, 234, 706,
+ FNT_CURVETO, 233, 691, 228, 738, 213, 738,
+ FNT_MOVETO, 212, 482,
+ FNT_CURVETO, 212, 482, 202, 300, 106, 204,
+ FNT_CURVETO, 32, 129, 10, 60, 10, -30,
+ FNT_CURVETO, 10, -158, 77, -286, 202, -286,
+ FNT_CURVETO, 327, -287, 394, -126, 394, -30,
+
+ FNT_MOVETO, 118, 171,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 288, 128, 96, 288, 96,
+ FNT_CURVETO, 449, 96, 588, 288, 588, 512,
+ FNT_CURVETO, 588, 736, 447, 928, 288, 928,
+ FNT_CURVETO, 128, 928, 0, 736, 0, 512,
+ FNT_MOVETO, 118, 853,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 458, 853,
+ FNT_LINETO, 577, 1024,
+ FNT_MOVETO, 458, 171,
+ FNT_LINETO, 577, 0,
+
+ FNT_MOVETO, 577, 128,
+ FNT_CURVETO, 560, 96, 512, -12, 416, -12,
+ FNT_CURVETO, 319, -12, 271, 82, 256, 128,
+ FNT_CURVETO, 224, 224, 191, 288, 96, 288,
+ FNT_CURVETO, 32, 288, 0, 192, 0, 160,
+ FNT_CURVETO, 0, 63, 32, 0, 96, 0,
+ FNT_CURVETO, 160, 0, 193, 32, 256, 128,
+ FNT_CURVETO, 256, 128, 272, 193, 272, 256,
+ FNT_LINETO, 272, 800,
+ FNT_CURVETO, 272, 896, 321, 1024, 416, 1024,
+ FNT_CURVETO, 480, 1024, 544, 959, 544, 831,
+ FNT_MOVETO, 416, 652,
+ FNT_LINETO, 128, 652,
+
+ FNT_MOVETO, 236, 0,
+ FNT_LINETO, 236, 705,
+ FNT_LINETO, 0, 1162,
+ FNT_MOVETO, 236, 703,
+ FNT_LINETO, 492, 1162,
+ FNT_MOVETO, 490, 703,
+ FNT_LINETO, 0, 703,
+ FNT_MOVETO, 490, 480,
+ FNT_LINETO, 0, 480,
+
+ FNT_MOVETO, 288, 256,
+ FNT_CURVETO, 321, 256, 325, 256, 352, 256,
+ FNT_CURVETO, 416, 256, 480, 358, 480, 449,
+ FNT_CURVETO, 480, 526, 472, 584, 416, 640,
+ FNT_CURVETO, 321, 736, 288, 768, 160, 896,
+ FNT_CURVETO, 100, 955, 113, 992, 113, 1024,
+ FNT_CURVETO, 113, 1152, 193, 1232, 256, 1232,
+ FNT_CURVETO, 352, 1232, 394, 1120, 394, 992,
+ FNT_MOVETO, 191, 864,
+ FNT_CURVETO, 160, 864, 156, 864, 128, 864,
+ FNT_CURVETO, 63, 864, 0, 762, 0, 672,
+ FNT_CURVETO, 0, 594, 8, 536, 65, 480,
+ FNT_CURVETO, 160, 384, 191, 352, 321, 224,
+ FNT_CURVETO, 379, 165, 406, 128, 406, 32,
+ FNT_CURVETO, 406, -83, 355, -202, 240, -202,
+ FNT_CURVETO, 144, -202, 80, -63, 80, 32,
+
+ FNT_MOVETO, 0, -118,
+ FNT_CURVETO, 0, -182, 32, -256, 96, -256,
+ FNT_CURVETO, 160, -256, 193, -160, 193, -128,
+ FNT_LINETO, 193, 896,
+ FNT_CURVETO, 193, 928, 224, 1024, 288, 1024,
+ FNT_CURVETO, 352, 1024, 384, 950, 384, 886,
+ FNT_MOVETO, 310, 703,
+ FNT_LINETO, 63, 703,
+
+ FNT_MOVETO, 235, -224,
+ FNT_LINETO, 235, 864,
+ FNT_MOVETO, 426, 575,
+ FNT_CURVETO, 394, 640, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 368,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+
+ FNT_MOVETO, 394, 577,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+ FNT_MOVETO, 65, 928,
+ FNT_LINETO, 224, 1120,
+ FNT_LINETO, 384, 928,
+
+ FNT_MOVETO, 12, 394,
+ FNT_LINETO, 449, 394,
+ FNT_CURVETO, 449, 650, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 384,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+ FNT_MOVETO, 63, 928,
+ FNT_LINETO, 224, 1120,
+ FNT_LINETO, 384, 928,
+
+ FNT_MOVETO, 65, 928,
+ FNT_LINETO, 224, 1120,
+ FNT_LINETO, 384, 928,
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 406, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 406, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+
+ FNT_MOVETO, 352, 736,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 352, 224,
+ FNT_CURVETO, 288, 0, 191, 0, 160, 0,
+ FNT_CURVETO, 96, 0, 0, 64, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 32, 928,
+ FNT_LINETO, 193, 1120,
+ FNT_LINETO, 352, 928,
+
+ FNT_MOVETO, 394, 577,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+ FNT_MOVETO, 160, 928,
+ FNT_LINETO, 352, 1184,
+
+ FNT_MOVETO, 12, 394,
+ FNT_LINETO, 449, 394,
+ FNT_CURVETO, 449, 650, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 384,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+ FNT_MOVETO, 160, 928,
+ FNT_LINETO, 352, 1184,
+
+ FNT_MOVETO, 160, 928,
+ FNT_LINETO, 352, 1184,
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 406, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 406, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+
+ FNT_MOVETO, 352, 736,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 352, 224,
+ FNT_CURVETO, 288, 0, 191, 0, 160, 0,
+ FNT_CURVETO, 96, 0, 0, 64, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 160, 928,
+ FNT_LINETO, 352, 1184,
+
+ FNT_MOVETO, 394, 577,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+ FNT_MOVETO, 256, 928,
+ FNT_LINETO, 63, 1184,
+
+ FNT_MOVETO, 12, 394,
+ FNT_LINETO, 449, 394,
+ FNT_CURVETO, 449, 650, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 384,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+ FNT_MOVETO, 256, 928,
+ FNT_LINETO, 63, 1184,
+
+ FNT_MOVETO, 256, 928,
+ FNT_LINETO, 63, 1184,
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 406, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 406, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+
+ FNT_MOVETO, 352, 736,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 352, 224,
+ FNT_CURVETO, 288, 0, 191, 0, 160, 0,
+ FNT_CURVETO, 96, 0, 0, 64, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 256, 928,
+ FNT_LINETO, 63, 1184,
+
+ FNT_MOVETO, 394, 577,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+ FNT_MOVETO, 69, 926,
+ FNT_CURVETO, 84, 926, 90, 943, 90, 958,
+ FNT_CURVETO, 90, 974, 85, 992, 69, 992,
+ FNT_CURVETO, 53, 992, 48, 974, 48, 958,
+ FNT_CURVETO, 48, 943, 54, 926, 69, 926,
+ FNT_MOVETO, 347, 926,
+ FNT_CURVETO, 361, 926, 368, 943, 368, 958,
+ FNT_CURVETO, 369, 974, 363, 992, 347, 992,
+ FNT_CURVETO, 332, 992, 326, 974, 326, 958,
+ FNT_CURVETO, 327, 943, 332, 927, 347, 926,
+
+ FNT_MOVETO, 12, 394,
+ FNT_LINETO, 449, 394,
+ FNT_CURVETO, 449, 650, 330, 736, 234, 736,
+ FNT_CURVETO, 74, 736, 0, 544, 0, 384,
+ FNT_CURVETO, 0, 191, 74, 0, 234, 0,
+ FNT_CURVETO, 352, 0, 394, 96, 426, 160,
+ FNT_MOVETO, 69, 926,
+ FNT_CURVETO, 84, 926, 90, 943, 90, 958,
+ FNT_CURVETO, 90, 974, 85, 992, 69, 992,
+ FNT_CURVETO, 53, 992, 48, 974, 48, 958,
+ FNT_CURVETO, 48, 943, 54, 926, 69, 926,
+ FNT_MOVETO, 347, 926,
+ FNT_CURVETO, 361, 926, 368, 943, 368, 958,
+ FNT_CURVETO, 369, 974, 362, 992, 347, 992,
+ FNT_CURVETO, 332, 992, 326, 974, 326, 958,
+ FNT_CURVETO, 327, 943, 332, 927, 347, 926,
+
+ FNT_MOVETO, 69, 926,
+ FNT_CURVETO, 84, 926, 90, 943, 90, 958,
+ FNT_CURVETO, 90, 974, 85, 992, 69, 992,
+ FNT_CURVETO, 53, 992, 48, 974, 48, 958,
+ FNT_CURVETO, 48, 943, 54, 926, 69, 926,
+ FNT_MOVETO, 347, 926,
+ FNT_CURVETO, 361, 926, 368, 943, 368, 958,
+ FNT_CURVETO, 369, 974, 362, 992, 347, 992,
+ FNT_CURVETO, 332, 992, 326, 974, 326, 958,
+ FNT_CURVETO, 327, 943, 332, 927, 347, 926,
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 406, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 406, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+
+ FNT_MOVETO, 352, 736,
+ FNT_LINETO, 352, 0,
+ FNT_MOVETO, 352, 224,
+ FNT_CURVETO, 288, 0, 191, 0, 160, 0,
+ FNT_CURVETO, 96, 0, 0, 64, 0, 256,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 45, 926,
+ FNT_CURVETO, 60, 926, 65, 943, 65, 958,
+ FNT_CURVETO, 66, 974, 60, 992, 45, 992,
+ FNT_CURVETO, 30, 992, 23, 974, 23, 958,
+ FNT_CURVETO, 24, 943, 29, 926, 45, 926,
+ FNT_MOVETO, 323, 926,
+ FNT_CURVETO, 338, 926, 344, 943, 344, 958,
+ FNT_CURVETO, 344, 974, 339, 992, 323, 992,
+ FNT_CURVETO, 307, 992, 302, 974, 302, 958,
+ FNT_CURVETO, 302, 943, 308, 926, 323, 926,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+ FNT_MOVETO, 288, 1025,
+ FNT_CURVETO, 329, 1025, 347, 1070, 347, 1111,
+ FNT_CURVETO, 347, 1153, 329, 1197, 288, 1197,
+ FNT_CURVETO, 248, 1197, 229, 1152, 229, 1111,
+ FNT_CURVETO, 229, 1070, 248, 1025, 288, 1025,
+
+ FNT_MOVETO, 96, 0,
+ FNT_LINETO, 96, 714,
+ FNT_MOVETO, -65, 928,
+ FNT_LINETO, 96, 1120,
+ FNT_LINETO, 256, 928,
+
+ FNT_MOVETO, 640, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, 0, 321, 0,
+ FNT_CURVETO, 512, 0, 640, 256, 640, 512,
+ FNT_CURVETO, 640, 768, 512, 1024, 319, 1024,
+ FNT_CURVETO, 128, 1024, 0, 768, 0, 512,
+
+ FNT_MOVETO, 608, 1024,
+ FNT_LINETO, 319, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 321, 1024,
+ FNT_LINETO, 321, 0,
+ FNT_LINETO, 608, 0,
+ FNT_MOVETO, 160, 512,
+ FNT_LINETO, 608, 512,
+
+ FNT_MOVETO, 219, 928,
+ FNT_CURVETO, 260, 928, 277, 974, 277, 1014,
+ FNT_CURVETO, 277, 1056, 260, 1100, 219, 1100,
+ FNT_CURVETO, 178, 1100, 160, 1055, 160, 1014,
+ FNT_CURVETO, 160, 974, 178, 928, 219, 928,
+ FNT_MOVETO, 394, 575,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+
+ FNT_MOVETO, 256, 1184,
+ FNT_LINETO, 63, 928,
+ FNT_MOVETO, 96, 0,
+ FNT_LINETO, 96, 714,
+
+ FNT_MOVETO, 416, 736,
+ FNT_LINETO, 63, 0,
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 406, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 406, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+
+ FNT_MOVETO, 273, 193,
+ FNT_CURVETO, 273, 63, 192, 0, 128, 0,
+ FNT_CURVETO, 63, 0, 0, 64, 0, 193,
+ FNT_CURVETO, 0, 352, 96, 416, 256, 416,
+ FNT_LINETO, 544, 416,
+ FNT_LINETO, 544, 577,
+ FNT_CURVETO, 544, 672, 480, 736, 416, 736,
+ FNT_CURVETO, 352, 736, 273, 671, 273, 544,
+ FNT_LINETO, 273, 191,
+ FNT_CURVETO, 273, 63, 352, 0, 416, 0,
+ FNT_CURVETO, 512, 0, 544, 96, 544, 193,
+ FNT_MOVETO, 272, 543,
+ FNT_CURVETO, 272, 672, 224, 736, 128, 736,
+ FNT_CURVETO, 96, 736, 0, 671, 0, 543,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+ FNT_MOVETO, 160, 1184,
+ FNT_CURVETO, 175, 1184, 181, 1201, 181, 1217,
+ FNT_CURVETO, 181, 1231, 175, 1248, 160, 1248,
+ FNT_CURVETO, 145, 1248, 139, 1231, 139, 1215,
+ FNT_CURVETO, 139, 1201, 146, 1184, 160, 1184,
+ FNT_MOVETO, 427, 1184,
+ FNT_CURVETO, 442, 1184, 448, 1201, 448, 1217,
+ FNT_CURVETO, 447, 1231, 442, 1248, 427, 1248,
+ FNT_CURVETO, 412, 1248, 407, 1231, 406, 1215,
+ FNT_CURVETO, 406, 1201, 412, 1184, 427, 1184,
+
+ FNT_MOVETO, 96, 0,
+ FNT_LINETO, 96, 714,
+ FNT_MOVETO, 96, 928,
+ FNT_LINETO, -96, 1184,
+
+ FNT_MOVETO, 188, 1184,
+ FNT_CURVETO, 203, 1185, 209, 1201, 209, 1216,
+ FNT_CURVETO, 209, 1231, 203, 1247, 188, 1248,
+ FNT_CURVETO, 173, 1248, 167, 1231, 167, 1215,
+ FNT_CURVETO, 167, 1201, 173, 1184, 188, 1184,
+ FNT_MOVETO, 455, 1184,
+ FNT_CURVETO, 470, 1184, 476, 1201, 476, 1216,
+ FNT_CURVETO, 476, 1231, 470, 1248, 455, 1248,
+ FNT_CURVETO, 440, 1248, 434, 1231, 434, 1215,
+ FNT_CURVETO, 434, 1201, 440, 1184, 455, 1184,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, -21, 321, -21,
+ FNT_CURVETO, 544, -21, 662, 256, 662, 512,
+ FNT_CURVETO, 662, 768, 544, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 768, 0, 512,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 512, 256,
+ FNT_CURVETO, 512, 96, 384, -21, 256, -21,
+ FNT_CURVETO, 128, -21, 0, 96, 0, 256,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 122, 1184,
+ FNT_CURVETO, 137, 1184, 143, 1201, 143, 1217,
+ FNT_CURVETO, 143, 1231, 137, 1248, 122, 1248,
+ FNT_CURVETO, 108, 1248, 101, 1231, 101, 1215,
+ FNT_CURVETO, 101, 1201, 107, 1184, 122, 1184,
+ FNT_MOVETO, 389, 1184,
+ FNT_CURVETO, 403, 1184, 411, 1201, 410, 1217,
+ FNT_CURVETO, 410, 1231, 403, 1248, 389, 1248,
+ FNT_CURVETO, 374, 1248, 369, 1231, 368, 1215,
+ FNT_CURVETO, 368, 1201, 374, 1184, 389, 1184,
+
+ FNT_MOVETO, 480, 0,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 0, 1024,
+ FNT_LINETO, 480, 1024,
+ FNT_MOVETO, 0, 544,
+ FNT_LINETO, 449, 544,
+ FNT_MOVETO, 224, 1184,
+ FNT_LINETO, 416, 1440,
+
+ FNT_MOVETO, 193, 0,
+ FNT_LINETO, 193, 714,
+ FNT_MOVETO, 22, 926,
+ FNT_CURVETO, 36, 926, 42, 943, 42, 958,
+ FNT_CURVETO, 42, 974, 37, 992, 22, 992,
+ FNT_CURVETO, 5, 992, 0, 974, 0, 958,
+ FNT_CURVETO, 0, 943, 6, 926, 22, 926,
+ FNT_MOVETO, 299, 926,
+ FNT_CURVETO, 314, 926, 319, 943, 319, 958,
+ FNT_CURVETO, 320, 974, 314, 992, 299, 992,
+ FNT_CURVETO, 284, 992, 278, 974, 278, 958,
+ FNT_CURVETO, 279, 943, 284, 926, 299, 926,
+
+ FNT_MOVETO, 193, 577,
+ FNT_LINETO, 256, 577,
+ FNT_CURVETO, 384, 608, 406, 705, 406, 800,
+ FNT_CURVETO, 406, 935, 336, 1040, 208, 1040,
+ FNT_CURVETO, 63, 1040, 0, 928, 0, 800,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 256, 577,
+ FNT_CURVETO, 384, 544, 449, 447, 449, 256,
+ FNT_CURVETO, 449, 128, 352, -13, 224, -13,
+ FNT_CURVETO, 128, 0, 96, 32, 96, 32,
+
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, -20, 321, -20,
+ FNT_CURVETO, 544, -20, 662, 256, 662, 512,
+ FNT_CURVETO, 662, 768, 544, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 768, 0, 512,
+ FNT_MOVETO, 160, 1184,
+ FNT_LINETO, 321, 1376,
+ FNT_LINETO, 480, 1184,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+ FNT_MOVETO, 224, 1184,
+ FNT_LINETO, 416, 1440,
+
+ FNT_MOVETO, 577, 0,
+ FNT_LINETO, 288, 1024,
+ FNT_LINETO, 0, 0,
+ FNT_MOVETO, 96, 321,
+ FNT_LINETO, 480, 321,
+ FNT_MOVETO, 495, 1312,
+ FNT_CURVETO, 441, 1215, 409, 1192, 377, 1192,
+ FNT_CURVETO, 345, 1192, 319, 1219, 288, 1251,
+ FNT_CURVETO, 256, 1283, 224, 1312, 191, 1312,
+ FNT_CURVETO, 160, 1312, 138, 1288, 84, 1192,
+
+ FNT_MOVETO, 394, 577,
+ FNT_LINETO, 394, 0,
+ FNT_MOVETO, 394, 160,
+ FNT_CURVETO, 330, 63, 256, 10, 191, 10,
+ FNT_CURVETO, 63, 10, 10, 94, 10, 193,
+ FNT_CURVETO, 10, 288, 66, 377, 224, 416,
+ FNT_CURVETO, 352, 449, 394, 477, 394, 608,
+ FNT_CURVETO, 394, 672, 312, 768, 224, 768,
+ FNT_CURVETO, 42, 768, 42, 586, 42, 586,
+ FNT_MOVETO, 416, 1056,
+ FNT_CURVETO, 362, 959, 330, 936, 298, 936,
+ FNT_CURVETO, 266, 936, 241, 963, 209, 995,
+ FNT_CURVETO, 177, 1027, 145, 1056, 113, 1056,
+ FNT_CURVETO, 81, 1056, 59, 1032, 5, 936,
+
+ FNT_MOVETO, 256, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 128, 1024,
+ FNT_LINETO, 128, 0,
+ FNT_LINETO, 352, 0,
+ FNT_CURVETO, 544, 0, 672, 256, 672, 512,
+ FNT_CURVETO, 672, 764, 575, 1024, 352, 1024,
+ FNT_LINETO, 128, 1024,
+
+ FNT_MOVETO, 326, 1042,
+ FNT_LINETO, 19, 760,
+ FNT_MOVETO, 381, 506,
+ FNT_CURVETO, 342, 608, 269, 836, 19, 1038,
+ FNT_MOVETO, 202, 612,
+ FNT_CURVETO, 321, 612, 421, 512, 421, 319,
+ FNT_CURVETO, 421, 152, 344, 0, 202, 0,
+ FNT_CURVETO, 96, 0, 0, 152, 0, 321,
+ FNT_CURVETO, 0, 460, 96, 612, 202, 612,
+
+ FNT_MOVETO, 96, 0,
+ FNT_LINETO, 96, 1024,
+ FNT_MOVETO, 48, 1184,
+ FNT_LINETO, 240, 1440,
+
+ FNT_MOVETO, 96, 0,
+ FNT_LINETO, 96, 1024,
+ FNT_MOVETO, 96, 1184,
+ FNT_LINETO, -96, 1440,
+
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, -20, 321, -20,
+ FNT_CURVETO, 544, -20, 662, 256, 662, 512,
+ FNT_CURVETO, 662, 768, 544, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 768, 0, 512,
+ FNT_MOVETO, 224, 1184,
+ FNT_LINETO, 416, 1440,
+
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, -20, 321, -20,
+ FNT_CURVETO, 544, -20, 662, 256, 662, 512,
+ FNT_CURVETO, 662, 768, 544, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 768, 0, 512,
+ FNT_MOVETO, 416, 1184,
+ FNT_LINETO, 224, 1440,
+
+ FNT_MOVETO, 512, 1312,
+ FNT_CURVETO, 458, 1215, 426, 1192, 394, 1192,
+ FNT_CURVETO, 362, 1192, 337, 1218, 305, 1251,
+ FNT_CURVETO, 273, 1283, 241, 1312, 209, 1312,
+ FNT_CURVETO, 177, 1312, 155, 1288, 101, 1192,
+ FNT_MOVETO, 0, 512,
+ FNT_CURVETO, 0, 256, 128, -21, 321, -21,
+ FNT_CURVETO, 544, -21, 662, 256, 662, 512,
+ FNT_CURVETO, 662, 768, 544, 1044, 319, 1044,
+ FNT_CURVETO, 128, 1044, 0, 768, 0, 512,
+
+ FNT_MOVETO, 234, 736,
+ FNT_CURVETO, 364, 736, 470, 544, 470, 384,
+ FNT_CURVETO, 470, 191, 407, 0, 234, 0,
+ FNT_CURVETO, 74, 0, 0, 192, 0, 384,
+ FNT_CURVETO, 0, 544, 74, 736, 234, 736,
+ FNT_MOVETO, 449, 1056,
+ FNT_CURVETO, 394, 959, 362, 936, 330, 936,
+ FNT_CURVETO, 298, 936, 273, 962, 241, 995,
+ FNT_CURVETO, 209, 1027, 177, 1056, 145, 1056,
+ FNT_CURVETO, 113, 1056, 91, 1032, 37, 936,
+
+ FNT_MOVETO, 431, 1344,
+ FNT_LINETO, 256, 1184,
+ FNT_LINETO, 79, 1344,
+ FNT_MOVETO, 490, 854,
+ FNT_CURVETO, 447, 992, 352, 1044, 256, 1044,
+ FNT_CURVETO, 128, 1044, 22, 959, 22, 800,
+ FNT_CURVETO, 22, 704, 74, 605, 160, 575,
+ FNT_LINETO, 256, 544,
+ FNT_CURVETO, 427, 487, 512, 431, 512, 256,
+ FNT_CURVETO, 512, 96, 416, -21, 256, -21,
+ FNT_CURVETO, 96, -21, 0, 96, 0, 256,
+
+ FNT_MOVETO, 367, 1075,
+ FNT_LINETO, 191, 915,
+ FNT_LINETO, 15, 1075,
+ FNT_MOVETO, 336, 618,
+ FNT_CURVETO, 309, 706, 248, 746, 176, 746,
+ FNT_CURVETO, 90, 746, 20, 678, 20, 558,
+ FNT_CURVETO, 20, 486, 70, 412, 160, 401,
+ FNT_LINETO, 204, 396,
+ FNT_CURVETO, 313, 384, 368, 319, 368, 191,
+ FNT_CURVETO, 368, 72, 295, -10, 175, -10,
+ FNT_CURVETO, 111, -10, 35, 27, 0, 112,
+
+ FNT_MOVETO, 512, 1024,
+ FNT_LINETO, 512, 256,
+ FNT_CURVETO, 512, 96, 384, -21, 256, -21,
+ FNT_CURVETO, 128, -21, 0, 96, 0, 256,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 160, 1184,
+ FNT_LINETO, 352, 1440,
+
+ FNT_MOVETO, 272, 0,
+ FNT_LINETO, 272, 416,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 272, 416,
+ FNT_LINETO, 544, 1024,
+ FNT_MOVETO, 138, 1184,
+ FNT_CURVETO, 153, 1184, 159, 1201, 159, 1217,
+ FNT_CURVETO, 159, 1231, 153, 1248, 138, 1248,
+ FNT_CURVETO, 123, 1248, 117, 1231, 117, 1215,
+ FNT_CURVETO, 117, 1201, 123, 1184, 138, 1184,
+ FNT_MOVETO, 406, 1184,
+ FNT_CURVETO, 420, 1184, 426, 1201, 426, 1217,
+ FNT_CURVETO, 426, 1231, 420, 1248, 406, 1248,
+ FNT_CURVETO, 390, 1248, 384, 1231, 384, 1215,
+ FNT_CURVETO, 384, 1201, 390, 1184, 406, 1184,
+
+ FNT_MOVETO, 193, 0,
+ FNT_LINETO, 0, 736,
+ FNT_MOVETO, 16, -256,
+ FNT_CURVETO, 96, -256, 117, -215, 160, -128,
+ FNT_LINETO, 384, 736,
+ FNT_MOVETO, 69, 928,
+ FNT_CURVETO, 84, 928, 90, 975, 90, 959,
+ FNT_CURVETO, 90, 945, 84, 992, 69, 992,
+ FNT_CURVETO, 54, 992, 48, 975, 48, 959,
+ FNT_CURVETO, 48, 945, 54, 928, 69, 928,
+ FNT_MOVETO, 336, 928,
+ FNT_CURVETO, 351, 928, 357, 975, 357, 959,
+ FNT_CURVETO, 357, 945, 351, 992, 336, 992,
+ FNT_CURVETO, 322, 992, 315, 975, 315, 959,
+ FNT_CURVETO, 315, 945, 322, 928, 336, 928,
+
+ FNT_MOVETO, 128, -449,
+ FNT_LINETO, 128, 1024,
+ FNT_MOVETO, 256, 1024,
+ FNT_LINETO, 0, 1024,
+ FNT_MOVETO, 256, -449,
+ FNT_LINETO, 0, -449,
+ FNT_MOVETO, 128, 0,
+ FNT_LINETO, 384, 0,
+ FNT_CURVETO, 512, 0, 586, 128, 586, 288,
+ FNT_CURVETO, 586, 449, 512, 566, 384, 566,
+ FNT_LINETO, 128, 566,
+
+ FNT_MOVETO, 0, 1024,
+ FNT_LINETO, 0, -288,
+ FNT_MOVETO, 0, 577,
+ FNT_CURVETO, 32, 640, 96, 736, 193, 736,
+ FNT_CURVETO, 352, 736, 426, 576, 426, 352,
+ FNT_CURVETO, 426, 160, 352, 0, 191, 0,
+ FNT_CURVETO, 96, 0, 32, 96, 0, 160,
+
+ FNT_MOVETO, 22, 480,
+ FNT_CURVETO, 36, 480, 42, 497, 42, 512,
+ FNT_CURVETO, 42, 527, 36, 544, 22, 544,
+ FNT_CURVETO, 6, 544, 0, 527, 0, 512,
+ FNT_CURVETO, 0, 497, 6, 480, 22, 480,
+
+ FNT_MOVETO, 0, -288,
+ FNT_LINETO, 65, 736,
+ FNT_MOVETO, 512, 63,
+ FNT_CURVETO, 512, 32, 480, -10, 447, -10,
+ FNT_CURVETO, 420, -10, 379, 1, 396, 256,
+ FNT_LINETO, 428, 736,
+ FNT_MOVETO, 396, 256,
+ FNT_CURVETO, 396, 160, 352, -32, 224, -32,
+ FNT_CURVETO, 103, -32, 63, 65, 32, 224,
+
+ FNT_MOVETO, 224, 566,
+ FNT_LINETO, 160, 566,
+ FNT_CURVETO, 96, 566, 11, 611, 0, 768,
+ FNT_CURVETO, -11, 923, 65, 1024, 160, 1024,
+ FNT_CURVETO, 193, 1024, 449, 1024, 449, 1024,
+ FNT_MOVETO, 224, 1024,
+ FNT_LINETO, 224, 0,
+ FNT_MOVETO, 368, 1024,
+ FNT_LINETO, 368, 0,
+
+ FNT_MOVETO, 512, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 449, -86,
+ FNT_LINETO, 63, -86,
+ FNT_LINETO, 352, 352,
+ FNT_LINETO, 352, -256,
+ FNT_MOVETO, 264, 992,
+ FNT_CURVETO, 352, 992, 396, 912, 396, 831,
+ FNT_CURVETO, 396, 752, 362, 679, 266, 679,
+ FNT_CURVETO, 196, 679, 128, 736, 96, 800,
+ FNT_MOVETO, 224, 992,
+ FNT_LINETO, 264, 992,
+ FNT_CURVETO, 344, 992, 374, 1080, 374, 1131,
+ FNT_CURVETO, 374, 1216, 319, 1280, 249, 1280,
+ FNT_CURVETO, 187, 1280, 128, 1224, 106, 1162,
+
+ FNT_MOVETO, 833, 512,
+ FNT_LINETO, 0, 512,
+
+ FNT_MOVETO, 288, 512,
+ FNT_LINETO, -128, 512,
+ FNT_MOVETO, 256, -86,
+ FNT_LINETO, -128, -86,
+ FNT_LINETO, 160, 352,
+ FNT_LINETO, 160, -256,
+ FNT_MOVETO, -22, 1120,
+ FNT_CURVETO, 26, 1140, 65, 1184, 96, 1280,
+ FNT_LINETO, 96, 672,
+
+ FNT_MOVETO, 416, 512,
+ FNT_LINETO, 0, 512,
+ FNT_MOVETO, 80, 202,
+ FNT_CURVETO, 80, 288, 152, 342, 193, 342,
+ FNT_CURVETO, 232, 342, 311, 289, 311, 175,
+ FNT_CURVETO, 311, 96, 272, 38, 171, -60,
+ FNT_CURVETO, 96, -132, 80, -224, 80, -256,
+ FNT_LINETO, 321, -256,
+ FNT_MOVETO, 106, 1120,
+ FNT_CURVETO, 154, 1140, 193, 1184, 224, 1280,
+ FNT_LINETO, 224, 672,
+
+ FNT_MOVETO, 96, 938,
+ FNT_CURVETO, 96, 938, 128, 1024, 214, 1024,
+ FNT_CURVETO, 310, 1024, 352, 896, 352, 831,
+ FNT_LINETO, 352, 368,
+ FNT_MOVETO, 352, 480,
+ FNT_CURVETO, 319, 384, 256, 368, 224, 368,
+ FNT_CURVETO, 128, 368, 80, 449, 80, 544,
+ FNT_CURVETO, 80, 608, 113, 670, 193, 714,
+ FNT_CURVETO, 288, 768, 352, 800, 352, 800,
+ FNT_MOVETO, 416, 191,
+ FNT_LINETO, 0, 191,
+
+ FNT_MOVETO, 416, 193,
+ FNT_LINETO, 0, 193,
+ FNT_MOVETO, 32, 705,
+ FNT_CURVETO, 32, 544, 96, 384, 208, 384,
+ FNT_CURVETO, 321, 384, 384, 544, 384, 705,
+ FNT_CURVETO, 384, 864, 319, 1024, 208, 1024,
+ FNT_CURVETO, 96, 1024, 32, 864, 32, 703,
+
+ FNT_MOVETO, 256, 736,
+ FNT_LINETO, 0, 368,
+ FNT_LINETO, 256, 0,
+ FNT_MOVETO, 512, 736,
+ FNT_LINETO, 256, 368,
+ FNT_LINETO, 512, 0,
+
+ FNT_MOVETO, 0, 736,
+ FNT_LINETO, 0, 0,
+ FNT_LINETO, 512, 0,
+ FNT_LINETO, 512, 736,
+ FNT_LINETO, 0, 736,
+
+ FNT_MOVETO, 449, 736,
+ FNT_LINETO, 705, 368,
+ FNT_LINETO, 447, 0,
+ FNT_MOVETO, 191, 736,
+ FNT_LINETO, 449, 368,
+ FNT_LINETO, 191, 0,
+
+ FNT_MOVETO, 512, 80,
+ FNT_LINETO, 0, 80,
+ FNT_MOVETO, 512, 624,
+ FNT_LINETO, 0, 624,
+ FNT_MOVETO, 256, 961,
+ FNT_LINETO, 256, 288
+};
+
+/* offsets are array index into fontData for each beginning of character,
+ data goes until next index (NB. there's an extra entry for end of data)
+ (character codes start with 32) Roman-8 encoding for table indexes
+*/
+const short int arc_font_offsets[] = {
+ 0,
+ 0,
+ 37,
+ 49,
+ 73,
+ 127,
+ 195,
+ 254,
+ 295,
+ 312,
+ 329,
+ 347,
+ 359,
+ 400,
+ 406,
+ 437,
+ 443,
+ 474,
+ 487,
+ 521,
+ 572,
+ 584,
+ 621,
+ 673,
+ 686,
+ 748,
+ 800,
+ 862,
+ 934,
+ 943,
+ 955,
+ 964,
+ 1026,
+ 1105,
+ 1120,
+ 1169,
+ 1200,
+ 1226,
+ 1244,
+ 1259,
+ 1299,
+ 1317,
+ 1323,
+ 1346,
+ 1364,
+ 1373,
+ 1388,
+ 1400,
+ 1431,
+ 1457,
+ 1494,
+ 1540,
+ 1588,
+ 1600,
+ 1623,
+ 1632,
+ 1647,
+ 1659,
+ 1674,
+ 1686,
+ 1698,
+ 1704,
+ 1716,
+ 1725,
+ 1735,
+ 1741,
+ 1792,
+ 1829,
+ 1860,
+ 1897,
+ 1931,
+ 1953,
+ 2004,
+ 2030,
+ 2042,
+ 2061,
+ 2079,
+ 2085,
+ 2131,
+ 2157,
+ 2188,
+ 2225,
+ 2262,
+ 2278,
+ 2326,
+ 2348,
+ 2374,
+ 2383,
+ 2398,
+ 2410,
+ 2429,
+ 2441,
+ 2484,
+ 2490,
+ 2533,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2564,
+ 2585,
+ 2609,
+ 2633,
+ 2660,
+ 2740,
+ 2755,
+ 2823,
+ 2829,
+ 2835,
+ 2844,
+ 2906,
+ 2937,
+ 2966,
+ 2998,
+ 3079,
+ 3089,
+ 3110,
+ 3135,
+ 3166,
+ 3206,
+ 3246,
+ 3289,
+ 3346,
+ 3383,
+ 3445,
+ 3500,
+ 3575,
+ 3602,
+ 3706,
+ 3746,
+ 3783,
+ 3843,
+ 3886,
+ 3926,
+ 3961,
+ 4018,
+ 4058,
+ 4095,
+ 4127,
+ 4184,
+ 4224,
+ 4261,
+ 4293,
+ 4406,
+ 4502,
+ 4595,
+ 4683,
+ 4729,
+ 4744,
+ 4781,
+ 4805,
+ 4887,
+ 4899,
+ 4936,
+ 5014,
+ 5091,
+ 5103,
+ 5196,
+ 5281,
+ 5305,
+ 5373,
+ 5427,
+ 5467,
+ 5488,
+ 5534,
+ 5616,
+ 5648,
+ 5695,
+ 5707,
+ 5719,
+ 5756,
+ 5793,
+ 5855,
+ 5917,
+ 5974,
+ 6031,
+ 6060,
+ 6137,
+ 6218,
+ 6259,
+ 6296,
+ 6327,
+ 6370,
+ 6409,
+ 6478,
+ 6484,
+ 6515,
+ 6568,
+ 6625,
+ 6662,
+ 6680,
+ 6695,
+ 6713,
+ 6731,
+ 6731
+};
+
+/* widths for each char (starting with code 32) */
+const short int arc_font_widths[] = {
+ 193,
+ 240,
+ 384,
+ 752,
+ 705,
+ 736,
+ 752,
+ 256,
+ 352,
+ 352,
+ 705,
+ 752,
+ 256,
+ 752,
+ 240,
+ 592,
+ 705,
+ 384,
+ 640,
+ 752,
+ 768,
+ 656,
+ 688,
+ 656,
+ 752,
+ 688,
+ 240,
+ 256,
+ 736,
+ 736,
+ 736,
+ 592,
+ 800,
+ 800,
+ 705,
+ 864,
+ 752,
+ 672,
+ 640,
+ 864,
+ 705,
+ 224,
+ 544,
+ 705,
+ 608,
+ 864,
+ 736,
+ 800,
+ 640,
+ 833,
+ 688,
+ 705,
+ 752,
+ 705,
+ 705,
+ 1024,
+ 736,
+ 752,
+ 736,
+ 384,
+ 592,
+ 384,
+ 512,
+ 896,
+ 384,
+ 592,
+ 640,
+ 640,
+ 640,
+ 640,
+ 449,
+ 640,
+ 544,
+ 224,
+ 336,
+ 577,
+ 220,
+ 833,
+ 544,
+ 640,
+ 640,
+ 640,
+ 416,
+ 577,
+ 432,
+ 544,
+ 592,
+ 833,
+ 624,
+ 592,
+ 608,
+ 416,
+ 224,
+ 416,
+ 768,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 592,
+ 193,
+ 800,
+ 800,
+ 672,
+ 672,
+ 672,
+ 512,
+ 512,
+ 384,
+ 384,
+ 512,
+ 512,
+ 608,
+ 705,
+ 705,
+ 768,
+ 896,
+ 752,
+ 592,
+ 321,
+ 864,
+ 640,
+ 736,
+ 544,
+ 240,
+ 592,
+ 800,
+ 768,
+ 688,
+ 672,
+ 608,
+ 640,
+ 592,
+ 640,
+ 640,
+ 544,
+ 592,
+ 640,
+ 640,
+ 544,
+ 592,
+ 640,
+ 640,
+ 544,
+ 592,
+ 640,
+ 640,
+ 544,
+ 800,
+ 384,
+ 833,
+ 800,
+ 592,
+ 384,
+ 640,
+ 752,
+ 800,
+ 384,
+ 800,
+ 705,
+ 672,
+ 544,
+ 640,
+ 800,
+ 800,
+ 800,
+ 592,
+ 864,
+ 640,
+ 384,
+ 384,
+ 800,
+ 800,
+ 800,
+ 640,
+ 705,
+ 577,
+ 705,
+ 752,
+ 592,
+ 784,
+ 640,
+ 240,
+ 705,
+ 640,
+ 705,
+ 896,
+ 480,
+ 608,
+ 608,
+ 640,
+ 705,
+ 705,
+ 705,
+ 705,
+ 592
+};
+
+/* generate the segments NB void *data is the the graphics state */
+static int
+hpgl_stick_segments(const gs_memory_t *mem, void *data, uint char_index)
+{
+ /* characters start with 32 - what about char index < 0x20 ?? */
+ short table_index_of_char = char_index - 0x20;
+ /* table of offsets into table which contains the font drawing */
+ short offset = stick_font_offsets[table_index_of_char];
+ /* look up the next characters offset, subtract and the result is
+ the number of drawing operations to render the character. */
+ short count = stick_font_offsets[table_index_of_char+1] - offset;
+ short stop = count + offset;
+ /* set up tables debending on stick or arc font */
+ int i;
+
+ if ( (char_index < 0x20) ||
+ (char_index > 0xff) ||
+ ((char_index > 0x7f) && (char_index < 0xa0)) )
+ return 0; /* no glyph */
+
+ /* all entries have 3 short entries */
+ i = offset;
+ while ( i < stop ) {
+ if ( stick_font_data[i] == FNT_LINETO ) {
+ gs_lineto(data, (floatp)(stick_font_data[i+1]), (floatp)(stick_font_data[i+2]));
+ i += 3;
+ }
+ else if ( stick_font_data[i] == FNT_MOVETO ) {
+ gs_moveto(data, (floatp)(stick_font_data[i+1]), (floatp)(stick_font_data[i+2]));
+ i += 3;
+ }
+ else
+ return_error(gs_error_invalidfont);
+ }
+
+ /* table must be corrupt if the loop didn't stop at stop */
+ if ( i != stop )
+ return_error(gs_error_invalidfont);
+ return 0;
+}
+
+/* this procedure has the same cartoon as hpgl_stick_segments() above
+ except the drawing operations are different */
+static int
+hpgl_arc_segments(const gs_memory_t *mem, void *data, uint char_index)
+{
+ /* characters start with 32 - what about char index < 0x20 ?? */
+ short table_index_of_char = char_index - 0x20;
+ /* table of offsets into table which contains the font drawing */
+ short offset = arc_font_offsets[table_index_of_char];
+ /* look up the next characters offset, subtract and the result is
+ the number of drawing operations to render the character. */
+ short count = arc_font_offsets[table_index_of_char+1] - offset;
+ short stop = count + offset;
+ /* set up tables debending on stick or arc font */
+ int i;
+ /* 3 entries for moveto and lineto and 5 for curveto */
+
+ if ( (char_index < 0x20) ||
+ (char_index > 0xff) ||
+ ((char_index > 0x7f) && (char_index < 0xa0)) )
+ return 0; /* no glyph */
+
+ i = offset;
+ while ( i < stop ) {
+ if ( arc_font_data[i] == FNT_LINETO ) {
+ gs_lineto(data, (floatp)(arc_font_data[i+1]), (floatp)(arc_font_data[i+2]));
+ i += 3;
+ }
+ else if ( arc_font_data[i] == FNT_MOVETO ) {
+ gs_moveto(data, (floatp)(arc_font_data[i+1]), (floatp)(arc_font_data[i+2]));
+ i += 3;
+ }
+ else if ( arc_font_data[i] == FNT_CURVETO ) {
+ gs_curveto(data, (floatp)(arc_font_data[i+1]), (floatp)(arc_font_data[i+2]),
+ (floatp)(arc_font_data[i+3]), (floatp)(arc_font_data[i+4]),
+ (floatp)(arc_font_data[i+5]), (floatp)(arc_font_data[i+6]));
+ i += 7;
+ }
+ else
+ return_error(gs_error_invalidfont);
+ }
+
+ /* table must be corrupt if the loop didn't stop at stop */
+ if ( i != stop )
+ return_error(gs_error_invalidfont);
+ return 0;
+}
+
+static int
+hpgl_stick_width(uint char_index)
+{
+ /* The fixed space font is always 1024, the width of the cell */
+ return 1024;
+}
+
+/* Get the unscaled width of a stick/arc character. */
+static int
+hpgl_arc_width(uint char_index)
+{
+ if ( char_index < 0x20 || (char_index < 0xa0 && char_index > 0x7f))
+ return arc_font_widths[0];
+ return arc_font_widths[char_index - 0x20];
+}
+
+/* interface procedure render the characters */
+int
+hpgl_stick_arc_segments(const gs_memory_t *mem,
+ void *data, uint char_index, hpgl_font_type_t font_type)
+{
+ if ( font_type == HPGL_ARC_FONT )
+ return hpgl_arc_segments(mem, data, char_index);
+ else
+ return hpgl_stick_segments(mem, data, char_index);
+}
+
+/* interface procedure to get the width of the characters */
+int hpgl_stick_arc_width(uint char_index, hpgl_font_type_t font_type)
+{
+ if ( font_type == HPGL_ARC_FONT )
+ return hpgl_arc_width(char_index);
+ else
+ return hpgl_stick_width(char_index);
+}
diff --git a/pcl/pgfdata.h b/pcl/pgfdata.h
new file mode 100644
index 000000000..ba224858e
--- /dev/null
+++ b/pcl/pgfdata.h
@@ -0,0 +1,28 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgfdata.h */
+/* Interface to HP-GL/2 stick and arc font data */
+
+/* font type - stick or arc */
+typedef enum {
+ HPGL_ARC_FONT,
+ HPGL_STICK_FONT
+} hpgl_font_type_t;
+
+/* Enumerate the segments of a stick/arc character. */
+int hpgl_stick_arc_segments(const gs_memory_t *mem,
+ void *data, uint char_index, hpgl_font_type_t font_type);
+
+/* Get the unscaled width of a stick/arc character. */
+int hpgl_stick_arc_width(uint char_index, hpgl_font_type_t font_type);
diff --git a/pcl/pgfont.c b/pcl/pgfont.c
new file mode 100644
index 000000000..0b18b0178
--- /dev/null
+++ b/pcl/pgfont.c
@@ -0,0 +1,231 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgfont.c */
+/* HP-GL/2 stick and arc font */
+#include "math_.h"
+#include "gstypes.h"
+#include "gsccode.h"
+#include "gsmemory.h" /* for gsstate.h */
+#include "gsstate.h" /* for gscoord.h, gspath.h */
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gxfixed.h" /* for gxchar.h */
+#include "gxchar.h"
+#include "gxfarith.h"
+#include "gxfont.h"
+#include "plfont.h"
+#include "pgfdata.h"
+#include "pgfont.h"
+
+
+
+/* The client always asks for a Unicode indexed chr.
+ * The stick/arc fonts themselves use Roman-8 (8U) indexing.
+ */
+extern const pl_symbol_map_t map_8U_unicode;
+static gs_glyph
+hpgl_stick_arc_encode_char(gs_font *pfont, gs_char chr, gs_glyph_space_t not_used)
+{
+ int i;
+ /* reverse map unicode back to roman 8 */
+ if (chr < 0x00a1)
+ return (gs_glyph)chr;
+ else {
+ for (i = 0x00a1; i < 0x00ff; ++i)
+ if (chr == map_8U_unicode.codes[i])
+ return (gs_glyph)i;
+
+ }
+ return (gs_glyph)chr; /* this eventually will be a fail */
+}
+
+/* The stick font is fixed-pitch.
+ */
+static int
+hpgl_stick_char_width(const pl_font_t *plfont, const void *pgs, uint uni_code, gs_point *pwidth)
+{
+ /* first map uni_code to roman-8 */
+ uni_code = (uint) hpgl_stick_arc_encode_char(NULL, uni_code, 0);
+
+ /* NB need an interface function call to verify the character exists */
+ if ( (uni_code >= 0x20) && (uni_code <= 0xff) )
+ pwidth->x = hpgl_stick_arc_width(uni_code, HPGL_STICK_FONT);
+ else
+ /* doesn't exist */
+ return 1;
+ return 0;
+}
+
+static int
+hpgl_stick_char_metrics(const pl_font_t *plfont, const void *pgs, uint uni_code, float metrics[4])
+{
+ gs_point width;
+
+ /* never a vertical substitute */
+ metrics[1] = metrics[3] = 0;
+ /* no lsb */
+ metrics[0] = 0;
+ /* just get the width */
+ if ( (hpgl_stick_char_width(plfont, pgs, uni_code, &width)) == 1 )
+ /* doesn't exist */
+ return 1;
+ metrics[2] = width.x;
+ return 0;
+}
+
+/* The arc font is proportionally spaced. */
+static int
+hpgl_arc_char_width(const pl_font_t *plfont, const void *pgs, uint uni_code, gs_point *pwidth)
+{
+ /* first map uni_code to roman-8 */
+ uni_code = (uint) hpgl_stick_arc_encode_char(NULL, uni_code, 0);
+
+ /* NB need an interface function call to verify the character exists */
+ if ( (uni_code >= 0x20) && (uni_code <= 0xff) ) {
+ pwidth->x = hpgl_stick_arc_width(uni_code, HPGL_ARC_FONT)
+ / 1024.0 /* convert to ratio of cell size to be multiplied by point size */
+ * 0.667; /* TRM 23-18 cell is 2/3 of point size */
+ }
+ else
+ /* doesn't exist */
+ return 1;
+ return 0;
+}
+
+static int
+hpgl_arc_char_metrics(const pl_font_t *plfont, const void *pgs, uint uni_code, float metrics[4])
+{
+ gs_point width;
+ /* never a vertical substitute */
+ metrics[1] = metrics[3] = 0;
+ /* no lsb */
+ metrics[0] = 0;
+ /* just get the width */
+ if ( (hpgl_arc_char_width(plfont, pgs, uni_code, &width)) == 1 )
+ /* doesn't exist */
+ return 1;
+ metrics[2] = width.x;
+ return 0;
+}
+
+/* Add a symbol to the path. */
+static int
+hpgl_stick_arc_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont,
+ gs_glyph uni_code, hpgl_font_type_t font_type)
+{
+ int width;
+ gs_matrix save_ctm;
+ int code;
+
+ /* we assert the font is present at this point */
+ width = hpgl_stick_arc_width(uni_code, font_type);
+
+ /* *** incorrect comment The TRM says the stick font is based on a
+ 32x32 unit cell, */
+ /* but the font we're using here is only 15x15. */
+ /* Also, per TRM 23-18, the character cell is only 2/3 the */
+ /* point size. */
+ gs_setcharwidth(penum, pgs, width / 1024.0 * 0.667, 0.0);
+ gs_currentmatrix(pgs, &save_ctm);
+ gs_scale(pgs, 1.0 / 1024.0 * .667, 1.0 / 1024.0 * .667);
+ gs_moveto(pgs, 0.0, 0.0);
+ code = hpgl_stick_arc_segments(pfont->memory, (void *)pgs, uni_code, font_type);
+ if ( code < 0 )
+ return code;
+ gs_setdefaultmatrix(pgs, NULL);
+ gs_initmatrix(pgs);
+ /* Set predictable join and cap styles. */
+ gs_setlinejoin(pgs, gs_join_round);
+ gs_setmiterlimit(pgs, 2.61); /* start beveling at 45 degrees */
+ gs_setlinecap(pgs, gs_cap_round);
+ {
+ float pattern[1];
+ gs_setdash(pgs, pattern, 0, 0);
+ }
+ gs_stroke(pgs);
+ gs_setmatrix(pgs, &save_ctm);
+ return 0;
+}
+
+static int
+hpgl_stick_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont,
+ gs_char ignore_chr, gs_glyph uni_code)
+{
+ return hpgl_stick_arc_build_char(penum, pgs, pfont, uni_code, HPGL_STICK_FONT);
+}
+static int
+hpgl_arc_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont,
+ gs_char ignore_chr, gs_glyph uni_code)
+{ return hpgl_stick_arc_build_char(penum, pgs, pfont, uni_code, HPGL_ARC_FONT);
+
+}
+
+/* Fill in stick/arc font boilerplate. */
+static void
+hpgl_fill_in_stick_arc_font(gs_font_base *pfont, long unique_id)
+{ /* The way the code is written requires FontMatrix = identity. */
+ gs_make_identity(&pfont->FontMatrix);
+ pfont->FontType = ft_user_defined;
+ pfont->PaintType = 1; /* stroked fonts */
+ pfont->BitmapWidths = false;
+ pfont->ExactSize = fbit_use_outlines;
+ pfont->InBetweenSize = fbit_use_outlines;
+ pfont->TransformedChar = fbit_use_outlines;
+ pfont->procs.encode_char = hpgl_stick_arc_encode_char; /* FIX ME (void *) */
+ /* p.y of the FontBBox is a guess, because of descenders. */
+ /* Because of descenders, we have no real idea what the */
+ /* FontBBox should be. */
+ pfont->FontBBox.p.x = 0;
+ pfont->FontBBox.p.y = -0.333;
+ pfont->FontBBox.q.x = 0.667;
+ pfont->FontBBox.q.y = 0.667;
+ uid_set_UniqueID(&pfont->UID, unique_id);
+ pfont->encoding_index = 1; /****** WRONG ******/
+ pfont->nearest_encoding_index = 1; /****** WRONG ******/
+}
+void
+hpgl_fill_in_stick_font(gs_font_base *pfont, long unique_id)
+{ hpgl_fill_in_stick_arc_font(pfont, unique_id);
+#define plfont ((pl_font_t *)pfont->client_data)
+ pfont->procs.build_char = hpgl_stick_build_char; /* FIX ME (void *) */
+ plfont->char_width = hpgl_stick_char_width;
+ plfont->char_metrics = hpgl_stick_char_metrics;
+#undef plfont
+}
+void
+hpgl_fill_in_arc_font(gs_font_base *pfont, long unique_id)
+{ hpgl_fill_in_stick_arc_font(pfont, unique_id);
+#define plfont ((pl_font_t *)pfont->client_data)
+ pfont->procs.build_char = hpgl_arc_build_char; /* FIX ME (void *) */
+ plfont->char_width = hpgl_arc_char_width;
+ plfont->char_metrics = hpgl_arc_char_metrics;
+#undef plfont
+}
+
+void
+hpgl_initialize_stick_fonts( hpgl_state_t *pcs )
+{
+ pcs->g.stick_font[0][0].pfont =
+ pcs->g.stick_font[0][1].pfont =
+ pcs->g.stick_font[1][0].pfont =
+ pcs->g.stick_font[1][1].pfont = 0;
+
+ /* NB most of the pl_font structure is uninitialized! */
+ pcs->g.stick_font[0][0].font_file =
+ pcs->g.stick_font[0][1].font_file =
+ pcs->g.stick_font[1][0].font_file =
+ pcs->g.stick_font[1][1].font_file = 0;
+}
diff --git a/pcl/pgfont.h b/pcl/pgfont.h
new file mode 100644
index 000000000..1af74f580
--- /dev/null
+++ b/pcl/pgfont.h
@@ -0,0 +1,27 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgfont.h */
+/* Definitions for HP-GL/2 stick and arc fonts */
+
+#ifndef pgfont_INCLUDED
+# define pgfont_INCLUDED
+
+#include "pgmand.h"
+
+/* Fill in stick/arc font boilerplate. */
+void hpgl_fill_in_stick_font(gs_font_base *pfont, long unique_id);
+void hpgl_fill_in_arc_font(gs_font_base *pfont, long unique_id);
+void hpgl_initialize_stick_fonts(hpgl_state_t *pcs);
+
+#endif /* pgfont_INCLUDED */
diff --git a/pcl/pgframe.c b/pcl/pgframe.c
new file mode 100644
index 000000000..f39d88f05
--- /dev/null
+++ b/pcl/pgframe.c
@@ -0,0 +1,224 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgframe.c */
+/* PCL5/HP-GL/2 picture frame commands */
+#include "math_.h"
+#include "pgmand.h"
+#include "pgdraw.h"
+#include "pgmisc.h"
+#include "gstypes.h" /* for gsstate.h */
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsmemory.h" /* for gsstate.h */
+#include "gsstate.h"
+#include "pcdraw.h"
+#include "pcfont.h" /* for pcl_continue_underline */
+#include "pcstate.h"
+
+/* Import the RTL implementation of ESC % # A. */
+extern pcl_command_proc(rtl_enter_pcl_mode);
+
+/* This routine should only be used by the pcl reset command. We
+ implicitly enter pcl mode if an ESC E is embedded in the gl/2
+ stream. */
+ int
+pcl_implicit_gl2_finish(pcl_state_t *pcs)
+{
+ pcs->parse_other = 0;
+ hpgl_call_mem(pcs->memory, hpgl_draw_current_path(pcs, hpgl_rm_vector));
+ return 0;
+}
+
+/* Even though these are PCL commands, */
+/* they are only relevant to HPGL. */
+
+/* side effects resulting from a change in picture frame size or
+ anchor point position */
+ static int
+pcl_set_picture_frame_side_effects(pcl_state_t *pcs)
+{
+ hpgl_args_t args;
+ /* default P1 and P2 */
+ hpgl_args_setup(&args);
+ hpgl_IP(&args, pcs);
+
+ /* default the clipping window */
+ hpgl_args_setup(&args);
+ hpgl_IW(&args, pcs);
+
+ /* clear the polygon buffer */
+ hpgl_args_set_int(&args,0);
+ hpgl_PM(&args, pcs);
+
+ hpgl_args_set_int(&args,2);
+ hpgl_PM(&args, pcs);
+
+ /* NB according to spec should move pen to P1. */
+ return 0;
+}
+
+
+int /* ESC * c <w_dp> X */
+pcl_horiz_pic_frame_size_decipoints(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ coord size = (coord)(float_arg(pargs) * 10.0); /* --> centipoints */
+
+ if ( size == 0 )
+ size = pcs->xfm_state.lp_size.x;
+ if ( size != pcs->g.picture_frame_width ) {
+ pcs->g.picture_frame_width = size;
+ pcl_set_picture_frame_side_effects(pcs);
+ }
+ return 0;
+}
+
+int /* ESC * c <h_dp> Y */
+pcl_vert_pic_frame_size_decipoints(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ coord size = (coord)(float_arg(pargs) * 10.0); /* --> centipoints */
+
+ /* default to pcl logical page */
+ if ( size == 0 ) {
+ size = pcs->xfm_state.lp_size.y;
+ if ( pcs->personality != rtl )
+ size -= inch2coord(1.0);
+ }
+ if ( size != pcs->g.picture_frame_height ) {
+ pcs->g.picture_frame_height = size;
+ pcl_set_picture_frame_side_effects(pcs);
+ }
+ return 0;
+}
+
+/*
+ * ESC * c 0 T
+ */
+ int
+pcl_set_pic_frame_anchor_point(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+ gs_point tmp_pt;
+
+ if (i != 0)
+ return 0;
+
+ /* The anchor point is in logical page space */
+ tmp_pt.x = pcs->cap.x;
+ tmp_pt.y = pcs->cap.y;
+ pcl_xfm_to_logical_page_space(pcs, &tmp_pt);
+ if ( ( tmp_pt.x != pcs->g.picture_frame.anchor_point.x ) ||
+ ( tmp_pt.y != pcs->g.picture_frame.anchor_point.y ) ) {
+ pcs->g.picture_frame.anchor_point.x = tmp_pt.x;
+ pcs->g.picture_frame.anchor_point.y = tmp_pt.y;
+ pcl_set_picture_frame_side_effects(pcs);
+ }
+ return 0;
+}
+
+int /* ESC * c <w_in> K */
+pcl_hpgl_plot_horiz_size(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ /* convert to centipoints as to match the picture frame */
+ float size = float_arg(pargs) * 7200.0;
+
+ if ( (coord)size == 0 ) {
+ size = pcs->g.picture_frame_width;
+ pcs->g.plot_size_horizontal_specified = false;
+ }
+ else
+ pcs->g.plot_size_horizontal_specified = true;
+
+ pcs->g.plot_width = (coord)size;
+ pcl_set_picture_frame_side_effects(pcs);
+ return 0;
+}
+
+int /* ESC * c <h_in> L */
+pcl_hpgl_plot_vert_size(pcl_args_t *pargs, pcl_state_t *pcs)
+{
+ /* convert to centipoints as to match the picture frame */
+ float size = float_arg(pargs) * 7200.0;
+ if ( (coord)size == 0 ) {
+ size = pcs->g.picture_frame_height;
+ pcs->g.plot_size_vertical_specified = false;
+ }
+ else
+ pcs->g.plot_size_vertical_specified = true;
+ pcs->g.plot_height = (coord)size;
+ pcl_set_picture_frame_side_effects(pcs);
+ return 0;
+}
+
+/* We redefine this command so we can draw the current GL path */
+/* and, if appropriate, reset the underline bookkeeping. */
+static int /* ESC % <enum> A */
+pcl_enter_pcl_mode(pcl_args_t *pargs, pcl_state_t *pcs)
+{ int code;
+
+ hpgl_call_mem(pcs->memory, hpgl_draw_current_path(pcs, hpgl_rm_vector));
+ code = rtl_enter_pcl_mode(pargs, pcs);
+ switch ( code )
+ {
+ default: /* error */
+ return code;
+ case 1: /* CAP changed */
+ pcl_continue_underline(pcs);
+ case 0: /* CAP not changed */
+ break;
+ }
+ return 0;
+}
+
+/* Initialization */
+static int
+pgframe_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ DEFINE_CLASS('*')
+ {'c', 'X',
+ PCL_COMMAND("Horizontal Picture Frame Size Decipoints",
+ pcl_horiz_pic_frame_size_decipoints,
+ pca_neg_error|pca_big_error)},
+ {'c', 'Y',
+ PCL_COMMAND("Vertical Picture Frame Size Decipoints",
+ pcl_vert_pic_frame_size_decipoints,
+ pca_neg_error|pca_big_error)},
+ {'c', 'T',
+ PCL_COMMAND("Set Picture Frame Anchor Point",
+ pcl_set_pic_frame_anchor_point,
+ pca_neg_error|pca_big_error)},
+ {'c', 'K',
+ PCL_COMMAND("HP-GL/2 Plot Horizontal Size",
+ pcl_hpgl_plot_horiz_size,
+ pca_neg_error|pca_big_error)},
+ {'c', 'L',
+ PCL_COMMAND("HP-GL/2 Plot Vertical Size",
+ pcl_hpgl_plot_vert_size,
+ pca_neg_error|pca_big_error)},
+ END_CLASS
+ DEFINE_CLASS('%')
+ {0, 'A',
+ PCL_COMMAND("Enter PCL Mode",
+ pcl_enter_pcl_mode,
+ pca_neg_ok|pca_big_ok|pca_in_rtl)},
+ END_CLASS
+ return 0;
+}
+const pcl_init_t pgframe_init = {
+ pgframe_do_registration, 0
+};
diff --git a/pcl/pggeom.c b/pcl/pggeom.c
new file mode 100644
index 000000000..e804388bb
--- /dev/null
+++ b/pcl/pggeom.c
@@ -0,0 +1,110 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pggeom.c */
+/* HP-GL/2 geometry routines */
+
+#include "stdio_.h"
+#include "pggeom.h"
+#include "gxfarith.h" /* for gs_sincos */
+
+/* HAS most of these computations require more error checking */
+
+/* ------ Lines, angles, arcs, and chords ------ */
+
+/* compute the angle between 0 and 2*PI given the slope */
+floatp
+hpgl_compute_angle(floatp dx, floatp dy)
+{
+ floatp alpha = atan2(dy, dx);
+
+ return (alpha < 0 ? alpha + M_PI * 2.0 : alpha);
+}
+
+/* compute the center of an arc given 3 points on the arc */
+int
+hpgl_compute_arc_center(floatp x1, floatp y1, floatp x2, floatp y2,
+ floatp x3, floatp y3, floatp *pcx, floatp *pcy)
+
+{
+ floatp px2, py2, dx2, dy2, px3, py3, dx3, dy3;
+ double denom, t2;
+
+ /*
+ * The center is the intersection of the perpendicular bisectors
+ * of the 3 chords. Any two will do for the computation.
+ * (For greatest numerical stability, we should probably choose
+ * the two outside chords, but this is a refinement that we will
+ * leave for the future.)
+ * We define each bisector by a line with the equations
+ * xi = pxi + ti * dxi
+ * yi = pyi + ti * dyi
+ * where i is 2 or 3.
+ */
+
+#define compute_bisector(px, py, dx, dy, xa, ya, xb, yb)\
+ (px = (xa + xb) / 2, py = (ya + yb) / 2,\
+ dx = (ya - yb), dy = (xb - xa) /* 90 degree rotation (either way is OK) */)
+
+ compute_bisector(px2, py2, dx2, dy2, x1, y1, x2, y2);
+ compute_bisector(px3, py3, dx3, dy3, x1, y1, x3, y3);
+
+#undef compute_bisector
+
+ /*
+ * Now find the intersections by solving for t2 or t3:
+ * px2 + t2 * dx2 = px3 + t3 * dx3
+ * py2 + t2 * dy2 = py3 + t3 * dy3
+ * i.e., in standard form,
+ * t2 * dx2 - t3 * dx3 = px3 - px2
+ * t2 * dy2 - t3 * dy3 = py3 - py2
+ * The solution of
+ * a*x + b*y = c
+ * d*x + e*y = f
+ * is
+ * denom = a*e - b*d
+ * x = (c*e - b*f) / denom
+ * y = (a*f - c*d) / denom
+ */
+ denom = dx3 * dy2 - dx2 * dy3;
+ if ( fabs(denom) < 1.0e-6 )
+ return -1; /* degenerate */
+
+ t2 = ((px3 - px2) * (-dy3) - (-dx3) * (py3 - py2)) / denom;
+ *pcx = px2 + t2 * dx2;
+ *pcy = py2 + t2 * dy2;
+ return 0;
+}
+
+/* compute the coordinates of a point on an arc */
+int
+hpgl_compute_arc_coords(floatp radius, floatp center_x, floatp center_y,
+ floatp angle, floatp *px, floatp *py)
+{
+ gs_sincos_t sincos;
+ gs_sincos_degrees(angle, &sincos);
+ *px = radius * sincos.cos + center_x;
+ *py = radius * sincos.sin + center_y;
+ return 0;
+}
+
+/* given a start point, angle (degrees) and magnitude of a vector compute its
+ endpoints */
+int
+hpgl_compute_vector_endpoints(floatp magnitude, floatp x, floatp y,
+ floatp angle_degrees, floatp *endx, floatp *endy)
+
+{
+ return hpgl_compute_arc_coords(magnitude, x, y,
+ angle_degrees, endx, endy);
+}
diff --git a/pcl/pggeom.h b/pcl/pggeom.h
new file mode 100644
index 000000000..be8d4532e
--- /dev/null
+++ b/pcl/pggeom.h
@@ -0,0 +1,89 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pggeom.h */
+/* Definitions for HP-GL/2 geometry. */
+
+#ifndef pggeom_INCLUDED
+# define pggeom_INCLUDED
+
+#include "math_.h"
+#include "gstypes.h" /* for gs_point */
+
+/* ------ Useful conversions ------ */
+
+/*
+ * Convert various other kinds of units to plotter units
+ * (1 plu = 1/40 mm = 1/1016 inch).
+ */
+#define coord_2_plu(a) ((a) * (1016.0 / 7200.0))
+#define plu_2_coord(a) ((a) * (7200.0 / 1016.0))
+#define mm_2_plu(a) ((a) * 40.0)
+#define inches_2_plu(a) ((a) * 1016.0)
+#define plu_2_inches(a) ((a) / 1016.0)
+
+/* ------ Lines, angles, arcs, and chords ------ */
+
+/* calculate the distance between 2 points */
+#define hpgl_compute_distance(x1, y1, x2, y2) \
+ hypot((x1) - (x2), (y1) - (y2))
+
+/* compute the angle between 0 and 2*PI given the slope */
+floatp hpgl_compute_angle(floatp dx, floatp dy);
+
+/* compute the center of an arc given 3 points on the arc */
+int hpgl_compute_arc_center(floatp x1, floatp y1, floatp x2,
+ floatp y2, floatp x3, floatp y3,
+ floatp *pcx, floatp *pcy);
+
+/* compute the coordinates of a point on an arc */
+int hpgl_compute_arc_coords(floatp radius, floatp center_x,
+ floatp center_y, floatp angle,
+ floatp *px, floatp *py);
+
+/* given a start point, angle (degrees) and magnitude of a vector compute its
+ endpoints */
+int hpgl_compute_vector_endpoints(floatp magnitude, floatp x, floatp y,
+ floatp angle_degrees, floatp *endx,
+ floatp *endy);
+
+/* ------ 3-point arcs ------ */
+
+#define epsilon (1.0/2048.0)
+/* defined with epsilon */
+#define equal(a, b) ((fabs((a)-(b)) < epsilon))
+
+/* this definition simplifies subsequent definitions */
+#define equal2(a, b, c, d) ((equal((a), (b))) && (equal((c), (d))))
+
+/* points are equal. HAS -- TEST for epsilon */
+#define hpgl_3_same_points(x1, y1, x2, y2, x3, y3) \
+ ((equal2((x1), (x2), (x2), (x3))) && (equal2((y1), (y2), (y2), (y3))))
+
+/* points are on the same line */
+#define hpgl_3_colinear_points(x1, y1, x2, y2, x3, y3) \
+ (equal(((y1) - (y3)) * ((x1) - (x2)), ((y1) - (y2)) * ((x1) - (x3))))
+
+/* intermediate is the same as first point or last */
+#define hpgl_3_no_intermediate(x1, y1, x2, y2, x3, y3) \
+ ((equal2((x1), (x2), (y1), (y2))) || (equal2((x2), (x3), (y2), (y3))))
+
+/* intermediate lies between endpoints */
+#define hpgl_3_intermediate_between(x1, y1, x2, y2, x3, y3) \
+ ((((x1) >= (x2)) && ((x2) <= (x3))) && \
+ (((y1) >= (y2)) && ((y2) <= (y3))))
+
+/* equal endpoints */
+#define hpgl_3_same_endpoints(x1, y1, x2, y2, x3, y3) \
+ (equal2((x1), (x3), (y1), (y3)))
+#endif /* pggeom_INCLUDED */
diff --git a/pcl/pginit.c b/pcl/pginit.c
new file mode 100644
index 000000000..84fdb8a46
--- /dev/null
+++ b/pcl/pginit.c
@@ -0,0 +1,207 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pginit.c - Initialization and resetting for HP-GL/2. */
+#include "gx.h"
+#include "gsmatrix.h" /* for gsstate.h */
+#include "gsmemory.h" /* for gsstate.h */
+#include "gsstate.h" /* for gs_setlimitclamp */
+#include "pgfont.h"
+#include "pgmand.h"
+#include "pginit.h"
+#include "pgdraw.h"
+#include "pgmisc.h"
+#include "pcpatrn.h"
+
+/* ------ Internal procedures ------ */
+
+/*
+ * Reset a set of font parameters to their default values.
+ */
+ void
+hpgl_default_font_params(
+ pcl_font_selection_t * pfs
+)
+{
+ pfs->params.symbol_set = 277; /* Roman-8 */
+ pfs->params.proportional_spacing = false;
+ pl_fp_set_pitch_per_inch(&pfs->params, 9);
+ pfs->params.height_4ths = (int)(11.5*4);
+ pfs->params.style = 0;
+ pfs->params.stroke_weight = 0;
+ pfs->params.typeface_family = 48; /* stick font */
+ pfs->font = 0; /* not looked up yet */
+}
+
+/*
+ * the following is not consistant with the general model as we
+ * usually depend upon calling the commands directly to update
+ * appropriate qtate variables, unfortunately we must guarantee a
+ * reasonable picture frame, anchor point, and plot size for the rest
+ * of the hpgl/2 code to function properly, and they must be provided
+ * all at once. For example documented side effects of changing the
+ * vertical picture frame height are IP;IW;PM;PM2, but these commands
+ * do not make sense if the horizontal picture frame has never been
+ * set.
+ */
+ static void
+hpgl_default_coordinate_system(
+ hpgl_state_t * pcs
+)
+{
+ pcs->g.plot_width = pcs->g.picture_frame_width
+ = pcs->xfm_state.lp_size.x;
+ pcs->g.plot_height = pcs->g.picture_frame_height
+ = pcs->xfm_state.lp_size.y;
+ if ( pcs->personality == rtl ) {
+ pcs->g.picture_frame.anchor_point.x = 0;
+ pcs->g.picture_frame.anchor_point.y = 0;
+ } else {
+ pcs->g.picture_frame.anchor_point.x = pcs->margins.left;
+ pcs->g.picture_frame.anchor_point.y = pcs->margins.top;
+ pcs->g.plot_height -= inch2coord(1.0);
+ pcs->g.picture_frame_height -= inch2coord(1.0);
+ }
+ pcs->g.plot_size_vertical_specified = false;
+ pcs->g.plot_size_horizontal_specified = false;
+ /* The default coordinate system is absolute with the origin at 0,0 */
+ pcs->g.move_or_draw = hpgl_plot_move;
+ pcs->g.relative_coords = hpgl_plot_absolute;
+ {
+ gs_point pos;
+ pos.x = 0.0;
+ pos.y = 0.0;
+ (void)hpgl_set_current_position(pcs, &pos);
+ }
+ pcs->g.scaling_type = hpgl_scaling_none;
+ return;
+}
+
+/*
+ * Reset all the fill patterns to solid fill.
+ */
+ void
+hpgl_default_all_fill_patterns(
+ hpgl_state_t * pgls
+)
+{
+ int i;
+
+ for (i = 1; i <= 8; ++i)
+ (void)pcl_pattern_RF(i, NULL, pgls);
+}
+
+ void
+hpgl_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ /* pgframe.c (Chapter 18) */
+ hpgl_args_t hpgl_args;
+
+ if ((type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_cold)) != 0 ) {
+ if ((type & (pcl_reset_initial | pcl_reset_cold)) != 0) {
+ gx_path_alloc_contained( &pcs->g.polygon.buffer.path,
+ pcs->memory,
+ "hpgl_do_reset polygon buffer"
+ );
+
+ /*
+ * HAS This is required for GL/2 but probably should
+ * be maintained locally in gl/2's state machinery
+ */
+ gs_setlimitclamp(pcs->pgs, true);
+ gs_setcurvejoin(pcs->pgs, gs_join_bevel);
+ } else
+ gx_path_new(&pcs->g.polygon.buffer.path);
+
+ /* provide default anchor point, plot size and picture frame size */
+ hpgl_default_coordinate_system(pcs);
+
+ /* we should not have a path at this point but we make sure */
+ hpgl_clear_current_path(pcs);
+
+ /* Initialize stick/arc font instances */
+ hpgl_initialize_stick_fonts(pcs);
+
+ /* intialize subpolygon started hack flag */
+ pcs->g.subpolygon_started = false;
+
+ /* execute only the implicit portion of IN */
+ hpgl_IN_implicit(pcs);
+
+ /* we select the default pen 1 here, oddly, IN does not select
+ the default pen even though it sets pen widths and units of
+ measure */
+ hpgl_args_set_int(&hpgl_args,1);
+ hpgl_SP(&hpgl_args, pcs);
+
+ }
+ /* NB check all of these */
+ if ((type & pcl_reset_page_params) != 0) {
+ /* provide default anchor point, plot size and picture frame size */
+ hpgl_default_coordinate_system(pcs);
+ hpgl_args_setup(&hpgl_args);
+ hpgl_IW(&hpgl_args, pcs);
+ hpgl_args_set_int(&hpgl_args,0);
+ hpgl_PM(&hpgl_args, pcs);
+ hpgl_args_set_int(&hpgl_args,2);
+ hpgl_PM(&hpgl_args, pcs);
+ hpgl_args_setup(&hpgl_args);
+ hpgl_IP(&hpgl_args, pcs);
+ }
+
+ if ((type & pcl_reset_picture_frame) != 0) {
+ /* this shouldn't happen. Picture frame side effects are
+ handled directly by the command picture frame command. */
+ dprintf("PCL reset picture frame received\n");
+ }
+
+ if ((type & pcl_reset_overlay) != 0)
+ /* ignore return */
+ (void)hpgl_reset_overlay(pcs);
+
+ if ((type & (pcl_reset_plot_size)) != 0) {
+ /* this shouldn't happen. Plot size side effects are handled
+ directly by the command picture frame command. */
+ dprintf("PCL reset plot received\n");
+ }
+
+ if ((type & (pcl_reset_permanent)) != 0 ) {
+ gx_path_free(&pcs->g.polygon.buffer.path, "hpgl_do_reset polygon buffer");
+ /* if we have allocated memory for a stick font free the memory */
+ hpgl_free_stick_fonts(pcs);
+ }
+ return;
+}
+
+/* ------ Copy the HP-GL/2 state for macro call/overlay/exit. */
+
+ static int
+hpgl_do_copy(
+ pcl_state_t * psaved,
+ const pcl_state_t * pcs,
+ pcl_copy_operation_t operation
+)
+{
+ if ((operation & pcl_copy_after) != 0) {
+ /* Don't restore the polygon buffer. (Copy from pcs to psaved.)
+ * path->segments is reference counted!
+ */
+ memcpy(&psaved->g.polygon.buffer.path, &pcs->g.polygon.buffer.path, sizeof(gx_path));
+ }
+ return 0;
+}
+
+const pcl_init_t pginit_init = { 0, hpgl_do_reset, hpgl_do_copy };
diff --git a/pcl/pginit.h b/pcl/pginit.h
new file mode 100644
index 000000000..5b597c5e2
--- /dev/null
+++ b/pcl/pginit.h
@@ -0,0 +1,33 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pginit.h - Interface to initialize/reset procedures in pginit.c */
+
+#ifndef pginit_INCLUDED
+#define pginit_INCLUDED
+
+#include "gx.h"
+#include "pcstate.h"
+#include "pcommand.h"
+#include "pgmand.h"
+
+/* Reset a set of font parameters to their default values. */
+void hpgl_default_font_params( pcl_font_selection_t * pfs );
+
+/* Reset all the fill patterns to solid fill. */
+void hpgl_default_all_fill_patterns( hpgl_state_t * pgls );
+
+/* Reset (parts of) the HP-GL/2 state. */
+void hpgl_do_reset( pcl_state_t * pcs, pcl_reset_type_t type );
+
+#endif /* pginit_INCLUDED */
diff --git a/pcl/pglabel.c b/pcl/pglabel.c
new file mode 100644
index 000000000..b7175dec2
--- /dev/null
+++ b/pcl/pglabel.c
@@ -0,0 +1,1476 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pglabel.c - HP-GL/2 label commands */
+
+#include "math_.h"
+#include "memory_.h"
+#include "ctype_.h"
+#include "stdio_.h" /* for gdebug.h */
+#include "gdebug.h"
+#include "pcparse.h"
+#include "plvalue.h"
+#include "pgmand.h"
+#include "pginit.h"
+#include "pgfont.h"
+#include "pgdraw.h"
+#include "pggeom.h"
+#include "pgmisc.h"
+#include "pcpage.h"
+#include "pcfsel.h"
+#include "pcsymbol.h"
+#include "pcpalet.h"
+#include "pcdraw.h"
+#include "gscoord.h"
+#include "gsline.h"
+#include "gspath.h"
+#include "gsutil.h"
+#include "gxchar.h" /* for show enumerator */
+#include "gxfont.h"
+#include "gxstate.h" /* for gs_state_client_data */
+
+#define STICK_FONT_TYPEFACE 48
+
+/* NB this next constant is not quite right. The STICK_FONT_TYPEFACE
+ definition is used in the code to cover both stick and arc fonts.
+ Typically the prescription was to choose the stick font typeface
+ (48) and enable proportional spacing to get the arc font. More
+ recently we discovered a new typeface family number that can be
+ used for the proportionally spaced arc fonts (50). This has been
+ reflected in the hpgl/2 selection code but nowhere else. */
+#define ARC_FONT_TYPEFACE 50
+
+/* currently selected font */
+static pl_font_t *
+hpgl_currentfont(const hpgl_state_t *pgls)
+{
+ return pgls->g.font_selection[pgls->g.font_selected].font;
+}
+
+static bool
+hpgl_is_currentfont_stick(const hpgl_state_t *pgls)
+{
+ pl_font_t *plfont = hpgl_currentfont(pgls);
+ if (!plfont)
+ return false;
+ return ( ((plfont->params.typeface_family & 0xfff) == STICK_FONT_TYPEFACE) &&
+ (plfont->params.proportional_spacing == false) );
+}
+
+/* convert points 2 plu - agfa uses 72.307 points per inch */
+static floatp
+hpgl_points_2_plu(const hpgl_state_t *pgls, floatp points)
+{
+ const pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ floatp ppi = 72.0;
+ if ( pfs->font->scaling_technology == plfst_Intellifont )
+ ppi = 72.307;
+ return points * (1016.0 / ppi);
+}
+
+/* ------ Next-character procedure ------ */
+
+/* is it a printable character - duplicate of pcl algorithm in
+ pctext.c */
+static bool
+hpgl_is_printable(
+ const pl_symbol_map_t * psm,
+ gs_char chr,
+ bool is_stick
+)
+{
+ if ( is_stick )
+ return (chr >= ' ') && (chr <= 0xff);
+ if ((psm == 0) || (psm->type >= 2))
+ return true;
+ else if (psm->type == 1)
+ chr &= 0x7f;
+ return (chr >= ' ') && (chr <= '\177');
+}
+
+/*
+ * Map a character through the symbol set, if needed.
+ */
+static gs_char
+hpgl_map_symbol(uint chr, const hpgl_state_t *pgls)
+{
+ const pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ const pl_symbol_map_t *psm = pfs->map;
+
+ return pl_map_symbol(psm, chr,
+ pfs->font->storage == pcds_internal,
+ pl_complement_to_vocab(pfs->font->character_complement) == plgv_MSL,
+ false);
+}
+
+/* ------ Font selection ------- */
+
+/* Select primary (0) or alternate (1) font. */
+static void
+hpgl_select_font_pri_alt(hpgl_state_t *pgls, int index)
+{
+ if ( pgls->g.font_selected != index ) {
+ hpgl_free_stick_fonts(pgls);
+ pgls->g.font_selected = index;
+ pgls->g.font = 0;
+ }
+ return;
+}
+
+/* forward decl */
+static int hpgl_recompute_font(hpgl_state_t *pgls);
+
+/* Ensure a font is available. */
+static int
+hpgl_ensure_font(hpgl_state_t *pgls)
+{
+ if ( ( pgls->g.font == 0 ) || ( pgls->g.font->pfont == 0 ) )
+ hpgl_call(hpgl_recompute_font(pgls));
+ return 0;
+}
+
+/*
+ * The character complement for the stick font is puzzling: it doesn't seem
+ * to correspond directly to any of the MSL *or* Unicode symbol set bits
+ * described in the Comparison Guide. We set the bits for MSL Basic Latin
+ * (63) and for Unicode ASCII (31), and Latin 1 (30).
+ */
+static const byte stick_character_complement[8] = {
+ 0x7f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xfe
+};
+
+/* Select the stick font, creating it if necessary. */
+/* We break this out only for readability: it's only called in one place. */
+static int
+hpgl_select_stick_font(hpgl_state_t *pgls)
+{ pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ pl_font_t *font = &pgls->g.stick_font[pgls->g.font_selected]
+ [pfs->params.proportional_spacing];
+ gs_font_base *pfont;
+ int code;
+ /* Create a gs_font if none has been created yet. */
+ hpgl_free_stick_fonts(pgls);
+ pfont = gs_alloc_struct(pgls->memory, gs_font_base, &st_gs_font_base,
+ "stick/arc font");
+
+
+ if ( pfont == 0 )
+ return_error(e_Memory);
+ code = pl_fill_in_font((gs_font *)pfont, font, pgls->font_dir,
+ pgls->memory, "stick/arc font");
+ if ( code < 0 )
+ return code;
+ if ( pfs->params.proportional_spacing )
+ hpgl_fill_in_arc_font(pfont, gs_next_ids(pgls->memory, 1));
+ else
+ hpgl_fill_in_stick_font(pfont, gs_next_ids(pgls->memory, 1));
+ font->pfont = (gs_font *)pfont;
+ font->scaling_technology = plfst_TrueType;/****** WRONG ******/
+ font->font_type = plft_Unicode;
+ memcpy(font->character_complement, stick_character_complement, 8);
+ /*
+ * The stick/arc font is protean: set its proportional spacing,
+ * style, and stroke weight parameters to the requested ones.
+ * We could fill in some of the other characteristics earlier,
+ * but it's simpler to do it here.
+ */
+ font->params = pfs->params;
+ font->params.typeface_family = STICK_FONT_TYPEFACE;
+ /*
+ * The stick font is defined in a cell that's only 2/3
+ * the size of the actual character.
+ */
+ pl_fp_set_pitch_cp(&font->params, 100.0*2/3);
+ pfs->font = font;
+ {
+ byte id[2];
+
+ id[0] = pfs->params.symbol_set >> 8;
+ id[1] = pfs->params.symbol_set & 0xff;
+ pfs->map = pcl_find_symbol_map(pgls,
+ id, plgv_Unicode);
+ }
+ return 0;
+}
+
+/* Check whether the stick font supports a given symbol set. */
+static bool
+hpgl_stick_font_supports(const pcl_state_t *pcs, uint symbol_set)
+{
+ pl_glyph_vocabulary_t gv =
+ pl_complement_to_vocab(stick_character_complement);
+ byte id[2];
+ pl_symbol_map_t *map;
+
+ id[0] = symbol_set >> 8;
+ id[1] = symbol_set & 0xff;
+ if ( (map = pcl_find_symbol_map(pcs, id, gv)) == 0 )
+ return false;
+ return pcl_check_symbol_support(map->character_requirements,
+ stick_character_complement);
+}
+
+/* Recompute the current font if necessary. */
+static int
+hpgl_recompute_font(hpgl_state_t *pgls)
+{ pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+
+ if (( ((pfs->params.typeface_family & 0xfff) == STICK_FONT_TYPEFACE ||
+ (pfs->params.typeface_family & 0xfff) == ARC_FONT_TYPEFACE )
+ && pfs->params.style == 0 /* upright */
+ && hpgl_stick_font_supports(pgls,
+ pfs->params.symbol_set))
+ /* rtl only has stick fonts */
+ || ( pgls->personality == rtl )
+ )
+ hpgl_call(hpgl_select_stick_font(pgls));
+ else
+ { int code = pcl_reselect_font(pfs, pgls);
+
+ if ( code < 0 )
+ return code;
+ }
+ pgls->g.font = pfs->font;
+ pgls->g.map = pfs->map;
+ return pl_load_resident_font_data_from_file(pgls->memory, pfs->font);
+}
+
+/* ------ Position management ------ */
+
+/* accessor for character extra space takes line feed direction into account */
+static inline hpgl_real_t
+hpgl_get_character_extra_space_x(const hpgl_state_t *pgls)
+{
+ return (pgls->g.character.line_feed_direction < 0) ?
+ pgls->g.character.extra_space.y :
+ pgls->g.character.extra_space.x;
+}
+
+static inline hpgl_real_t
+hpgl_get_character_extra_space_y(const hpgl_state_t *pgls)
+{
+ return (pgls->g.character.line_feed_direction < 0) ?
+ pgls->g.character.extra_space.x :
+ pgls->g.character.extra_space.y;
+}
+
+/* Get a character width in the current font, plus extra space if any. */
+/* If the character isn't defined, return 1, otherwise return 0. */
+static int
+hpgl_get_char_width(const hpgl_state_t *pgls, gs_char ch, hpgl_real_t *width)
+{
+ gs_glyph glyph = hpgl_map_symbol(ch, pgls);
+ const pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ int code = 0;
+ gs_point gs_width;
+ if ( pgls->g.character.size_mode == hpgl_size_not_set ) {
+ if ( pfs->params.proportional_spacing ) {
+ code = pl_font_char_width(pfs->font, (void *)(pgls->pgs), glyph, &gs_width);
+ /* hack until this code gets written properly, the
+ following should amount to a percentage of the
+ em-square the space character would occupy... */
+ if (code == 1) {
+ gs_width.y = 0;
+ gs_width.x = pl_fp_pitch_cp(&pfs->font->params) / 100.0;
+ }
+
+ if ( !pl_font_is_scalable(pfs->font) ) {
+ if ( code == 0 )
+ *width = gs_width.x * inches_2_plu(1.0 / pfs->font->resolution.x);
+ else
+ *width = coord_2_plu(pl_fp_pitch_cp(&pfs->font->params) * 10);
+ goto add;
+ }
+ else if ( code >= 0 ) {
+ *width = gs_width.x * hpgl_points_2_plu(pgls, pfs->params.height_4ths / 4.0);
+ goto add;
+ }
+ code = 1;
+ }
+ *width = hpgl_points_2_plu(pgls, pl_fp_pitch_cp(&pfs->params) / 100.0);
+ } else {
+ *width = pgls->g.character.size.x;
+ if (pgls->g.character.size_mode == hpgl_size_relative)
+ *width *= pgls->g.P2.x - pgls->g.P1.x;
+
+ }
+ add:
+
+ if ( hpgl_get_character_extra_space_x(pgls) != 0 ) {
+ /* Add extra space. */
+ if ( pfs->params.proportional_spacing && ch != ' ' ) {
+ /* Get the width of the space character. */
+ int scode =
+ pl_font_char_width(pfs->font, (void *)(pgls->pgs), hpgl_map_symbol(' ', pgls), &gs_width);
+ hpgl_real_t extra;
+
+ if ( scode >= 0 )
+ extra = gs_width.x * hpgl_points_2_plu(pgls, pfs->params.height_4ths / 4.0);
+ else
+ extra = hpgl_points_2_plu(pgls, (pl_fp_pitch_cp(&pfs->params)) / 10.0);
+ *width += extra * hpgl_get_character_extra_space_x(pgls);
+ } else {
+ /* All characters have the same width, */
+ /* or we're already getting the width of a space. */
+ *width *= 1.0 + hpgl_get_character_extra_space_x(pgls);
+ }
+ }
+ return code;
+}
+/* Get the cell height or character height in the current font, */
+/* plus extra space if any. */
+static int
+hpgl_get_current_cell_height(const hpgl_state_t *pgls, hpgl_real_t *height)
+{
+ const pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+
+ if ( pfs->font->scaling_technology != plfst_bitmap ) {
+ gs_point scale = hpgl_current_char_scale(pgls);
+ *height = fabs(scale.y);
+ } else {
+ /* NB temporary not correct */
+ *height = hpgl_points_2_plu(pgls, pfs->params.height_4ths / 4.0);
+ }
+
+ /* the HP manual says linefeed distance or cell height is 1.33
+ times point size for stick fonts and "about" 1.2 times the
+ point size for "most" fonts. Empirical results suggest the
+ stick font value is 1.28. NB This value appears to be
+ slightly different for the proportional arc font. */
+ if (pgls->g.character.text_path == hpgl_text_right || pgls->g.character.text_path == hpgl_text_left) {
+ if ( hpgl_is_currentfont_stick(pgls) )
+ *height *= 1.28;
+ else
+ *height *= 1.2;
+ } else {
+ /* INC */
+ if ( hpgl_is_currentfont_stick(pgls) )
+ *height *= .96;
+ else
+ *height *= .898;
+ }
+
+
+ *height *= 1.0 + hpgl_get_character_extra_space_y(pgls);
+ return 0;
+}
+
+/* distance tranformation for character slant */
+static int
+hpgl_slant_transform_distance(hpgl_state_t *pgls, gs_point *dxy, gs_point *s_dxy)
+{
+ if ( pgls->g.character.slant && !pgls->g.bitmap_fonts_allowed ) {
+ gs_matrix smat;
+ gs_point tmp_dxy = *dxy;
+ gs_make_identity(&smat);
+ smat.yx = pgls->g.character.slant;
+ hpgl_call(gs_distance_transform(tmp_dxy.x, tmp_dxy.y, &smat, s_dxy));
+ }
+ return 0;
+}
+
+/* distance tranformation for character direction */
+static int
+hpgl_rotation_transform_distance(hpgl_state_t *pgls, gs_point *dxy, gs_point *r_dxy)
+{
+ double run = pgls->g.character.direction.x;
+ double rise = pgls->g.character.direction.y;
+ if ( rise != 0 ) {
+ double denom = hypot(run, rise);
+ gs_point tmp_dxy = *dxy;
+ gs_matrix rmat;
+ gs_make_identity(&rmat);
+ rmat.xx = run / denom;
+ rmat.xy = rise / denom;
+ rmat.yx = -rmat.xy;
+ rmat.yy = rmat.xx;
+ hpgl_call(gs_distance_transform(tmp_dxy.x, tmp_dxy.y, &rmat, r_dxy));
+ }
+ return 0;
+}
+
+/* Reposition the cursor. This does all the work for CP, and is also */
+/* used to handle some control characters within LB. */
+/* If pwidth != 0, it points to a precomputed horizontal space width. */
+static int
+hpgl_move_cursor_by_characters(hpgl_state_t *pgls, hpgl_real_t spaces,
+ hpgl_real_t lines, const hpgl_real_t *pwidth)
+{
+ double nx, ny;
+ double dx = 0, dy = 0;
+
+ hpgl_call(hpgl_ensure_font(pgls));
+
+ lines *= pgls->g.character.line_feed_direction;
+ /* For vertical text paths, we have to swap spaces and lines. */
+ switch ( pgls->g.character.text_path )
+ {
+ case hpgl_text_right:
+ nx = spaces, ny = lines; break;
+ case hpgl_text_down:
+ nx = lines, ny = -spaces; break;
+ case hpgl_text_left:
+ nx = -spaces, ny = -lines; break;
+ case hpgl_text_up:
+ nx = -lines, ny = spaces; break;
+ }
+ /* calculate the next label position in relative coordinates. */
+ if ( nx != 0 ) {
+ hpgl_real_t width;
+ if ( pwidth != 0 )
+ width = *pwidth;
+ else
+ hpgl_get_char_width(pgls, ' ', &width);
+ dx = width * nx;
+ }
+ if ( ny != 0 ) {
+ hpgl_real_t height;
+ hpgl_call(hpgl_get_current_cell_height(pgls, &height));
+ dy = ny * height;
+ }
+
+ /*
+ * We just computed the deltas in user units if characters are
+ * using relative sizing, and in PLU otherwise.
+ * If scaling is on but characters aren't using relative
+ * sizing, we have to convert the deltas to user units.
+ */
+ if ( pgls->g.scaling_type != hpgl_scaling_none )
+ {
+ gs_matrix mat;
+ gs_point user_dxy;
+ hpgl_call(hpgl_compute_user_units_to_plu_ctm(pgls, &mat));
+ hpgl_call(gs_distance_transform_inverse(dx, dy, &mat, &user_dxy));
+ dx = user_dxy.x;
+ dy = user_dxy.y;
+ }
+
+ {
+ gs_point dxy;
+ dxy.x = dx;
+ dxy.y = dy;
+ hpgl_rotation_transform_distance(pgls, &dxy, &dxy);
+ dx = dxy.x;
+ dy = dxy.y;
+ }
+ /* a relative move to the new position */
+ hpgl_call(hpgl_add_point_to_path(pgls, dx, dy,
+ hpgl_plot_move_relative, true));
+
+ if ( lines != 0 ) {
+ /* update the position of the carriage return point */
+ pgls->g.carriage_return_pos.x += dx;
+ pgls->g.carriage_return_pos.y += dy;
+ }
+ /* free any selected stick fonts */
+ hpgl_free_stick_fonts(pgls);
+ return 0;
+}
+
+/* Execute a CR for CP or LB. */
+static int
+hpgl_do_CR(hpgl_state_t *pgls)
+{
+ return hpgl_add_point_to_path(pgls, pgls->g.carriage_return_pos.x,
+ pgls->g.carriage_return_pos.y,
+ hpgl_plot_move_absolute,
+ true);
+}
+
+/* CP [spaces,lines]; */
+/* CP [;] */
+int
+hpgl_CP(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_real_t spaces, lines;
+
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &spaces) )
+ {
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &lines) )
+ return e_Range;
+ }
+ else
+ {
+ /* if there are no arguments a carriage return and line feed
+ is executed */
+ hpgl_call(hpgl_do_CR(pgls));
+ spaces = 0, lines = -1;
+ }
+ return hpgl_move_cursor_by_characters(pgls, spaces, lines,
+ (const hpgl_real_t *)0);
+}
+
+/* ------ Label buffer management ------ */
+
+/* initialize the character buffer, setting state pointers for the
+ beginning of the character buffer and the current character within
+ the buffer to position 0. */
+static int
+hpgl_init_label_buffer(hpgl_state_t *pgls)
+{
+ pgls->g.label.char_count = 0;
+ pgls->g.label.buffer_size = hpgl_char_count;
+ return ((pgls->g.label.buffer =
+ gs_alloc_bytes(pgls->memory, hpgl_char_count,
+ "hpgl_init_label_buffer")) == 0 ?
+ e_Memory :
+ 0);
+}
+
+/* release the character buffer */
+static int
+hpgl_destroy_label_buffer(hpgl_state_t *pgls)
+{
+ gs_free_object(pgls->memory, pgls->g.label.buffer,
+ "hpgl_destroy_label_buffer");
+ pgls->g.label.char_count = 0;
+ pgls->g.label.buffer_size = 0;
+ pgls->g.label.buffer = 0;
+ return 0;
+}
+
+/* add a single character to the line buffer */
+static int
+hpgl_buffer_char(hpgl_state_t *pgls, byte ch)
+{
+ /* check if there is room for the new character and resize if
+ necessary */
+ if ( pgls->g.label.buffer_size == pgls->g.label.char_count )
+ { /* Resize the label buffer, currently by doubling its size. */
+ uint new_size = pgls->g.label.buffer_size << 1;
+ byte *new_mem =
+ gs_resize_object(pgls->memory, pgls->g.label.buffer, new_size,
+ "hpgl_resize_label_buffer");
+
+ if ( new_mem == 0 )
+ return_error(e_Memory);
+ pgls->g.label.buffer = new_mem;
+ pgls->g.label.buffer_size = new_size;
+ }
+ /* store the character */
+ pgls->g.label.buffer[pgls->g.label.char_count++] = ch;
+ return 0;
+}
+
+/*
+ * Test if the gl/2 drawing primitives should draw the character or
+ * "show" can be used directly.
+ */
+static bool
+hpgl_use_show(hpgl_state_t *pgls, pl_font_t *pfont)
+{
+
+ /* Show cannot be used if CF is not default since the character
+ may require additional processing by the line drawing code. */
+ if ( (pgls->g.character.fill_mode == 0 && pgls->g.character.edge_pen == 0) ||
+ (pfont->scaling_technology == plfst_bitmap) )
+ return true;
+ else
+ return false;
+}
+
+/* get the scaling factors for a gl/2 character */
+gs_point
+hpgl_current_char_scale(const hpgl_state_t *pgls)
+{
+ const pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ pl_font_t *font = pfs->font;
+ bool bitmaps_allowed = pgls->g.bitmap_fonts_allowed;
+
+ gs_point scale;
+
+ if (pgls->g.character.size_mode == hpgl_size_not_set || font->scaling_technology == plfst_bitmap) {
+ if (font->scaling_technology == plfst_bitmap) {
+ scale.x = inches_2_plu(1.0 / font->resolution.x);
+ scale.y = -inches_2_plu(1.0 / font->resolution.y);
+ /* Scale fixed-width fonts by pitch, variable-width by height. */
+ } else if (pfs->params.proportional_spacing) {
+ if (pl_font_is_scalable(font)) {
+ scale.x = hpgl_points_2_plu(pgls, pfs->params.height_4ths / 4.0);
+ scale.y = scale.x;
+ } else {
+ double ratio = (double)pfs->params.height_4ths
+ / font->params.height_4ths;
+
+ scale.x = ratio * inches_2_plu(1.0 / font->resolution.x);
+
+ /*
+ * Bitmap fonts use the PCL coordinate system,
+ * so we must invert the Y coordinate.
+ */
+ scale.y = -(ratio * inches_2_plu(1.0 / font->resolution.y));
+ }
+ } else {
+#define PERCENT_OF_EM ((pl_fp_pitch_cp(&pfs->font->params) / 100.0))
+ scale.x = scale.y = (1.0/PERCENT_OF_EM) * hpgl_points_2_plu(pgls, pl_fp_pitch_cp(&pfs->params) / 100);
+ }
+ } else {
+ /*
+ * Note that the CTM takes P1/P2 into account unless
+ * an absolute character size is in effect.
+ */
+ /* HP is really scaling the cap height not the point size.
+ We assume point size is 1.5 times the point size */
+ scale.x = pgls->g.character.size.x * 1.5 * 1.25;
+ scale.y = pgls->g.character.size.y * 1.5;
+ if (pgls->g.character.size_mode == hpgl_size_relative)
+ scale.x *= pgls->g.P2.x - pgls->g.P1.x,
+ scale.y *= pgls->g.P2.y - pgls->g.P1.y;
+ if (bitmaps_allowed) /* no mirroring */
+ scale.x = fabs(scale.x), scale.y = fabs(scale.y);
+ }
+ return scale;
+
+}
+/*
+ * build the path and render it
+ */
+static int
+hpgl_print_char(
+ hpgl_state_t * pgls,
+ uint ch
+)
+{
+ int text_path = pgls->g.character.text_path;
+ const pcl_font_selection_t * pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ pl_font_t * font = pfs->font;
+ gs_state * pgs = pgls->pgs;
+ gs_matrix save_ctm;
+ gs_font * pfont = pgls->g.font->pfont;
+ gs_point scale = hpgl_current_char_scale(pgls);
+ /*
+ * All character data is relative, but we have to start at
+ * the right place.
+ */
+ hpgl_call( hpgl_add_point_to_path( pgls,
+ pgls->g.pos.x,
+ pgls->g.pos.y,
+ hpgl_plot_move_absolute,
+ true
+ ) );
+ hpgl_call(gs_currentmatrix(pgs, &save_ctm));
+
+ /*
+ * Use plotter unit ctm.
+ */
+ hpgl_call(hpgl_set_plu_ctm(pgls));
+
+ /* ?? WRONG and UGLY */
+ {
+ float metrics[4];
+ if ( (pl_font_char_metrics(font, (void *)(pgls->pgs),
+ hpgl_map_symbol(ch, pgls), metrics)) == 1)
+ ch = ' ';
+ }
+
+ /*
+ * If we're using a stroked font, patch the pen width to reflect
+ * the stroke weight. Note that when the font's build_char
+ * procedure calls stroke, the CTM is still scaled.
+ ****** WHAT IF scale.x != scale.y? ****** this should be unnecessary.
+ */
+
+ if (pfont->PaintType != 0) {
+ const float * widths = pcl_palette_get_pen_widths(pgls->ppalet);
+ float save_width = widths[hpgl_get_selected_pen(pgls)];
+ int weight = pfs->params.stroke_weight;
+ floatp nwidth;
+
+ if (weight == 9999)
+ nwidth = save_width;
+ else {
+ nwidth = 0.06 + weight * (weight < 0 ? 0.005 : 0.010);
+ nwidth *= min(scale.x, scale.y) * (hpgl_width_scale(pgls));
+ }
+ /* in points */
+ gs_setlinewidth(pgs, nwidth * (72.0/1016.0));
+ }
+
+
+ /*
+ * We know that the drawing machinery only sets the CTM
+ * once, at the beginning of the path. We now impose the scale
+ * (and other transformations) on the CTM so that we can add
+ * the symbol outline based on a 1x1-unit cell.
+ */
+ {
+ gs_font * pfont = pgls->g.font->pfont;
+ bool bitmaps_allowed = pgls->g.bitmap_fonts_allowed;
+ bool use_show = hpgl_use_show(pgls, font);
+ gs_matrix pre_rmat, rmat, advance_mat;
+ int angle = -1; /* a multiple of 90 if used */
+ gs_text_enum_t *penum;
+ byte str[2];
+ int code;
+ gs_point start_pt, end_pt;
+ hpgl_real_t space_width;
+ int space_code;
+ hpgl_real_t width;
+
+ /* Handle size. */
+
+ gs_scale(pgs, scale.x, scale.y);
+ /* Handle rotation. */
+ {
+ double run = pgls->g.character.direction.x,
+ rise = pgls->g.character.direction.y;
+
+ if (pgls->g.character.direction_relative)
+ run *= pgls->g.P2.x - pgls->g.P1.x,
+ rise *= pgls->g.P2.y - pgls->g.P1.y;
+ gs_make_identity(&rmat);
+ if ((run < 0) || (rise != 0)) {
+ double denom = hypot(run, rise);
+
+ rmat.xx = run / denom;
+ rmat.xy = rise / denom;
+ rmat.yx = -rmat.xy;
+ rmat.yy = rmat.xx;
+ if ( bitmaps_allowed &&
+ (run != 0) &&
+ (rise != 0) ) { /* not a multple of 90 degrees */
+ /*
+ * If bitmap fonts are allowed, rotate to the nearest
+ * multiple of 90 degrees. We have to do something
+ * special at the end to create the correct escapement.
+ */
+ gs_currentmatrix(pgs, &pre_rmat);
+ if (run >= 0) {
+ if (rise >= 0)
+ angle = (run >= rise ? 0 : 90);
+ else
+ angle = (-rise >= run ? 270 : 0);
+ } else {
+ if (rise >= 0)
+ angle = (rise >= -run ? 90 : 180);
+ else
+ angle = (-run >= -rise ? 180 : 270);
+ }
+ }
+ gs_concat(pgs, &rmat);
+ }
+ }
+
+ /* Handle slant. */
+ if (pgls->g.character.slant && !bitmaps_allowed) {
+ gs_matrix smat;
+
+ gs_make_identity(&smat);
+ smat.yx = pgls->g.character.slant;
+ gs_concat(pgs, &smat);
+ }
+
+ gs_setfont(pgs, pfont);
+ pfont->FontMatrix = pfont->orig_FontMatrix;
+
+ /*
+ * Adjust the initial position of the character according to
+ * the text path. And the left side bearing. It appears
+ * HPGL/2 renders all characters without a left side bearing.
+ */
+ hpgl_call(gs_currentpoint(pgs, &start_pt));
+ if (text_path == hpgl_text_left) {
+ hpgl_get_char_width(pgls, ch, &width);
+ start_pt.x -= width / scale.x;
+ hpgl_call(hpgl_add_point_to_path(pgls, start_pt.x, start_pt.y,
+ hpgl_plot_move_absolute, false));
+
+ }
+
+ /*
+ * Reset the rotation if we're using a bitmap font.
+ */
+ gs_currentmatrix(pgs, &advance_mat);
+ if (angle >= 0) {
+ gs_setmatrix(pgs, &pre_rmat);
+ gs_rotate(pgs, (floatp)angle);
+ }
+
+ str[0] = ch;
+ str[1] = 0;
+
+ /* If SP is a control code, get the width of the space character. */
+ if (ch == ' ') {
+ space_code = hpgl_get_char_width(pgls, ' ', &space_width);
+
+ if ( 0 == space_code &&
+ pl_font_is_scalable(font) &&
+ pfs->params.proportional_spacing )
+ space_code = 1; /* NB hpgl_get_width lies. */
+
+ if (space_code == 1) {
+ /* Space is a control code. */
+ if ( pl_font_is_scalable(font) ) {
+ if (pfs->params.proportional_spacing)
+ space_width =
+ (coord_2_plu(pl_fp_pitch_cp(&pfs->font->params)
+ * pfs->params.height_4ths / 4) ) / scale.x;
+ else
+ space_width = 1.0;
+ /* error! NB scalable fixed pitch space_code == 0 */
+ } else
+ space_width =
+ ( coord_2_plu(pl_fp_pitch_cp(&pfs->font->params) * 10.0) ) / scale.x;
+ space_width *= (1.0 + hpgl_get_character_extra_space_x(pgls));
+ }
+ }
+
+ /* Check for SP control code. */
+ if (ch == ' ' && space_code != 0) {
+ /* Space is a control code. Just advance the position. */
+ gs_setmatrix(pgs, &advance_mat);
+ hpgl_call(hpgl_add_point_to_path(pgls, space_width, 0.0,
+ hpgl_plot_move_relative, false));
+ hpgl_call(gs_currentpoint(pgs, &end_pt));
+ /* at this point we will assume the page is marked */
+ pgls->page_marked = true;
+ } else {
+ gs_text_params_t text;
+ gs_char mychar_buff[1];
+ mychar_buff[0] = hpgl_map_symbol(ch, pgls);
+ if (use_show) {
+ /* not a path that needs to be drawn by the hpgl/2
+ vector drawing code. */
+ hpgl_call(hpgl_set_drawing_color(pgls, hpgl_rm_character));
+ text.operation = TEXT_FROM_CHARS | TEXT_DO_DRAW | TEXT_RETURN_WIDTH;
+ } else
+ text.operation = TEXT_FROM_CHARS | TEXT_DO_TRUE_CHARPATH | TEXT_RETURN_WIDTH;
+ text.data.chars = mychar_buff;
+ /* always on char (gs_chars (ints)) at a time */
+ text.size = 1;
+ code = gs_text_begin(pgs, &text, pgls->memory, &penum);
+ if ( code >= 0 )
+ code = gs_text_process(penum);
+
+ if ( code >= 0 ) {
+ /* we just check the current position for
+ "insidedness" - this seems to address the dirty
+ page issue in practice. */
+ pcl_mark_page_for_current_pos(pgls);
+ }
+ gs_text_release(penum, "hpgl_print_char");
+ if ( code < 0 )
+ return code;
+ gs_setmatrix(pgs, &advance_mat);
+ if (angle >= 0) {
+ /* Compensate for bitmap font non-rotation. */
+ if (text_path == hpgl_text_right) {
+ hpgl_get_char_width(pgls, ch, &width);
+ hpgl_call(hpgl_add_point_to_path(pgls, start_pt.x + width / scale.x,
+ start_pt.y, hpgl_plot_move_absolute, false));
+ }
+ }
+ hpgl_call(gs_currentpoint(pgs, &end_pt));
+ if ( start_pt.x == end_pt.x && start_pt.y == end_pt.y ) {
+ /* freetype doesn't move currentpoint in gs_show(),
+ * since gs cache is not used. NB we don't support
+ * freetype anymore is this necessary?
+ */
+ hpgl_get_char_width(pgls, ch, &width);
+ hpgl_call(hpgl_add_point_to_path(pgls, width / scale.x, 0.0,
+ hpgl_plot_move_relative, false));
+ hpgl_call(gs_currentpoint(pgs, &end_pt));
+ }
+ if ( (text_path == hpgl_text_right) &&
+ (hpgl_get_character_extra_space_x(pgls) != 0) ) {
+ hpgl_get_char_width(pgls, ch, &width);
+ end_pt.x = start_pt.x + width / scale.x;
+ hpgl_call(hpgl_add_point_to_path(pgls, end_pt.x, end_pt.y, hpgl_plot_move_absolute, false));
+ }
+ }
+ /*
+ * Adjust the final position according to the text path.
+ */
+ switch (text_path) {
+ case hpgl_text_right:
+ break;
+
+ case hpgl_text_down:
+ {
+ hpgl_real_t height;
+
+ hpgl_call(hpgl_get_current_cell_height(pgls, &height));
+ hpgl_call( hpgl_add_point_to_path(pgls, start_pt.x, end_pt.y - height / scale.y,
+ hpgl_plot_move_absolute, false) );
+
+ }
+ break;
+
+ case hpgl_text_left:
+ hpgl_call(hpgl_add_point_to_path(pgls, start_pt.x, start_pt.y,
+ hpgl_plot_move_absolute, false));
+ break;
+ case hpgl_text_up:
+ {
+ hpgl_real_t height;
+
+ hpgl_call(hpgl_get_current_cell_height(pgls, &height));
+ hpgl_call(hpgl_add_point_to_path(pgls, start_pt.x,
+ end_pt.y + height / scale.y, hpgl_plot_move_absolute, false));
+ }
+ break;
+ }
+
+ gs_setmatrix(pgs, &save_ctm);
+ hpgl_call(gs_currentpoint(pgs, &end_pt));
+ if (!use_show)
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_character));
+
+ hpgl_call( hpgl_add_point_to_path( pgls,
+ end_pt.x,
+ end_pt.y,
+ hpgl_plot_move_absolute,
+ true
+ ) );
+ }
+
+ return 0;
+}
+
+/* Determine whether labels can concatenate. */
+/* Note that LO requires a pre-scan iff this is false. */
+static bool
+hpgl_can_concat_labels(const hpgl_state_t *pgls)
+{ /* The following is per TRM 23-78. */
+ static const byte can_concat[22] = {
+ 0, 9, 1, 3, 8, 0, 2, 12, 4, 6,
+ 0, 9, 1, 3, 8, 0, 2, 12, 4, 6,
+ 0, 9
+ };
+
+ return (can_concat[pgls->g.label.origin] &
+ (1 << pgls->g.character.text_path)) != 0;
+}
+
+
+/* return relative coordinates to compensate for origin placement -- LO */
+static int
+hpgl_get_character_origin_offset(hpgl_state_t *pgls, int origin,
+ hpgl_real_t width, hpgl_real_t height,
+ gs_point *offset)
+{
+ double pos_x = 0.0, pos_y = 0.0;
+ double off_x, off_y;
+ hpgl_real_t adjusted_height = height;
+
+#ifdef CHECK_UNIMPLEMENTED
+ if (pgls->g.character.extra_space.x != 0 || pgls->g.character.extra_space.y != 0)
+ dprintf("warning origin offset with non zero extra space not supported\n");
+#endif
+ adjusted_height /= 1.6;
+ if (hpgl_is_currentfont_stick(pgls))
+ adjusted_height /= 1.4;
+
+ /* offset values specified by the documentation */
+ if ( (origin >= 11 && origin <= 14) || (origin >= 16 && origin <= 19) ) {
+ if (hpgl_is_currentfont_stick(pgls)) {
+ off_x = off_y = 0.33 * adjusted_height;
+ } else {
+ /* the documentation says this should be .25, experiments
+ indicate .33 like stick fonts. */
+ off_x = off_y = 0.33 * adjusted_height;
+ }
+ }
+
+ switch ( origin ) {
+ case 11:
+ pos_x = -off_x;
+ pos_y = -off_y;
+ case 1:
+ break;
+ case 12:
+ pos_x = -off_x;
+ case 2:
+ pos_y = .5 * adjusted_height;
+ break;
+ case 13:
+ pos_x = -off_x;
+ pos_y = off_y;
+ case 3:
+ pos_y += adjusted_height;
+ break;
+ case 14:
+ pos_y = -off_y;
+ case 4:
+ pos_x = .5 * width;
+ break;
+ case 15:
+ case 5:
+ pos_x = .5 * width;
+ pos_y = .5 * adjusted_height;
+ break;
+ case 16:
+ pos_y = off_y;
+ case 6:
+ pos_x = .5 * width;
+ pos_y += adjusted_height;
+ break;
+ case 17:
+ pos_x = off_x;
+ pos_y = -off_y;
+ case 7:
+ pos_x += width;
+ break;
+ case 18:
+ pos_x = off_x;
+ case 8:
+ pos_x += width;
+ pos_y = .5 * adjusted_height;
+ break;
+ case 19:
+ pos_x = off_x;
+ pos_y = off_y;
+ case 9:
+ pos_x += width;
+ pos_y += adjusted_height;
+ break;
+ case 21:
+ {
+ /* // LO21 prints at the current position not pcl CAP.
+ gs_matrix save_ctm;
+ gs_point pcl_pos_dev, label_origin;
+
+ gs_currentmatrix(pgls->pgs, &save_ctm);
+ pcl_set_ctm(pgls, false);
+ hpgl_call(gs_transform(pgls->pgs, (floatp)pgls->cap.x,
+ (floatp)pgls->cap.y, &pcl_pos_dev));
+ gs_setmatrix(pgls->pgs, &save_ctm);
+ hpgl_call(gs_itransform(pgls->pgs, (floatp)pcl_pos_dev.x,
+ (floatp)pcl_pos_dev.y, &label_origin));
+ pos_x = -(pgls->g.pos.x - label_origin.x);
+ pos_y = (pgls->g.pos.y - label_origin.y);
+ */
+ }
+ break;
+ default:
+ dprintf("unknown label parameter");
+
+ }
+ /* a relative move to the new position */
+ offset->x = pos_x;
+ offset->y = pos_y;
+
+ /* account for character direction and slant */
+ hpgl_rotation_transform_distance(pgls, offset, offset);
+ hpgl_slant_transform_distance(pgls, offset, offset);
+
+ switch ( pgls->g.character.text_path ) {
+ case hpgl_text_left:
+ offset->x -= width;
+ break;
+ case hpgl_text_down:
+ offset->y -= height;
+ break;
+ default:
+ DO_NOTHING;
+ }
+
+ {
+ gs_matrix mat;
+ hpgl_compute_user_units_to_plu_ctm(pgls, &mat);
+ offset->x /= mat.xx;
+ offset->y /= mat.yy;
+ }
+ /* convert to user units */
+ return 0;
+}
+
+static gs_char
+hpgl_next_char(hpgl_state_t *pgls, byte **ppb)
+{
+ byte *pb = *ppb;
+ gs_char chr = *pb++;
+
+ if (pgls->g.label.double_byte)
+ chr = (chr << 8) + *pb++;
+ *ppb = pb;
+ return chr;
+}
+
+/* Prints a buffered line of characters. */
+/* If there is a CR, it is the last character in the buffer. */
+static int
+hpgl_process_buffer(hpgl_state_t *pgls, gs_point *offset)
+{
+ hpgl_real_t label_length = 0.0, label_height = 0.0;
+ bool vertical = hpgl_text_is_vertical(pgls->g.character.text_path);
+ int i, inc;
+
+ /* a peculiar side effect of LABEL parsing double byte characters
+ is it leaves an extra byte in the buffer - fix that now, and
+ properly set the increment for the parallel loops below. */
+ if ( pgls->g.label.double_byte ) {
+ pgls->g.label.char_count--;
+ inc = 2;
+ } else {
+ inc = 1;
+ }
+
+
+ /*
+ * NOTE: the two loops below must be consistent with each other!
+ */
+
+ {
+ hpgl_real_t width = 0.0, height = 0.0;
+ int save_index = pgls->g.font_selected;
+ bool first_char_on_line = true;
+ byte *b = pgls->g.label.buffer;
+
+ for ( i=0; i < pgls->g.label.char_count; i+=inc ) {
+ gs_char ch = hpgl_next_char(pgls, &b);
+ if ( ch < 0x20 && !pgls->g.transparent_data )
+ switch (ch) {
+ case BS :
+ if ( width == 0.0 ) { /* BS as first char of string */
+ hpgl_call(hpgl_ensure_font(pgls));
+ hpgl_get_char_width(pgls, ' ', &width);
+ hpgl_call(hpgl_get_current_cell_height(pgls, &height));
+ }
+ if ( vertical ) { /* Vertical text path, back up in Y. */
+ label_height -= height;
+ if ( label_height < 0.0 )
+ label_height = 0.0;
+ } else { /* Horizontal text path, back up in X. */
+ label_length -= width;
+ if ( label_length < 0.0 )
+ label_length = 0.0;
+ }
+ continue;
+ case LF :
+ first_char_on_line = true;
+ continue;
+ case CR :
+ continue;
+ case FF :
+ continue;
+ case HT :
+ hpgl_call(hpgl_ensure_font(pgls));
+ hpgl_get_char_width(pgls, ' ', &width);
+ width *= 5;
+ goto acc_ht;
+ case SI :
+ hpgl_select_font_pri_alt(pgls, 0);
+ continue;
+ case SO :
+ hpgl_select_font_pri_alt(pgls, 1);
+ continue;
+ default :
+ break;
+ }
+ hpgl_call(hpgl_ensure_font(pgls));
+ hpgl_get_char_width(pgls, ch, &width);
+acc_ht: hpgl_call(hpgl_get_current_cell_height(pgls, &height));
+ if ( vertical ) {
+ if ( width > label_length )
+ label_length = width;
+ if ( !first_char_on_line )
+ label_height += height;
+ else
+ first_char_on_line = false;
+ } else { /* Horizontal text path: sum widths, take max of heights. */
+ label_length += width;
+ if ( height > label_height )
+ label_height = height;
+ }
+ }
+ hpgl_select_font_pri_alt(pgls, save_index);
+ }
+ hpgl_call(hpgl_get_character_origin_offset(pgls, pgls->g.label.origin,
+ label_length, label_height,
+ offset));
+
+ /* now add the offsets in relative plu coordinates */
+ hpgl_call(hpgl_add_point_to_path(pgls, -offset->x, -offset->y,
+ hpgl_plot_move_relative, false));
+
+ {
+ byte *b = pgls->g.label.buffer;
+ for ( i = 0; i < pgls->g.label.char_count; i+=inc ) {
+ gs_char ch = hpgl_next_char(pgls, &b);
+ if ( ch < 0x20 && !pgls->g.transparent_data ) {
+ hpgl_real_t spaces, lines;
+
+ switch (ch) {
+ case BS :
+ spaces = -1, lines = 0;
+ break;
+ case LF :
+ /*
+ * If the text path is vertical, we must use the
+ * computed label (horizontal) width, not the width
+ * of a space.
+ */
+ if ( vertical ) {
+ const pcl_font_selection_t * pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ hpgl_real_t label_advance;
+ /* Handle size. */
+ if (pgls->g.character.size_mode == hpgl_size_not_set) {
+ /* Scale fixed-width fonts by pitch, variable-width by height. */
+ if (pfs->params.proportional_spacing) {
+ if (pl_font_is_scalable(pfs->font))
+ label_advance = hpgl_points_2_plu(pgls, pfs->params.height_4ths / 4.0);
+ else {
+ double ratio = (double)pfs->params.height_4ths
+ / pfs->font->params.height_4ths;
+ label_advance = ratio * inches_2_plu(1.0 / pfs->font->resolution.x);
+ }
+ } else
+ label_advance = hpgl_points_2_plu(pgls, pl_fp_pitch_cp(&pfs->params) /
+ pl_fp_pitch_cp(&pfs->font->params) );
+ if ( hpgl_get_character_extra_space_x(pgls) != 0 )
+ label_advance *= 1.0 + hpgl_get_character_extra_space_x(pgls);
+ } else {
+ /*
+ * Note that the CTM takes P1/P2 into account unless
+ * an absolute character size is in effect.
+ *
+ *
+ * HACKS - I am not sure what this should be the
+ * actual values ???
+ */
+ label_advance = pgls->g.character.size.x * 1.5 * 1.25;
+ if (pgls->g.character.size_mode == hpgl_size_relative)
+ label_advance *= pgls->g.P2.x - pgls->g.P1.x;
+ if (pgls->g.bitmap_fonts_allowed) /* no mirroring */
+ label_advance = fabs(label_advance);
+ }
+ hpgl_move_cursor_by_characters(pgls, 0, -1,
+ &label_advance);
+ continue;
+ }
+ spaces = 0, lines = -1;
+ break;
+ case CR :
+ hpgl_call(hpgl_do_CR(pgls));
+ continue;
+ case FF :
+ /* does nothing */
+ spaces = 0, lines = 0;
+ break;
+ case HT :
+ /* appears to expand to 5 spaces */
+ spaces = 5, lines = 0;
+ break;
+ case SI :
+ hpgl_select_font_pri_alt(pgls, 0);
+ continue;
+ case SO :
+ hpgl_select_font_pri_alt(pgls, 1);
+ continue;
+ default :
+ goto print;
+ }
+ hpgl_move_cursor_by_characters(pgls, spaces, lines,
+ (const hpgl_real_t *)0);
+ continue;
+ }
+print: {
+ /* if this a printable character print it
+ otherwise continue, a character can be
+ printable and undefined in which case
+ it is printed as a space character */
+ const pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ if ( !hpgl_is_printable(pfs->map, ch,
+ (pfs->params.typeface_family & 0xfff) == STICK_FONT_TYPEFACE ) )
+ continue;
+ }
+ hpgl_call(hpgl_ensure_font(pgls));
+ hpgl_call(hpgl_print_char(pgls, ch));
+ }
+ }
+ pgls->g.label.char_count = 0;
+ return 0;
+}
+
+
+/**
+ * used by hpgl_LB() to find the end of a label
+ *
+ * 8bit and 16bit label terminator check
+ * (prev << 8) & curr -> 16 bit
+ * have_16bits allows per byte call with true on 16bit boundary.
+ */
+static
+bool is_terminator( hpgl_state_t *pgls, byte prev, byte curr, bool have_16bits )
+{
+ return
+ pgls->g.label.double_byte ?
+ ( have_16bits && prev == 0 && curr == pgls->g.label.terminator ) :
+ ( curr == pgls->g.label.terminator );
+}
+
+#define GL_LB_HAVE_16BITS (pgls->g.label.have_16bits)
+#define GL_LB_CH (pgls->g.label.ch)
+#define GL_LB_PREV_CH (pgls->g.label.prev_ch)
+
+/* LB ..text..terminator */
+int
+hpgl_LB(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+ bool print_terminator = pgls->g.label.print_terminator;
+
+ if ( pargs->phase == 0 )
+ {
+ /* initialize the character buffer and CTM first time only */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ hpgl_call(hpgl_init_label_buffer(pgls));
+ hpgl_call(hpgl_set_ctm(pgls));
+ hpgl_call(hpgl_set_clipping_region(pgls, hpgl_rm_vector));
+ pgls->g.label.initial_pos = pgls->g.pos;
+ GL_LB_HAVE_16BITS = true;
+ GL_LB_CH = 0xff;
+ GL_LB_PREV_CH = 0xff; /* for two byte terminators */
+ pargs->phase = 1;
+ }
+
+ while ( p < rlimit )
+ {
+ /* This is not ugly and unintuitive */
+ GL_LB_HAVE_16BITS = !GL_LB_HAVE_16BITS;
+ GL_LB_PREV_CH = GL_LB_CH;
+ GL_LB_CH = *++p;
+ if_debug1('I',
+ (GL_LB_CH == '\\' ? " \\%c" : GL_LB_CH >= 33 && GL_LB_CH <= 126 ? " %c" :
+ " \\%03o"),
+ GL_LB_CH);
+ if ( is_terminator(pgls, GL_LB_PREV_CH, GL_LB_CH, GL_LB_HAVE_16BITS) )
+ {
+ if ( !print_terminator )
+ {
+ gs_point lo_offsets;
+ hpgl_call(hpgl_process_buffer(pgls, &lo_offsets));
+ hpgl_call(hpgl_destroy_label_buffer(pgls));
+ pargs->source.ptr = p;
+ /*
+ * Depending on the DV/LO combination, conditionally
+ * restore the initial position, per TRM 23-78.
+ */
+ if ( !hpgl_can_concat_labels(pgls) ) {
+ hpgl_call(hpgl_add_point_to_path(pgls,
+ pgls->g.carriage_return_pos.x,
+ pgls->g.carriage_return_pos.y,
+ hpgl_plot_move_absolute, true));
+ } else {
+ /* undo the label origin offsets */
+ hpgl_call(hpgl_add_point_to_path(pgls, lo_offsets.x, lo_offsets.y,
+ hpgl_plot_move_relative, false));
+ }
+ /* clear the current path terminating carriage
+ returns and linefeeds will leave "moveto's" in
+ the path */
+ hpgl_call(hpgl_clear_current_path(pgls));
+ /* also clean up stick fonts - they are likely to
+ become dangling references in the current font
+ scheme since they don't have a dictionary entry */
+ hpgl_free_stick_fonts(pgls);
+ return 0;
+ }
+ /*
+ * Process the character in the ordinary way, then come here
+ * again. We do things this way to simplify the case where
+ * the terminator is a control character.
+ */
+ --p;
+ print_terminator = false;
+ }
+
+ /* process the buffer for a carriage return so that we can
+ treat the label origin correctly, and initialize a new
+ buffer */
+
+ hpgl_call(hpgl_buffer_char(pgls, GL_LB_CH));
+ if ( GL_LB_CH == CR && !pgls->g.transparent_data )
+ {
+ gs_point lo_offsets;
+ hpgl_call(hpgl_process_buffer(pgls, &lo_offsets));
+ hpgl_call(hpgl_destroy_label_buffer(pgls));
+ hpgl_call(hpgl_init_label_buffer(pgls));
+ }
+ }
+ pargs->source.ptr = p;
+ return e_NeedData;
+}
+
+void
+hpgl_free_stick_fonts(hpgl_state_t *pgls)
+{
+ pcl_font_selection_t *pfs =
+ &pgls->g.font_selection[pgls->g.font_selected];
+ pl_font_t *font = &pgls->g.stick_font[pgls->g.font_selected]
+ [pfs->params.proportional_spacing];
+
+ /* no stick fonts - nothing to do */
+ if ( font->pfont == 0 )
+ return;
+
+ gs_free_object(pgls->memory, font->pfont, "stick/arc font");
+ font->pfont = 0;
+ return;
+}
+
+int
+hpgl_print_symbol_mode_char(hpgl_state_t *pgls)
+{
+ /* save the original origin since symbol mode character are
+ always centered */
+ int saved_origin = pgls->g.label.origin;
+ gs_point save_pos = pgls->g.pos;
+ gs_point lo_offsets;
+ hpgl_call(hpgl_gsave(pgls));
+ /* HAS this need checking. I don't know how text direction
+ and label origin interact in symbol mode */
+ pgls->g.label.origin = 5;
+ /* HAS - alot of work for one character */
+ hpgl_call(hpgl_clear_current_path(pgls));
+ hpgl_call(hpgl_init_label_buffer(pgls));
+ hpgl_call(hpgl_buffer_char(pgls, pgls->g.symbol_mode));
+ hpgl_call(hpgl_process_buffer(pgls, &lo_offsets));
+ hpgl_call(hpgl_destroy_label_buffer(pgls));
+ hpgl_call(hpgl_grestore(pgls));
+ /* restore the origin */
+ pgls->g.label.origin = saved_origin;
+ hpgl_call(hpgl_set_current_position(pgls, &save_pos));
+ hpgl_free_stick_fonts(pgls);
+ return 0;
+}
+
+/* Initialization */
+static int
+pglabel_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ HPGL_COMMAND('C', 'P', hpgl_CP, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ /* LB also has special argument parsing. */
+ HPGL_COMMAND('L', 'B', hpgl_LB, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
+}
+
+const pcl_init_t pglabel_init = {
+ pglabel_do_registration, 0
+};
diff --git a/pcl/pglfill.c b/pcl/pglfill.c
new file mode 100644
index 000000000..3be4189f0
--- /dev/null
+++ b/pcl/pglfill.c
@@ -0,0 +1,913 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pglfill.c - HP-GL/2 line and fill attributes commands */
+#include "memory_.h"
+#include "pcparse.h"
+#include "pgmand.h"
+#include "pginit.h"
+#include "pggeom.h"
+#include "pgdraw.h"
+#include "pgmisc.h"
+#include "pcdraw.h"
+#include "gsuid.h" /* for gxbitmap.h */
+#include "gstypes.h" /* for gxbitmap.h */
+#include "gsstate.h" /* needed by gsrop.h */
+#include "gsrop.h"
+#include "gxbitmap.h"
+#include "pcpalet.h"
+#include "pcpatrn.h"
+
+/*
+ * AC [x,y]; Anchor corner for fill offsets, note that this is
+ * different than the anchor corner of the pcl picture frame.
+ */
+ int
+hpgl_AC(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ hpgl_real_t x, y;
+
+ if (hpgl_arg_units(pgls->memory, pargs, &x)) {
+ if (!hpgl_arg_units(pgls->memory, pargs, &y))
+ return e_Range;
+ } else {
+ x = 0.0;
+ y = 0.0;
+ }
+
+ /* draw the current path */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ pgls->g.anchor_corner.x = x;
+ pgls->g.anchor_corner.y = y;
+
+ return 0;
+}
+
+/*
+ * FT 1|2;
+ * FT 3[,spacing[,angle]];
+ * FT 4[,spacing[,angle]];
+ * FT 10[,level];
+ * FT 11[,index][,use_pen_1_or_cur_pen]; - varies from documentation
+ * FT 21[,type];
+ * FT 22[,id];
+ * FT;
+ */
+ int
+hpgl_FT(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int type = hpgl_FT_pattern_solid_pen1;
+ hpgl_hatch_params_t * params;
+
+ hpgl_arg_int(pgls->memory, pargs, &type);
+ switch (type) {
+
+ case hpgl_FT_pattern_solid_pen1: /* 1 */
+ case hpgl_FT_pattern_solid_pen2: /* 2 */
+ /* Default all the parameters. */
+ pgls->g.fill.param.hatch.spacing = 0;
+ pgls->g.fill.param.hatch.angle = 0;
+ pgls->g.fill.param.crosshatch.spacing = 0;
+ pgls->g.fill.param.crosshatch.angle = 0;
+ pgls->g.fill.param.shading = 100;
+ pgls->g.fill.param.user_defined.pattern_index = 1;
+ pgls->g.fill.param.user_defined.use_current_pen = false;
+ pgls->g.fill.param.pattern_type = 1; /****** NOT SURE ******/
+ pgls->g.fill.param.pattern_id = 0; /****** NOT SURE ******/
+ break;
+
+ case hpgl_FT_pattern_one_line: /* 3 */
+ params = &pgls->g.fill.param.hatch;
+ goto hatch;
+
+ case hpgl_FT_pattern_two_lines: /* 4 */
+ params = &pgls->g.fill.param.crosshatch;
+hatch:
+ {
+ hpgl_real_t spacing = params->spacing;
+ hpgl_real_t angle = params->angle;
+
+ if (hpgl_arg_real(pgls->memory, pargs, &spacing)) {
+ if (spacing < 0)
+ return e_Range;
+ hpgl_arg_real(pgls->memory, pargs, &angle);
+ }
+
+ /*
+ * If the specified spacing is 0, we use 1% of the P1/P2
+ * diagonal distance. We handle this when performing the
+ * fill, not here, because this distance may change
+ * depending on the position of P1 and P2.
+ */
+ params->spacing = spacing;
+ params->angle = angle;
+ }
+ break;
+
+ case hpgl_FT_pattern_shading: /* 10 */
+ {
+ int level;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &level)) {
+ if ((level < 0) || (level > 100))
+ return e_Range;
+ pgls->g.fill.param.shading = level;
+ }
+ }
+ break;
+
+ case hpgl_FT_pattern_RF: /* 11 */
+ {
+ int index, mode;
+
+ /* contrary to the documentation, option 2 is used */
+ if (!hpgl_arg_int(pgls->memory, pargs, &index))
+ index = pgls->g.fill.param.user_defined.pattern_index;
+ else if ((index < 1) || (index > 8))
+ return e_Range;
+ if (!hpgl_arg_c_int(pgls->memory, pargs, &mode))
+ mode = pgls->g.fill.param.user_defined.use_current_pen;
+ else if ((mode & ~1) != 0)
+ return e_Range;
+ pgls->g.fill.param.user_defined.pattern_index = index;
+ pgls->g.fill.param.user_defined.use_current_pen = mode;
+ }
+ break;
+
+ case hpgl_FT_pattern_cross_hatch: /* 21 */
+ {
+ int pattern;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &pattern)) {
+ if ((pattern < 1) || (pattern > 6))
+ return e_Range;
+ pgls->g.fill.param.pattern_type = pattern;
+ }
+ }
+ break;
+
+ case hpgl_FT_pattern_user_defined: /* 22 */
+ {
+ int32 id;
+
+ if (hpgl_arg_int(pgls->memory, pargs, &id)) {
+ if ((id < 0) || (id > 0xffff))
+ return e_Range;
+ pgls->g.fill.param.pattern_id = id;
+ }
+ }
+ break;
+
+ default:
+ return e_Range;
+ }
+ pgls->g.fill.type = (hpgl_FT_pattern_source_t)type;
+ return 0;
+}
+
+void
+hpgl_set_line_attribute_defaults(hpgl_state_t *pgls)
+{
+ pgls->g.line.cap = 1; /* butt */
+ pgls->g.line.join = 1; /* mitered */
+ pgls->g.miter_limit = 5;
+}
+/*
+ * LA [kind1,value1[,kind2,value2[,kind3,value3]]];
+ */
+ int
+hpgl_LA(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int cap = pgls->g.line.cap, join = pgls->g.line.join;
+ hpgl_real_t miter_limit = pgls->g.miter_limit;
+ bool no_args=true;
+ int kind;
+
+ while (hpgl_arg_c_int(pgls->memory, pargs, &kind)) {
+ no_args=false;
+ switch (kind) {
+
+ case 1: /* line ends */
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &cap) || (cap < 1) || (cap > 4) )
+ return e_Range;
+ break;
+
+ case 2: /* line joins */
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &join) || (join < 1) || (join > 6) )
+ return e_Range;
+ break;
+
+ case 3: /* miter limit */
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &miter_limit) )
+ return e_Range;
+ if (miter_limit < 1)
+ miter_limit = 1;
+ break;
+
+ default:
+ return e_Range;
+ }
+ }
+
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+
+ /* LA1,1,2,1,3,5 is the same as LA */
+ if (no_args) {
+ hpgl_args_setup(pargs);
+ hpgl_args_add_int(pargs, 1);
+ hpgl_args_add_int(pargs, 1);
+ hpgl_args_add_int(pargs, 2);
+ hpgl_args_add_int(pargs, 1);
+ hpgl_args_add_int(pargs, 3);
+ hpgl_args_add_real(pargs, 5.0);
+ hpgl_LA(pargs, pgls);
+ return 0;
+ }
+
+ pgls->g.line.cap = cap;
+ pgls->g.line.join = join;
+ pgls->g.miter_limit = miter_limit;
+ return 0;
+}
+
+/* constant data for default pattern percentages, */
+
+static const hpgl_line_type_t hpgl_fixed_pats[8] = {
+ { 2, { 0.0, 1.0 } },
+ { 2, { 0.5, 0.5 } },
+ { 2, { 0.7, 0.3 } },
+ { 4, { 0.8, 0.1, 0.0, 0.1 } },
+ { 4, { 0.7, 0.1, 0.1, 0.1 } },
+ { 6, { 0.5, 0.1, 0.1, 0.1, 0.1, 0.1 } },
+ { 6, { 0.7, 0.1, 0.0, 0.1, 0.0, 0.1 } },
+ { 8, { 0.5, 0.1, 0.0, 0.1, 0.1, 0.1, 0.0, 0.1 } }
+};
+
+static const hpgl_line_type_t hpgl_adaptive_pats[8] = {
+ { 3, { 0.0, 1.0, 0.0 } },
+ { 3, { 0.25, 0.5, 0.25 } },
+ { 3, { 0.35, 0.3, 0.35 } },
+ { 5, { 0.4, 0.1, 0.0, 0.1, 0.4 } },
+ { 5, { 0.35, 0.1, 0.1, 0.1, 0.35 } },
+ { 7, { 0.25, 0.1, 0.1, 0.1, 0.1, 0.1, 0.25 } },
+ { 7, { 0.35, 0.1, 0.0, 0.1, 0.0, 0.1, 0.35 } },
+ { 9, { 0.25, 0.1, 0.0, 0.1, 0.1, 0.1, 0.0, 0.1, 0.25 } }
+};
+
+ void
+hpgl_set_line_pattern_defaults(hpgl_state_t *pgls)
+{
+ pgls->g.line.current.pattern_length_relative = 0; /* relative */
+ pgls->g.line.current.pattern_length = 4.0; /* % of P1 P2 */
+ pgls->g.line.current.is_solid = true;
+ pgls->g.line.current.type = 0;
+ memcpy( &pgls->g.fixed_line_type,
+ &hpgl_fixed_pats,
+ sizeof(hpgl_fixed_pats)
+ );
+ memcpy( &pgls->g.adaptive_line_type,
+ &hpgl_adaptive_pats,
+ sizeof(hpgl_adaptive_pats)
+ );
+
+ /* initialize the current pattern offset - this is not part of the
+ command but is used internally to modulate the phase of the
+ HPGL/2 vector fills. NB - needs a new home. */
+ pgls->g.line.current.pattern_offset = 0.0;
+}
+
+/*
+ * LT type[,length[,mode]];
+ * LT99;
+ * LT;
+ * NB - needs reorganizing
+ */
+ int
+hpgl_LT(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int type;
+
+ /* Draw the current path for any LT command irrespective of
+ whether or not the the LT changes anything */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+
+ /* no parameter defaults to solid line type - note line type 0 is
+ for dots, this is the no parameter default. We keep the old
+ pattern parameters (no update) and save the current pattern
+ since type 99 can only be invoked if the current line is solid
+ (i.e. the 99 pattern only needs to be saved here */
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &type) ) {
+ pgls->g.line.saved = pgls->g.line.current;
+ pgls->g.line.saved.pos.x = pgls->g.pos.x;
+ pgls->g.line.saved.pos.y = pgls->g.pos.y;
+ pgls->g.line.current.is_solid = true;
+ return 0;
+ }
+
+ /* 99 restores the previous line type if a solid line type is the
+ current selection (LT;) LT99 is ignored when a non-solid line
+ type is in effect, of course the previous line may have been a
+ solid line resulting in nop. */
+ if ( type == 99 && pgls->g.line.current.is_solid == true &&
+ pgls->g.line.saved.pos.x == pgls->g.pos.x &&
+ pgls->g.line.saved.pos.y == pgls->g.pos.y ) {
+ pgls->g.line.current = pgls->g.line.saved;
+ return 0;
+ }
+
+ /* check line type range */
+ if ( type < -8 || type > 8 )
+ return e_Range;
+ /* Initialize, get and check pattern length and mode. If the mode
+ is relative (0) the units are a % of the distance from P1 to P2
+ for the absolute mode units are millimeters */
+ {
+ /* initialize pattern lengths to current state values */
+ hpgl_real_t length = pgls->g.line.current.pattern_length;
+ int mode = pgls->g.line.current.pattern_length_relative;
+
+ /* get/check the pattern length and mode */
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &length) ) {
+ if ( length <= 0 )
+ return e_Range;
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) )
+ if ( (mode != 0) && (mode != 1) )
+ return e_Range;
+ }
+
+ /* if we are here this is a non-solid line and we should be
+ able to set the rest of the line parameter state values.
+ NB have not checked if some of these get set if there is a
+ range error for pattern length or mode. An experiment for
+ another day... */
+
+ if ( type == 0 ) {
+ /* Spec says this is for dots, on clj4550 its solid line type!
+ * NB: need multiple device testing as its likely to be device specific.
+ * fts 1435 1451 1830 1833. */
+ pgls->g.line.current.is_solid = true;
+ }
+ else
+ pgls->g.line.current.is_solid = false;
+ pgls->g.line.current.type = type;
+ pgls->g.line.current.pattern_length = length;
+ pgls->g.line.current.pattern_length_relative = mode;
+ pgls->g.line.current.type = type;
+ }
+ return 0;
+}
+
+/*
+ * MC mode[,opcode];
+ */
+ int
+hpgl_MC(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int mode = 0, opcode;
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ if (hpgl_arg_c_int(pgls->memory, pargs, &mode) && ((mode & ~1) != 0))
+ return e_Range;
+ opcode = mode ? 168 : 252;
+ if ((mode != 0) && hpgl_arg_c_int(pgls->memory, pargs, &opcode)) {
+ if ((opcode < 0) || (opcode > 255)) {
+ pgls->logical_op = 252;
+ return e_Range;
+ }
+ }
+ pgls->logical_op = opcode;
+ return 0;
+}
+
+/*
+ * PP [mode];
+ */
+ int
+hpgl_PP(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int mode = 0;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &mode)) {
+ if ((mode < 0) || (mode > 1))
+ return e_Range;
+ }
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ pgls->pp_mode = mode;
+ return 0;
+}
+
+/*
+ * PW [width[,pen]];
+ */
+ int
+hpgl_PW(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ /*
+ * we initialize the parameter to be parsed to either .1 which
+ * is a % of the magnitude of P1 P2 or .35 MM WU sets up how
+ * it gets interpreted.
+ */
+ hpgl_real_t param = pgls->g.pen.width_relative ? .1 : .35;
+ hpgl_real_t width_plu;
+ int pmin = 0;
+ int pmax = pcl_palette_get_num_entries(pgls->ppalet) - 1;
+ hpgl_real_t pf_factor = hpgl_width_scale(pgls);
+
+ /*
+ * we maintain the line widths in plotter units, irrespective
+ * of current units (WU).
+ */
+ if (hpgl_arg_c_real(pgls->memory, pargs, &param)) {
+ if (hpgl_arg_c_int(pgls->memory, pargs, &pmin)) {
+ if ((pmin < 0) || (pmin > pmax))
+ return e_Range;
+ pmax = pmin;
+ }
+ }
+
+ /* width is maintained in plu only */
+ width_plu = ( (pgls->g.pen.width_relative)
+ ? ( (param / 100.0) * hpgl_compute_distance( pgls->g.P1.x,
+ pgls->g.P1.y,
+ pgls->g.P2.x,
+ pgls->g.P2.y
+ ) )
+ : mm_2_plu(param) * pf_factor );
+
+ /*
+ * PCLTRM 22-38 metric widths scaled scaled by the ratio of
+ * the picture frame to plot size. Note that we always store
+ * the line width in PU not MM.
+ */
+ if (pgls->g.pen.width_relative)
+ width_plu *= pf_factor;
+
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ {
+ int i;
+ for (i = pmin; i <= pmax; ++i)
+ pcl_palette_PW(pgls, i, width_plu);
+ }
+ return 0;
+}
+
+/*
+ * RF [index[,width,height,pen...]];
+ *
+ * Nominally, patterns generated via RF are colored patterns. For backwards
+ * compatibility with PCL 5e, however, they may also be uncolored patterns. The
+ * determining factor is whether or not all of the entries in the pattern are
+ * 0 or 1: if so, the pattern is an uncolored pattern; otherwise it is a colored
+ * pattern.
+ */
+ int
+hpgl_RF(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ uint index, width, height;
+ gs_depth_bitmap pixmap;
+ int code = 0;
+ bool is_mask = true;
+ byte * data;
+
+ if (pargs->phase == 0) {
+
+ if (!hpgl_arg_c_int(pgls->memory, pargs, (int *)&index)) {
+ hpgl_default_all_fill_patterns(pgls);
+ return 0;
+ }
+ if ((index < 1) || (index > 8))
+ return e_Range;
+
+ if (!hpgl_arg_c_int(pgls->memory, pargs, (int *)&width)) {
+ pcl_pattern_RF(index, NULL, pgls);
+ return 0;
+ }
+ if ( (width < 1) ||
+ (width > 255) ||
+ !hpgl_arg_c_int(pgls->memory, pargs, (int *)&height) ||
+ (height < 1) ||
+ (height > 255) )
+ return e_Range;
+
+ /* allocate enough memory for pattern header and data */
+ data = gs_alloc_bytes(pgls->memory, width * height, "hpgl raster fill");
+ if (data == 0)
+ return e_Memory;
+
+ /*
+ * All variables must be saved in globals since the parser
+ * the parser reinvokes hpgl_RF() while processing data
+ * (hpgl_arg_c_int can execute a longjmp).
+ */
+ pgls->g.raster_fill.width = width;
+ pgls->g.raster_fill.height = height;
+ pgls->g.raster_fill.data = data;
+ pgls->g.raster_fill.is_mask = is_mask;
+ pgls->g.raster_fill.index = index;
+ /* set bitmap to 0, as not all pens need be provided */
+ memset(data, 0, width * height);
+ /* prepare to read the pixel values */
+ hpgl_next_phase(pargs);
+
+ } else {
+ width = pgls->g.raster_fill.width;
+ height = pgls->g.raster_fill.height;
+ data = pgls->g.raster_fill.data;
+ is_mask = pgls->g.raster_fill.is_mask;
+ index = pgls->g.raster_fill.index;
+ }
+
+ while ((pargs->phase - 1) < width * height) {
+ int pixel;
+
+ if (!hpgl_arg_c_int(pgls->memory, pargs, &pixel))
+ break;
+ if (pixel != 0) {
+ data[pargs->phase - 1] = pixel;
+ if (pixel != 1)
+ is_mask = false;
+ }
+ hpgl_next_phase(pargs);
+ }
+
+ if ( pgls->personality == pcl5e )
+ is_mask = true; /* always for a monochrome configuration */
+ /* if the pattern is uncolored, collapse it to 1-bit per pixel */
+ if (is_mask) {
+ int raster = (width + 7) / 8;
+ byte * mdata = gs_alloc_bytes( pgls->memory,
+ height * raster,
+ "hpgl mask raster fill"
+ );
+ byte * pb1 = data;
+ byte * pb2 = mdata;
+ int i;
+
+ if (mdata == 0) {
+ gs_free_object(pgls->memory, data, "hpgl raster fill");
+ return e_Memory;
+ }
+
+ for (i = 0; i < height; i++) {
+ int mask = 0x80;
+ int outval = 0;
+ int j;
+
+ for (j = 0; j < width; j++) {
+ if (*pb1++ != 0)
+ outval |= mask;
+ if ((mask >>= 1) == 0) {
+ *pb2++ = outval;
+ outval = 0;
+ mask = 0x80;
+ }
+ }
+
+ if (mask != 0x80)
+ *pb2++ = outval;
+ }
+
+ gs_free_object(pgls->memory, data, "hpgl raster fill");
+ pixmap.data = mdata;
+ pixmap.raster = raster;
+ pixmap.pix_depth = 1;
+
+ } else {
+ pixmap.data = data;
+ pixmap.raster = width;
+ pixmap.pix_depth = 8;
+ }
+
+ /* set up the pixmap */
+ pixmap.size.x = width;
+ pixmap.size.y = height;
+ pixmap.id = 0;
+ pixmap.num_comps = 1;
+
+ if ((code = pcl_pattern_RF(index, &pixmap, pgls)) < 0)
+ gs_free_object(pgls->memory, data, "hpgl raster fill");
+ pgls->g.raster_fill.data = 0;
+ return code;;
+}
+
+/*
+ * SM [char];
+ */
+ int
+hpgl_SM(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ const byte * p = pargs->source.ptr;
+ const byte * rlimit = pargs->source.limit;
+
+ for (;;) {
+ if (p >= rlimit) {
+ pargs->source.ptr = p;
+ return e_NeedData;
+ }
+ ++p;
+ if (*p == ' ')
+ continue; /* ignore initial spaces */
+ else if (*p == ';') {
+ pgls->g.symbol_mode = 0;
+ break;
+ }
+
+ /*
+ * p. 22-44 of the PCL5 manual says that the allowable codes
+ * are 33-58, 60-126, 161 and 254. This is surely an error:
+ * it must be 161-254.
+ */
+ else if ( ((*p >= 33) && (*p <= 126)) || ((*p >= 161) && (*p <= 254)) ) {
+ pgls->g.symbol_mode = *p;
+ return 0;
+ } else
+ return e_Range;
+ }
+ return 0;
+}
+
+/*
+ * SP [pen];
+ */
+ int
+hpgl_SP(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int pen = 0;
+ /* palette pen numbers are always consecutive integers starting
+ with 0 */
+ int max_pen = pcl_palette_get_num_entries(pgls->ppalet) - 1;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &pen)) {
+ if (pen < 0)
+ return e_Range;
+ while ( pen > max_pen )
+ pen = pen - max_pen;
+ }
+
+ if (pen == pgls->g.pen.selected)
+ return 0;
+
+ if ( !pgls->g.polygon_mode )
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ pgls->g.pen.selected = pen;
+ return 0;
+}
+
+/*
+ * SV [type[,option1[,option2]];
+ */
+/*
+ * HAS - this should be redone with a local copy of the screen
+ * parameters and need to check if we draw the current path if the
+ * command is called with arguments that set the state to the current
+ * state
+ */
+ int
+hpgl_SV(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int type = hpgl_SV_pattern_solid_pen;
+
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ if (hpgl_arg_c_int(pgls->memory, pargs, &type)) {
+
+ switch (type) {
+
+ case hpgl_SV_pattern_solid_pen: /* 0 */
+ pgls->g.screen.param.shading = 100;
+ pgls->g.screen.param.user_defined.pattern_index = 1;
+ pgls->g.screen.param.user_defined.use_current_pen = false;
+ pgls->g.screen.param.pattern_type = 1;
+ pgls->g.screen.param.pattern_id = 0;
+ break;
+
+ case hpgl_SV_pattern_shade: /* 1 */
+ {
+ int level;
+
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &level) ||
+ (level < 0) ||
+ (level > 100) )
+ return e_Range;
+ pgls->g.screen.param.shading = level;
+ }
+ break;
+
+ case hpgl_SV_pattern_RF: /* 2 */
+ {
+ int index, mode;
+
+ if (!hpgl_arg_int(pgls->memory, pargs, &index))
+ index = pgls->g.screen.param.user_defined.pattern_index;
+ else if ((index < 1) || (index > 8))
+ return e_Range;
+ if (!hpgl_arg_c_int(pgls->memory, pargs, &mode))
+ mode = pgls->g.screen.param.user_defined.use_current_pen;
+ else if ((mode & ~1) != 0)
+ return e_Range;
+ pgls->g.screen.param.user_defined.pattern_index = index;
+ pgls->g.screen.param.user_defined.use_current_pen = mode;
+ }
+ break;
+
+ case hpgl_SV_pattern_cross_hatch: /* 21 */
+ {
+ int pattern;
+
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &pattern) ||
+ (pattern < 1) ||
+ (pattern > 6) )
+ return e_Range;
+ pgls->g.screen.param.pattern_type = pattern;
+ }
+ break;
+
+ case hpgl_SV_pattern_user_defined: /* 22 */
+ {
+ int32 id;
+
+ if (!hpgl_arg_int(pgls->memory, pargs, &id) || (id < 0) || (id > 0xffff))
+ return e_Range;
+ pgls->g.screen.param.pattern_id = id;
+ }
+ break;
+
+ default:
+ return e_Range;
+ }
+ }
+
+ pgls->g.screen.type = (hpgl_SV_pattern_source_t)type;
+ return 0;
+}
+
+/*
+ * TR [mode];
+ *
+ * NB: Though termed "source transparency" in HP's documentation, GL/2
+ * transparency concept actually corresponds to pattern transparency in
+ * the PCL sense. GL/2 objects are all logically masks: they have no
+ * background, and thus are unaffected by source transparency.
+ *
+ * The GL/2 source and PCL pattern transparency states are, however,
+ * maintained separately. The former affects only GL/2 objects, the
+ * latter only objects generated in PCL.
+ */
+ int
+hpgl_TR(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int mode = 1;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &mode) && ((mode & ~1) != 0))
+ return e_Range;
+
+ pgls->g.source_transparent = (mode != 0);
+ return 0;
+}
+
+/*
+ * UL [index[,gap1..20];
+ */
+ int
+hpgl_UL(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int index;
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ if (hpgl_arg_c_int(pgls->memory, pargs, &index)) {
+ hpgl_real_t gap[20];
+ double total = 0;
+ int i, k;
+
+ if ((index < -8) || (index > 8) || (index == 0))
+ return e_Range;
+ for (i = 0; (i < 20) && hpgl_arg_c_real(pgls->memory, pargs, &gap[i]); ++i ) {
+ if (gap[i] < 0)
+ return e_Range;
+ total += gap[i];
+ }
+ if (total == 0)
+ return e_Range;
+
+ for (k = 0; k < i; k++)
+ gap[k] /= total;
+
+ {
+ hpgl_line_type_t * fixed_plt =
+ &pgls->g.fixed_line_type[(index < 0 ? -index : index) - 1];
+ hpgl_line_type_t * adaptive_plt =
+ &pgls->g.adaptive_line_type[(index < 0 ? -index : index) - 1];
+
+ fixed_plt->count = adaptive_plt->count = i;
+ memcpy(fixed_plt->gap, gap, i * sizeof(hpgl_real_t));
+ memcpy(adaptive_plt->gap, gap, i * sizeof(hpgl_real_t));
+ }
+
+ } else {
+ hpgl_set_line_pattern_defaults(pgls);
+ }
+ return 0;
+}
+
+/*
+ * WU [mode];
+ */
+ int
+hpgl_WU(
+ hpgl_args_t * pargs,
+ hpgl_state_t * pgls
+)
+{
+ int mode = 0;
+
+ if (hpgl_arg_c_int(pgls->memory, pargs, &mode)) {
+ if ((mode != 0) && (mode != 1))
+ return e_Range;
+ }
+ pgls->g.pen.width_relative = mode;
+ hpgl_args_setup(pargs);
+ hpgl_PW(pargs, pgls);
+ return 0;
+}
+
+/*
+ * Initialization
+ */
+ static int
+pglfill_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * mem
+)
+{
+ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ HPGL_COMMAND('A', 'C', hpgl_AC, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('F', 'T', hpgl_FT, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('L', 'A', hpgl_LA, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('L', 'T', hpgl_LT, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('M', 'C', hpgl_MC, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'W', hpgl_PW, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'P', hpgl_PP, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('R', 'F', hpgl_RF, hpgl_cdf_pcl_rtl_both), /* + additional I parameters */
+
+ /*
+ * SM has special argument parsing, so it must handle skipping
+ * in polygon mode itself.`
+ */
+ HPGL_COMMAND('S', 'M', hpgl_SM, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'P', hpgl_SP, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'V', hpgl_SV, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('T', 'R', hpgl_TR, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('U', 'L', hpgl_UL, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('W', 'U', hpgl_WU, hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
+}
+
+const pcl_init_t pglfill_init = { pglfill_do_registration, 0, 0 };
diff --git a/pcl/pgmand.h b/pcl/pgmand.h
new file mode 100644
index 000000000..d0f586cce
--- /dev/null
+++ b/pcl/pgmand.h
@@ -0,0 +1,336 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgmand.h - Definitions for HP-GL/2 commands and parser */
+
+#ifndef pgmand_INCLUDED
+#define pgmand_INCLUDED
+
+#include "stdio_.h" /* for gdebug.h */
+#include <setjmp.h> /* must come after std.h */
+#include "gdebug.h"
+#include "pcommand.h"
+#include "pcstate.h"
+/* Define the type for the HP-GL state. */
+typedef struct pcl_state_s hpgl_state_t;
+
+/* Define the type for HP-GL/2 command arguments. */
+#ifndef hpgl_parser_state_DEFINED
+# define hpgl_parser_state_DEFINED
+typedef struct hpgl_args_s hpgl_parser_state_t;
+#endif
+
+typedef struct hpgl_args_s hpgl_args_t;
+
+/* Define a command processing procedure. */
+#define hpgl_command_proc(proc)\
+ int proc(hpgl_args_t *, hpgl_state_t *)
+typedef hpgl_command_proc((*hpgl_command_proc_t));
+
+/*
+ * Because HP-GL/2 commands have irregular syntax, we have to let them parse
+ * their arguments themselves. But parsing can be interrupted at any point
+ * by reaching an input buffer boundary, so we can't just let the commands
+ * call procedures that get the next argument of a given type out of the
+ * input stream. At the same time, we would like to hide buffer boundaries
+ * from the individual command implementations to the greatest extent
+ * possible.
+ *
+ * For simple commands that take a maximum number of numeric arguments, we
+ * do indeed let the commands call get-argument procedures. In addition to
+ * parsing the input, these procedures save the scanned arguments in an
+ * array. If one of these procedures runs out of input data, it does a
+ * longjmp back to the main parser, which exits to its client to request
+ * more input. When the parser regains control, it simply restarts the
+ * command procedure from the beginning. This time, the get-argument
+ * procedures return the saved values from the array before continuing to
+ * scan the (new) input. In this way, buffer boundaries cause some extra
+ * work, but the command implementations don't notice them. The only
+ * requirement is that a command must not change the permanent state until
+ * it has read all of its arguments.
+ *
+ * For commands that take other kinds of arguments, or a variable
+ * (potentially large) number of numeric arguments, the situation is more
+ * complicated. The command is still expected to detect running out of
+ * input data, and is still restarted, but it must keep track of its
+ * progress itself. We provide a variable called 'phase' for this
+ * purpose: it is set to 0 just after the parser recognizes a command,
+ * and is free for the command to use thereafter.
+ */
+typedef struct hpgl_command_s {
+ hpgl_command_proc_t proc;
+ byte flags;
+#define hpgl_cdf_polygon 1 /* execute command even in polygon mode */
+#define hpgl_cdf_lost_mode_cleared 2 /* exectute command only if lost mode cleared */
+#define hpgl_cdf_rtl 4 /* execute only in rtl mode */
+#define hpgl_cdf_pcl 8 /* execute only in pcl mode */
+#define hpgl_cdf_pcl_rtl_both (hpgl_cdf_rtl|hpgl_cdf_pcl)
+} hpgl_command_definition_t;
+
+/* Define a HP-GL/2 command argument value. */
+typedef struct hpgl_value_s {
+ union v_n {
+ int32 i;
+ hpgl_real_t r;
+ } v_n;
+ bool is_real;
+} hpgl_value_t;
+
+/* Define the structure passed to HP-GL/2 commands. */
+struct hpgl_args_s {
+ /* Parsing state */
+ stream_cursor_read source;
+ int first_letter; /* -1 if we haven't seen the first letter of */
+ /* a command, the letter (0-25) if we have */
+ bool done; /* true if we've seen an argument */
+ /* terminator */
+ const hpgl_command_definition_t *command; /* command being executed, */
+ /* 0 if none */
+ jmp_buf exit_to_parser; /* longjmp here if we ran out of data */
+ /* while scanning an argument, or we */
+ /* found a syntax error */
+ struct arg_ { /* argument scanning state */
+ /* State within the current argument */
+ int have_value; /* 0 = no value, 1 = int, 2 = real */
+ double frac_scale; /* 10 ^ # of digits after dot */
+ int sign; /* 0 = none, +/-1 = sign */
+ /* State of argument list collection */
+ int count; /* # of fully scanned arguments */
+ int next; /* # of next scanned arg to return */
+ hpgl_value_t scanned[21]; /* args already scanned */
+ } arg;
+ /* Command execution state */
+ int phase; /* phase within command, see above */
+
+ /*
+ * We register all the HP-GL/2 commands dynamically, for maximum
+ * configuration flexibility. hpgl_command_list points to the individual
+ * command definitions; as each command is registered, we enter it in the
+ * list, and then store its index in the actual dispatch table
+ * (hpgl_command_indices).
+ */
+ hpgl_command_definition_t *hpgl_command_list[100];
+ int hpgl_command_next_index;
+ /* Dispatch tables */
+ byte hpgl_command_indices[26][26];
+};
+
+/* Register HP-GL/2 commands. */
+typedef struct {
+ char char1, char2;
+ hpgl_command_definition_t defn;
+} hpgl_named_command_t;
+int hpgl_init_command_index(hpgl_parser_state_t **pgl_parser_state, gs_memory_t *mem);
+void hpgl_define_commands(const gs_memory_t *mem,
+ const hpgl_named_command_t *,
+ hpgl_parser_state_t *pgl_parser_state);
+#define DEFINE_HPGL_COMMANDS(mem) \
+{ const gs_memory_t *mem_ = mem; \
+ static const hpgl_named_command_t defs_[] = {
+#define HPGL_COMMAND(c1, c2, proc, flag)\
+ {c1, c2, {proc, flag}}
+#define END_HPGL_COMMANDS\
+ {0, 0}\
+ };\
+ hpgl_define_commands(mem_, defs_, pcl_parser_state->hpgl_parser_state);\
+}
+
+/* Define a return code asking for more data. */
+#define e_NeedData (-200)
+
+/* Initialize the HP-GL/2 parser. */
+void hpgl_process_init(hpgl_parser_state_t *);
+
+/* Process a buffer of HP-GL/2 commands. */
+/* Return 0 if more input needed, 1 if ESC seen, or an error code. */
+int hpgl_process(hpgl_parser_state_t *pst, hpgl_state_t *pgls,
+ stream_cursor_read *pr);
+
+/* Prepare to scan the next (numeric) argument. */
+#define hpgl_arg_init(pargs)\
+ ((pargs)->arg.have_value = 0, (pargs)->arg.sign = 0)
+
+/* Prepare to scan a sequence of numeric arguments. Execute this */
+/* once per sequence, when incrementing the phase. */
+#define hpgl_args_init(pargs)\
+ (hpgl_arg_init(pargs), (pargs)->arg.count = 0)
+/* Move to the next phase of a command. */
+#define hpgl_next_phase(pargs)\
+ ((pargs)->phase++, hpgl_args_init(pargs))
+
+/*
+ * Scan a numeric argument, returning true if there was one, or false
+ * if we have reached the end of the arguments. Note that these
+ * procedures longjmp back to the parser if they run out of input data.
+ */
+bool hpgl_arg_real(const gs_memory_t *mem, hpgl_args_t *pargs, hpgl_real_t *pr);
+bool hpgl_arg_c_real(const gs_memory_t *mem, hpgl_args_t *pargs, hpgl_real_t *pr);
+bool hpgl_arg_int(const gs_memory_t *mem, hpgl_args_t *pargs, int32 *pi);
+bool hpgl_arg_c_int(const gs_memory_t *mem, hpgl_args_t *pargs, int *pi);
+/*
+ * Many vector commands are defined as taking parameters whose format is
+ * "current units". This is nonsensical: whether scaling is on or off
+ * has no bearing on whether coordinates are represented as integers or
+ * reals. Nevertheless, in deference to this definition (and just in case
+ * it turns out it actually matters), we define a separate procedure for
+ * this.
+ */
+bool hpgl_arg_units(const gs_memory_t *mem, hpgl_args_t *pargs, hpgl_real_t *pu);
+
+/* In some cases, it is convenient for the implementation of command A to
+ * call another command B. While we don't particularly like this approach
+ * in general, we do support it, as long as command B doesn't do its own
+ * argument parsing (e.g., PE, LB). The framework for doing this is the
+ * following:
+ * hpgl_args_t args;
+ * ...
+ * hpgl_args_setup(&args);
+ * << As many times as desired: >>
+ * hpgl_args_add_int/real(&args, value);
+ * hpgl_B(&args, pgls);
+ */
+#define args_setup_count_(pargs, numargs)\
+ ((void)((pargs)->done = true, (pargs)->arg.count = (numargs),\
+ (pargs)->arg.next = (pargs)->phase = 0))
+#define hpgl_args_setup(pargs)\
+ args_setup_count_(pargs, 0)
+#define args_put_int_(pargs, index, iplus, ival)\
+ ((void)((pargs)->arg.scanned[index].v_n.i = (ival),\
+ (pargs)->arg.scanned[iplus].is_real = false))
+#define hpgl_args_add_int(pargs, ival)\
+ args_put_int_(pargs, (pargs)->arg.count, (pargs)->arg.count++, ival)
+#define args_put_real_(pargs, index, iplus, rval)\
+ ((void)((pargs)->arg.scanned[index].v_n.r = (rval),\
+ (pargs)->arg.scanned[iplus].is_real = true))
+#define hpgl_args_add_real(pargs, rval)\
+ args_put_real_(pargs, (pargs)->arg.count, (pargs)->arg.count++, rval)
+/*
+ * We provide shortcuts for commands that take just 1 or 2 arguments.
+ */
+#define hpgl_args_set_int(pargs, ival)\
+ (args_setup_count_(pargs, 1), args_put_int_(pargs, 0, 0, ival))
+#define hpgl_args_set_real(pargs, rval)\
+ (args_setup_count_(pargs, 1), args_put_real_(pargs, 0, 0, rval))
+#define hpgl_args_set_real2(pargs, rval1, rval2)\
+ (args_setup_count_(pargs, 2), args_put_real_(pargs, 0, 0, rval1),\
+ args_put_real_(pargs, 1, 1, rval2))
+
+/*
+ * HPGL mnemonics
+ */
+
+/* commands from pgchar.c -- HP-GL/2 character commands */
+int hpgl_AD(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_CF(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_CP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_DI(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_DR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_DT(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_DV(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_ES(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_FI(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_FN(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_LB(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_LM(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_LO(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SA(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SB(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SD(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SI(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SL(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SS(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_TD(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+/* commands from pgcolor.c - HP-GL/2 color vector graphics commands */
+int hpgl_MC(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_NP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+/* commands from pgconfig.c - HP-GL/2 configuration and status commands */
+int hpgl_CO(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_DF(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+int hpgl_IN(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_IN_implicit(hpgl_state_t *pgls);
+
+int hpgl_IP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_IR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_IW(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PG(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PS(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RO(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SC(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+/* commands from pglfill.c - HP-GL/2 line and fill attributes commands */
+int hpgl_AC(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_FT(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_LA(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_LT(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PW(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RF(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SM(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_SV(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_TR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_UL(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_WU(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+/* commands from pgpoly.c -- HP-GL/2 polygon commands */
+int hpgl_EA(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_EP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_ER(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_EW(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_FP(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PM(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RA(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RQ(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_WG(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+/* commands from pgvector.c - HP-GL/2 vector commands */
+int hpgl_AA(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_AR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_AT(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_BR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_BZ(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_CI(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PA(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PD(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PE(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PR(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_PU(hpgl_args_t *pargs, hpgl_state_t *pgls);
+int hpgl_RT(hpgl_args_t *pargs, hpgl_state_t *pgls);
+
+/* commands from pgframe.c -- PCL5/HP-GL/2 picture frame commands */
+int pcl_horiz_pic_frame_size_decipoints(pcl_args_t *pargs, hpgl_state_t *pgls);
+int pcl_vert_pic_frame_size_decipoints(pcl_args_t *pargs, hpgl_state_t *pgls);
+int pcl_set_pic_frame_anchor_point(pcl_args_t *pargs, hpgl_state_t *pgls);
+int pcl_hpgl_plot_horiz_size(pcl_args_t *pargs, hpgl_state_t *pgls);
+int pcl_hpgl_plot_vert_size(pcl_args_t *pargs, hpgl_state_t *pgls);
+
+/* reset required for overlay macros - a partial DF command */
+int hpgl_reset_overlay(hpgl_state_t *pgls);
+
+/* this should find a new home but for now we list it here. */
+int hpgl_print_symbol_mode_char(hpgl_state_t *pgls);
+
+/* reset LT parameters */
+void hpgl_set_line_pattern_defaults(hpgl_state_t *pgls);
+
+/* reset LA parameters */
+void hpgl_set_line_attribute_defaults(hpgl_state_t *pgls);
+
+void hpgl_free_stick_fonts(hpgl_state_t *pgls);
+#endif /* pgmand_INCLUDED */
diff --git a/pcl/pgmisc.c b/pcl/pgmisc.c
new file mode 100644
index 000000000..58911aeb1
--- /dev/null
+++ b/pcl/pgmisc.c
@@ -0,0 +1,75 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgmisc.c */
+/* HP-GL/2 miscellaneous support */
+
+#include "pgmand.h"
+#include "pgmisc.h"
+
+bool
+current_units_out_of_range(hpgl_real_t x)
+{
+ const hpgl_real_t max = (1 << 30) - 1;
+ const hpgl_real_t min = -(1 << 30);
+ /* Not much to do about the floating point equality checking here
+ The problem is the coordinates should already be in an exact
+ (fixed) representation at this time but they are not so we make
+ due with the following. */
+ return (x < min || x > max);
+}
+
+void
+hpgl_set_lost_mode(hpgl_state_t *pgls, hpgl_lost_mode_t lost_mode)
+{
+ if ( lost_mode == hpgl_lost_mode_entered )
+ {
+#ifdef INFINITE_LOOP
+ hpgl_args_t args;
+ /* raise the pen. Note this should handle the pcl oddity
+ that when lost mode is cleared with an absolute PD we
+ draw a line from the last valid position to the first
+ args of pen down. The following appends a moveto the
+ current point in the gs path */
+ hpgl_args_setup(&args);
+ hpgl_PU(&args, pgls);
+#endif
+#ifdef DEBUG
+ dprintf("entering lost mode\n");
+#endif
+ }
+ pgls->g.lost_mode = lost_mode;
+
+}
+
+#ifdef DEBUG
+
+/* Print an error message. Note that function may be NULL. */
+/* This procedure must return its 'code' argument: see pgmisc.h. */
+int
+hpgl_print_error(const gs_memory_t *mem,
+ const char *function, const char *file, int line, int code)
+{
+ dprintf4("hpgl call failed\n\tcalled from: %s\n\tfile: %s\n\tline: %d\n\terror code: %d\n",
+ (function == 0 ? "" : function), file, line, code);
+ hpgl_error();
+ return code;
+}
+
+/* called when there is a graphics error. Keep a breakpoint on this function */
+void
+hpgl_error()
+{
+ return;
+}
+#endif
diff --git a/pcl/pgmisc.h b/pcl/pgmisc.h
new file mode 100644
index 000000000..f86c08f2b
--- /dev/null
+++ b/pcl/pgmisc.h
@@ -0,0 +1,88 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgmisc.h */
+/* definitions for HP-GL/2 lost mode and error handling routines. */
+
+#ifndef pgmisc_INCLUDED
+# define pgmisc_INCLUDED
+
+void hpgl_set_lost_mode(hpgl_state_t *pgls, hpgl_lost_mode_t lost_mode);
+/* get the current setting of the edge pen set by CF, NB this should
+ be in a different header file */
+int32 hpgl_get_character_edge_pen(hpgl_state_t *pgls);
+
+/* macro to see if we are in lost mode */
+#define hpgl_lost (pgls->g.lost_mode == hpgl_lost_mode_entered)
+
+/* a macro that calls a function and returns an error code if the code
+ returned is less than 0. Most of the hpgl and gs functions return
+ if the calling function is less than 0 so this avoids cluttering up
+ the code with the if statement and debug code. */
+
+#ifdef DEBUG
+
+void hpgl_error(void);
+int hpgl_print_error(const gs_memory_t *mem,
+ const char *function, const char *file, int line, int code);
+
+# ifdef __GNUC__
+# define hpgl_call_note_error(mem, code)\
+ hpgl_print_error(mem, __FUNCTION__, __FILE__, __LINE__, code)
+# else
+# define hpgl_call_note_error(mem, code)\
+ hpgl_print_error(mem, (const char *)0, __FILE__, __LINE__, code)
+# endif
+
+#else /* !DEBUG */
+
+#define hpgl_call_note_error(mem, code) (code)
+
+#endif
+
+/* We use the do ... while(0) in order to make the call be a statement */
+/* syntactically. */
+
+#define hpgl_call_and_check(mem, call, if_check_else)\
+do { \
+ int code; \
+ if ((code = (call)) < 0) \
+ { if_check_else() \
+ return hpgl_call_note_error(mem, code); \
+ } \
+} while (0)
+
+/* Ordinary function calls */
+
+#define hpgl_no_check() /* */
+
+#define hpgl_call(call)\
+ hpgl_call_and_check(pgls->memory, call, hpgl_no_check)
+
+#define hpgl_call_mem(mem, call)\
+ hpgl_call_and_check(mem, call, hpgl_no_check)
+
+/* Function calls that can set LOST mode */
+
+#define hpgl_limitcheck_set_lost()\
+ if ( code == gs_error_limitcheck )\
+ hpgl_set_lost_mode(pgls, hpgl_lost_mode_entered);\
+ else
+
+#define hpgl_call_check_lost(call)\
+ hpgl_call_and_check(pgls->memory, call, hpgl_limitcheck_set_lost)
+
+/* needs a better home */
+gs_point hpgl_current_char_scale(const hpgl_state_t *pgls);
+
+#endif /* pgmisc_INCLUDED */
diff --git a/pcl/pgparse.c b/pcl/pgparse.c
new file mode 100644
index 000000000..e140757f7
--- /dev/null
+++ b/pcl/pgparse.c
@@ -0,0 +1,404 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgparse.c */
+/* HP-GL/2 parser */
+#include "math_.h"
+#include "stdio_.h"
+#include "gdebug.h"
+#include "gstypes.h"
+#include "scommon.h"
+#include "pgmand.h"
+
+/* ---------------- Command definition ---------------- */
+
+/* Register a command. Return true if this is a redefinition. */
+static bool
+hpgl_register_command(hpgl_parser_state_t *pgl_parser_state,
+ byte *pindex,
+ const hpgl_command_definition_t *pcmd)
+{
+ int index = pgl_parser_state->hpgl_command_next_index;
+ byte prev = *pindex;
+
+ if ( prev != 0 && prev <= index &&
+ pgl_parser_state->hpgl_command_list[prev] == pcmd )
+ index = prev;
+ else if ( index != 0 && pgl_parser_state->hpgl_command_list[index] == pcmd )
+ ;
+ else
+ pgl_parser_state->hpgl_command_list[pgl_parser_state->hpgl_command_next_index = ++index] = (hpgl_command_definition_t *)pcmd;
+ *pindex = index;
+ return (prev != 0 && prev != index);
+}
+
+/* Define a list of commands. */
+void
+hpgl_define_commands(const gs_memory_t *mem, const hpgl_named_command_t *pcmds,
+ hpgl_parser_state_t *pgl_parser_state
+)
+{ const hpgl_named_command_t *pcmd = pcmds;
+
+ for ( ; pcmd->char1; ++pcmd )
+#ifdef DEBUG
+ if (
+#endif
+ hpgl_register_command(pgl_parser_state,
+ &pgl_parser_state->hpgl_command_indices
+ [pcmd->char1 - 'A'][pcmd->char2 - 'A'],
+ &pcmd->defn)
+#ifdef DEBUG
+ )
+ dprintf2("Redefining command %c%c\n", pcmd->char1, pcmd->char2);
+#endif
+ ;
+}
+
+/* ---------------- Parsing ---------------- */
+
+/* Initialize the HP-GL/2 parser state. */
+void
+hpgl_process_init(hpgl_parser_state_t *pst)
+{ pst->first_letter = -1;
+ pst->command = 0;
+}
+
+/* Process a buffer of HP-GL/2 commands. */
+/* Return 0 if more input needed, 1 if ESC seen, or an error code. */
+int
+hpgl_process(hpgl_parser_state_t *pst, hpgl_state_t *pgls,
+ stream_cursor_read *pr)
+{ const byte *p = pr->ptr;
+ const byte *rlimit = pr->limit;
+ int code = 0;
+
+ pst->source.limit = rlimit;
+ /* Prepare to catch a longjmp indicating the argument scanner */
+ /* needs more data, or encountered an error. */
+ code = setjmp(pst->exit_to_parser);
+ if ( code )
+ { /* The command detected an error, or we need to ask */
+ /* the caller for more data. pst->command != 0. */
+ pr->ptr = pst->source.ptr;
+ if ( code < 0 && code != e_NeedData )
+ { pst->command = 0; /* cancel command */
+ if_debug0('i', "\n");
+ return code;
+ }
+ return 0;
+ }
+ /* Check whether we're still feeding data to a command. */
+call: if ( pst->command )
+ { pst->source.ptr = p;
+ pst->arg.next = 0;
+ code = (*pst->command->proc)(pst, pgls);
+ p = pst->source.ptr;
+ if ( code < 0 )
+ goto x;
+ pst->command = 0;
+ if_debug0('i', "\n");
+ }
+ while ( p < rlimit )
+ { byte next = *++p;
+
+ if ( next >= 'A' && next <= 'Z' )
+ next -= 'A';
+ else if ( next >= 'a' && next <= 'z' )
+ next -= 'a';
+ else if ( next == ESC )
+ { --p;
+ pst->first_letter = -1;
+ code = 1;
+ break;
+ }
+ else /* ignore everything else */
+ { /* Apparently this is what H-P plotters do.... */
+ if ( next > ' ' && next != ',' )
+ pst->first_letter = -1;
+ continue;
+ }
+ if ( pst->first_letter < 0 )
+ { pst->first_letter = next;
+ continue;
+ }
+ { int index = pst->hpgl_command_indices[pst->first_letter][next];
+
+#ifdef DEBUG
+ if ( gs_debug_c('i') )
+ { char c = (index ? '-' : '?');
+ dprintf4("--%c%c%c%c", pst->first_letter + 'A',
+ next + 'A', c, c);
+ }
+#endif
+ if ( index == 0 ) /* anomalous, drop 1st letter */
+ { pst->first_letter = next;
+ continue;
+ }
+ pst->first_letter = -1;
+ pst->command = pst->hpgl_command_list[index];
+ pst->phase = 0;
+ pst->done = false;
+ hpgl_args_init(pst);
+ /*
+ * Only a few commands should be executed while we're in
+ * polygon mode: check for this here. Note that we rely
+ * on the garbage-skipping property of the parser to skip
+ * over any following arguments. This doesn't work for
+ * the few commands with special syntax that should be
+ * ignored in polygon mode (CO, DT, LB, SM); they must be
+ * flagged as executable even in polygon mode, and check
+ * the render_mode themselves.
+ */
+ {
+ bool ignore_command = false;
+ if (( pgls->g.polygon_mode ) &&
+ !(pst->command->flags & hpgl_cdf_polygon)
+ )
+ ignore_command = true;
+ else
+ { /* similarly if we are in lost mode we do not
+ execute the commands that are only defined to
+ be used when lost mode is cleared. */
+ if (( pgls->g.lost_mode == hpgl_lost_mode_entered ) &&
+ (pst->command->flags & hpgl_cdf_lost_mode_cleared)
+ )
+ ignore_command = true;
+ }
+ /* Also, check that we have a command that can be executed
+ with the current personality. NB reorganize me. */
+ if ( pgls->personality == rtl )
+ if ( !(pst->command->flags & hpgl_cdf_rtl) ) /* not rtl pcl only */
+ ignore_command = true;
+ if ( (pgls->personality == pcl5c) || (pgls->personality == pcl5e) )
+ if ( !(pst->command->flags & hpgl_cdf_pcl) ) /* not pcl rtl only */
+ ignore_command = true;
+ if ( ignore_command )
+ pst->command = 0;
+ }
+ goto call;
+ }
+ }
+x: pr->ptr = p;
+ return (code == e_NeedData ? 0 : code);
+}
+
+/*
+ * Get a numeric HP-GL/2 argument from the input stream. Return 0 if no
+ * argument, a pointer to the value if an argument is present, or longjmp if
+ * need more data. Note that no errors are possible.
+ */
+static const hpgl_value_t *
+hpgl_arg(const gs_memory_t *mem,
+ hpgl_parser_state_t *pst)
+{ const byte *p;
+ const byte *rlimit;
+ hpgl_value_t *pvalue;
+
+#define parg (&pst->arg)
+ if ( parg->next < parg->count )
+ { /* We're still replaying already-scanned arguments. */
+ return &parg->scanned[parg->next++];
+ }
+ if ( pst->done )
+ return 0;
+ p = pst->source.ptr;
+ rlimit = pst->source.limit;
+ pvalue = &parg->scanned[parg->count];
+#define check_value()\
+ if ( parg->have_value ) goto done
+
+ for ( ; p < rlimit; ++p )
+ { byte ch = p[1];
+ switch ( ch )
+ {
+ case '+':
+ check_value();
+ parg->have_value = 1;
+ parg->sign = 1;
+ pvalue->v_n.i = 0;
+ break;
+ case '-':
+ check_value();
+ parg->have_value = 1;
+ parg->sign = -1;
+ pvalue->v_n.i = 0;
+ break;
+ case '.':
+ switch ( parg->have_value )
+ {
+ default: /* > 1 */
+ goto out;
+ case 0:
+ pvalue->v_n.r = 0;
+ break;
+ case 1:
+ pvalue->v_n.r = pvalue->v_n.i;
+ }
+ parg->have_value = 2;
+ parg->frac_scale = 1.0;
+ break;
+ case ';':
+ pst->done = true;
+ check_value();
+ goto out;
+ case HT: case LF: case FF: case CR:
+ /* control charachers are ignored during parsing hpgl
+ */
+ continue;
+ case SP: case ',':
+ /*
+ * The specification doesn't say what to do with extra
+ * separators; we just ignore them.
+ */
+ if ( !parg->have_value )
+ break;
+ ++p;
+done: if ( parg->sign < 0 )
+ { if ( parg->have_value > 1 )
+ pvalue->v_n.r = -pvalue->v_n.r;
+ else
+ pvalue->v_n.i = -pvalue->v_n.i;
+ }
+ goto out;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ ch -= '0';
+#define max_i 0x7fffffff
+ switch ( parg->have_value )
+ {
+ default: /* case 2 */
+ pvalue->v_n.r += ch / (parg->frac_scale *= 10);
+ break;
+ case 0:
+ parg->have_value = 1;
+ pvalue->v_n.i = ch;
+ break;
+ case 1:
+ if ( pvalue->v_n.i >= max_i/10 &&
+ (pvalue->v_n.i > max_i/10 || ch > max_i%10)
+ )
+ return NULL;
+ else
+ pvalue->v_n.i = pvalue->v_n.i * 10 + ch;
+ }
+ break;
+ default:
+ pst->done = true;
+ check_value();
+ goto out;
+ }
+ }
+ /* We ran out of data before reaching a terminator. */
+ pst->source.ptr = p;
+ longjmp(pst->exit_to_parser, e_NeedData);
+ /* NOTREACHED */
+out: pst->source.ptr = p;
+ switch ( parg->have_value )
+ {
+ case 0: /* no argument */
+ return NULL;
+ case 1: /* integer */
+ if_debug1('I', " %ld", (long)pvalue->v_n.i);
+ pvalue->is_real = false;
+ break;
+ default /* case 2 */: /* real */
+ if_debug1('I', " %g", pvalue->v_n.r);
+ pvalue->is_real = true;
+ }
+ hpgl_arg_init(pst);
+ parg->next = ++(parg->count);
+ return pvalue;
+#undef parg
+}
+
+/* Get a real argument. */
+bool
+hpgl_arg_real(const gs_memory_t *mem,
+ hpgl_args_t *pargs, hpgl_real_t *pr)
+{ const hpgl_value_t *pvalue = hpgl_arg(mem, pargs);
+
+ if ( !pvalue )
+ return false;
+ *pr = (pvalue->is_real ? pvalue->v_n.r : pvalue->v_n.i);
+ return true;
+}
+
+/* Get a clamped real argument. */
+bool
+hpgl_arg_c_real(const gs_memory_t *mem,
+ hpgl_args_t *pargs, hpgl_real_t *pr)
+{ const hpgl_value_t *pvalue = hpgl_arg(mem, pargs);
+ hpgl_real_t r;
+
+ if ( !pvalue )
+ return false;
+ r = (pvalue->is_real ? pvalue->v_n.r : pvalue->v_n.i);
+ *pr = (r < -32768 ? -32768 : r > 32767 ? 32767 : r);
+ return true;
+
+}
+
+/* Get an integer argument. */
+bool
+hpgl_arg_int(const gs_memory_t *mem,
+ hpgl_args_t *pargs, int32 *pi)
+{ const hpgl_value_t *pvalue = hpgl_arg(mem, pargs);
+
+ if ( !pvalue )
+ return false;
+ *pi = (pvalue->is_real ? (int32)pvalue->v_n.r : pvalue->v_n.i);
+ return true;
+}
+
+/* Get a clamped integer argument. */
+bool
+hpgl_arg_c_int(const gs_memory_t *mem,
+ hpgl_args_t *pargs, int *pi)
+{ const hpgl_value_t *pvalue = hpgl_arg(mem, pargs);
+ int32 i;
+
+ if ( !pvalue )
+ return false;
+ i = (pvalue->is_real ? (int32)pvalue->v_n.r : pvalue->v_n.i);
+ *pi = (i < -32768 ? -32768 : i > 32767 ? 32767 : i);
+ return true;
+}
+
+/* Get a "current units" argument. */
+bool
+hpgl_arg_units(const gs_memory_t *mem,
+ hpgl_args_t *pargs, hpgl_real_t *pu)
+{ /****** PROBABLY WRONG ******/
+ return hpgl_arg_real(mem, pargs, pu);
+}
+
+/* initialize the HPGL command counter */
+ int
+hpgl_init_command_index(hpgl_parser_state_t **pgl_parser_state, gs_memory_t *mem)
+{
+ hpgl_parser_state_t *pgst =
+ (hpgl_parser_state_t *)gs_alloc_bytes(mem, sizeof(hpgl_parser_state_t),
+ "hpgl_init_command_index");
+ /* fatal */
+ if ( pgst == 0 )
+ return -1;
+
+ pgst->hpgl_command_next_index = 0;
+ /* NB fix me the parser should not depend on this behavior the
+ previous design had these in bss which was automatically
+ cleared to zero. */
+ memset(pgst->hpgl_command_indices, 0, sizeof(pgst->hpgl_command_indices));
+ hpgl_process_init(pgst);
+ *pgl_parser_state = pgst;
+ return 0;
+}
diff --git a/pcl/pgpoly.c b/pcl/pgpoly.c
new file mode 100644
index 000000000..d4f504d61
--- /dev/null
+++ b/pcl/pgpoly.c
@@ -0,0 +1,392 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgpoly.c - HP-GL/2 polygon commands */
+
+#include "std.h"
+#include "pcparse.h"
+#include "pgmand.h"
+#include "pgdraw.h"
+#include "pggeom.h"
+#include "pgmisc.h"
+#include "pcpatrn.h"
+#include "gspath.h"
+#include "gscoord.h"
+
+/* ------ Internal procedures ------ */
+
+/* Define fill/edge and absolute/relative flags. */
+#define DO_EDGE 1
+#define DO_RELATIVE 2
+
+/* clear the polygon buffer by entering and exiting polygon mode. */
+static int
+hpgl_clear_polygon_buffer(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_args_setup(pargs);
+ hpgl_call(hpgl_PM(pargs, pgls));
+ hpgl_args_set_int(pargs,2);
+ hpgl_call(hpgl_PM(pargs, pgls));
+ return 0;
+}
+
+/* Build a rectangle in polygon mode used by (EA, ER, RA, RR). */
+static int
+hpgl_rectangle(hpgl_args_t *pargs, hpgl_state_t *pgls, int flags, bool do_poly)
+{ hpgl_real_t x2, y2;
+ if ( !hpgl_arg_units(pgls->memory, pargs, &x2) ||
+ !hpgl_arg_units(pgls->memory, pargs, &y2) ||
+ current_units_out_of_range(x2) ||
+ current_units_out_of_range(y2) ) {
+ hpgl_call(hpgl_clear_polygon_buffer(pargs, pgls));
+ return e_Range;
+ }
+
+ if ( flags & DO_RELATIVE )
+ {
+ x2 += pgls->g.pos.x;
+ y2 += pgls->g.pos.y;
+ }
+
+ if ( do_poly ) {
+ hpgl_args_setup(pargs);
+ /* enter polygon mode. */
+ hpgl_call(hpgl_PM(pargs, pgls));
+ }
+
+ /* do the rectangle */
+ {
+ hpgl_real_t x1 = pgls->g.pos.x;
+ hpgl_real_t y1 = pgls->g.pos.y;
+
+ hpgl_call(hpgl_add_point_to_path(pgls, x1, y1, hpgl_plot_move_absolute, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, x2, y1, hpgl_plot_draw_absolute, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, x2, y2, hpgl_plot_draw_absolute, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, x1, y2, hpgl_plot_draw_absolute, true));
+ hpgl_call(hpgl_close_current_path(pgls));
+ }
+
+ /* exit polygon mode PM2 */
+ if ( do_poly ) {
+ hpgl_args_set_int(pargs,2);
+ hpgl_call(hpgl_PM(pargs, pgls));
+ }
+ return 0;
+}
+
+/* Fill or edge a wedge (EW, WG). */
+static int
+hpgl_wedge(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ hpgl_real_t radius, start, sweep, chord = 5.0;
+
+ if ( !hpgl_arg_units(pgls->memory, pargs, &radius) ||
+ !hpgl_arg_c_real(pgls->memory, pargs, &start) ||
+ !hpgl_arg_c_real(pgls->memory, pargs, &sweep) || sweep < -360 || sweep > 360
+ ) {
+ hpgl_call(hpgl_clear_polygon_buffer(pargs, pgls));
+ return e_Range;
+ }
+
+ hpgl_arg_c_real(pgls->memory, pargs, &chord);
+
+ /* enter polygon mode */
+ hpgl_args_setup(pargs);
+ hpgl_call(hpgl_PM(pargs, pgls));
+
+ if ( sweep > 359.9 || sweep < -359.9) {
+ floatp num_chordsf = 360 / chord;
+ /* match hp 4600 rounding, precompute since regular arc rounding is different. */
+ floatp intpart;
+ int num_chords = (modf(num_chordsf, &intpart) < 0.06) ? intpart : intpart+1;
+ floatp integral_chord_angle = fabs(sweep / num_chords);
+
+ hpgl_call(hpgl_add_arc_to_path(pgls, pgls->g.pos.x, pgls->g.pos.y,
+ radius, start, 360.0, integral_chord_angle, true,
+ hpgl_plot_draw_absolute, true));
+ }
+ else
+ /* draw the 2 lines and the arc using 3 point this does seem
+ convoluted but it does guarantee that the endpoint lines
+ for the vectors and the arc endpoints are coincident. */
+ {
+ hpgl_real_t x1, y1, x2, y2, x3, y3;
+ hpgl_compute_vector_endpoints(radius, pgls->g.pos.x, pgls->g.pos.y,
+ start, &x1, &y1);
+ hpgl_compute_vector_endpoints(radius, pgls->g.pos.x, pgls->g.pos.y,
+ (start + (sweep / 2.0)), &x2, &y2);
+ hpgl_compute_vector_endpoints(radius, pgls->g.pos.x, pgls->g.pos.y,
+ (start + sweep), &x3, &y3);
+ hpgl_call(hpgl_add_point_to_path(pgls, pgls->g.pos.x, pgls->g.pos.y,
+ hpgl_plot_move_absolute, true));
+ hpgl_call(hpgl_add_point_to_path(pgls, x1, y1,
+ hpgl_plot_draw_absolute, true));
+ hpgl_call(hpgl_add_arc_3point_to_path(pgls,
+ x1, y1,
+ x2, y2,
+ x3, y3, chord,
+ hpgl_plot_draw_absolute));
+ }
+
+ hpgl_call(hpgl_close_current_path(pgls));
+ hpgl_args_set_int(pargs,2);
+ hpgl_call(hpgl_PM(pargs, pgls));
+
+ return 0;
+}
+
+/* ------ Commands ------ */
+
+/* EA x,y; */
+int
+hpgl_EA(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+
+ hpgl_call(hpgl_rectangle(pargs, pgls, DO_EDGE, true));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ return 0;
+}
+
+/* EP; */
+int
+hpgl_EP(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ /* preserve the current path and copy the polygon buffer to
+ the current path */
+ hpgl_call(hpgl_gsave(pgls));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector_no_close));
+ hpgl_call(hpgl_grestore(pgls));
+ return 0;
+}
+
+/* ER dx,dy; */
+int
+hpgl_ER(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_rectangle(pargs, pgls, DO_RELATIVE, true));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ return 0;
+}
+
+/* EW radius,astart,asweep[,achord]; */
+int
+hpgl_EW(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_wedge(pargs, pgls));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ return 0;
+}
+
+static hpgl_rendering_mode_t
+hpgl_get_poly_render_mode(
+ hpgl_state_t * pgls
+)
+{
+ hpgl_FT_pattern_source_t type = pgls->g.fill.type;
+
+ return ( ((type == hpgl_FT_pattern_one_line) ||
+ (type == hpgl_FT_pattern_two_lines) )
+ ? hpgl_rm_clip_and_fill_polygon
+ : hpgl_rm_polygon );
+}
+
+/* FP method; */
+/* FP; */
+int
+hpgl_FP(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int method = 0;
+
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &method) && (method & ~1) ) {
+ hpgl_call(hpgl_clear_polygon_buffer(pargs, pgls));
+ return e_Range;
+ }
+ pgls->g.fill_type = (method == 0) ?
+ hpgl_even_odd_rule : hpgl_winding_number_rule;
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls,
+ hpgl_get_poly_render_mode(pgls)));
+ return 0;
+}
+
+/* close a subpolygon; PM1 or CI inside of a polygon */
+int
+hpgl_close_subpolygon(hpgl_state_t *pgls)
+{
+ gs_point first, last;
+ gs_point point;
+ gs_fixed_point first_device;
+
+ if ( pgls->g.polygon_mode ) {
+
+ if ( gx_path_subpath_start_point(gx_current_path(pgls->pgs),
+ &first_device) >= 0 ) {
+ first.x = fixed2float(first_device.x);
+ first.y = fixed2float(first_device.y);
+
+ /* get gl/2 current position -- always current units */
+ hpgl_call(hpgl_get_current_position(pgls, &last));
+ /* convert to device space using the current ctm */
+ hpgl_call(gs_transform(pgls->pgs, last.x, last.y, &last));
+ /*
+ * if the first and last are the same close the path (i.e
+ * force gs to apply join and miter)
+ */
+ if (equal(first.x, last.x) && equal(first.y, last.y)) {
+ hpgl_call(gs_closepath(pgls->pgs));
+ }
+ else {
+ /* explicitly close the path if the pen has been down */
+ if ( pgls->g.have_drawn_in_path ) {
+ hpgl_call(hpgl_close_current_path(pgls));
+
+ /* update current position to the first point in sub-path,
+ * should be the same as last point after close path
+ * needed for relative moves after close of unclosed polygon
+ */
+ hpgl_call(gs_itransform(pgls->pgs, first.x, first.y, &point));
+ hpgl_call(hpgl_set_current_position(pgls, &point));
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ }
+ }
+ /* remain in poly mode, this shouldn't be necessary */
+ pgls->g.polygon_mode = true;
+ }
+ pgls->g.subpolygon_started = true;
+ }
+ return 0;
+}
+
+/* PM op; */
+int
+hpgl_PM(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ int op;
+
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &op) == 0 )
+ op = 0;
+
+ switch( op )
+ {
+ case 0 :
+ /* draw the current path if there is one */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ /* clear the polygon buffer as well */
+ gx_path_new(&pgls->g.polygon.buffer.path);
+ /* global flag to indicate that we are in polygon mode */
+ pgls->g.polygon_mode = true;
+ /* save the pen state, to be restored by PM2 */
+ hpgl_save_pen_state(pgls,
+ &pgls->g.polygon.pen_state,
+ hpgl_pen_down | hpgl_pen_pos);
+ break;
+ case 1 :
+ hpgl_call(hpgl_close_subpolygon(pgls));
+ break;
+ case 2 :
+ if ( pgls->g.polygon_mode ) {
+ /* explicitly close the path if the pen is down */
+ if ( pgls->g.move_or_draw == hpgl_pen_down
+ && pgls->g.have_drawn_in_path )
+ hpgl_call(hpgl_close_current_path(pgls));
+ /* make a copy of the path and clear the current path */
+ hpgl_call(hpgl_copy_current_path_to_polygon_buffer(pgls));
+ hpgl_call(hpgl_clear_current_path(pgls));
+ /* return to vector mode */
+ pgls->g.polygon_mode = false;
+ /* restore the pen state */
+ hpgl_restore_pen_state(pgls,
+ &pgls->g.polygon.pen_state,
+ hpgl_pen_down | hpgl_pen_pos);
+ }
+ break;
+ default:
+ return e_Range;
+ }
+ return 0;
+}
+
+/* RA x,y; */
+int
+hpgl_RA(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_rectangle(pargs, pgls, 0, true));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls,
+ hpgl_get_poly_render_mode(pgls)));
+ return 0;
+}
+
+/* RR dx,dy;*/
+int
+hpgl_RR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_rectangle(pargs, pgls, DO_RELATIVE, true));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls,
+ hpgl_get_poly_render_mode(pgls)));
+ return 0;
+}
+
+/* RQ dx,dy;*/
+int
+hpgl_RQ(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ /* contary to the specification HP uses default pixel placement
+ with RQ */
+ byte save_pp = pgls->pp_mode;
+ pgls->pp_mode = 0;
+ hpgl_call(hpgl_rectangle(pargs, pgls, DO_RELATIVE, false));
+ hpgl_call(hpgl_draw_current_path(pgls,
+ hpgl_get_poly_render_mode(pgls)));
+ /* restore saved pixel placement mode */
+ pgls->pp_mode = save_pp;
+ return 0;
+}
+
+
+/* WG radius,astart,asweep[,achord]; */
+int
+hpgl_WG(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_wedge(pargs, pgls));
+ hpgl_call(hpgl_copy_polygon_buffer_to_current_path(pgls));
+ hpgl_call(hpgl_draw_current_path(pgls,
+ hpgl_get_poly_render_mode(pgls)));
+ return 0;
+}
+
+/* Initialization */
+static int
+pgpoly_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem)
+{ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ HPGL_COMMAND('E', 'A', hpgl_EA, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('E', 'P', hpgl_EP, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('E', 'R', hpgl_ER, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('E', 'W', hpgl_EW, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('F', 'P', hpgl_FP, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'M', hpgl_PM, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('R', 'A', hpgl_RA, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('R', 'R', hpgl_RR, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('R', 'Q', hpgl_RQ, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('W', 'G', hpgl_WG, hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
+}
+const pcl_init_t pgpoly_init = {
+ pgpoly_do_registration, 0
+};
diff --git a/pcl/pgstate.h b/pcl/pgstate.h
new file mode 100644
index 000000000..4dbce5f7c
--- /dev/null
+++ b/pcl/pgstate.h
@@ -0,0 +1,347 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgstate.h - definition of HP-GL/2 portion of PCL5 state */
+
+/*
+ * This file should not be included by files other than pcstate.h; if you
+ * need the information in this file, include pcstate.h.
+ */
+
+#ifndef pgstate_INCLUDED
+#define pgstate_INCLUDED
+
+/*
+ * HPGL/2 coordinates are internally represented in plotter units
+ * 1/1024" when scaling is off and user units when scaling is in
+ * effect. The data structure g.pos maintains the coordinates in the
+ * hpgl/2 state. By default the coordinate system sets up the origin
+ * in the lower left of the page with X increasing along the short
+ * edge and Y increasing up the long edge. Note the Y direction is
+ * opposite PCL's.
+ */
+
+#include "gx.h"
+#include "gxfixed.h"
+#include "gslparam.h"
+
+#ifndef gs_imager_state_DEFINED
+# define gs_imager_state_DEFINED
+typedef struct gs_imager_state_s gs_imager_state;
+#endif
+#include "gzpath.h"
+
+/* Opaque type for a path */
+#ifndef gx_path_DEFINED
+# define gx_path_DEFINED
+typedef struct gx_path_s gx_path;
+#endif
+
+/* Define a type for HP-GL/2 floating point values. */
+typedef double hpgl_real_t;
+
+/* scaling definition */
+typedef struct hpgl_scaling_params_s {
+ gs_point pmin, pmax, factor;
+ float left, bottom;
+} hpgl_scaling_params_t;
+
+/* Define a line type (a.k.a. dash pattern). */
+typedef struct hpgl_line_type_s {
+ int count;
+ hpgl_real_t gap[20];
+} hpgl_line_type_t;
+
+typedef struct hpgl_path_state_s {
+ gx_path path;
+} hpgl_path_state_t;
+
+/* Define rendering modes - character, polygon, or vector.
+ This affects the line attributes chosen (see
+ hpgl_set_graphics_line_attribute_state) and whether we use
+ stroke or fill on the path. */
+typedef enum {
+ hpgl_rm_vector,
+ hpgl_rm_vector_no_close,
+ hpgl_rm_character,
+ hpgl_rm_polygon,
+ hpgl_rm_vector_fill,
+ hpgl_rm_clip_and_fill_polygon, /* for hpgl/2 line type filling */
+ hpgl_rm_nop /* don't do anything with the path. future use */
+} hpgl_rendering_mode_t;
+
+/* state of lost mode */
+typedef enum {
+ hpgl_lost_mode_entered,
+ hpgl_lost_mode_cleared
+} hpgl_lost_mode_t;
+
+typedef enum {
+ hpgl_even_odd_rule,
+ hpgl_winding_number_rule
+} hpgl_render_fill_type_t;
+
+/* Define the structure for saving the pen state temporarily. */
+/* HAS: note don't mix and match save a restores. perhaps there
+ should be a type check field in the structure. */
+typedef struct hpgl_pen_state_s {
+ int relative_coords;
+ int move_or_draw;
+ gs_point pos;
+} hpgl_pen_state_t;
+
+/* Define the parameters for GL hatch/cross-hatch fill types. */
+typedef struct hpgl_hatch_params_s {
+ float spacing;
+ float angle;
+} hpgl_hatch_params_t;
+
+/*
+ * Define the functions for adding points to paths. Note that the
+ * move/draw and absolute/relative alternatives can be tested, set, etc.
+ * individually.
+ */
+#define hpgl_plot_absolute 0
+#define hpgl_plot_relative 1
+#define hpgl_plot_is_absolute(func) (((func) & hpgl_plot_relative) == 0)
+#define hpgl_plot_is_relative(func) (((func) & hpgl_plot_relative) != 0)
+#define hpgl_plot_move 0
+#define hpgl_plot_draw 2
+#define hpgl_plot_is_move(func) (((func) & hpgl_plot_draw) == 0)
+#define hpgl_plot_is_draw(func) (((func) & hpgl_plot_draw) != 0)
+typedef enum {
+ hpgl_plot_move_absolute = hpgl_plot_move | hpgl_plot_absolute,
+ hpgl_plot_move_relative = hpgl_plot_move | hpgl_plot_relative,
+ hpgl_plot_draw_absolute = hpgl_plot_draw | hpgl_plot_absolute,
+ hpgl_plot_draw_relative = hpgl_plot_draw | hpgl_plot_relative
+} hpgl_plot_function_t;
+#define hpgl_plot_function_procedures\
+ gs_moveto, gs_rmoveto, gs_lineto, gs_rlineto
+
+typedef struct pcl_hpgl_state_s {
+ /* Chapter 17 lost mode (pgmisc.c) */
+
+ /* According to PCLTRM IN, PG, RP and PA with args in range clears
+ lost mode. Note that all these commands have PA with valid args
+ as a side effect so only PA needs to clear lost mode. */
+
+ hpgl_lost_mode_t lost_mode;
+
+ /* Chapter 18 (pgframe.c) */
+
+ struct pf_ {
+ coord_point_t size;
+ coord_point_t anchor_point;
+ } picture_frame;
+
+#define picture_frame_width picture_frame.size.x
+#define picture_frame_height picture_frame.size.y
+
+ coord_point_t plot_size;
+
+#define plot_width plot_size.x
+#define plot_height plot_size.y
+ bool plot_size_vertical_specified;
+ bool plot_size_horizontal_specified;
+ /* Chapter 19 (pgconfig.c) */
+
+ enum {
+ hpgl_scaling_none = -1,
+ hpgl_scaling_anisotropic = 0,
+ hpgl_scaling_isotropic = 1,
+ hpgl_scaling_point_factor = 2
+ } scaling_type;
+ hpgl_scaling_params_t scaling_params;
+ struct soft_clip_window_ {
+ bool active; /* current unit window has be given,
+ if not use picture frame */
+ bool isbound; /* bound to plotter units */
+ gs_rect rect; /* clipping window (IW) */
+ } soft_clip_window;
+ int rotation;
+ gs_point P1, P2; /* in plotter units */
+
+ /* Chapter 20 (pgvector.c) */
+
+ int move_or_draw; /* hpgl_plot_move/draw */
+ int relative_coords; /* hpgl_plot_absolute/relative */
+ gs_point pos;
+ /* used to track the line drawing state in hpgl */
+ gs_point first_point;
+ /* Chapter 21 (pgpoly.c) */
+ struct polygon_ {
+ hpgl_path_state_t buffer; /* path for polygon buffer */
+ hpgl_pen_state_t pen_state; /* save pen state during polygon mode */
+ } polygon;
+ bool polygon_mode;
+
+ /* Chapter 22 (pglfill.c) */
+
+ struct lp_ {
+ struct ltl_ {
+ int type;
+ /* the offset value is not required by the gl/2
+ language, however we use it to implement offsetting
+ line patterns for hpgl/2 vector fills */
+ float pattern_offset;
+ float pattern_length;
+ bool pattern_length_relative;
+ bool is_solid;
+ gs_point pos;
+ } current, saved; /* enable saving for LT99 */
+ int cap;
+ int join;
+ } line;
+ float miter_limit;
+ struct pen_ {
+ bool width_relative;
+ int selected; /* currently selected pen # */
+ } pen;
+ byte symbol_mode; /* 0 if not in symbol mode */
+ struct ft_ {
+ hpgl_FT_pattern_source_t type;
+ /*
+ * Because each fill type remembers its previous parameter values,
+ * we must use a structure rather than a union here.
+ */
+ struct fp_ {
+ hpgl_hatch_params_t hatch;
+ hpgl_hatch_params_t crosshatch;
+ int shading; /* 0..100 */
+ struct { int pattern_index; bool use_current_pen; } user_defined;
+ int pattern_type;
+ uint pattern_id;
+ } param;
+ } fill;
+ /* current bits of fraction for polyline encoded numbers */
+ int32 fraction_bits;
+ hpgl_render_fill_type_t fill_type;
+ hpgl_line_type_t fixed_line_type[8];
+ hpgl_line_type_t adaptive_line_type[8];
+ gs_point anchor_corner;
+ bool source_transparent;
+ struct scr_ {
+ hpgl_SV_pattern_source_t type;
+ struct sp_ {
+ int shading; /* 0..100 */
+ struct { int pattern_index; bool use_current_pen; } user_defined;
+ int pattern_type;
+ uint pattern_id;
+ } param;
+ } screen;
+ /* Temporary while downloading raster fill pattern */
+ struct rf_ {
+ int index, width, height;
+ uint raster;
+ byte *data;
+ bool is_mask;
+ } raster_fill;
+
+ /* Chapter 23 (pgchar.c, pglabel.c) */
+
+ pcl_font_selection_t font_selection[2];
+ int font_selected; /* 0 or 1 */
+ pl_font_t *font; /* 0 means recompute from params */
+ pl_symbol_map_t *map; /* map for current font */
+ pl_font_t stick_font[2][2]; /* stick/arc fonts */
+ struct ch_ {
+ gs_point direction;
+ bool direction_relative;
+ enum {
+ hpgl_text_right = 0,
+ hpgl_text_down = 1,
+ hpgl_text_left = 2,
+ hpgl_text_up = 3
+ } text_path;
+#define hpgl_text_is_vertical(path) (((path) & 1) != 0)
+ int line_feed_direction; /* +1 = normal, -1 = reversed */
+ gs_point extra_space;
+ gs_point size;
+ enum {
+ hpgl_size_not_set,
+ hpgl_size_absolute,
+ hpgl_size_relative
+ } size_mode;
+ hpgl_real_t slant;
+ enum {
+ hpgl_char_solid_edge = 0,
+ hpgl_char_edge = 1,
+ hpgl_char_fill = 2,
+ hpgl_char_fill_edge = 3
+ } fill_mode;
+ int edge_pen; /* 0 = no edge */
+ } character;
+ struct lb_ {
+ int origin;
+ uint terminator;
+ bool print_terminator;
+ /* Double-byte support */
+ uint row_offset; /* implicit high byte */
+ bool double_byte;
+ bool write_vertical;
+ /*
+ * The following are only used during the execution of a
+ * single LB command, but since hpgl_LB may need to exit
+ * back to the parser for more data, we can't make them
+ * local variables of hpgl_LB.
+ */
+ gs_point initial_pos;
+#define hpgl_char_count 128 /* initial buffer size */
+ byte *buffer; /* start of line buffer pointer */
+ uint buffer_size; /* size of the current buffer */
+ uint char_count; /* count of chars in the buffer */
+ byte ch;
+ byte prev_ch;
+ bool have_16bits; /* two byte terminators need 16 bits */
+ } label;
+ bool transparent_data;
+ uint font_id[2];
+ bool bitmap_fonts_allowed;
+ gs_point carriage_return_pos;
+ /* extra pen state for routines that cannot use local variables
+ because of longjmp parser braindamage. */
+ hpgl_pen_state_t pen_state;
+ bool subpolygon_started; /* true if we are just starting a subpolygon */
+ bool have_drawn_in_path; /* true if the pen has been down during this path */
+} pcl_hpgl_state_t;
+
+#define hpgl_pen_relative (1)
+#define hpgl_pen_down (1<<1)
+#define hpgl_pen_pos (1<<2)
+#define hpgl_pen_all (hpgl_pen_relative | hpgl_pen_down | hpgl_pen_pos)
+
+#define hpgl_save_pen_state(pgls, save, save_flags)\
+do {\
+ if ( (save_flags) & hpgl_pen_relative )\
+ ((save)->relative_coords = (pgls)->g.relative_coords);\
+ if ( (save_flags) & hpgl_pen_down )\
+ ((save)->move_or_draw = (pgls)->g.move_or_draw);\
+ if ( (save_flags) & hpgl_pen_pos )\
+ ((save)->pos = (pgls)->g.pos);\
+} while (0)
+
+#define hpgl_restore_pen_state(pgls, save, restore_flags)\
+do {\
+ if ( (restore_flags) & hpgl_pen_relative )\
+ ((pgls)->g.relative_coords = (save)->relative_coords);\
+ if ( (restore_flags) & hpgl_pen_down )\
+ ((pgls)->g.move_or_draw = (save)->move_or_draw);\
+ if ( (restore_flags) & hpgl_pen_pos )\
+ ((pgls)->g.pos = (save)->pos);\
+} while (0)
+
+/* check if current units are within the so-called "functional range"
+ defined to be -2^30 to 2^30 - 1 */
+bool current_units_out_of_range(hpgl_real_t x);
+
+#endif /* pgstate_INCLUDED */
diff --git a/pcl/pgvector.c b/pcl/pgvector.c
new file mode 100644
index 000000000..a36163808
--- /dev/null
+++ b/pcl/pgvector.c
@@ -0,0 +1,629 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pgvector.c */
+/* HP-GL/2 vector commands */
+
+#include "stdio_.h" /* for gdebug.h */
+#include "gdebug.h"
+#include "pcparse.h"
+#include "pgmand.h"
+#include "pggeom.h"
+#include "pgdraw.h"
+#include "pgmisc.h"
+#include "gspath.h"
+#include "gscoord.h"
+#include "math_.h"
+
+/* ------ Internal procedures ------ */
+
+/* Draw an arc (AA, AR). */
+ static int
+hpgl_arc(hpgl_args_t *pargs, hpgl_state_t *pgls, bool relative)
+{
+ hpgl_real_t x_center, y_center, sweep, x_current, y_current, chord_angle = 5;
+ hpgl_real_t radius, start_angle;
+
+ if ( !hpgl_arg_units(pgls->memory, pargs, &x_center) ||
+ !hpgl_arg_units(pgls->memory, pargs, &y_center) ||
+ !hpgl_arg_c_real(pgls->memory, pargs, &sweep)
+ )
+ return e_Range;
+
+ hpgl_arg_c_real(pgls->memory, pargs, &chord_angle);
+
+ if ( current_units_out_of_range(x_center) ||
+ current_units_out_of_range(y_center) )
+ return 0;
+
+ x_current = pgls->g.pos.x;
+ y_current = pgls->g.pos.y;
+
+ if ( relative )
+ {
+ x_center += x_current;
+ y_center += y_current;
+ }
+
+ radius =
+ hpgl_compute_distance(x_current, y_current, x_center, y_center);
+
+ start_angle = radians_to_degrees *
+ hpgl_compute_angle(x_current - x_center, y_current - y_center);
+
+ hpgl_call(hpgl_add_arc_to_path(pgls, x_center, y_center,
+ radius, start_angle, sweep,
+ chord_angle,
+ false,
+ pgls->g.move_or_draw, true));
+
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* Draw a 3-point arc (AT, RT). */
+ static int
+hpgl_arc_3_point(hpgl_args_t *pargs, hpgl_state_t *pgls, bool relative)
+{
+ hpgl_real_t x_start = pgls->g.pos.x, y_start = pgls->g.pos.y;
+ hpgl_real_t x_inter, y_inter, x_end, y_end;
+ hpgl_real_t chord_angle = 5;
+
+ if ( !hpgl_arg_units(pgls->memory, pargs, &x_inter) ||
+ !hpgl_arg_units(pgls->memory, pargs, &y_inter) ||
+ !hpgl_arg_units(pgls->memory, pargs, &x_end) ||
+ !hpgl_arg_units(pgls->memory, pargs, &y_end)
+ )
+ return e_Range;
+
+ hpgl_arg_c_real(pgls->memory, pargs, &chord_angle);
+
+ if ( relative )
+ {
+ x_inter += x_start;
+ y_inter += y_start;
+ x_end += x_start;
+ y_end += y_start;
+ }
+
+ hpgl_call(hpgl_add_arc_3point_to_path(pgls,
+ x_start, y_start,
+ x_inter, y_inter,
+ x_end, y_end, chord_angle,
+ pgls->g.move_or_draw));
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* Draw a Bezier (BR, BZ). */
+int
+hpgl_bezier(hpgl_args_t *pargs, hpgl_state_t *pgls, bool relative)
+{
+ hpgl_real_t x_start, y_start;
+
+ /*
+ * Since these commands take an arbitrary number of arguments,
+ * we reset the argument bookkeeping after each group.
+ */
+
+ for ( ; ; )
+ {
+ hpgl_real_t coords[6];
+ int i;
+
+ for ( i = 0; i < 6 && hpgl_arg_units(pgls->memory, pargs, &coords[i]); ++i )
+ ;
+ switch ( i )
+ {
+ case 0: /* done */
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ /* draw the path */
+ if ( !pgls->g.polygon_mode ) {
+ /* apparently only round and beveled joins are
+ allowed 5 is bevel and 4 is round */
+ int save_join = pgls->g.line.join;
+ if ( pgls->g.line.join != 1 && pgls->g.line.join != 4 )
+ pgls->g.line.join = 1; /* bevel */
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ pgls->g.line.join = save_join;
+ }
+ return 0;
+ case 6:
+ break;
+ default:
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return e_Range;
+ }
+
+ x_start = pgls->g.pos.x;
+ y_start = pgls->g.pos.y;
+
+ if ( relative )
+ hpgl_call(hpgl_add_bezier_to_path(pgls, x_start, y_start,
+ x_start + coords[0],
+ y_start + coords[1],
+ x_start + coords[2],
+ y_start + coords[3],
+ x_start + coords[4],
+ y_start + coords[5],
+ pgls->g.move_or_draw));
+ else
+ hpgl_call(hpgl_add_bezier_to_path(pgls, x_start, y_start,
+ coords[0], coords[1],
+ coords[2], coords[3],
+ coords[4], coords[5],
+ pgls->g.move_or_draw));
+ /* Prepare for the next set of points. */
+ hpgl_args_init(pargs);
+ }
+}
+
+/* Plot points, symbols, or lines (PA, PD, PR, PU). */
+int
+hpgl_plot(hpgl_args_t *pargs, hpgl_state_t *pgls, hpgl_plot_function_t func)
+{
+ /*
+ * Since these commands take an arbitrary number of arguments,
+ * we reset the argument bookkeeping after each group.
+ */
+ /* bool first_loop = true; */
+ hpgl_real_t x, y;
+ if ( hpgl_plot_is_move(func) && !pgls->g.polygon_mode ) {
+ hpgl_call(hpgl_close_path(pgls));
+ }
+ while ( hpgl_arg_units(pgls->memory, pargs, &x) &&
+ hpgl_arg_units(pgls->memory, pargs, &y) ) {
+
+ if ( current_units_out_of_range(x) ||
+ current_units_out_of_range(y) )
+ return e_Range;
+
+ /* move with arguments closes path */
+ if ( pargs->phase == 0
+ && (hpgl_plot_is_move(func) || pgls->g.subpolygon_started )) {
+ hpgl_call(hpgl_close_path(pgls));
+ }
+ pargs->phase = 1; /* we have arguments */
+ /* first point of a subpolygon is a pen up - absurd */
+ if ( pgls->g.subpolygon_started ) {
+ pgls->g.subpolygon_started = false;
+ pgls->g.have_drawn_in_path = false;
+ hpgl_call(hpgl_add_point_to_path(pgls, x, y,
+ hpgl_plot_move | pgls->g.relative_coords,
+ true));
+ }
+ else {
+ hpgl_call(hpgl_add_point_to_path(pgls, x, y, func, true));
+ if ( hpgl_plot_is_draw(func) )
+ pgls->g.have_drawn_in_path = true;
+ }
+ /* Prepare for the next set of points. */
+ if ( pgls->g.symbol_mode != 0 )
+ hpgl_call(hpgl_print_symbol_mode_char(pgls));
+ hpgl_args_init(pargs);
+ }
+
+ /* check for no argument, no polygon, absolute will add a point to path case
+ * NB stefan: need to find the test case
+ */
+ if ( !pargs->phase && hpgl_plot_is_absolute(func) && !pgls->g.polygon_mode ) {
+ gs_point cur_point;
+ hpgl_call(hpgl_get_current_position(pgls, &cur_point));
+ hpgl_call(hpgl_add_point_to_path(pgls, cur_point.x,
+ cur_point.y, func, true));
+ }
+ if ( pgls->g.symbol_mode != 0 )
+ hpgl_call(hpgl_print_symbol_mode_char(pgls));
+
+ /* don't update if no arguments */
+ if ( pargs->phase )
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+}
+
+/* ------ Commands ------ */
+ static int
+hpgl_draw_arc(hpgl_state_t *pgls)
+{
+ if ( !pgls->g.polygon_mode )
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ return 0;
+}
+
+/* AA xcenter,ycenter,sweep[,chord]; */
+ int
+hpgl_AA(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_arc(pargs, pgls, false));
+ hpgl_call(hpgl_draw_arc(pgls));
+ return 0;
+}
+
+/* AR xcenter,ycenter,sweep[,chord]; */
+ int
+hpgl_AR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_arc(pargs, pgls, true));
+ hpgl_call(hpgl_draw_arc(pgls));
+ return 0;
+}
+
+/* AT xinter,yinter,xend,yend[,chord]; */
+ int
+hpgl_AT(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_arc_3_point(pargs, pgls, false));
+ hpgl_call(hpgl_draw_arc(pgls));
+ return 0;
+}
+
+/* BR x1,y1,x2,y2,x3,y3...; */
+ int
+hpgl_BR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ return hpgl_bezier(pargs, pgls, true);
+}
+
+/* BZ x1,y1,x2,y2,x3,y3...; */
+int
+hpgl_BZ(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{ return hpgl_bezier(pargs, pgls, false);
+}
+
+/* CI radius[,chord]; */
+int
+hpgl_CI(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_real_t radius, chord = 5;
+ bool reset_ctm = true;
+ gs_point pos;
+
+ if ( !hpgl_arg_units(pgls->memory, pargs, &radius) )
+ return e_Range;
+
+ /* close existing path iff a draw exists in polygon path */
+ if ( pgls->g.have_drawn_in_path && pgls->g.polygon_mode )
+ hpgl_call(hpgl_close_subpolygon(pgls));
+
+ /* center; closing subpolygon can move center */
+ pos = pgls->g.pos;
+
+ hpgl_arg_c_real(pgls->memory, pargs, &chord);
+ /* draw the path here for line type 0, otherwise the first dot
+ drawn in the circumference of the circle will be oriented
+ in the same direction as the center dot */
+ if ( !pgls->g.line.current.is_solid && (pgls->g.line.current.type == 0) )
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+
+ /* draw the arc/circle */
+ hpgl_call(hpgl_add_arc_to_path(pgls, pos.x, pos.y,
+ radius, 0.0, 360.0, chord, true,
+ hpgl_plot_draw_absolute, reset_ctm));
+ if ( !pgls->g.polygon_mode )
+ hpgl_call(hpgl_draw_arc(pgls));
+
+ /* end path, start new path by moving back to the center */
+ hpgl_call(hpgl_close_current_path(pgls));
+ hpgl_call(hpgl_add_point_to_path(pgls, pos.x, pos.y,
+ hpgl_plot_move_absolute,
+ true));
+ pgls->g.have_drawn_in_path = false; /* prevent dot draw on close */
+ hpgl_call(hpgl_set_current_position(pgls, &pos));
+
+ if ( !pgls->g.polygon_mode )
+ hpgl_call(hpgl_clear_current_path(pgls));
+
+ return 0;
+}
+
+/* PA x,y...; */
+int
+hpgl_PA(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+
+ if ( pgls->g.relative_coords != hpgl_plot_absolute ) {
+ pgls->g.relative_coords = hpgl_plot_absolute;
+ if ( !pgls->g.polygon_mode ) {
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ hpgl_call(hpgl_clear_current_path(pgls));
+ }
+ }
+ return hpgl_plot(pargs, pgls,
+ pgls->g.move_or_draw | hpgl_plot_absolute);
+}
+
+/* PD (d)x,(d)y...; */
+int
+hpgl_PD(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ pgls->g.move_or_draw = hpgl_plot_draw;
+ return hpgl_plot(pargs, pgls,
+ hpgl_plot_draw | pgls->g.relative_coords);
+}
+
+/* PE (flag|value|coord)*; */
+/*
+ * We record the state of the command in the 'phase' as follows:
+ */
+enum {
+ pe_pen_up = 1, /* next coordinate are pen-up move */
+ pe_absolute = 2, /* next coordinates are absolute */
+ pe_7bit = 4, /* use 7-bit encoding */
+ pe_entered = 8 /* we have entered PE once */
+};
+
+/* convert pe fixed to float accounting for fractional bits */
+static inline floatp
+pe_fixed2float(int32 x, int32 fbits)
+{
+ return ((floatp)x * (1.0 / pow(2, fbits)));
+}
+
+static bool pe_args(const gs_memory_t *mem, hpgl_args_t *, int32 *, int);
+int
+hpgl_PE(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ /*
+ * To simplify the control structure here, we require that
+ * the input buffer be large enough to hold 2 coordinates
+ * in the base 32 encoding, i.e., 14 bytes. We're counting on
+ * there not being any whitespace within coordinate values....
+ */
+ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+ /* count points to allow medium size paths, performance optimization
+ * point_count_max should be smaller than input buffer
+ */
+ int point_count = 0;
+ static const int point_count_max = 100;
+
+ if ( pargs->phase == 0 ) {
+ /* After PE is executed, the previous plotting mode (absolute or
+ relative) is restored. If the finnal move is made with the pen up,
+ the pen remains in the up position; otherwise the pen is left in
+ the down position. At least HP documented this bug. */
+ hpgl_save_pen_state(pgls, &pgls->g.pen_state, hpgl_pen_relative);
+ pargs->phase |= pe_entered;
+ pgls->g.fraction_bits = 0;
+ }
+ while ( p < rlimit ) {
+ byte ch = *(pargs->source.ptr = ++p);
+ switch ( ch & 127 /* per spec */ ) {
+ case ';':
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ if ( pargs->phase & pe_entered )
+ hpgl_restore_pen_state(pgls, &pgls->g.pen_state, hpgl_pen_relative);
+ /* prevent paths from getting excessively large */
+ if ( !pgls->g.polygon_mode )
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ return 0;
+ case ':':
+ if_debug0('I', "\n PE SP");
+ {
+ int32 pen;
+ if ( !pe_args(pgls->memory, pargs, &pen, 1) )
+ {
+ pargs->source.ptr = p - 1;
+ break;
+ }
+ if ( !pgls->g.polygon_mode ) {
+ hpgl_args_t args;
+ hpgl_args_set_int(&args, pen);
+ /* Note SP is illegal in polygon mode we must handle that here */
+ hpgl_call(hpgl_SP(&args, pgls));
+ }
+ }
+ p = pargs->source.ptr;
+ continue;
+ case '<':
+ if_debug0('I', "\n PE PU");
+ pargs->phase |= pe_pen_up;
+ continue;
+ case '>':
+ if_debug0('I', "\n PE PD");
+ {
+ int32 fbits;
+ if ( !pe_args(pgls->memory, pargs, &fbits, 1) )
+ {
+ pargs->source.ptr = p - 1;
+ break;
+ }
+ if ( fbits < -26 || fbits > 26 )
+ return e_Range;
+ pgls->g.fraction_bits = fbits;
+ }
+ p = pargs->source.ptr;
+ continue;
+ case '=':
+ if_debug0('I', " PE ABS");
+ pargs->phase |= pe_absolute;
+ continue;
+ case '7':
+ if_debug0('I', "\n PE 7bit");
+ pargs->phase |= pe_7bit;
+ continue;
+ case ESC:
+ /*
+ * This is something of a hack. Apparently we're supposed
+ * to parse all PCL commands embedded in the GL/2 stream,
+ * and simply ignore everything except the 3 that end GL/2
+ * mode. Instead, we simply stop parsing PE arguments as
+ * soon as we see an ESC.
+ */
+ if ( ch == ESC ) /* (might be ESC+128) */ {
+ pargs->source.ptr = p - 1; /* rescan ESC */
+ if ( pargs->phase & pe_entered ) {
+ hpgl_restore_pen_state(pgls, &pgls->g.pen_state, hpgl_pen_relative);
+ }
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
+ }
+ /* falls through */
+ default:
+ if ( (ch & 127) <= 32 || (ch & 127) == 127 )
+ continue;
+ pargs->source.ptr = p - 1;
+ {
+ int32 xy[2];
+ hpgl_args_t args;
+ int32 fbits = pgls->g.fraction_bits;
+ if ( !pe_args(pgls->memory, pargs, xy, 2) )
+ break;
+ if ( pargs->phase & pe_absolute )
+ pgls->g.relative_coords = hpgl_plot_absolute;
+ else
+ pgls->g.relative_coords = hpgl_plot_relative;
+ hpgl_args_set_real2(&args, pe_fixed2float(xy[0], fbits),
+ pe_fixed2float(xy[1], fbits));
+ if ( pargs->phase & pe_pen_up ) {
+ /* prevent paths from getting excessively large */
+ if ( !pgls->g.polygon_mode && point_count > point_count_max ) {
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ point_count = 0;
+ }
+ hpgl_PU(&args, pgls);
+ }
+ else
+ hpgl_PD(&args, pgls);
+ point_count++;
+ }
+ pargs->phase &= ~(pe_pen_up | pe_absolute);
+ p = pargs->source.ptr;
+ continue;
+ }
+ break;
+ }
+ return e_NeedData;
+}
+/* Get an encoded value from the input. Return false if we ran out of */
+/* input data. Ignore syntax errors (!). */
+static bool
+pe_args(const gs_memory_t *mem, hpgl_args_t *pargs, int32 *pvalues, int count)
+{ const byte *p = pargs->source.ptr;
+ const byte *rlimit = pargs->source.limit;
+ int i, code;
+
+ for ( i = 0; i < count; ++i )
+ { int32 value = 0;
+ int shift = 0;
+
+ for ( ; ; )
+ { int ch;
+
+ if ( p >= rlimit )
+ return false;
+ ch = *++p;
+ if ( (ch & 127) <= 32 || (ch & 127) == 127 )
+ continue;
+ if ( pargs->phase & pe_7bit )
+ { ch -= 63;
+ if ( ch & ~63 )
+ goto syntax_error;
+ value += (int32)(ch & 31) << shift;
+ shift += 5;
+ if ( ch & 32 )
+ break;
+ }
+ else
+ { ch -= 63;
+ if ( ch & ~191 )
+ goto syntax_error;
+ value += (int32)(ch & 63) << shift;
+ shift += 6;
+ if ( ch & 128 )
+ break;
+ }
+ }
+ pvalues[i] = (value & 1 ? -(value >> 1) : value >> 1);
+ if_debug1('I', " [%ld]", (long)pvalues[i] );
+ }
+ pargs->source.ptr = p;
+ return true;
+syntax_error:
+ /* Just ignore everything we've parsed up to this point. */
+ pargs->source.ptr = p;
+ code = gs_note_error(e_Syntax);
+ return false;
+}
+
+/* PR dx,dy...; */
+int
+hpgl_PR(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ if ( pgls->g.relative_coords != hpgl_plot_relative ) {
+ pgls->g.relative_coords = hpgl_plot_relative;
+ if ( !pgls->g.polygon_mode ) {
+ hpgl_call(hpgl_draw_current_path(pgls, hpgl_rm_vector));
+ hpgl_call(hpgl_clear_current_path(pgls));
+ }
+ }
+ return hpgl_plot(pargs, pgls,
+ pgls->g.move_or_draw | hpgl_plot_relative);
+}
+
+/* PU (d)x,(d)y...; */
+int
+hpgl_PU(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ pgls->g.move_or_draw = hpgl_plot_move;
+ return hpgl_plot(pargs, pgls,
+ hpgl_plot_move | pgls->g.relative_coords);
+}
+
+/* RT xinter,yinter,xend,yend[,chord]; */
+int
+hpgl_RT(hpgl_args_t *pargs, hpgl_state_t *pgls)
+{
+ hpgl_call(hpgl_arc_3_point(pargs, pgls, true));
+ hpgl_call(hpgl_draw_arc(pgls));
+ return 0;
+}
+
+/* Initialization */
+static int
+pgvector_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t *mem
+)
+{
+ /* Register commands */
+ DEFINE_HPGL_COMMANDS(mem)
+ HPGL_COMMAND('A', 'A',
+ hpgl_AA, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('A', 'R',
+ hpgl_AR, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('A', 'T',
+ hpgl_AT, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('B', 'R',
+ hpgl_BR, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both), /* argument pattern can repeat */
+ HPGL_COMMAND('B', 'Z',
+ hpgl_BZ, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both), /* argument pattern can repeat */
+ HPGL_COMMAND('C', 'I',
+ hpgl_CI, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'A',
+ hpgl_PA, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both), /* argument pattern can repeat */
+ HPGL_COMMAND('P', 'D',
+ hpgl_PD, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both), /* argument pattern can repeat */
+ HPGL_COMMAND('P', 'E',
+ hpgl_PE, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('P', 'R',
+ hpgl_PR, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both), /* argument pattern can repeat */
+ HPGL_COMMAND('P', 'U',
+ hpgl_PU, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both), /* argument pattern can repeat */
+ HPGL_COMMAND('R', 'T',
+ hpgl_RT, hpgl_cdf_polygon|hpgl_cdf_lost_mode_cleared|hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
+}
+const pcl_init_t pgvector_init = {
+ pgvector_do_registration, 0
+};
diff --git a/pcl/rtgmode.c b/pcl/rtgmode.c
new file mode 100644
index 000000000..3285ab6c1
--- /dev/null
+++ b/pcl/rtgmode.c
@@ -0,0 +1,736 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtgmode.c - PCL graphics (raster) mode */
+#include "gx.h"
+#include "math_.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gsrect.h"
+#include "gsstate.h"
+#include "pcstate.h"
+#include "pcpatxfm.h"
+#include "pcpage.h"
+#include "pcindxed.h"
+#include "pcpalet.h"
+#include "pcursor.h"
+#include "pcdraw.h"
+#include "rtraster.h"
+#include "rtrstcmp.h"
+#include "rtgmode.h"
+
+/*
+ * Intersect a rectangle with the positive quadrant.
+ */
+ static void
+intersect_with_positive_quadrant(
+ gs_rect * prect
+)
+{
+ if (prect->p.x < 0.0) {
+ prect->p.x = 0.0;
+ prect->q.x = (prect->q.x < 0.0 ? 0.0 : prect->q.x);
+ }
+ if (prect->p.y < 0.0) {
+ prect->p.y = 0.0;
+ prect->q.y = (prect->q.y < 0.0 ? 0.0 : prect->q.y);
+ }
+}
+
+/*
+ * Get the effective printing region in raster space
+ */
+static void
+get_raster_print_rect( const gs_memory_t *mem,
+ const gs_rect * plp_print_rect,
+ gs_rect * prst_print_rect,
+ const gs_matrix * prst2lp
+ )
+{
+ gs_matrix lp2rst;
+
+ pcl_invert_mtx(prst2lp, &lp2rst);
+ pcl_transform_rect(mem, plp_print_rect, prst_print_rect, &lp2rst);
+ intersect_with_positive_quadrant(prst_print_rect);
+}
+
+/*
+ * Enter raster graphics mode.
+ *
+ * The major function of this routine is to establish the raster to device
+ * space transformations. This is rather involved:
+ *
+ * 1. The first feature to be established is the orientation of raster space
+ * relative to page space. Three state parameters are involved in
+ * determining this orientation: the logical page orientation, the current
+ * print direction, and the raster presentation mode. These are combined
+ * in the following manner:
+ *
+ * tr = (print_direction / 90) + logical_page_orientation
+ *
+ * raster_rotate = (presentation_mode == 0 ? tr : tr & 0x2)
+ *
+ * 2. The next step is to determine the location of the origin of the raster
+ * to page transformation. Intially this origin is set at the appropriate
+ * corner of the logical page, based on the orientation determined above.
+ * The origin is then shift based on the manner in which graphics mode is
+ * entered (the mode operand):
+ *
+ * If entry is IMPLICIT (i.e.: via a transfer data command rather than
+ * an enter graphics mode command), translation by the existing left
+ * graphics margin is used, in the orientation of raster space.
+ *
+ * If entry is via an enter graphics mode command which specifies moving
+ * the origin to the logical page boundary (NO_SCALE_LEFT_MARG (0) or
+ * SCALE_LEFT_MARG (2)), action depends on whether or not horizontal
+ * access of print direction space and of raster space are the same:
+ *
+ * if there are the same, the origin is left unchanged
+ *
+ * if they are not the same, the origin is shifted 1/6" (1200 centi-
+ * points) in the positive horizontal raster space axis.
+ *
+ * The latter correction is not documented by HP, and there is no clear
+ * reason why it should apply, but it has been verified to be the case
+ * for all HP products testd.
+ *
+ * If entry is via an enter graphics mode command with specifies use
+ * of the current point (NO_SCALE_CUR_PT(1) or SCALE_CUR_PT(3)), the
+ * current point is transformed to raster space and its "horizontal"
+ * component is used as the new graphics margin.
+ *
+ * Irrespective of how the "horizontal" component of the raster image origin
+ * is specified, the vertical component is always derived from the current
+ * addressable point, by converting the point to raster space.
+ *
+ * 3. Next, the scale of the raster to page space transformation is established.
+ * This depends on whether or not PCL raster scaling is to be employed.
+ * For raster scaling to be used, all of the following must hold:
+ *
+ * the scale_raster flag in the PCL raster state must be set
+ * the current palette must be writable
+ * the raster source height and width must have been explicitly set
+ *
+ * The scale_raster flag in the PCL raster state is normally set by the
+ * enter raster graphics command. Hence, if graphics mode is entered
+ * explicitly, the first requirement follows the behavior of the HP Color
+ * LaserJet 5/5M. The DeskJet 1600C/CM behaves differently: it will never
+ * user raster scaling if graphics mode is entered implicitly.
+ *
+ * The reason for the second requirement is undoubtedly related to some
+ * backwards compatibility requirement, but is otherwise obscure. The
+ * restriction is, however, both document and uniformly applied by all
+ * HP products that support raster scaling.
+ *
+ * If raster scaling is not used, the scale of raster space is determined
+ * by the ratio of the graphics resolution (set by the graphics resolution
+ * command) and unit of page space (centi-points). This factor is applied
+ * in both scan directions.
+ *
+ * If scaling is employed, the situation is somewhat more complicated. It
+ * is necessary, in this case, to know which of the raster destination
+ * dimensions have been explicitly set:
+ *
+ * If both dimensions are specified, the ration of these dimensions
+ * to the source raster width and height determine the raster scale.
+ *
+ * If only one destination dimension is specified, the ratio of this
+ * dimension to the corresponding source dimension determins the
+ * raster scale for both dimensions; With strange interactions with
+ * the 1200centipoint margin and rotated pages (Bug emulation).
+ *
+ * If neither dimension is specified, the page printable region is
+ * transformed to raster space, the intersection of this with the
+ * positive quadrant is taken. The dimensions of the resulting region
+ * are compared with the dimensions of the source raster. The smaller
+ * of the two dest_dim / src_dim ratios is used as the ratio for
+ * the raster scale in both dimensions (i.e.: select the largest
+ * isotropic scaling that does not cause clipping).
+ *
+ * 4. Finally, the extent of raster space must be determined. This is done by
+ * converting the page printable region to raster space and intersecting
+ * the result with the positive quadrant. This region is used to determine
+ * the useable source raster width and height.
+ *
+ */
+ int
+pcl_enter_graphics_mode(
+ pcl_state_t * pcs,
+ pcl_gmode_entry_t mode
+)
+{
+ floatp scale_x, scale_y;
+ pcl_xfm_state_t * pxfmst = &(pcs->xfm_state);
+ pcl_raster_state_t * prstate = &(pcs->raster_state);
+ float gmargin_cp = (float)prstate->gmargin_cp;
+ gs_point cur_pt;
+ gs_matrix rst2lp, rst2dev, lp2rst;
+ gs_rect print_rect;
+ uint src_wid, src_hgt;
+ int rot;
+ int code = 0;
+ double dwid, dhgt;
+ int clip_x, clip_y;
+ /*
+ * Check if the raster is to be clipped fully; see rtrstst.h for details.
+ * Since this is a discontinuous effect, the equality checks below
+ * should be made while still in centipoints.
+ */
+ prstate->clip_all = ( (pcs->cap.x == pxfmst->pd_size.x) ||
+ (pcs->cap.y == pxfmst->pd_size.y) );
+
+ /* create to raster space to logical page space transformation */
+ rot = pxfmst->lp_orient + pxfmst->print_dir;
+ if (prstate->pres_mode_3)
+ rot &= 0x2;
+ rot = (rot - pxfmst->lp_orient) & 0x3;
+ if (prstate->y_advance == -1)
+ rot = (rot + 2) & 0x3;
+ pcl_make_rotation(rot, pxfmst->lp_size.x, pxfmst->lp_size.y, &rst2lp);
+ pcl_invert_mtx(&rst2lp, &lp2rst);
+
+ /* convert the current point to raster space */
+ cur_pt.x = (double)pcs->cap.x;
+ cur_pt.y = (double)pcs->cap.y;
+ pcl_xfm_to_logical_page_space(pcs, &cur_pt);
+ gs_point_transform(cur_pt.x, cur_pt.y, &lp2rst, &cur_pt);
+
+ /* translate the origin of the forward transformation */
+ if (((int)mode & 0x1) != 0)
+ gmargin_cp = cur_pt.x;
+ gs_matrix_translate(&rst2lp, gmargin_cp, cur_pt.y, &rst2lp);
+ prstate->gmargin_cp = gmargin_cp;
+
+ /* isotropic scaling with missing parameter is based on clipped raster dimensions */
+
+ /* transform the clipping window to raster space */
+ get_raster_print_rect(pcs->memory, &(pxfmst->lp_print_rect), &print_rect, &rst2lp);
+ dwid = print_rect.q.x - print_rect.p.x;
+ dhgt = print_rect.q.y - print_rect.p.y;
+
+ clip_x = pxfmst->lp_print_rect.p.x; /* if neg then: */
+ clip_y = pxfmst->lp_print_rect.p.y; /* = 1200centipoints */
+
+ /* set the matrix scale */
+ if ( !prstate->scale_raster ||
+ !prstate->src_width_set ||
+ !prstate->src_height_set ||
+ (pcs->ppalet->pindexed->pfixed && mode == IMPLICIT) ) {
+ scale_x = 7200.0 / (floatp)prstate->resolution;
+ scale_y = scale_x;
+
+ } else if (prstate->dest_width_set) {
+ scale_x = (floatp)prstate->dest_width_cp / (floatp)prstate->src_width;
+
+ if ( clip_x < 0 && pxfmst->lp_orient == 3 ) {
+ scale_y = (floatp)(prstate->dest_width_cp - clip_y ) / (floatp)prstate->src_width;
+ if ( rot == 2 && scale_y <= 2* prstate->src_width) /* empirical test 1 */
+ scale_y = scale_x;
+ }
+ else if ( clip_x < 0 && pxfmst->lp_orient == 1 && rot == 3 ) {
+ scale_y = (floatp)(prstate->dest_width_cp - clip_y) / (floatp)prstate->src_width;
+
+ if ( prstate->dest_width_cp <= 7200 ) /* empirical test 2 */
+ scale_y = (floatp)(prstate->dest_width_cp + clip_y) / (floatp)prstate->src_width;
+ }
+ else
+ scale_y = scale_x;
+
+ if (prstate->dest_height_set)
+ scale_y = (floatp)prstate->dest_height_cp / (floatp)prstate->src_height;
+
+ } else if (prstate->dest_height_set) {
+ scale_x = scale_y = (floatp)prstate->dest_height_cp / (floatp)prstate->src_height;
+ } else {
+
+ /* select isotropic scaling with no clipping */
+ scale_x = (floatp)dwid / (floatp)prstate->src_width;
+ scale_y = (floatp)dhgt / (floatp)prstate->src_height;
+ if (scale_x > scale_y)
+ scale_x = scale_y;
+ else
+ scale_y = scale_x;
+ }
+
+ gs_matrix_scale(&rst2lp, scale_x, scale_y, &rst2lp);
+ gs_matrix_multiply(&rst2lp, &(pxfmst->lp2dev_mtx), &rst2dev);
+
+ rst2dev.tx = (double)((int)(rst2dev.tx + 0.5));
+ rst2dev.ty = (double)((int)(rst2dev.ty + 0.5));
+ /*
+ * Set up the graphic stat for rasters. This turns out to be more difficult
+ * than might first be imagined.
+ *
+ * One problem is that two halftones may be needed simultaneously:
+ *
+ * the foreground CRD and halftone, in case the current "texture" is a
+ * a solid color or an uncolored pattern
+ *
+ * the palette CRD and halftone, to be used in rendering the raster
+ * itself
+ *
+ * Since the graphic state can only hold one CRD and one halftone method
+ * at a time, this presents a bit of a problem.
+ *
+ * To get around the problem, an extra graphic state is necessary. Patterns
+ * in the graphic library are given their own graphic state. Hence, by
+ * replacing a solid color with an uncolored pattern that takes the
+ * foreground value everywhere, the desired effect can be achieved. Code
+ * in pcpatrn.c handles these matters.
+ *
+ * The second problem is a limitation in the graphic library's support of
+ * CIE color spaces. These spaces require a joint cache, which is only
+ * created when the color space is installed in the graphic state. However,
+ * the current color space at the time a raster is rendered may need to
+ * be a pattern color space, so that the proper interaction between the
+ * raster and the texture generated by the pattern. To work around this
+ * problem, we install the raster's color space in the current graphic
+ * state, perform a gsave, then place what may be a patterned color space
+ * in the new graphic state.
+ */
+ pcl_set_graphics_state(pcs);
+ pcl_set_drawing_color(pcs, pcl_pattern_raster_cspace, 0, true);
+ pcl_gsave(pcs);
+ pcl_set_drawing_color(pcs, pcs->pattern_type, pcs->current_pattern_id, true);
+ gs_setmatrix(pcs->pgs, &rst2dev);
+
+ /* translate the origin of the forward transformation */
+ /* tansform the clipping window to raster space; udpate source dimensions */
+ get_raster_print_rect(pcs->memory, &(pxfmst->lp_print_rect), &print_rect, &rst2lp);
+
+ /* min size is 1 pixel */
+ src_wid = max(1, (uint)(floor(print_rect.q.x) - floor(print_rect.p.x)));
+ src_hgt = max(1, (uint)(floor(print_rect.q.y) - floor(print_rect.p.y)));
+ if (prstate->src_width_set && (src_wid > prstate->src_width))
+ src_wid = prstate->src_width;
+ if (prstate->src_height_set && (src_hgt > prstate->src_height))
+ src_hgt = prstate->src_height;
+
+ if (src_wid <= 0 || src_hgt <= 0) {
+ pcl_grestore(pcs);
+ return 1; /* hack, we want to return a non critical warning */
+ }
+ /* determine (conservatively) if the region of interest has been
+ marked */
+ pcs->page_marked = true;
+ if ((code = pcl_start_raster(src_wid, src_hgt, pcs)) >= 0)
+ prstate->graphics_mode = true;
+ else
+ pcl_grestore(pcs);
+ return code;
+}
+
+/*
+ * End (raster) graphics mode. This may be called explicitly by either of the
+ * end graphics mode commands (<esc>*rB or <esc>*rC), or implicitly by any
+ * commmand which is neither legal nor ignored in graphics mode.
+ */
+ int
+pcl_end_graphics_mode(
+ pcl_state_t * pcs
+)
+{
+ gs_point cur_pt;
+ gs_matrix dev2pd;
+
+ /* close the raster; exit graphics mode */
+ pcl_complete_raster(pcs);
+ pcs->raster_state.graphics_mode = false;
+
+ /* get the new current point; then restore the graphic state */
+ gs_transform(pcs->pgs, 0.0, 0.0, &cur_pt);
+ pcl_grestore(pcs);
+
+ /* transform the new point back to "pseudo print direction" space */
+ pcl_invert_mtx(&(pcs->xfm_state.pd2dev_mtx), &dev2pd);
+ gs_point_transform(cur_pt.x, cur_pt.y, &dev2pd, &cur_pt);
+ pcl_set_cap_x(pcs, (coord)(cur_pt.x + 0.5), false, false);
+ return pcl_set_cap_y( pcs,
+ (coord)(cur_pt.y + 0.5) - pcs->margins.top,
+ false,
+ false,
+ false,
+ false
+ );
+}
+
+
+/*
+ * ESC * t # R
+ *
+ * Set raster graphics resolution.
+ * The value provided will be rounded up to the nearest legal value or down to 600dpi.
+ * 75 100 150 200 300 600 are legal; 120 and 85.7143 are multiples of 75 but not legal.
+ */
+ static int
+set_graphics_resolution(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint res = arg_is_present(pargs) ? uint_arg(pargs) : 75;
+ uint qi = 600 / res;
+
+
+ /* HP does not allow 120 dpi or 85.7 dpi as a resolution */
+ qi = (qi == 0 ? 1 : (qi > 8 ? 8 : (qi == 7 ? 6 : (qi == 5 ? 4 : qi))));
+
+ /* ignore if already in graphics mode */
+ if (!pcs->raster_state.graphics_mode)
+ pcs->raster_state.resolution = 600 / qi;
+
+ return 0;
+}
+
+/*
+ * ESC * r # F
+ *
+ * Set raster graphics presentation mode.
+ *
+ * This command is ignored if values other than 0 and 3 are provided, ignoring
+ * any sign. The command is also ignored inside graphics mode.
+ */
+ static int
+set_graphics_presentation_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint mode = uint_arg(pargs);
+
+ if (!pcs->raster_state.graphics_mode) {
+ if (mode == 3)
+ pcs->raster_state.pres_mode_3 = 1;
+ else if (mode == 0)
+ pcs->raster_state.pres_mode_3 = 0;
+ }
+
+ return 0;
+}
+
+/*
+ * ESC * r # S
+ *
+ * Set raster width. Note that the useable width may be less due to clipping.
+ * This implementation ignores the sign of the dimension, which matches the
+ * behavior of the HP Color LaserJet 5/5M. The behavior of the of the DeskJet
+ * 1600C/CM differs: it ignores the command if a negative operand is provided.
+ *
+ * This command is ignored in graphics mode.
+ */
+ static int
+set_src_raster_width(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if (!pcs->raster_state.graphics_mode) {
+ pcs->raster_state.src_width = uint_arg(pargs);
+ pcs->raster_state.src_width_set = true;
+ }
+ return 0;
+}
+
+/*
+ * ESC * r # t
+ *
+ * Set raster height. Note that the useable height may be less due to clipping.
+ * This implementation ignores the sign of the dimension, which matches the
+ * behavior of the HP Color LaserJet 5/5M. The behavior of the of the DeskJet
+ * 1600C/CM differs: it ignores the command if a negative operand is provided.
+ *
+ * This command is ignored in graphics mode.
+ */
+ static int
+set_src_raster_height(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if (!pcs->raster_state.graphics_mode) {
+ pcs->raster_state.src_height = uint_arg(pargs);
+ pcs->raster_state.src_height_set = true;
+ }
+ return 0;
+}
+
+/*
+ * ESC * b # M
+ *
+ * Set compresson method.
+ *
+ * This command is unique among PCL commands in that it is interpreted both
+ * inside and outside of graphics mode, and its execution neither starts nor
+ * ends graphic mode.
+ *
+ * It is not possible to use adaptive compression (mode 5) with mutliple plane
+ * pixel encodings, but it is not possible to check for a conflict at this
+ * point as the pixel encoding may be changed before any raster data is
+ * transfered. Hence, the transfer raster data command must perform the required
+ * check.
+ */
+ static int
+set_compression_method(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint mode = uint_arg(pargs);
+
+ if ( (mode < count_of(pcl_decomp_proc)) &&
+ ((pcl_decomp_proc[mode] != 0) || (mode == (uint)ADAPTIVE_COMPRESS)) )
+ pcs->raster_state.compression_mode = mode;
+ return 0;
+}
+
+/*
+ * ESC * t # H
+ *
+ * Set destination raster width, in decipoints. This implementation follows that
+ * of the HP Color LaserJet 5/5M in that it ignores the sign of the operand; the
+ * DeskJet 1600 C/CM has different behavior. Note that the stored value is in
+ * centi-points, while the operand is in deci-points.
+ *
+ * Though it is not noted in the "PCL 5 Color Technical Reference Manual", this
+ * command is ignored in graphics mode.
+ */
+ static int
+set_dest_raster_width(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if (!pcs->raster_state.graphics_mode) {
+ if ( arg_is_present(pargs) ) {
+ uint dw = 10 * fabs(float_arg(pargs));
+
+ pcs->raster_state.dest_width_cp = dw;
+ pcs->raster_state.dest_width_set = (dw != 0);
+ }
+ else
+ pcs->raster_state.dest_width_set = false;
+ }
+ return 0;
+}
+
+/*
+ * ESC * t # V
+ *
+ * Set destination raster height, in decipoints. This implementation follows that
+ * of the HP Color LaserJet 5/5M in that it ignores the sign of the operand; the
+ * DeskJet 1600 C/CM has different behavior. Note that the stored value is in
+ * centi-points, while the operand is in deci-points.
+ *
+ * Though it is not noted in the "PCL 5 Color Technical Reference Manual", this
+ * command is ignored in graphics mode.
+ */
+ static int
+set_dest_raster_height(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if (!pcs->raster_state.graphics_mode) {
+ if ( arg_is_present(pargs) ) {
+ uint dh = 10 * fabs(float_arg(pargs));
+
+ pcs->raster_state.dest_height_cp = dh;
+ pcs->raster_state.dest_height_set = (dh != 0);
+ }
+ else
+ pcs->raster_state.dest_height_set = false;
+ }
+ return 0;
+}
+
+/*
+ * ESC * r # A
+ *
+ * Start raster graphics mode.
+ *
+ * See the commment ahead of the procedure pcl_enter_graphics mode above for
+ * a discussion of the rather curios manner in which the left raster graphics
+ * margin is set below.
+ */
+ static int
+start_graphics_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcl_gmode_entry_t mode = (pcl_gmode_entry_t)uint_arg(pargs);
+ pcl_raster_state_t * prstate = &(pcs->raster_state);
+
+ if (mode > SCALE_CUR_PTR)
+ mode = NO_SCALE_LEFT_MARG;
+ if (!prstate->graphics_mode) {
+ int r90 = (pcs->xfm_state.lp_orient + pcs->xfm_state.print_dir) & 0x1;
+
+ prstate->scale_raster = ((((int)mode) & 0x2) != 0);
+ prstate->gmargin_cp = 0;
+ if (prstate->pres_mode_3 && (r90 != 0))
+ prstate->gmargin_cp += inch2coord(1.0 / 6.0);
+ pcl_enter_graphics_mode(pcs, mode);
+ }
+ return 0;
+}
+
+/*
+ * ESC * r # B
+ *
+ * End raster graphics mode - old style.
+ */
+ static int
+end_graphics_mode_B(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if (pcs->raster_state.graphics_mode)
+ pcl_end_graphics_mode(pcs);
+ return 0;
+}
+
+/*
+ * ESC * r # C
+ *
+ * End raster graphics mode - new style. This resets the compression mode and
+ * the left grahics margin, in addition to ending graphics mode.
+ */
+ static int
+end_graphics_mode_C(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ if (pcs->raster_state.graphics_mode)
+ pcl_end_graphics_mode(pcs);
+ pcs->raster_state.gmargin_cp = 0L;
+ pcs->raster_state.compression_mode = 0;
+ return 0;
+}
+
+
+/*
+ * Initialization
+ */
+ static int
+gmode_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem /* ignored */
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 't', 'R',
+ PCL_COMMAND( "Raster Graphics Resolution",
+ set_graphics_resolution,
+ pca_raster_graphics | pca_neg_ok | pca_big_clamp | pca_in_rtl
+ )
+ },
+ {
+ 'r', 'F',
+ PCL_COMMAND( "Raster Graphics Presentation Mode",
+ set_graphics_presentation_mode,
+ pca_raster_graphics | pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'r', 'S',
+ PCL_COMMAND( "Source Raster Width",
+ set_src_raster_width,
+ pca_raster_graphics | pca_neg_ok | pca_big_clamp | pca_in_rtl
+ )
+ },
+ {
+ 'r', 'T',
+ PCL_COMMAND( "Source Raster_Height",
+ set_src_raster_height,
+ pca_raster_graphics | pca_neg_ok | pca_big_clamp | pca_in_rtl
+ )
+ },
+ {
+ 'b', 'M',
+ PCL_COMMAND( "Set Compresion Method",
+ set_compression_method,
+ pca_raster_graphics | pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 't', 'H',
+ PCL_COMMAND( "Destination Raster Width",
+ set_dest_raster_width,
+ pca_raster_graphics | pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 't', 'V',
+ PCL_COMMAND( "Destination Raster Height",
+ set_dest_raster_height,
+ pca_raster_graphics | pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ {
+ 'r', 'A',
+ PCL_COMMAND( "Start Raster Graphics",
+ start_graphics_mode,
+ pca_raster_graphics | pca_neg_ok | pca_big_clamp | pca_in_rtl
+ )
+ },
+ {
+ 'r', 'B',
+ PCL_COMMAND( "End Raster Graphics (Old)",
+ end_graphics_mode_B,
+ pca_raster_graphics | pca_neg_ok | pca_big_ok | pca_in_rtl
+ )
+ },
+ {
+ 'r', 'C',
+ PCL_COMMAND( "End Raster Graphics (New)",
+ end_graphics_mode_C,
+ pca_raster_graphics | pca_neg_ok | pca_big_ok | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+ static void
+gmode_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_printer
+ | pcl_reset_overlay );
+
+ if ((type & mask) != 0) {
+ pcl_raster_state_t * prstate = &(pcs->raster_state);
+
+ prstate->gmargin_cp = 0L;
+ prstate->resolution = 75;
+ prstate->pres_mode_3 = true;
+ prstate->scale_raster = false;
+ prstate->src_width_set = false;
+ prstate->src_height_set = false;
+ prstate->dest_width_set = false;
+ prstate->dest_height_set = false;
+ prstate->scale_algorithm = 0;
+ prstate->graphics_mode = false;
+ prstate->compression_mode = NO_COMPRESS;
+ prstate->y_advance = 1;
+ }
+}
+
+const pcl_init_t rtgmode_init = { gmode_do_registration, gmode_do_reset, 0 };
diff --git a/pcl/rtgmode.h b/pcl/rtgmode.h
new file mode 100644
index 000000000..eb2b21013
--- /dev/null
+++ b/pcl/rtgmode.h
@@ -0,0 +1,48 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtgmode.h - interface to PCL graphics (raster) mode */
+
+#ifndef rtgmode_INCLUDED
+#define rtgmode_INCLUDED
+
+#include "rtrstst.h"
+#include "pcstate.h"
+#include "pcommand.h"
+
+/*
+ * Types of entry into graphics mode. Note that implicit entry is distinct
+ * from any of the explicit modes.
+ */
+typedef enum {
+ NO_SCALE_LEFT_MARG = 0,
+ NO_SCALE_CUR_PT = 1,
+ SCALE_LEFT_MARG = 2,
+ SCALE_CUR_PTR = 3,
+ IMPLICIT = 100
+} pcl_gmode_entry_t;
+
+
+/* enter raster graphics mode */
+int pcl_enter_graphics_mode(
+ pcl_state_t * pcs,
+ pcl_gmode_entry_t mode
+);
+
+/* exit raster graphics mode */
+int pcl_end_graphics_mode(pcl_state_t * pcs);
+
+extern const pcl_init_t rtgmode_init;
+extern const pcl_init_t rtlrastr_init;
+
+#endif /* rtgmode_INCLUDED */
diff --git a/pcl/rtmisc.c b/pcl/rtmisc.c
new file mode 100644
index 000000000..acf21d6ca
--- /dev/null
+++ b/pcl/rtmisc.c
@@ -0,0 +1,254 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtmisc.c - Miscellanous HP RTL commands */
+/* the order of these includes are jumbled because of dependencies */
+#include "math_.h"
+#include "pgmand.h"
+#include "pgdraw.h" /* for hpgl_add_pcl_point_to_path() */
+#include "pgmisc.h" /* for hpgl_call */
+#include "gsmemory.h"
+#include "gsrop.h"
+#include "gscoord.h"
+#include "pcpatxfm.h"
+#include "pcpage.h"
+#include "pcdraw.h"
+
+/* ---------------- Chapter 4 ---------------- */
+
+/* Import the table of pointers to initialization data. */
+extern const pcl_init_t * pcl_init_table[];
+
+/* ---------------- Chapter 18 ---------------- */
+
+/*
+ * ESC % <enum> B
+ */
+ static int
+rtl_enter_hpgl_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int i = int_arg(pargs);
+
+ /* Note: -1..3 for PCL5c, 0..1 for PCL5 */
+ if (i < 0)
+ i = -1;
+ else if (i > 3)
+ return 0;
+ hpgl_call_mem(pcs->memory, hpgl_clear_current_path(pcs));
+ pcs->parse_other = ( int (*)( void *,
+ pcl_state_t *,
+ stream_cursor_read *
+ ) ) hpgl_process;
+
+ /* add the pcl cap to hpgl/2's path */
+ if (i == 1) {
+ gs_point pcl_pt;
+
+ pcl_pt.x = (hpgl_real_t)pcs->cap.x;
+ pcl_pt.y = (hpgl_real_t)pcs->cap.y;
+ hpgl_add_pcl_point_to_path(pcs, &pcl_pt);
+ hpgl_update_carriage_return_pos(pcs);
+ }
+ hpgl_call_mem(pcs->memory, hpgl_set_ctm(pcs));
+ return 0;
+}
+
+/*
+ * We export this so we can call it from HP-GL/2 configurations.
+ * Note that it returns 1 iff it changed the PCL CAP.
+ *
+ * ESC % <enum> A
+ */
+ int
+rtl_enter_pcl_mode(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int b = int_arg(pargs) & 1;
+
+ if ( pcs->parse_other ==
+ (int(*)(void *, pcl_state_t *, stream_cursor_read *))hpgl_process ) {
+ /*
+ * We were in HP-GL/2 mode. Destroy the gl/2 polygon path
+ * and conditionally copy back the cursor position.
+ */
+ if (b != 0) {
+ /* the usual user -> device -> user dance. */
+ gs_point pt, dev_pt;
+
+ hpgl_call_mem(pcs->memory, hpgl_set_ctm(pcs));
+ hpgl_call_mem(pcs->memory, hpgl_get_current_position(pcs, &pt));
+ hpgl_call_mem(pcs->memory, gs_transform(pcs->pgs, pt.x, pt.y, &dev_pt));
+ hpgl_call_mem(pcs->memory, pcl_set_ctm(pcs, true));
+ hpgl_call_mem(pcs->memory, gs_itransform(pcs->pgs, dev_pt.x, dev_pt.y, &pt));
+
+ /* HPGL/2 uses floats for coordinates */
+#define round(x) (((x) < 0.0) ? (ceil ((x) - 0.5)) : (floor ((x) + 0.5)))
+ pcs->cap.x = round(pt.x);
+ pcs->cap.y = round(pt.y);
+#undef round
+ }
+ } else
+ b = 0;
+
+ pcs->parse_other = 0;
+ return b; /* not 0, see comment above */
+}
+
+/* ---------------- Comparison Guide ---------------- */
+
+/* (From PCL5 Comparison Guide, p. 1-30 & 1-92) */
+
+/*
+ * ESC & b <count> W
+ */
+ static int
+pcl_appletalk_configuration(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ const byte * data = arg_data(pargs);
+ uint count = uint_arg(pargs);
+ uint i;
+
+ if ((count < 2) || (data[0] == ' '))
+ return e_Range;
+
+ /* split the string at the first space */
+ for (i = 1; data[i] != ' '; ++i) {
+ if (i == count - 1)
+ return e_Range;
+ }
+ if (pcs->configure_appletalk == 0)
+ return 0;
+ return (*pcs->configure_appletalk)(data, i, data + i + 1, count - (i + 1));
+}
+
+/* (From PCL5 Comparison Guide, p. 1-100) */
+
+/*
+ * ESC & a <bool> N
+ */
+ static int
+pcl_negative_motion(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ int motion = int_arg(pargs);
+
+ if (motion > 1)
+ return e_Range;
+
+ /* Currently we can't take any advantage of this.... */
+ return 0;
+}
+
+/* ---------------- Initialization ---------------- */
+ static int
+rtmisc_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * mem
+)
+{
+ /* Register commands */
+ /* Chapter 4 */
+ DEFINE_CLASS('%')
+ /* Chapter 18 */
+ {
+ 0, 'B',
+ PCL_COMMAND( "Enter HP-GL/2 Mode",
+ rtl_enter_hpgl_mode,
+ pca_neg_ok | pca_big_ok | pca_in_rtl
+ )
+ },
+ {
+ 0, 'A',
+ PCL_COMMAND( "Enter PCL Mode",
+ rtl_enter_pcl_mode,
+ pca_neg_ok | pca_big_ok | pca_in_rtl
+ )
+ },
+ END_CLASS
+
+ /* Comparison Guide */
+ DEFINE_CLASS('&')
+ {
+ 'b', 'W',
+ PCL_COMMAND( "Appletalk Configuration",
+ pcl_appletalk_configuration,
+ pca_bytes
+ )
+ },
+ {
+ 'a', 'N',
+ PCL_COMMAND( "Negative Motion",
+ pcl_negative_motion,
+ pca_neg_error | pca_big_error
+ )
+ },
+ END_CLASS
+
+ return 0;
+}
+
+/*
+ * The default for printer name should be set by the output device, but
+ * we will ignore that for now.
+ *
+ * Note that printer and device names are NOT reset by a pcl_reset_printer
+ * (ESC E); if they were, AppleTalk network communication would be in
+ * serious trouble. In fact, these parameters are normally stored in NVRAM,
+ * so they should not even be reset for pcl_reset_initial. Hence, we have
+ * consigned them to the currently unused pcl_reset_cold category
+ *
+ * The value of the device type field is as specified by the PCL 5 Comparison
+ * Guide (October, 1996 ed.), but it is not clear this is the correct value
+ * for a color device. This field is generally used to select a driver on
+ * the host system, and it is not clear an "HP LaserJet 4" device will
+ * generate color output (this may vary from host to host).
+ */
+ static void
+rtmisc_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ static const uint mask = ( pcl_reset_initial
+ | pcl_reset_cold
+ | pcl_reset_printer );
+
+ if (pcs->configure_appletalk == 0)
+ return;
+
+ if ((type & mask) != 0)
+ pcs->configure_appletalk("JOB", 3, "", 0);
+ if ((type & pcl_reset_cold) != 0) {
+ static const byte prntr_name[] = "HP Color LaserJet 5M";
+ static const byte dev_type[] = "HP LaserJet 4";
+
+ pcs->configure_appletalk( "RENAME",
+ 6,
+ prntr_name,
+ sizeof(prntr_name) - 1
+ );
+ pcs->configure_appletalk("TYPE", 4, dev_type, sizeof(dev_type) - 1);
+ }
+}
+
+const pcl_init_t rtmisc_init = { rtmisc_do_registration, rtmisc_do_reset, 0 };
diff --git a/pcl/rtraster.c b/pcl/rtraster.c
new file mode 100644
index 000000000..20c0a2d91
--- /dev/null
+++ b/pcl/rtraster.c
@@ -0,0 +1,1431 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtraster.c - raster transfer commands */
+
+#include "memory_.h"
+#include "gx.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsimage.h"
+#include "gsiparam.h"
+#include "gsiparm4.h"
+#include "gsdevice.h"
+#include "gsrop.h"
+#include "pcstate.h"
+#include "pcpalet.h"
+#include "pcpage.h"
+#include "pcindxed.h"
+#include "pcwhtidx.h"
+#include "pcdraw.h"
+#include "rtgmode.h"
+#include "rtrstcmp.h"
+#include "rtraster.h"
+
+/*
+ * The maximum number of planes for which seed rows need to be kept. This is the
+ * larger of the maximum number of bits per index (for pixel encoding mode 0 -
+ * indexed by plane) or maximum of the sum over the primaries of the number of
+ * bits per primary for pixel encoding mode 2 (direct by plane). For all
+ * current PCL printers, the effective bound is the the former, and is 8.
+ */
+#define MAX_PLANES 8
+
+/*
+ * Structure to describe a PCL raster
+ */
+typedef struct pcl_raster_s {
+
+ /* memory used to allocate this structure */
+ gs_memory_t * pmem;
+
+ byte nplanes; /* # of planes (seed rows) */
+ byte bits_per_plane; /* bits per plane */
+ byte nsrcs; /* # of data sources, 1 or 3 */
+
+ uint transparent:1; /* 1 ==> source transparency */
+ uint src_height_set:1; /* source height was set */
+ uint indexed:1; /* != 0 ==> indexed color space */
+ uint zero_is_white:1; /* all planes 0 ==> white */
+ uint zero_is_black:1; /* all planes 0 ==> solid color */
+
+ int wht_indx; /* white index, for indexed color
+ space only */
+ const void * remap_ary; /* remap array, if needed */
+
+ pcl_state_t * pcs; /* to avoid n extra operand */
+ pcl_cs_indexed_t * pindexed; /* color space */
+
+ gs_image_enum * pen; /* image enumerator */
+ uint16 plane_index; /* next plane to be received */
+ uint16 rows_rendered; /* # of source rows rendered */
+ uint16 src_width; /* usable raster width */
+ uint16 src_height; /* remaining usable raster height */
+
+ /* objects required for opaque source/transparent pattern case */
+ gs_image_enum * mask_pen; /* enumerator for mask */
+ pcl_cs_indexed_t * mask_pindexed; /* special color space for mask */
+ ulong white_val; /* value interpreted as white */
+ void (*gen_mask_row)( struct pcl_raster_s * prast );
+
+ /* buffers */
+ pcl_seed_row_t * pseed_rows; /* seed rows, one per plane */
+ byte * cons_buff; /* consolidation buffer */
+ byte * mask_buff; /* buffer for mask row, if needed */
+
+} pcl_raster_t;
+
+/* GC routines */
+private_st_seed_row_t();
+private_st_seed_row_t_element();
+
+gs_private_st_ptrs2( st_raster_t,
+ pcl_raster_t,
+ "PCL raster object",
+ raster_enum_ptrs,
+ raster_reloc_ptrs,
+ pseed_rows,
+ cons_buff
+ );
+
+/* forward declaration */
+static int process_zero_rows( gs_state * pgs, pcl_raster_t * prast, int nrows );
+
+
+/*
+ * Clear the consolidation buffer, allocating it if it does not already
+ * exist.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+clear_cons_buff(
+ pcl_raster_t * prast
+)
+{
+ byte * pcons = prast->cons_buff;
+ int npixels = prast->src_width;
+
+ if (pcons == 0) {
+ pcons = gs_alloc_bytes( prast->pmem,
+ npixels,
+ "PCL raster consolidation buff"
+ );
+ if (pcons == 0)
+ return e_Memory;
+ prast->cons_buff = pcons;
+ }
+ memset(pcons, 0, npixels);
+
+ return 0;
+}
+
+/*
+ * Clear the mask buffer, allocating it if it does not exist.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+clear_mask_buff(
+ pcl_raster_t * prast
+)
+{
+ byte * pmask = prast->mask_buff;
+ int nbytes = (prast->src_width + 7) / 8;
+
+ if (pmask == 0) {
+ pmask = gs_alloc_bytes( prast->pmem,
+ nbytes,
+ "PCL raster mask buffer"
+ );
+ if (pmask == 0)
+ return e_Memory;
+ prast->mask_buff = pmask;
+ }
+ memset(pmask, 0, nbytes);
+
+ return 0;
+
+}
+
+/*
+ * Generate a mask row in case there are multiple data sources (in the graphic
+ * library sense). This code takes much advantage of the knowledge that the
+ * mutliple source case is always direct and one bit per pixel.
+ */
+ static void
+gen_mask_multisrc(
+ pcl_raster_t * prast
+)
+{
+ byte * ip0 = prast->pseed_rows[0].pdata;
+ byte * ip1 = prast->pseed_rows[1].pdata;
+ byte * ip2 = prast->pseed_rows[2].pdata;
+ byte * op = prast->mask_buff;
+ uint m0 = (prast->white_val >> 16) & 0xff;
+ uint m1 = (prast->white_val >> 8) & 0xff;
+ uint m2 = prast->white_val & 0xff;
+ int nbytes = prast->pseed_rows[0].size;
+ int i;
+
+ for (i = 0; i < nbytes; i++)
+ *op++ = (*ip0++ ^ m0) & (*ip1++ ^ m1) & (*ip2++ ^ m2);
+}
+
+/*
+ * Generate a mask from input data that is less than one byte. For PCL rasters
+ * as implemented by this routine, such situations only occur when an integral
+ * number of pixels fit within one byte, and this routine takes advantage of
+ * that situation.
+ */
+ static void
+gen_mask_subbyte(
+ pcl_raster_t * prast
+)
+{
+ byte * ip = prast->pseed_rows[0].pdata;
+ byte * op = prast->mask_buff;
+ int ishift = prast->bits_per_plane;
+ uint targ = prast->white_val;
+ int size = prast->src_width;
+ uint ival, oval, imask, omask;
+ int i;
+
+ for (i = 0, ival = 0, oval = 0, imask = 0, omask = 0x80; i < size; i++) {
+ if ((imask >>= ishift) == 0) {
+ imask = 0xff - (0xff >> ishift);
+ ival = *ip++;
+ }
+ if (((ival ^ targ) & imask) == 0)
+ oval |= omask;
+ if ((omask >>= 1) == 0) {
+ *op++ = oval;
+ omask = 0x80;
+ oval = 0;
+ }
+ }
+ if (omask != 0x80)
+ *op++ = oval;
+}
+
+/*
+ * Generate a mask from input data that has one byte per pixel.
+ */
+ static void
+gen_mask_1byte(
+ pcl_raster_t * prast
+)
+{
+ byte * ip = (prast->nplanes == 1 ? prast->pseed_rows[0].pdata
+ : prast->cons_buff);
+ byte * op = prast->mask_buff;
+ uint targ = prast->white_val;
+ int size = prast->src_width;
+ uint oval, omask;
+ int i;
+
+ for (i = 0, oval = 0, omask = 0x80; i < size; i++) {
+ if (*ip++ == targ)
+ oval |= omask;
+ if ((omask >>= 1) == 0) {
+ *op++ = oval;
+ omask = 0x80;
+ oval = 0;
+ }
+ }
+ if (omask != 0x80)
+ *op++ = oval;
+}
+
+/*
+ * Generate a mask row in the case that more than one byte is required per
+ * pixel. The only possible such case in PCL is 8-bits per primary 3 color,
+ * so this routine handles only that case.
+ */
+ void
+gen_mask_multibyte(
+ pcl_raster_t * prast
+)
+{
+ byte * ip = prast->pseed_rows[0].pdata;
+ byte * op = prast->mask_buff;
+ int size = prast->src_width;
+ ulong targ = prast->white_val;
+ uint oval, omask;
+ int i;
+
+ for (i = 0, oval = 0, omask = 0x80; i < size; i++, ip += 3) {
+ ulong ival = (((ulong)ip[0]) << 16) | (((ulong)ip[1]) << 8) | ip[2];
+
+ if (ival == targ)
+ oval |= omask;
+ if ((omask >>= 1) == 0) {
+ *op++ = oval;
+ omask = 0x80;
+ oval = 0;
+ }
+ }
+ if (omask != 0x80)
+ *op++ = oval;
+}
+
+/*
+ * Consolidate a set of seed rows into the consolidated row buffer.
+ *
+ * This routine will only be called if:
+ *
+ * prast->nplanes > 1
+ * prast->bits_per_plane = 1
+ * prast->nsrcs = 1
+ *
+ * The output is always packed 8 bits per pixel, even if ferwer are required.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+consolidate_row(
+ pcl_raster_t * prast
+)
+{
+ byte * pcons;
+ uint nplanes = prast->nplanes;
+ uint npixels = prast->src_width;
+ int code, i;
+
+ /* clear the consolidation buffer */
+ if ((code = clear_cons_buff(prast)) < 0)
+ return code;
+ pcons = prast->cons_buff;
+
+ /* for each plane, "or" in the appropriate bit */
+ for (i = 0; i < nplanes; i++) {
+ if (!prast->pseed_rows[i].is_blank) {
+ const byte * ip = prast->pseed_rows[i].pdata;
+ byte * op = pcons;
+ int cnt = npixels;
+
+ for (; cnt >= 8; ip++, op += 8, cnt -= 8) {
+ uint val = *ip;
+
+ /*
+ * cons_buff was allocated with gs_alloc_bytes, so we know
+ * it is aligned for (at least) bits32 access.
+ */
+#if ARCH_IS_BIG_ENDIAN
+ static const bits32 spread[16] = {
+ 0x00000000, 0x00000001, 0x00000100, 0x00000101,
+ 0x00010000, 0x00010001, 0x00010100, 0x00010101,
+ 0x01000000, 0x01000001, 0x01000100, 0x01000101,
+ 0x01010000, 0x01010001, 0x01010100, 0x01010101
+ };
+#else
+ static const bits32 spread[16] = {
+ 0x00000000, 0x01000000, 0x00010000, 0x01010000,
+ 0x00000100, 0x01000100, 0x00010100, 0x01010100,
+ 0x00000001, 0x01000001, 0x00010001, 0x01010001,
+ 0x00000101, 0x01000101, 0x00010101, 0x01010101
+ };
+#endif
+ ((bits32 *)op)[0] |= spread[val >> 4] << i;
+ ((bits32 *)op)[1] |= spread[val & 0xf] << i;
+ }
+ if (cnt) {
+ uint ishift = 7;
+ uint val = *ip;
+
+ do {
+ *op++ |= ((val >> ishift--) & 0x1) << i;
+ } while (--cnt > 0);
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Create an enumerator for the mask portion of an image (if required).
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+create_mask_enumerator(
+ pcl_raster_t * prast
+)
+{
+ int transparent = prast->transparent;
+ /*
+ * Most elements of gs_image1_t and gs_image4_t are identical. The only exception
+ * that we care about is MaskColor in gs_image_type4_t.
+ */
+ union {
+ gs_image1_t i1;
+ gs_image4_t i4;
+ } image;
+ gs_image_enum * pen = gs_image_enum_alloc( prast->pmem,
+ "Create image for PCL raster" );
+ int code = 0;
+ const byte * pcolor = 0;
+ gx_image_enum_common_t * pie = 0;
+ pcl_state_t * pcs = prast->pcs;
+
+ if (pen == 0)
+ return e_Memory;
+
+ pcl_set_drawing_color(pcs, pcl_pattern_solid_white, 0, true);
+
+ /* generate the special two entry indexed color space required */
+ if (prast->indexed)
+ pcolor = prast->pindexed->palette.data + 3 * prast->wht_indx;
+ else {
+ static const byte cwhite[3] = { 1.0, 1.0, 1.0 };
+
+ pcolor = cwhite;
+ }
+ code = pcl_cs_indexed_build_special( &(prast->mask_pindexed),
+ prast->pindexed->pbase,
+ pcolor,
+ prast->pmem
+ );
+
+ if (code >= 0) {
+ if (transparent)
+ gs_image4_t_init( (gs_image4_t *) &image, prast->mask_pindexed->pcspace);
+ else
+ gs_image_t_init_adjust( (gs_image_t *) &image, prast->mask_pindexed->pcspace, 0);
+ image.i1.Width = prast->src_width;
+ image.i1.Height = prast->src_height;
+
+ if ( pcs->personality == pcl5e )
+ image.i1.CombineWithColor = false;
+ else
+ image.i1.CombineWithColor = true;
+ image.i1.format = gs_image_format_chunky;
+ image.i1.BitsPerComponent = 1;
+ image.i1.Decode[0] = 0.0;
+ image.i1.Decode[1] = 1.0;
+ if (transparent)
+ image.i4.MaskColor[0] = 0.0;
+
+ code = gs_image_begin_typed( (const gs_image_common_t *)&image,
+ pcs->pgs,
+ true,
+ &pie
+ );
+
+ if (code >= 0)
+ code = gs_image_common_init( pen,
+ pie,
+ (gs_data_image_t *)&image,
+ gs_currentdevice_inline(pcs->pgs)
+ );
+ }
+
+ if (code < 0)
+ gs_free_object(prast->pmem, pen, "Create image for PCL raster");
+ else
+ prast->mask_pen = pen;
+
+ pcl_set_drawing_color(pcs, pcs->pattern_type, pcs->pattern_id, true);
+ return code;
+}
+
+/*
+ * Create the graphic library image object needed to represent a raster.
+ *
+ * If the image does not use transparency then we need to use image type 1 processing.
+ * Otherwise we need to use image type 4. Most of the setup is the same for both
+ * cases. Thus rather than split this into two routines with a lot redundant code
+ * I am keeping one routine with a union structure (image) and some conditionals.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+create_image_enumerator(
+ pcl_raster_t * prast
+)
+{
+ int nplanes = prast->nplanes;
+ int b_per_p = prast->bits_per_plane;
+ int num_comps = (prast->indexed ? 1 : 3);
+ int nsrcs = prast->nsrcs;
+ /*
+ * Most elements of gs_image1_t and gs_image4_t are identical. The only exception
+ * that we care about is MaskColor in gs_image_type4_t.
+ */
+ int use_image4 = prast->transparent;
+ union {
+ gs_image1_t i1;
+ gs_image4_t i4;
+ } image;
+ gs_image_enum * pen = gs_image_enum_alloc( prast->pmem,
+ "Create image for PCL raster" );
+ gx_image_enum_common_t * pie = 0;
+ gs_color_space * pcspace = ( prast->indexed
+ ? prast->pindexed->pcspace
+ : prast->pindexed->pbase->pcspace );
+ int code = 0;
+
+ if (pen == 0)
+ return e_Memory;
+
+ /*
+ * There is one more case in which we will not use image type 4 processing.
+ * If our color specifications are indexed and the wht_index value is greater
+ * then the largest possible value given the number of index bits, then it is
+ * not possible to ever get a 'white' (transparent) value. Thus skip
+ * transparency in this case.
+ */
+ if ((prast->indexed) && (prast->wht_indx >= 1 << (nplanes * b_per_p)))
+ use_image4 = 0;
+
+ if (use_image4)
+ gs_image4_t_init( (gs_image4_t *) &image, pcspace);
+ else
+ gs_image_t_init_adjust( (gs_image_t *) &image, pcspace, 0);
+ image.i1.Width = prast->src_width;
+ image.i1.Height = prast->src_height;
+ image.i1.CombineWithColor = true;
+ image.i1.format = ( nsrcs > 1 ? gs_image_format_component_planar
+ : gs_image_format_chunky );
+
+ if (nplanes > nsrcs)
+ image.i1.BitsPerComponent = 8; /* always 8 bits per pixel if consolidated */
+ else
+ image.i1.BitsPerComponent = (nplanes * b_per_p) / num_comps;
+
+ if (prast->indexed) {
+ if (use_image4)
+ image.i4.MaskColor[0] = prast->wht_indx;
+ image.i1.Decode[0] = 0.0;
+ image.i1.Decode[1] = (1 << image.i1.BitsPerComponent) - 1;
+ } else {
+ int i;
+
+ for (i = 0; i < num_comps; i++) {
+ image.i1.Decode[2 * i] = prast->pindexed->Decode[2 * i];
+ image.i1.Decode[2 * i + 1] = prast->pindexed->Decode[2 * i + 1];
+
+ if (use_image4) {
+ image.i4.MaskColor[i] = (1 << image.i1.BitsPerComponent);
+ if (image.i1.Decode[2 * i] == 1.0)
+ image.i4.MaskColor[i] = 0;
+ else if (image.i1.Decode[2 * i + 1] == 1.0)
+ image.i4.MaskColor[i] = (1 << image.i1.BitsPerComponent) - 1;
+ }
+ }
+ }
+
+ code = gs_image_begin_typed( (const gs_image_common_t *)&image,
+ prast->pcs->pgs,
+ true,
+ &pie
+ );
+ if (code >= 0)
+ code = gs_image_common_init( pen,
+ pie,
+ (gs_data_image_t *)&image,
+ gs_currentdevice_inline(prast->pcs->pgs)
+ );
+ if (code < 0) {
+ gs_free_object(prast->pmem, pen, "Create image for PCL raster");
+ return code;
+ }
+ prast->pen = pen;
+ return 0;
+}
+
+/*
+ * Close the image being used to represent a raster. If the second argument is
+ * true, complete the raster as well.
+ *
+ * This routine does NOT clear the seed rows, as their content may be needed
+ * for the next row of the raster.
+ *
+ * NB: This routine may re-invoke itself recursively when completing the raster,
+ * as this routine will call process_zero_rows, which may once again invoke
+ * this routine. The recursion can only extend to one additional level,
+ * however, as process_zero_rows will call this routine with complete set
+ * set to false.
+ */
+ static void
+close_raster(
+ gs_state * pgs,
+ pcl_raster_t * prast,
+ bool complete
+)
+{
+ /* see if we need to fill in any missing rows */
+ if ( complete &&
+ (prast->src_height > prast->rows_rendered) &&
+ prast->src_height_set )
+ (void)process_zero_rows(pgs, prast, prast->src_height - prast->rows_rendered);
+ if (prast->pen != 0) {
+ gs_image_cleanup(prast->pen, pgs);
+ gs_free_object(prast->pmem, prast->pen, "Close PCL raster");
+ prast->pen = 0;
+ }
+ if (prast->mask_pen != 0) {
+ gs_image_cleanup(prast->mask_pen, pgs);
+ gs_free_object(prast->pmem, prast->mask_pen, "Close PCL raster");
+ prast->mask_pen = 0;
+ }
+ gs_translate(prast->pcs->pgs, 0.0, (floatp)(prast->rows_rendered));
+ prast->src_height -= prast->rows_rendered;
+ prast->rows_rendered = 0;
+}
+
+
+/*
+ * Generate the white-mask corresponding to an image scanline. This is
+ * necessary to implement the opaque source/transparent texture case.
+ *
+ * HP's specification of transparency includes one unintuitive case: opaque
+ * source and transparent texture. In this case, the texture applies only to
+ * the non-white portion of the source; the white portion should be rendered
+ * in a solid white.
+ *
+ * Since the graphic library does not support mutliple textures in a single
+ * rendering operation, it is necessary to split objects that have both a
+ * foreground and a background into two transparent objects: one having just
+ * the foreground, the other just the background. In the case of rasters it
+ * is necessary to form a mask object that is the inverse of the background,
+ * and "paint" it with "white". The following code accomplishes this task.
+ *
+ * It is, unfortunately, not possible to use the graphic libraries image mask
+ * feature to implement the "white mask", because image masks in the graphic
+ * library are not implemented as mask objects. Rather, they are implemented
+ * as transparent colored patterns, with the foreground color taken from the
+ * current color at the time the image mask is begun. Instead, a two entry
+ * transparent colored image is used, whose foreground color is the current
+ * white and whose background color is a transparent white.
+ *
+ * As always, what is considered "white" is evaluated in the source color space;
+ * this varies from HP's practice, and can give unexpected results if an
+ * inverting color lookup table is used.
+ */
+ static int
+process_mask_row(
+ pcl_raster_t * prast
+)
+{
+ int code = clear_mask_buff(prast);
+ gs_image_enum * pen = prast->mask_pen;
+
+ if ( (code >= 0) &&
+ ((pen != 0) || ((code = create_mask_enumerator(prast)) >= 0)) ) {
+ uint dummy;
+ pcl_state_t * pcs = prast->pcs;
+
+ pen = prast->mask_pen;
+ pcl_set_drawing_color(pcs, pcl_pattern_solid_white, 0, true);
+ prast->gen_mask_row(prast);
+ code = gs_image_next( pen,
+ prast->mask_buff,
+ (prast->src_width + 7) / 8,
+ &dummy
+ );
+ pcl_set_drawing_color(pcs, pcs->pattern_type, pcs->pattern_id, true);
+ }
+ return code;
+}
+
+ static int
+process_zero_mask_rows(
+ pcl_raster_t * prast,
+ int nrows
+)
+{
+ int code = clear_mask_buff(prast);
+ gs_image_enum * pen = prast->mask_pen;
+
+ if ( (code >= 0) &&
+ ((pen != 0) || ((code = create_mask_enumerator(prast)) >= 0)) ) {
+ uint dummy;
+ pcl_state_t * pcs = prast->pcs;
+ int nbytes = (prast->src_width + 7) / 8;
+
+ pen = prast->mask_pen;
+ memset(prast->mask_buff, 0xff, nbytes);
+ pcl_set_drawing_color(pcs, pcl_pattern_solid_white, 0, true);
+ gs_setrasterop(pcs->pgs, (gs_rop3_t)rop3_know_S_1((int)0xff));
+ while ((nrows-- > 0) && (code >= 0))
+ code = gs_image_next(pen, prast->mask_buff, nbytes, &dummy);
+ pcl_set_drawing_color(pcs, pcs->pattern_type, pcs->pattern_id, true);
+ }
+ return code;
+}
+
+/*
+ * Process some number of zero-ed out rows, either as rasters or as a rectangle.
+ *
+ * Ideally, any sufficiently large regions of zero value would be rendered as
+ * a rectangle, but doing so runs afoul of PCL's graphic model. Rectangles are
+ * mask objects, whose value is provided by the current color/pattern/texture.
+ * Images are colored objects, whose interaction with the the current color/
+ * texture/raster is established by the current raster operation.
+ *
+ * In many cases, it is possible to emulate the effect of a colored object by
+ * use of a mask object and modifications to the current pattern/color/texture
+ * and the current raster operation. For the most part, however, situations in
+ * which such modifications are useful do not occur often enough to be worth
+ * special handling.
+ *
+ * There is one case that does arise with some frequency and is simple to
+ * handle: 0 is white, and source transparency is on. In this case, no work
+ * is necessary: just leave the output as is.
+ *
+ * The other case that is likely to arise often enough to be worth special
+ * handling is when 0 is white but source transparency is off. In this case,
+ * the current raster operation must be inverted relative to the source
+ * component and a solid rectangle output. A similar situation with a black
+ * rectangle does not occur very frequently, but can be handled by the same
+ * technique (without inverting the raster operation), so it is handled here
+ * as well.
+ *
+ * Zero regions of less than a kilo byte are not given special handling, so
+ * as to avoid the overhead of closing and then restarting an image.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ static int
+process_zero_rows(
+ gs_state * pgs,
+ pcl_raster_t * prast,
+ int nrows
+)
+{
+ int npixels = prast->src_width;
+ int nbytes = (npixels * prast->bits_per_plane + 7) / 8;
+ int nplanes = prast->nplanes;
+ int rem_rows = prast->src_height - prast->rows_rendered;
+ pcl_seed_row_t * pseed_rows = prast->pseed_rows;
+ int code = 0;
+ int i;
+ int moveto_nrows = nrows;
+
+ /* don't bother going beyond the end of the image */
+ if (nrows > rem_rows) {
+ nrows = rem_rows;
+ }
+
+ /* if clipping the whole raster, just update rendered rows */
+ if (prast->pcs->raster_state.clip_all) {
+ prast->rows_rendered += nrows;
+ return 0;
+ }
+
+ /* clear the seed rows */
+ for (i = 0; i < nplanes; i++) {
+ if (!pseed_rows[i].is_blank) {
+ memset(prast->pseed_rows[i].pdata, 0, nbytes);
+ pseed_rows[i].is_blank = true;
+ }
+ }
+
+ /* render as raster or rectangle */
+ if ( ((nrows * nbytes > 1024) || (prast->pen == 0)) &&
+ (prast->zero_is_white || prast->zero_is_black) ) {
+ gs_state * pgs = prast->pcs->pgs;
+
+ close_raster(pgs, prast, false);
+ if ((prast->zero_is_black) || !prast->pcs->source_transparent ) {
+ gs_rect tmp_rect;
+ bool invert = prast->zero_is_white;
+
+ tmp_rect.p.x = 0.0;
+ tmp_rect.p.y = 0.0;
+ tmp_rect.q.x = (double)npixels;
+ tmp_rect.q.y = (double)nrows;
+ if (invert) {
+ gs_setrasterop( pgs,
+ (gs_rop3_t)rop3_invert_S(gs_currentrasterop(pgs))
+ );
+ gs_rectfill(pgs, &tmp_rect, 1 );
+
+ gs_setrasterop( pgs,
+ (gs_rop3_t)rop3_invert_S(gs_currentrasterop(pgs))
+ );
+ }
+ else
+ gs_rectfill(pgs, &tmp_rect, 1);
+
+ }
+
+ prast->src_height -= nrows;
+ /* NB HP bug CET21.04 pg 7 */
+ /* NB text cap move to moveto_nrows, but raster cap moveto nrows */
+ gs_translate(pgs, 0.0, (floatp)moveto_nrows);
+
+ return 0;
+
+ } else {
+ int nsrcs = prast->nsrcs;
+ gs_image_enum * pen = prast->pen;
+ int cnt = 0;
+ uint size = 0;
+ const byte * pb;
+
+ if (pen == 0) {
+ if ((code = create_image_enumerator(prast)) < 0)
+ return code;
+ pen = prast->pen;
+ }
+
+ if (nplanes > nsrcs) {
+ if ((code = clear_cons_buff(prast)) < 0)
+ return code;
+ cnt = nrows;
+ size = npixels;
+ pb = prast->cons_buff;
+ } else {
+ cnt = nrows * nsrcs;
+ size = nbytes;
+ pb = prast->pseed_rows[0].pdata;
+ }
+
+ for (i = 0; i < cnt; i++) {
+ uint dummy;
+
+ if ((code = gs_image_next(pen, pb, size, &dummy)) < 0)
+ return code;
+ }
+ prast->rows_rendered += nrows;
+
+ if (prast->gen_mask_row != 0)
+ code = process_zero_mask_rows(prast, nrows);
+
+ return code;
+ }
+}
+
+/*
+ * Process the next raster row.
+ *
+ * The compression mode is provided to allow this routine to fill in any
+ * missing rows. For adaptive compression (mode 5), this will be 0.
+ */
+ static int
+process_row(
+ pcl_raster_t * prast,
+ int comp_mode /* modified compression mode */
+)
+{
+ int nplanes = prast->nplanes;
+ gs_image_enum * pen = prast->pen;
+ int i;
+ int code = 0;
+
+ /* check if there is anything to do */
+ if (prast->rows_rendered >= prast->src_height)
+ return 0;
+ else if (prast->pcs->raster_state.clip_all) {
+ prast->rows_rendered++;
+ return 0;
+ }
+
+ /* handle any planes not provided */
+ for (i = prast->plane_index; i < nplanes; i++) {
+ static const byte dummy = 0;
+
+ (void)pcl_decomp_proc[comp_mode](prast->pseed_rows + i, &dummy, 0);
+ }
+
+ /* create the image enumerator if it does not already exist */
+ if (pen == 0) {
+ if ((code = create_image_enumerator(prast)) < 0)
+ return code;
+ pen = prast->pen;
+ }
+
+ /* update the raster parameters */
+ prast->rows_rendered++;
+ prast->plane_index = 0;
+
+ if (prast->nsrcs == 1) {
+ byte * pb;
+ int nbytes, b_per_p;
+ uint dummy;
+
+ /* consolidate the planes if necessary */
+ if (nplanes > prast->nsrcs) {
+ if ((code = consolidate_row(prast)) < 0)
+ return code;
+ pb = prast->cons_buff;
+ b_per_p = 8;
+ nbytes = prast->src_width;
+ } else {
+ pb = prast->pseed_rows[0].pdata;
+ nbytes = prast->pseed_rows[0].size;
+ b_per_p = prast->bits_per_plane;
+ }
+
+ /*
+ * Remap the planes, if this is required.
+ *
+ * Remapping is only required for indexed color spaces. The indexed
+ * by plane case will have been collapsed to an indexed by pixel case
+ * by this point.
+ *
+ * (The macro pcl_cmap_apply_remap_ary checks for
+ * prast->remap_ary == 0.)
+ */
+ pcl_cmap_apply_remap_ary( prast->remap_ary,
+ pb,
+ b_per_p,
+ prast->src_width
+ );
+
+ code = gs_image_next(pen, pb, nbytes, &dummy);
+
+ } else {
+ uint dummy;
+ int nsrcs = prast->nsrcs;
+
+ for (i = 0; (i < nsrcs) && (code >= 0); i++)
+ code = gs_image_next( pen,
+ prast->pseed_rows[i].pdata,
+ prast->pseed_rows[i].size,
+ &dummy
+ );
+ }
+
+ if ((prast->gen_mask_row != 0) && (code >= 0))
+ code = process_mask_row(prast);
+ return code;
+}
+
+/*
+ * Process an input data buffer using adpative compression.
+ */
+ static int
+process_adaptive_compress(
+ gs_state * pgs,
+ pcl_raster_t * prast,
+ const byte * pin,
+ uint insize
+)
+{
+ pcl_seed_row_t * pseed_row = prast->pseed_rows;
+ byte * pdata = pseed_row->pdata;
+ uint row_size = pseed_row->size;
+ int code = 0;
+
+ prast->plane_index = 0;
+ while ((insize >= 3) && (code >= 0)) {
+ int cmd = *pin++;
+ uint param = *pin++;
+
+ param = (param << 8) + *pin++;
+ insize -= 3;
+ if (cmd <= 3) {
+ uint cnt = min(insize, param);
+
+ pcl_decomp_proc[cmd](pseed_row, pin, cnt);
+ insize -= cnt;
+ pin += cnt;
+ prast->plane_index = 1;
+ code = process_row(prast, 0);
+ } else if (cmd == 4)
+ code = process_zero_rows(pgs, prast, param);
+ else if (cmd == 5) {
+ uint rem_rows = prast->src_height - prast->rows_rendered;
+ gs_image_enum * pen = prast->pen;
+
+ if (param > rem_rows)
+ param = rem_rows;
+
+ /* if clipping the raster, just update lines rendered */
+ if (prast->pcs->raster_state.clip_all) {
+ prast->rows_rendered += param;
+ continue;
+ }
+
+ /* create the image enumerator if it does not already exist */
+ if (pen == 0) {
+ if ((code = create_image_enumerator(prast)) < 0)
+ return code;
+ pen = prast->pen;
+ }
+
+ if (prast->nplanes == 1) {
+ prast->rows_rendered += param;
+ while ((param-- > 0) && (code >= 0)) {
+ uint dummy;
+
+ code = gs_image_next(pen, pdata, row_size, &dummy);
+ if ((prast->gen_mask_row != 0) && (code >= 0))
+ code = process_mask_row(prast);
+ }
+ } else {
+ prast->plane_index = 1;
+ while ( (param-- > 0) && ((code = process_row(prast, 0) >= 0)) )
+ prast->plane_index = 1;
+ prast->plane_index = 0;
+ }
+ } else
+ break;
+ }
+
+ return code;
+}
+
+/*
+ * Add a raster plane. The second operand indicates whether or not this is the
+ * final plane of a row.
+ */
+ static int
+add_raster_plane(
+ const byte * pdata,
+ uint nbytes,
+ bool end_row,
+ pcl_state_t * pcs
+)
+{
+ pcl_raster_t * prast = (pcl_raster_t *)pcs->raster_state.pcur_raster;
+ int comp_mode = pcs->raster_state.compression_mode;
+ int nplanes = 0;
+ int plane_index = 0;
+ int code = 0;
+
+ /* enter raster mode implicitly if not already there */
+ if (prast == 0) {
+ if ((code = pcl_enter_graphics_mode(pcs, IMPLICIT)) != 0)
+ return code;
+ prast = (pcl_raster_t *)pcs->raster_state.pcur_raster;
+ }
+
+ /*
+ * Adaptive compression (mode 5) is only available for single-plane
+ * encodings, and then only if used with a transfer row (ESC * b # W)
+ * command. The latter behavior matches that of the HP Color LaserJet 5/5M,
+ * but not that of the DeskJet 1600C/CM, which has somewhat erratic
+ * behavior in this case.
+ */
+ nplanes = prast->nplanes;
+ if ((comp_mode == ADAPTIVE_COMPRESS) && !end_row)
+ return e_Range;
+
+ /*
+ * If all the rows that can be output have already been rendered, just
+ * return.
+ */
+ if (prast->rows_rendered >= prast->src_height)
+ return 0;
+
+ /*
+ * If all planes for this row have been entered, just ignore the current
+ * data (but don't return yet, as we may still need to output the current
+ * raster row).
+ */
+ plane_index = prast->plane_index;
+ if (plane_index < nplanes) {
+ pcl_seed_row_t * pseed = prast->pseed_rows + plane_index;
+
+ prast->plane_index++;
+ if (comp_mode == ADAPTIVE_COMPRESS)
+ return process_adaptive_compress(pcs->pgs, prast, pdata, nbytes);
+ else
+ (void)pcl_decomp_proc[comp_mode](pseed, pdata, nbytes);
+ }
+
+ return 0;
+}
+
+/*
+ * Create a PCL raster object. This procedure is called when entering graphics
+ * mode.
+ *
+ * Note that a raster must be considered "transparent" if either source or
+ * pattern transparency is in effect. If only pattern transparency is set, an
+ * addition mask object must be created to fill the "white" regions of the
+ * raster. This object does not use the current texture; it sets the texture
+ * to opaque white when it is rendered. This is in conformance with HP's
+ * somewhat unintuitive interpretation of the opaque source/transparent
+ * pattern situation.
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+ int
+pcl_start_raster(
+ uint src_width,
+ uint src_height,
+ pcl_state_t * pcs
+)
+{
+ pcl_raster_t * prast = (pcl_raster_t *)pcs->raster_state.pcur_raster;
+ pcl_palette_t * ppalet = pcs->ppalet;
+ pcl_cs_indexed_t * pindexed = ppalet->pindexed;
+ pcl_encoding_type_t penc = pcl_cs_indexed_get_encoding(pindexed);
+ pcl_seed_row_t * pseed_rows = 0;
+
+ /* there can only be one raster object present at a time */
+ if (prast != 0)
+ pcl_complete_raster(pcs);
+
+ prast = gs_alloc_struct( pcs->memory,
+ pcl_raster_t,
+ &st_raster_t,
+ "start PCL raster"
+ );
+ if (prast == 0)
+ return e_Memory;
+
+ prast->pmem = pcs->memory;
+
+ if ( pcs->source_transparent || pcs->pattern_transparent)
+ prast->transparent = true;
+ else
+ prast->transparent = false;
+ prast->src_height_set = pcs->raster_state.src_height_set;
+ prast->pcs = pcs;
+ pcl_cs_indexed_init_from(prast->pindexed, pindexed);
+
+ prast->pen = 0;
+ prast->plane_index = 0;
+ prast->rows_rendered = 0;
+ prast->src_width = src_width;
+ prast->src_height = src_height;
+ prast->mask_pen = 0;
+ prast->mask_pindexed = 0;
+ prast->gen_mask_row = 0;
+
+ /* the conslidation and mask buffers are created when first needed */
+ prast->cons_buff = 0;
+ prast->mask_buff = 0;
+
+ if (penc <= pcl_penc_indexed_by_pixel) {
+ int b_per_i = pcl_cs_indexed_get_bits_per_index(pindexed);
+
+ if (penc == pcl_penc_indexed_by_plane) {
+ prast->nplanes = b_per_i;
+ prast->bits_per_plane = 1;
+ } else { /* penc == pcl_penc_indexed_by_pixel */
+ prast->nplanes = 1;
+ prast->bits_per_plane = b_per_i;
+ }
+ prast->nsrcs = 1;
+ prast->indexed = true;
+ prast->zero_is_white = pcl_cs_indexed_0_is_white(pindexed);
+ prast->zero_is_black = pcl_cs_indexed_0_is_black(pindexed);
+ prast->remap_ary = pcl_cmap_create_remap_ary(pcs, &(prast->wht_indx));
+
+ } else { /* penc >= pcl_penc_direct_by_plane */
+ int b_per_primary = pcl_cs_indexed_get_bits_per_primary(pindexed, 0);
+
+ if (penc == pcl_penc_direct_by_plane) {
+ prast->nplanes = 3;
+ prast->bits_per_plane = b_per_primary;
+ prast->nsrcs = 3;
+ } else { /* penc == pcl_penc_direct_by_pixel */
+ prast->nplanes = 1;
+ prast->bits_per_plane = 3 * b_per_primary;
+ prast->nsrcs = 1;
+ }
+ prast->indexed = false;
+ prast->zero_is_white = false;
+ prast->zero_is_black = true;
+ prast->wht_indx = 1; /* not significant */
+ prast->remap_ary = 0;
+ }
+
+ /* allocate the seed row buffers */
+ pseed_rows = gs_alloc_struct_array( prast->pmem,
+ prast->nplanes,
+ pcl_seed_row_t,
+ &st_seed_row_t_element,
+ "start PCL raster"
+ );
+ if (pseed_rows != 0) {
+ int seed_row_bytes = (prast->src_width * prast->bits_per_plane + 7)
+ / 8;
+ int nplanes = prast->nplanes;
+ int i, j;
+
+ for (i = 0; i < nplanes; i++) {
+ byte * pdata = gs_alloc_bytes( prast->pmem,
+ seed_row_bytes,
+ "start PCL raster"
+ );
+
+ if (pdata == 0)
+ break;
+ pseed_rows[i].size = seed_row_bytes;
+ pseed_rows[i].pdata = pdata;
+ memset(pseed_rows[i].pdata, 0, seed_row_bytes);
+ pseed_rows[i].is_blank = true;
+ }
+
+ /* check if everything was successful */
+ if (i < nplanes) {
+
+ /* memory exhaustion; release the already allocated seed rows */
+ for (j = 0; j < i; j++)
+ gs_free_object( prast->pmem,
+ pseed_rows[j].pdata,
+ "start PCL raster"
+ );
+ gs_free_object(prast->pmem, pseed_rows, "start PCL raster");
+ pseed_rows = 0;
+ }
+ }
+
+ /* check for memory exhaustion */
+ if (pseed_rows == 0) {
+ gs_free_object(prast->pmem, prast, "start PCL raster");
+ return e_Memory;
+ }
+
+ prast->pseed_rows = pseed_rows;
+ pcs->raster_state.pcur_raster = (pcl_raster_type *)prast;
+
+ /* see if a mask is required */
+ if ( !pcs->source_transparent &&
+ pcs->pattern_transparent &&
+ (!prast->indexed ||
+ (prast->wht_indx
+ < (1 << prast->nplanes * prast->bits_per_plane)) ) ) {
+
+ if (!prast->indexed) {
+ ulong white_val = 0UL;
+
+ /* direct by plane or by pixel, one or 8 bits per primary */
+ prast->gen_mask_row = (prast->nsrcs > 1 ? gen_mask_multisrc
+ : gen_mask_multibyte);
+ if (prast->pindexed->Decode[1] == 1.0)
+ white_val |= ((ulong)0xff) << 16;
+ if (prast->pindexed->Decode[3] == 1.0)
+ white_val |= ((ulong)0xff) << 8;
+ if (prast->pindexed->Decode[5] == 1.0)
+ white_val |= 0xff;
+ prast->white_val = white_val;
+
+ } else if ((prast->nplanes > 1) || (prast->bits_per_plane == 8)){
+
+ /* indexed by plane or direct by pixel, 8 bits per pixel */
+ prast->gen_mask_row = gen_mask_1byte;
+ prast->white_val = prast->wht_indx;
+
+ } else {
+ ulong white_val = prast->wht_indx;
+ int n = 8 / prast->bits_per_plane;
+
+ /* indexed by pixel, < 8 bits per pixel */
+ prast->gen_mask_row = gen_mask_subbyte;
+ while (n-- > 0)
+ white_val |= (white_val << prast->bits_per_plane);
+ prast->white_val = white_val;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Complete a raster. This is called when exiting graphics mode.
+ */
+ void
+pcl_complete_raster(pcl_state_t *pcs)
+{
+ pcl_raster_t * prast = (pcl_raster_t *)pcs->raster_state.pcur_raster;
+ int i;
+
+ /* if already in raster mode, ignore */
+ if (prast == 0)
+ return;
+
+ /* close the current raster */
+ close_raster(pcs->pgs, prast, true);
+
+ /* free associated objects */
+ if (prast->remap_ary != 0) {
+ gs_free_object( prast->pmem,
+ (void *)prast->remap_ary,
+ "Complete PCL raster"
+ );
+ prast->remap_ary = 0;
+ }
+
+ if (prast->pindexed != 0) {
+ pcl_cs_indexed_release(prast->pindexed);
+ prast->pindexed = 0;
+ }
+ if (prast->mask_pindexed != 0) {
+ pcl_cs_indexed_release(prast->mask_pindexed);
+ prast->mask_pindexed = 0;
+ }
+
+ if (prast->pseed_rows != 0) {
+ for (i = 0; i < prast->nplanes; i++) {
+ if (prast->pseed_rows[i].pdata != 0)
+ gs_free_object( prast->pmem,
+ prast->pseed_rows[i].pdata,
+ "Complete PCL raster"
+ );
+ }
+ gs_free_object(prast->pmem, prast->pseed_rows, "Complete PCL raster");
+ prast->pseed_rows = 0;
+ }
+
+ if (prast->cons_buff != 0)
+ gs_free_object(prast->pmem, prast->cons_buff, "Complete PCL raster");
+ if (prast->mask_buff != 0)
+ gs_free_object(prast->pmem, prast->mask_buff, "Complete PCL raster");
+
+
+ /* free the PCL raster robject itself */
+ gs_free_object(prast->pmem, prast, "Complete PCL raster");
+ pcs->raster_state.pcur_raster = 0;
+}
+
+/*
+ * ESC * b # V
+ *
+ * Add a plane buffer to the current set.
+ */
+ static int
+transfer_raster_plane(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ return add_raster_plane(arg_data(pargs), arg_data_size(pargs), false, pcs);
+}
+
+/*
+ * <esc> * b # W
+ *
+ * Add a plane buffer to the current buffered set, and complete the current
+ * raster row.
+ */
+ static int
+transfer_raster_row(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ const byte * pdata = arg_data(pargs);
+ int comp_mode = pcs->raster_state.compression_mode;
+ int code = 0;
+
+ code = add_raster_plane(pdata, arg_data_size(pargs), true, pcs);
+
+ /* complete the row (execpt for adaptive compression) */
+ if (comp_mode != ADAPTIVE_COMPRESS && code == 0)
+ code = process_row((pcl_raster_t *)pcs->raster_state.pcur_raster, comp_mode);
+
+ return code;
+}
+
+/*
+ * <esc> * b # Y
+ *
+ * Skip (zero-fill) a number of raster rows. This command is ignored outside
+ * of raster mode.
+ *
+ * Note that any incomplete plane data for the current row is discarded by this
+ * command.
+ */
+ static int
+raster_y_offset(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ pcl_raster_t * prast = (pcl_raster_t *)pcs->raster_state.pcur_raster;
+
+ /* ignored outside of graphics mode */
+ if ((prast != 0) && (uint_arg(pargs) > 0)) {
+ return process_zero_rows(pcs->pgs, prast, uint_arg(pargs));
+ } else
+ return 0;
+}
+
+/*
+ * ESC * b <direction> L
+ *
+ * set raster print direction
+ */
+ static int
+set_line_path(
+ pcl_args_t * pargs,
+ pcl_state_t * pcs
+)
+{
+ uint i = uint_arg(pargs);
+
+ if (i <= 1)
+ pcs->raster_state.y_advance = (i == 1 ? -1 : 1);
+ return 0;
+}
+
+/*
+ * There is no specific copy code for this module, as both entry to and exit
+ * from a macro must end graphics mode (and thus are handled by the parser).
+ * There is also no explicit reset routine, as the required work is handled
+ * at a higher level.
+ */
+ static int
+raster_do_registration(
+ pcl_parser_state_t *pcl_parser_state,
+ gs_memory_t * pmem /* ignored */
+)
+{
+ DEFINE_CLASS('*')
+ {
+ 'b', 'V',
+ PCL_COMMAND( "Transfer Raster Plane",
+ transfer_raster_plane,
+ pca_raster_graphics | pca_bytes | pca_in_rtl
+ )
+ },
+ {
+ 'b', 'W',
+ PCL_COMMAND( "Transfer Raster Row",
+ transfer_raster_row,
+ pca_raster_graphics | pca_bytes | pca_in_rtl
+ )
+ },
+ {
+ 'b', 'Y',
+ PCL_COMMAND( "Raster Y Offset",
+ raster_y_offset,
+ pca_raster_graphics | pca_neg_ok | pca_big_clamp | pca_in_rtl
+ )
+ },
+ {
+ /* NB this command should *only* be exectuted in rtl but we
+ use it in both rtl and pcl5 */
+ 'b', 'L',
+ PCL_COMMAND( "Line Path",
+ set_line_path,
+ pca_neg_ok | pca_big_ignore | pca_in_rtl
+ )
+ },
+ END_CLASS
+ return 0;
+}
+
+ static void
+raster_do_reset(
+ pcl_state_t * pcs,
+ pcl_reset_type_t type
+)
+{
+ if ((type & pcl_reset_initial) != 0)
+ pcs->raster_state.pcur_raster = 0;
+}
+
+const pcl_init_t rtraster_init = { raster_do_registration, raster_do_reset, 0 };
diff --git a/pcl/rtraster.h b/pcl/rtraster.h
new file mode 100644
index 000000000..b5b3e0a47
--- /dev/null
+++ b/pcl/rtraster.h
@@ -0,0 +1,38 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtraster.h - interface to raster rendering code */
+
+#ifndef rtraster_INCLUDED
+#define rtraster_INCLUDED
+
+#include "pcstate.h"
+#include "pcommand.h"
+
+/*
+ * Create a PCL raster object (on entering raster graphics mode).
+ *
+ * Returns 0 on success, < 0 in the event of an error.
+ */
+int pcl_start_raster(
+ uint src_width,
+ uint src_height,
+ pcl_state_t * pcs
+);
+
+/* complete a raster (when exiting raster graphics mode) */
+void pcl_complete_raster(pcl_state_t *pcs);
+
+extern const pcl_init_t rtraster_init;
+
+#endif /* rtraster_INCLUDED */
diff --git a/pcl/rtrstcmp.c b/pcl/rtrstcmp.c
new file mode 100644
index 000000000..d882684ae
--- /dev/null
+++ b/pcl/rtrstcmp.c
@@ -0,0 +1,262 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtrstcmp.c - raster decompression routines */
+
+#include "string_.h"
+#include "pcstate.h"
+#include "rtrstcmp.h"
+
+/*
+ * Each of the decompression methods has the same structure. The operands are
+ * are the seed row to be filled in and the buffer from which it is to be
+ * filled. A size is provided for the latter.
+ *
+ * Adpative compression (mode 5) is not handled at this level, though it will
+ * make use of these routines for decompressing individual raster rows.
+ */
+
+/*
+ * Uncompressed data.
+ */
+ static void
+uncompress_0(
+ pcl_seed_row_t * pout,
+ const byte * pin,
+ int in_size
+)
+{
+ int nbytes = (in_size > pout->size ? pout->size : in_size);
+
+ memcpy(pout->pdata, pin, nbytes);
+ if (!pout->is_blank)
+ memset(pout->pdata + nbytes, 0, pout->size - nbytes);
+ pout->is_blank = (in_size == 0);
+}
+
+/*
+ * Run-length compression.
+ */
+ static void
+uncompress_1(
+ pcl_seed_row_t * pout,
+ const byte * pin,
+ int in_size
+)
+{
+ int i = in_size / 2;
+ byte * pb = pout->pdata;
+ byte * plim = pb + pout->size;
+
+ while (i-- > 0) {
+ int cnt = *pin++ + 1;
+ byte val = *pin++;
+
+ if (cnt > plim - pb)
+ cnt = plim - pb;
+ while (cnt-- > 0)
+ *pb++ = val;
+ }
+ if (!pout->is_blank)
+ memset(pb, 0, plim - pb);
+ pout->is_blank = (in_size == 0);
+}
+
+/*
+ * TIFF "Packbits" compression.
+ */
+ static void
+uncompress_2(
+ pcl_seed_row_t * pout,
+ const byte * pin,
+ int in_size
+)
+{
+ int i = in_size;
+ byte * pb = pout->pdata;
+ byte * plim = pb + pout->size;
+
+ while (i-- > 0) {
+ int cntrl = *pin++;
+
+ if (cntrl < 128) {
+ uint cnt = min(cntrl + 1, i);
+ const byte * ptmp = pin;
+
+ i -= cnt;
+ pin += cnt;
+ if (cnt > plim - pb)
+ cnt = plim - pb;
+ while (cnt-- > 0)
+ *pb++ = *ptmp++;
+
+ } else if ((cntrl > 128) && (i-- > 0)) {
+ int cnt = min(257 - cntrl, plim - pb);
+ int val = *pin++;
+
+ while (cnt-- > 0)
+ *pb++ = val;
+ }
+ }
+ if (!pout->is_blank)
+ memset(pb, 0, plim - pb);
+ pout->is_blank = (in_size == 0);
+}
+
+/*
+ * Delta row compression
+ */
+ static void
+uncompress_3(
+ pcl_seed_row_t * pout,
+ const byte * pin,
+ int in_size
+)
+{
+ int i = in_size;
+ byte * pb = pout->pdata;
+ byte * plim = pb + pout->size;
+
+ while (i-- > 0) {
+ uint val = *pin++;
+ uint cnt = (val >> 5) + 1;
+ uint offset = val & 0x1f;
+ const byte * ptmp = 0;
+
+ if ((offset == 0x1f) && (i-- > 0)) {
+ uint add_offset;
+
+ do
+ offset += (add_offset = *pin++);
+ while ((add_offset == 0xff) && (i-- > 0));
+ }
+
+ if (cnt > i)
+ cnt = i;
+ i -= cnt;
+ ptmp = pin;
+ pin += cnt;
+ if ((pb += offset) >= plim)
+ break;
+ if (cnt > plim - pb)
+ cnt = plim - pb;
+ while (cnt-- > 0)
+ *pb++ = *ptmp++;
+ }
+ pout->is_blank = (pout->is_blank && (in_size == 0));
+}
+
+/*
+ * Adpative compression (mode 5) is handled at a higher level.
+ */
+
+/*
+ * Compression mode 9.
+ *
+ * HP's documentation of this command is not completely clear regarding the
+ * interpretation of the replacement byte count for the run-length compression
+ * case. The interpretation used here, based on the documentation in the
+ * "PCL 5 Comparison Guide", October 1996 edition, pp. 2.94-2.96, is that the
+ * replacement byte count refers to the number of output bytes replaced, and
+ * as many input bytes as required are read until at leas this many output
+ * bytes have been replaced.
+ */
+ static void
+uncompress_9(
+ pcl_seed_row_t * pout,
+ const byte * pin,
+ int in_size
+)
+{
+ int i = in_size;
+ byte * pb = pout->pdata;
+ byte * plim = pb + pout->size;
+
+
+ while (i-- > 0) {
+ uint val = *pin++;
+ uint cnt = 0;
+ uint offset = 0;
+ bool more_cnt = false;
+ bool more_offset = false;
+ bool comp = ((val & 0x80) != 0);
+
+ if (comp) {
+ offset = (val >> 5) & 0x3;
+ more_offset = (offset == 0x3);
+ cnt = (val & 0x1f) + 1;
+ more_cnt = (cnt == 0x20);
+ } else {
+ offset = (val >> 3) & 0xf;
+ more_offset = (offset == 0xf);
+ cnt = (val & 0x7) + 1;
+ more_cnt = (cnt == 0x8);
+ }
+
+ while (more_offset && (i-- > 0)) {
+ uint extra = *pin++;
+
+ more_offset = (extra == 0xff);
+ offset += extra;
+ }
+ while (more_cnt && (i-- > 0)) {
+ uint extra = *pin++;
+
+ more_cnt = (extra == 0xff);
+ offset += extra;
+ }
+
+ if ((pb += offset) >= plim)
+ break;
+ if (comp) {
+ uint j = i / 2;
+
+ while (j-- > 0) {
+ uint rep_cnt = *pin++;
+ uint rep_val = *pin++;
+
+ if (rep_cnt > plim - pb)
+ rep_cnt = plim - pb;
+ while (rep_cnt-- > 0)
+ *pb++ = rep_val;
+ }
+ i -= 2 * j;
+
+ } else {
+ if (cnt > i)
+ cnt = i;
+ i -= cnt;
+ pin += cnt;
+ if (cnt > plim - pb)
+ cnt = plim - pb;
+ while (cnt-- > 0)
+ *pb++ = *pin++;
+ }
+
+ }
+ pout->is_blank = (pout->is_blank && (in_size == 0));
+
+}
+
+
+void (*const pcl_decomp_proc[9 + 1])( pcl_seed_row_t * pout,
+ const byte * pin,
+ int in_size
+ ) = {
+ uncompress_0,
+ uncompress_1,
+ uncompress_2,
+ uncompress_3,
+ 0, 0, 0, 0, 0, /* modes 4 and 6 - 8 unused; mode 5 handled separately */
+ uncompress_9
+};
diff --git a/pcl/rtrstcmp.h b/pcl/rtrstcmp.h
new file mode 100644
index 000000000..b996cbaa8
--- /dev/null
+++ b/pcl/rtrstcmp.h
@@ -0,0 +1,89 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtrstcmp.h - interface to the raster decompression code */
+
+#ifndef rtrstcmp_INCLUDED
+#define rtrstcmp_INCLUDED
+
+#include "gx.h"
+#include "gsstruct.h"
+
+/*
+ * Types:
+ *
+ * 0 - compression mode 0 (no compression), param is size in bytes
+ * 1 - compression mode 1 (run length compression), param is size in bytes
+ * 2 - compression mode 2 ("Packbits" compression), param is size in bytes
+ * 3 - compression mode 3 (delta row compression), param is size in bytes
+ * 4 - not used
+ * 5 - compression mode 5 (adaptive), param is size in bytes
+ * 9 - compression mode 9 (modified delta row), param is size in bytes
+ *
+ * There is no separate format for repeated rows. The desired effect can be
+ * achieve by create a buffer of type 3 with a size of 0 bytes.
+ */
+typedef enum {
+ NO_COMPRESS = 0,
+ RUN_LEN_COMPRESS = 1,
+ PACKBITS_COMPRESS = 2,
+ DELTA_ROW_COMPRESS = 3,
+ /* 4 is not used, and indicated as reserved by HP */
+ ADAPTIVE_COMPRESS = 5,
+ /* 6 - 8 unused */
+ MOD_DELTA_ROW_COMPRESS = 9
+} pcl_rast_buff_type_t;
+
+/*
+ * A seed-row structure. These buffers are used both to pass data to the
+ * graphic library image routines, and to retain information on the last row
+ * sent to support "delta-row" compression.
+ *
+ * The is_blank flag is intended as a hint, not as an absolute indication. If
+ * it is set, the seed row is known to be blank. However, even if it is not
+ * set the seed row may still be blank.
+ */
+typedef struct pcl_seed_row_s {
+ ushort size;
+ bool is_blank;
+ byte * pdata;
+} pcl_seed_row_t;
+
+/* in rtraster.c */
+#define private_st_seed_row_t() \
+ gs_private_st_ptrs1( st_seed_row_t, \
+ pcl_seed_row_t, \
+ "PCL raster seed row", \
+ seed_row_enum_ptrs, \
+ seed_row_reloc_ptrs, \
+ pdata \
+ )
+
+#define private_st_seed_row_t_element() \
+ gs_private_st_element( st_seed_row_t_element, \
+ pcl_seed_row_t, \
+ "PCL seed row array", \
+ seed_row_element_enum_ptrs, \
+ seed_row_element_reloc_ptrs, \
+ st_seed_row_t \
+ )
+
+/*
+ * The array of decompression functions.
+ */
+extern void (*const pcl_decomp_proc[9 + 1])(pcl_seed_row_t *pout,
+ const byte *pin,
+ int in_size
+ );
+
+#endif /* rtrstcmp_INCLUDED */
diff --git a/pcl/rtrstst.h b/pcl/rtrstst.h
new file mode 100644
index 000000000..c71e4283e
--- /dev/null
+++ b/pcl/rtrstst.h
@@ -0,0 +1,147 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* rtrstst.h - structure for holding raster information in the PCL state */
+
+#ifndef rtrstst_INCLUDED
+#define rtrstst_INCLUDED
+
+#include "gsimage.h"
+#include "gx.h"
+#include "pccoord.h"
+
+/*
+ * The current state of the raster machinery.
+ *
+ * There are several fields in the structure whose presence (or absence) may not
+ * be totally intuitive.
+ *
+ * 1. The graphics margin (the "horizontal" distance of the origin of the image
+ * from the applicable edge of the logical page) is a state variable, even
+ * though this fact is almost never apparent in practice. The parameter is
+ * significant only if "graphics mode" (in the sense used in the PCL
+ * documentation) is entered implicitly; all of the explicit ways of entering
+ * graphics mode (<esc>*r#A, where # is in the range 0-3) set the graphics
+ * margin. Furthermore, if the graphics mode is ended via <esc>*rC (but not
+ * <esc>*rB), the graphics margin is reset to 0.
+ *
+ * For ease of implementation, the graphics margin is in centipoints, but in
+ * the orientation of raster space. The latter feature is significant: it is
+ * possible to implicitly enter graphics mode in an orientation different
+ * from that in which the graphics margin was set. In this case, the
+ * displacement remains the same, but in a different orientation.
+ *
+ * 2. Whether or not raster scaling is (potentially) used for a given image
+ * is a state variable in some HP PCL implementations, but not in others.
+ * Speicifically, the DeskJet 1600C/CM never uses raster scaling on implicit
+ * entry into graphics mode, while the Color LaserJet 5/5M retains the
+ * state of the last entry into graphics mode (in the current PCL state).
+ * The latter approach is used in this code.
+ *
+ * Note that it is the scale/don't scale value of the last entry into
+ * graphics mode that is retained, not whether or not scaling actually
+ * took place for that raster. In particular, assume that graphics mode
+ * was entered with <esc>*r[23]A but the raster was not scaled due to some
+ * other condition (palette not writable, source raster dimensions not
+ * supplied). If the condition preventing raster scaling is altered, and
+ * subsequently graphics mode entered implicitly, raster scaling will
+ * occur.
+ *
+ * 3. The situation with the scale algorithm feature is not yet clear. The
+ * documentation states ("PCL 5 Color Technical Reference Manual", May
+ * 1996 ed., p. 6-42) that "This command is valid only after a Start
+ * Raster command (<esc>*r#A) with scale mode ON." While this might indicate
+ * that the scale algorithm is not a state variable, we tend to think the
+ * statement merely reflects a poor choice of wording. We believe it
+ * would have been better stated as "this command is not effective except
+ * after ..." A reason for this belief is that all of the commands that
+ * are "valid" after a start raster mode are of the form <esc>*b#, while
+ * the scale algorithm command is of the form <esc>*t#, as are the source
+ * resolution and destination dimension commands (all of which are state
+ * variables).
+ *
+ * 4. Clipping or rasters in PCL is handled in a manner similar to that of
+ * text, which leads to some curious behavior. Normally, rasters are clipped
+ * to the printable page boundary. However, if the raster orgin is at
+ * the logical page "right" or "bottom" boundary relative to the print
+ * direction, the raster is clipped completely, even in cases in which the
+ * logical page boundary is inside the printable region.
+ *
+ * Centi-point precision is used to determine whether or not the raster
+ * origin is at the logical page boundary. For logical orientation 0 and
+ * 2, the the logical page is either 25 or 21 pixels (at 300 dpi) inside
+ * the printable region, depending on the page size. Hence, it is possible
+ * to relocate a raster by one centipoint, and have a 25 pixel extent of
+ * that raster either appear or disappear.
+ *
+ * This clipping is inconsistently applied when presentation mode 3 is
+ * used and the print direction is not along with width of the "physical"
+ * page. In this case, the perpendicular of the raster scanline direction
+ * points in the opposite of the print direction, thus the raster could
+ * move off the "left" edge of the logical page. No clipping is performed
+ * in this case, most likely due to the implementation method chosen by HP.
+ *
+ * The field clip_all is set to true if the raster output is to be suppressed
+ * because the raster origin is at the logical page boundary. The motion
+ * implied by rendered scanlines must still be accounted for, hence the
+ * need for this field.
+ *
+ * Because of the dis-continuous nature of this effect, it is sensitive to
+ * to arithmetic precision. It is possible to set up situations in practice
+ * in which the last bit of precision of a floating-point calculation will
+ * determine whether a raster is clipped or not. Fortunately, these
+ * situations do not arise in practice.
+ */
+
+#ifndef pcl_raster_t_DEFINED
+#define pcl_raster_t_DEFINED
+typedef struct pcl_raster_t pcl_raster_type;
+#endif /* pcl_raster_t_DEFINED */
+
+typedef struct pcl_raster_state_s {
+ uint resolution; /* source resolution, dots per inch */
+
+ /* various flags */
+ uint pres_mode_3:1; /* 1 ==> presentation mode 3 */
+ uint scale_raster:1; /* 1 ==> raster scaling enabled */
+ uint src_width_set:1; /* source raster width explicitly set */
+ uint src_height_set:1; /* source raster height explicitly set */
+ uint dest_width_set:1; /* destination width explicitly set */
+ uint dest_height_set:1; /* destination height explicitly set */
+ uint scale_algorithm:1; /* not currently supported */
+ uint graphics_mode:1; /* 1 ==> in graphics mode */
+ uint compression_mode:8; /* compression mode */
+
+ /* for RTL support */
+ int y_advance; /* advance is +y (1) or -y (-1) */
+
+ /* source and (if applicable) destination dimensions */
+ uint src_width; /* source raster width, samples */
+ uint src_height; /* source raster height, scanlines */
+ uint dest_width_cp; /* destination width, centi-points */
+ uint dest_height_cp; /* destination height, centi-points */
+
+ coord gmargin_cp; /* "horizontal" displacement of raster origin */
+
+ int clip_all; /* on last entry into raster mode, the raster
+ * origin was at the logical page edge, hence
+ * the raster needs to be clipped */
+ pcl_raster_type *pcur_raster; /* There is at most one image
+ * actively under construction in PCL
+ * at one time. This pointer points
+ * to that image, if it exists. The
+ * pointer will be non-null while in
+ * graphic mode. */
+} pcl_raster_state_t;
+
+#endif /* rtrstst_INCLUDED */
diff --git a/pl/pjparse.c b/pl/pjparse.c
new file mode 100644
index 000000000..4bd089928
--- /dev/null
+++ b/pl/pjparse.c
@@ -0,0 +1,1241 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pjparse.c */
+/* PJL parser */
+#include "stat_.h"
+#include "memory_.h"
+#include "stdio_.h"
+#include "scommon.h"
+#include "gdebug.h"
+#include "gp.h"
+#include "pjparse.h"
+#include "plfont.h"
+#include "plver.h" /* PJL_VOLUME_0 PJL_VOLUME_1*/
+#include "ctype_.h" /* for toupper() */
+#include <stdlib.h> /* for atoi() */
+
+/* ------ pjl state definitions ------ */
+
+#define PJL_STRING_LENGTH (256)
+#define PJL_PATH_NAME_LENGTH (256)
+#define MAXPATHLEN 1024
+
+
+/* definitions for fontsource and font number table entries */
+typedef struct pjl_fontsource {
+ char designator[2];
+ char pathname[PJL_PATH_NAME_LENGTH+1];
+ char fontnumber[PJL_STRING_LENGTH+1];
+} pjl_fontsource_t;
+
+/* definitions for variable names and values */
+typedef struct pjl_envir_var_s {
+ char var[PJL_STRING_LENGTH+1];
+ char value[PJL_STRING_LENGTH+1];
+} pjl_envir_var_t;
+
+/* the pjl current environment and the default user environment. Note
+ the default environment should be stored in NVRAM on embedded print
+ systems. */
+typedef struct pjl_parser_state_s {
+ char line[81]; /* buffered command line */
+ int bytes_to_write; /* data processing by fsdownload */
+ int bytes_to_read; /* data processed by fsupload */
+ FILE *fp; /* fsdownload or fsupload file */
+ int pos; /* current position in line */
+ pjl_envir_var_t *defaults; /* the default environment (i.e. set default) */
+ pjl_envir_var_t *envir; /* the pjl environment */
+ /* these are seperated out from the default and environmnet for no good reason */
+ pjl_fontsource_t *font_defaults;
+ pjl_fontsource_t *font_envir;
+ char *environment_font_path; /* if there is an operating sytem env
+ var it is used instead of the
+ default pjl fontsource */
+ gs_memory_t *mem;
+} pjl_parser_state_t;
+
+/* provide factory defaults for pjl commands. Note these are not pjl
+ defaults but initial values set in the printer when shipped. In an
+ embedded system these would be defined in ROM */
+static const pjl_envir_var_t pjl_factory_defaults[] = {
+ {"formlines", "60"},
+ {"widea4", "no"},
+ {"fontsource", "I"},
+ {"fontnumber", "0"},
+ {"pitch", "10.00"},
+ {"ptsize", "12.00"},
+ /* NB pc8 is used on 6mp, clj4550, clj4600
+ roman8 is used on most other HP devices */
+ {"symset", "pc8"},
+ {"copies", "1"},
+ {"paper", "letter"},
+ {"orientation", "portrait"},
+ {"duplex", "off"},
+ {"binding", "longedge"},
+ {"manualfeed", "off"},
+ {"fontsource", "I"},
+ {"fontnumber", "0"},
+ {"useciecolor", "off"},
+ {"personality", "pcl5c"},
+ {"language", "auto"},
+ {"disklock", "off"},
+ {"plotsizeoverride", "off"}, /* override hpgl/2 PS command args */
+ {"plotsize1", "0"}, /* 1st arg to PS - plotter units */
+ {"plotsize2", "0"}, /* 2nd arg to PS - plotter units */
+ {"plotsizerotate", "on"}, /* "on" default allows PS rotation per spec */
+ {"viewer", "off"}, /* "on" enables unsafe viewer speed optimizations */
+ /* {"personality", "rtl"}, */
+ {"", ""}
+};
+
+/* FONTS I (Internal Fonts) C, C1, C2 (Cartridge Fonts) S (Permanent
+ Soft Fonts) M1, M2, M3, M4 (fonts stored in one of the printer's
+ ROM SIMM slots). Simulate cartridge, permanent soft fonts, and
+ printer ROM SIMMS with sub directories. See table below. Also
+ resources can be set up as lists of resources which is useful for
+ host based systems. Entries are seperated with a semi-colon. Note
+ there is some unnecessary overlap in the factory default and font
+ source table. */
+static const pjl_fontsource_t pjl_fontsource_table[] = {
+ { "I", "fonts/;urwfonts/;/windows/fonts/;/win95/fonts/;/winnt/fonts/" },
+ { "C", "CART0/", "" },
+ { "C1", "CART1/", "" },
+ { "C2", "CART2/", "" },
+ { "S", "MEM0/", "" },
+ { "M1", "MEM1/", "" },
+ { "M2", "MEM2/", "" },
+ { "M3", "MEM3/", "" },
+ { "M4", "MEM4/", "" },
+ { "", "", "" }
+};
+
+/* pjl tokens parsed */
+typedef enum {
+ DONE,
+ SET,
+ DEFAULT,
+ EQUAL,
+ VARIABLE,
+ SETTING,
+ UNIDENTIFIED, /* NB not used */
+ LPARM, /* NB not used */
+ PREFIX, /* @PJL */
+ INITIALIZE,
+ RESET,
+ INQUIRE,
+ DINQUIRE,
+ ENTER,
+ LANGUAGE,
+ ENTRY,
+ COUNT,
+ OFFSET,
+ FSDOWNLOAD,
+ FSAPPEND,
+ FSDELETE,
+ FSDIRLIST,
+ FSINIT,
+ FSMKDIR,
+ FSQUERY,
+ FSUPLOAD,
+ FORMATBINARY, /* this nonsense is ignored.
+ all data is treated as binary */
+ NAME, /* used for pathnames */
+ SIZE, /* size of data */
+ VOLUME, /* volume indicator for filesystem initialization */
+ DISKLOCK
+} pjl_token_type_t;
+
+/* lookup table to map strings to pjl tokens */
+typedef struct pjl_lookup_table_s {
+ char pjl_string[PJL_STRING_LENGTH+1];
+ pjl_token_type_t pjl_token;
+} pjl_lookup_table_t;
+
+static const pjl_lookup_table_t pjl_table[] = {
+ { "@PJL", PREFIX },
+ { "SET", SET },
+ { "DEFAULT", DEFAULT },
+ { "INITIALIZE", INITIALIZE },
+ { "=", EQUAL },
+ { "DINQUIRE", DINQUIRE },
+ { "INQUIRE", INQUIRE },
+ { "ENTER", ENTER },
+ /* File system related variables */
+ { "FSDOWNLOAD", FSDOWNLOAD },
+ { "FSAPPEND", FSAPPEND },
+ { "FSDELETE", FSDELETE },
+ { "FSDIRLIST", FSDIRLIST },
+ { "FSINIT", FSINIT },
+ { "FSMKDIR", FSMKDIR },
+ { "FSQUERY", FSQUERY },
+ { "FSUPLOAD", FSUPLOAD },
+ { "FORMAT:BINARY", FORMATBINARY }, /* this nonsense is ignored.
+ all data is treated as binary */
+ { "NAME", NAME }, /* used for pathnames */
+ { "SIZE", SIZE }, /* size of data */
+ { "VOLUME", VOLUME }, /* used for volume name */
+ { "ENTRY", ENTRY },
+ { "COUNT", COUNT },
+ { "OFFSET", OFFSET },
+ { "DISKLOCK", DISKLOCK },
+ { "", (pjl_token_type_t)0 /* don't care */ }
+};
+
+/* permenant soft font slots - bit n is the n'th font number. */
+#define MAX_PERMANENT_FONTS 256 /* multiple of 8 */
+unsigned char pjl_permanent_soft_fonts[MAX_PERMANENT_FONTS / 8];
+
+/* ----- private functions and definitions ------------ */
+
+/* forward declaration */
+static int pjl_set(pjl_parser_state_t *pst, char *variable, char *value, bool defaults);
+
+/* handle pjl variables which affect the state of other variables - we
+ don't handle all of these yet. NB not complete. */
+
+ void
+pjl_side_effects(pjl_parser_state_t *pst, char *variable, char *value, bool defaults)
+{
+ /* default formlines to 45 if the orientation is set to landscape.
+ We assume the side effect will not affect itself so we can call
+ the caller. */
+ if ( !pjl_compare(variable, "ORIENTATION") &&
+ !pjl_compare(value, "LANDSCAPE") )
+ pjl_set(pst, (char *)"FORMLINES", (char *)"45", defaults);
+ /* fill in other side effects here */
+ return;
+}
+
+/* set a pjl environment or default variable. */
+static int
+pjl_set(pjl_parser_state_t *pst, char *variable, char *value, bool defaults)
+{
+ pjl_envir_var_t *table = (defaults ? pst->defaults : pst->envir);
+ int i;
+
+ if (defaults) /* default also sets current environment. */
+ pjl_set( pst, variable, value, false );
+
+ for (i = 0; table[i].var[0]; i++)
+ if (!pjl_compare(table[i].var, variable)) {
+ /* set the value */
+ strcpy(table[i].value, value);
+ /* set any side effects of setting the value */
+ pjl_side_effects(pst, variable, value, defaults);
+ return 1;
+ }
+ /* didn't find variable */
+ return 0;
+}
+
+/* get next token from the command line buffer */
+static pjl_token_type_t
+pjl_get_token(pjl_parser_state_t *pst, char token[])
+{
+ int c;
+ int start_pos;
+
+ /* skip any whitespace if we need to. */
+ while((c = pst->line[pst->pos]) == ' ' || c == '\t') pst->pos++;
+
+ /* special case to allow = with no intevervening spaces between
+ lhs and rhs */
+ if ( c == '=' ) {
+ pst->pos++;
+ return EQUAL;
+ }
+
+ /* set the starting position */
+ start_pos = pst->pos;
+
+ /* end of line reached; null shouldn't happen but we check anyway */
+ if ( c == '\0' || c == '\n' )
+ return DONE;
+
+ /* check for a quoted string. It should not span a line */
+ if ( c == '"' ) {
+ c = pst->line[pst->pos++];
+ while ((c = pst->line[pst->pos]) != '"' &&
+ c != '\0' &&
+ c != '\n')
+ pst->pos++;
+ /* this routine doesn't yet support real error handling - here
+ we should check if c == '"' */
+ if ( c == '"' )
+ pst->pos++;
+ else
+ return DONE;
+ } else {
+ /* set the ptr to the next delimeter. */
+ while((c = pst->line[pst->pos]) != ' ' &&
+ c != '\t' &&
+ c != '\r' &&
+ c != '\n' &&
+ c != '=' &&
+ c != '\0')
+ pst->pos++;
+ }
+
+ /* build the token */
+ {
+ int slength = pst->pos - start_pos;
+ int i;
+ /* we allow = to special case for allowing
+ token doesn't fit or is empty */
+ if (( slength > PJL_STRING_LENGTH) || slength == 0)
+ return DONE;
+ /* now the string can be safely copied */
+ strncpy(token, &pst->line[start_pos], slength);
+ token[slength] = '\0';
+
+ /* for known tokens */
+ for (i = 0; pjl_table[i].pjl_string[0]; i++)
+ if (!pjl_compare(pjl_table[i].pjl_string, token))
+ return pjl_table[i].pjl_token;
+
+ /* NB add other cases here */
+ /* check for variables that we support */
+ for (i = 0; pst->envir[i].var[0]; i++)
+ if (!pjl_compare(pst->envir[i].var, token))
+ return VARIABLE;
+
+ /* NB assume this is a setting yuck */
+ return SETTING;
+ }
+ /* shouldn't happen */
+ return DONE;
+}
+
+/* check if fonts exist in the current font source path */
+static char *
+pjl_check_font_path(char *path_list, gs_memory_t *mem)
+{
+ /* lookup a font path and check if any files (presumably fonts are
+ present) */
+ char tmp_path[PJL_PATH_NAME_LENGTH+1];
+ char *tmp_pathp = tmp_path;
+ const char pattern[] = "*";
+ char tmp_path_and_pattern[PJL_PATH_NAME_LENGTH+1+1]; /* pattern + null */
+ char *dirname;
+ char fontfilename[MAXPATHLEN+1];
+ /* make a tmp copy of the colon delimited path */
+ strcpy(tmp_path, path_list);
+ /* for each path search for fonts. If we find them return we only
+ check if the directory resource has files without checking if
+ the files are indeed fonts. */
+ while ( (dirname = strtok(tmp_pathp, ";")) != NULL ) {
+ file_enum *fe;
+ strcpy(tmp_path_and_pattern, dirname);
+ strcat(tmp_path_and_pattern, pattern);
+ fe = gp_enumerate_files_init(tmp_path_and_pattern, strlen(tmp_path_and_pattern), mem);
+ if ( (gp_enumerate_files_next(fe, fontfilename, PJL_PATH_NAME_LENGTH) ) == -1 ) {
+ tmp_pathp = NULL;
+ } else {
+ /* wind through the rest of the files. This should close
+ things up as well. All we need to do is clean up but
+ gp_enumerate_files_close() does not close the current
+ directory */
+ while ( 1 ) {
+ int fstatus = (int)gp_enumerate_files_next(fe, fontfilename, PJL_PATH_NAME_LENGTH);
+ /* we don't care if the file does not fit (return +1) */
+ if ( fstatus == -1 )
+ break;
+ }
+ /* NB fix me - replace : separated path with real path.
+ We should do this elsewhere */
+ strcpy(path_list, dirname);
+ return path_list;
+ }
+ }
+ return NULL;
+}
+
+/* initilize both pjl state and default environment to default font
+ number if font resources are present. Note we depend on the PDL
+ (pcl) to provide information about 'S' permanent soft fonts. For
+ all other resources we check for filenames which should correspond
+ to fonts. */
+static void
+pjl_reset_fontsource_fontnumbers(pjl_parser_state_t* pst)
+{
+ char default_font_number[] = "0"; /* default number if resources are present */
+ gs_memory_t *mem = pst->mem;
+
+ int i;
+ for (i = 0; pst->font_defaults[i].designator[0]; i++) {
+ if ( pjl_check_font_path(pst->font_defaults[i].pathname, mem) )
+ strcpy(pst->font_defaults[i].fontnumber, default_font_number);
+ if ( pjl_check_font_path(pst->font_envir[i].pathname, mem) )
+ strcpy(pst->font_envir[i].fontnumber, default_font_number);
+ }
+}
+
+
+/* Strips off extra quotes '"'
+ * and changes pjl volume from 0: to makefile specifed PJL_VOLUME_0 directory
+ * and translates '\\' to '/'
+ * result in fnamep,
+ * ie: ""0:\\dir\subdir\file"" --> "PJL_VOLUME_0/dir/subdir/file"
+ */
+static void
+pjl_parsed_filename_to_string(char *fnamep, const char *pathname)
+{
+ int i;
+ int size;
+
+ *fnamep = 0; /* in case of bad input */
+ if (pathname == 0 || pathname[0] != '"' || strlen(pathname) < 3)
+ return; /* bad input pjl file */
+
+ if ( pathname[1] == '0' && pathname[2] == ':') {
+ /* copy pjl_volume string in */
+ strncpy(fnamep, PJL_VOLUME_0, strlen(PJL_VOLUME_0));
+ fnamep += strlen(PJL_VOLUME_0);
+ }
+ else if ( pathname[1] == '1' && pathname[2] == ':') {
+ /* copy pjl_volume string in */
+ strncpy(fnamep, PJL_VOLUME_1, strlen(PJL_VOLUME_1));
+ fnamep += strlen(PJL_VOLUME_1);
+ }
+ else
+ return; /* bad input pjl file */
+
+ /* the pathname parsed has whatever quoting mechanism was used
+ * remove quotes, use forward slash, copy rest.
+ */
+ size = strlen(pathname);
+
+ for( i = 3; i < size; i++ ) {
+ if ( pathname[i] == '\\')
+ *fnamep++ = '/';
+ else if ( pathname[i] != '"')
+ *fnamep++ = pathname[i];
+ /* else it is a quote skip it */
+ }
+ /* NULL terminate */
+ *fnamep = '\0';
+}
+
+/* Verify a file write operation is ok. The filesystem must be 0: or
+ 1:, no other pjl files can have pending writes, and the pjl
+ disklock state variable must be false */
+static int
+pjl_verify_file_operation(pjl_parser_state_t *pst, char *fname)
+{
+ /* make sure we are playing in the pjl sandbox */
+ if ( 0 != strncmp(PJL_VOLUME_0, fname, strlen(PJL_VOLUME_0))
+ && 0 != strncmp(PJL_VOLUME_1, fname, strlen(PJL_VOLUME_1)) ) {
+ dprintf1("illegal path name %s\n", fname);
+ return -1;
+ }
+ /* make sure we are not currently writing to a file.
+ Simultaneously file writing is not supported */
+ if ( pst->bytes_to_write || pst->fp )
+ return -1;
+
+ /* no operation if disklocak is enabled */
+ if ( !pjl_compare(pjl_get_envvar(pst, "disklock"), "on") )
+ return -1;
+ /* ok */
+ return 0;
+}
+
+/* debugging procedure to warn about writing to an extant file */
+static void
+pjl_warn_exists(const gs_memory_t *mem, char *fname)
+{
+ FILE *fpdownload;
+ /* issue a warning if the file exists */
+ if ( (fpdownload = fopen(fname, gp_fmode_rb) ) != NULL ) {
+ fclose(fpdownload);
+ dprintf1("warning file exists overwriting %s\n", fname);
+ }
+}
+
+/* open a file for writing or appending */
+static FILE *
+pjl_setup_file_for_writing(pjl_parser_state_t *pst, char *pathname, int size, bool append)
+{
+ FILE *fp;
+ char fname[MAXPATHLEN];
+
+ pjl_parsed_filename_to_string(fname, pathname);
+ if ( pjl_verify_file_operation(pst, fname) < 0 )
+ return NULL;
+ pjl_warn_exists(pst->mem, fname);
+ {
+ char fmode[4];
+ strcpy(fmode, gp_fmode_wb);
+ if (append)
+ strcat(fmode, "+");
+ if ( (fp = fopen(fname, gp_fmode_wb)) == NULL) {
+ dprintf("warning file open for writing failed\n" );
+ return NULL;
+ }
+ }
+ return fp;
+}
+
+/* set up the state to download date to a pjl file */
+static int
+pjl_set_fs_download_state(pjl_parser_state_t *pst, char *pathname, int size)
+{
+ /* somethink is wrong if the state indicates we are already writing to a file */
+ FILE *fp = pjl_setup_file_for_writing(pst, pathname, size, false /* append */);
+ if ( fp == NULL )
+ return -1;
+ pst->fp = fp;
+ pst->bytes_to_write = size;
+ return 0;
+}
+
+/* set up the state to append subsequent data from the input stream to
+ a file */
+static int
+pjl_set_append_state(pjl_parser_state_t *pst, char *pathname, int size)
+{
+ FILE *fp = pjl_setup_file_for_writing(pst, pathname, size, true /* append */);
+ if ( fp == NULL )
+ return -1;
+ pst->fp = fp;
+ pst->bytes_to_write = size;
+ return 0;
+}
+
+/* create a pjl volume, this should create the volume 0: or 1: we
+ simply create a directory with the volume name. */
+static int
+pjl_fsinit(pjl_parser_state_t *pst, char *pathname)
+{
+ char fname[MAXPATHLEN];
+ pjl_parsed_filename_to_string(fname, pathname);
+ if ( pjl_verify_file_operation(pst, fname) < 0 )
+ return -1;
+ return mkdir(fname, 0777);
+}
+
+/* make a pjl directory */
+int
+pjl_fsmkdir(pjl_parser_state_t *pst, char *pathname)
+{
+ char fname[MAXPATHLEN];
+ pjl_parsed_filename_to_string(fname, pathname);
+ if ( pjl_verify_file_operation(pst, fname) < 0 )
+ return -1;
+ return mkdir(fname, 0777);
+}
+
+/* query a file in the pjl sandbox */
+int
+pjl_fsquery(pjl_parser_state_t *pst, char *pathname)
+{
+ /* not implemented */
+ return -1;
+}
+
+/* Upload a file from the pjl sandbox */
+int
+pjl_fsupload(pjl_parser_state_t *pst, char *pathname, int offset, int size)
+{
+ /* not implemented */
+ return -1;
+}
+
+
+/* search pathname for filename return a match in result. result
+ should be a 0 length string upon calling this routine. If a match
+ is found result will hold the matching path and filename. Thie
+ procedure recursively searches the directory tree "pathname" for
+ "filename" */
+int
+pjl_search_for_file(pjl_parser_state_t *pst, char *pathname, char *filename, char *result)
+{
+ file_enum *fe;
+ char fontfilename[MAXPATHLEN];
+ struct stat stbuf;
+
+ /* should check length */
+ strcpy(fontfilename, pathname);
+ strcat(fontfilename, "/*");
+ fe = gp_enumerate_files_init(fontfilename, strlen(fontfilename), pst->mem);
+ if ( fe ) {
+ do {
+ uint fstatus = gp_enumerate_files_next(fe, fontfilename, PJL_PATH_NAME_LENGTH);
+ /* done */
+ if ( fstatus == ~(uint)0 )
+ return 0;
+ fontfilename[fstatus] = '\0';
+ if (fontfilename[fstatus-1] != '.') { /* skip over . and .. */
+ /* a directory */
+ if ( ( stat(fontfilename, &stbuf) >= 0 ) && stat_is_dir(stbuf) )
+ pjl_search_for_file(pst, fontfilename, filename, result);
+ else /* a file */
+ if ( !strcmp(strrchr( fontfilename, '/' ) + 1, filename) )
+ strcpy(result, fontfilename);
+ }
+
+ } while (1);
+ }
+ /* not implemented */
+ return -1;
+}
+
+int
+pjl_fsdirlist(pjl_parser_state_t *pst, char *pathname, int entry, int count)
+{
+ file_enum *fe;
+ char fontfilename[MAXPATHLEN];
+ pjl_parsed_filename_to_string(fontfilename, pathname);
+ /* if this is a directory add * for the directory listing NB fix */
+ strcat(fontfilename, "/*");
+ fe = gp_enumerate_files_init(fontfilename, strlen(fontfilename), pst->mem);
+ if ( fe ) {
+ do {
+ uint fstatus = gp_enumerate_files_next(fe, fontfilename, PJL_PATH_NAME_LENGTH);
+ /* done */
+ if ( fstatus == ~(uint)0 )
+ return 0;
+ fontfilename[fstatus] = '\0';
+ /* NB - debugging output only */
+ dprintf1("%s\n", fontfilename);
+ } while (1);
+ }
+ /* should not get here */
+ return -1;
+}
+
+inline static int
+pjl_write_remaining_data(pjl_parser_state_t *pst, const byte **pptr, const byte **pplimit)
+{
+ const byte *ptr = *pptr;
+ const byte *plimit = *pplimit;
+
+ uint avail = plimit - ptr;
+ uint bytes_written = min( avail, pst->bytes_to_write );
+ if ( fwrite( ptr, 1, bytes_written, pst->fp ) != bytes_written ) {
+ /* try to close the file before failing */
+ fclose(pst->fp);
+ pst->fp = NULL;
+ return -1;
+ }
+ pst->bytes_to_write -= bytes_written;
+ if ( pst->bytes_to_write == 0 ) { /* done */
+ fclose(pst->fp);
+ pst->fp = NULL;
+ }
+ /* update stream pointer */
+ *pptr += bytes_written;
+ return 0;
+}
+
+static int
+pjl_delete_file(pjl_parser_state_t *pst, char *pathname)
+{
+ char fname[MAXPATHLEN];
+ pjl_parsed_filename_to_string(fname, pathname);
+ if ( pjl_verify_file_operation(pst, fname) < 0 )
+ return -1;
+ return unlink(fname);
+}
+
+/* handle pattern foo = setting, e.g. volume = "0:", name = 0:]pcl.
+ the setting will be returned in "token" if successful. Return 0
+ for success and -1 if we fail */
+static int
+pjl_get_setting(pjl_parser_state_t *pst, pjl_token_type_t tok, char *token)
+{
+ pjl_token_type_t lhs = pjl_get_token(pst, token);
+ if ( lhs != tok )
+ return -1;
+ if ( (tok = pjl_get_token(pst, token) ) != EQUAL )
+ return -1;
+ if ( (tok = pjl_get_token(pst, token) ) != SETTING )
+ return -1;
+ return 0;
+}
+
+/* parse and set up state for one line of pjl commands */
+static int
+pjl_parse_and_process_line(pjl_parser_state_t *pst)
+{
+ pjl_token_type_t tok;
+ char token[PJL_STRING_LENGTH+1] = {0};
+ char pathname[MAXPATHLEN];
+ /* reset the line position to the beginning of the line */
+ pst->pos = 0;
+ /* all pjl commands start with the pjl prefix @PJL */
+ if ( (tok = pjl_get_token(pst, token)) != PREFIX )
+ return -1;
+ /* NB we should check for required and optional used of whitespace
+ but we don't see PJLTRM 2-6 PJL Command Syntax and Format. */
+ while( (tok = pjl_get_token(pst, token)) != DONE ) {
+ switch( tok ) {
+ case SET:
+ case DEFAULT:
+ {
+ bool defaults;
+var: defaults = (tok == DEFAULT);
+ /* NB we skip over lparm and search for the variable */
+ while( (tok = pjl_get_token(pst, token)) != DONE )
+ if ( tok == VARIABLE ) {
+ char variable[PJL_STRING_LENGTH+1];
+ strcpy(variable, token);
+ if (((tok = pjl_get_token(pst, token)) == EQUAL) &&
+ (tok = pjl_get_token(pst, token)) == SETTING) {
+ return pjl_set(pst, variable, token, defaults);
+ } else
+ return -1; /* syntax error */
+ } else
+ continue;
+ return 0;
+ }
+ case INITIALIZE:
+ /* set the user default environment to the factory default environment */
+ memcpy(pst->defaults, &pjl_factory_defaults, sizeof(pjl_factory_defaults));
+ memcpy(pst->font_defaults, &pjl_fontsource_table, sizeof(pjl_fontsource_table));
+ pjl_reset_fontsource_fontnumbers(pst);
+ return 0;
+ /* set the current environment to the user default environment */
+ case RESET:
+ memcpy(pst->envir, pst->defaults, sizeof(pjl_factory_defaults));
+ memcpy(pst->font_envir, pst->font_defaults, sizeof(pjl_fontsource_table));
+ return 0;
+ case ENTER:
+ /* there is no setting for the default language */
+ tok = SET;
+ goto var;
+ case FSDOWNLOAD: {
+ /* consume and ignore FORMAT:BINARY foolishness. if it is
+ present or search for the name */
+ int size;
+ /* ignore format binary stuff */
+ if ( ( tok = pjl_get_token(pst, token) ) == FORMATBINARY )
+ ;
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ if ( pjl_get_setting(pst, SIZE, token) < 0 )
+ return -1;
+ size = pjl_vartoi(token);
+ return pjl_set_fs_download_state(pst, pathname, size);
+ }
+ case FSAPPEND: {
+ int size;
+ if ( ( tok = pjl_get_token(pst, token) ) == FORMATBINARY )
+ ;
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ if ( pjl_get_setting(pst, SIZE, token) < 0 )
+ return -1;
+ size = pjl_vartoi(token);
+ return pjl_set_append_state(pst, pathname, size);
+ }
+ case FSDELETE:
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ return pjl_delete_file(pst, pathname);
+ case FSDIRLIST: {
+ int entry;
+ int count;
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ if ( pjl_get_setting(pst, ENTRY, token) < 0 )
+ return -1;
+ entry = pjl_vartoi(token);
+ if ( pjl_get_setting(pst, COUNT, token) < 0 )
+ return -1;
+ count = pjl_vartoi(token);
+ return pjl_fsdirlist(pst, pathname, entry, count);
+ }
+ case FSINIT:
+ if ( pjl_get_setting(pst, VOLUME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ return pjl_fsinit(pst, pathname);
+ case FSMKDIR:
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ return pjl_fsmkdir(pst, pathname);
+ case FSQUERY:
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ return pjl_fsquery(pst, pathname);
+ case FSUPLOAD: {
+ int size;
+ int offset;
+ if ( ( tok = pjl_get_token(pst, token) ) == FORMATBINARY )
+ ;
+ if ( pjl_get_setting(pst, NAME, token) < 0 )
+ return -1;
+ strcpy(pathname, token);
+ if ( pjl_get_setting(pst, OFFSET, token) < 0 )
+ return -1;
+ offset = pjl_vartoi(token);
+ if ( pjl_get_setting(pst, SIZE, token) < 0 )
+ return -1;
+ size = pjl_vartoi(token);
+ return pjl_fsupload(pst, pathname, size, offset);
+ }
+ default:
+ return -1;
+ }
+ }
+ return (tok == DONE ? 0 : -1);
+}
+
+/* get a file from 0: or 1: volume */
+static FILE *
+get_fp(pjl_parser_state_t *pst, char *name)
+{
+ char result[MAXPATHLEN];
+
+ /* 0: */
+ result[0] = '\0';
+ pjl_search_for_file(pst, (char *)PJL_VOLUME_0, name, result);
+ if ( result[0] == '\0' ) {
+ /* try 1: */
+ pjl_search_for_file(pst, (char *)PJL_VOLUME_1, name, result);
+ if ( result[0] == '\0' )
+ return 0;
+ }
+ return fopen(result, gp_fmode_rb);
+}
+
+/* scan for a named resoource in the pcl sandbox 0: or 1: and return
+ the size of the object. We do not distinguish between empty and
+ non-existant files */
+long int
+pjl_get_named_resource_size(pjl_parser_state_t *pst, char *name)
+{
+ long int size;
+ FILE *fp = get_fp(pst, name);
+ if ( fp == NULL )
+ return 0;
+ fseek(fp, 0L, SEEK_END);
+ size = ftell(fp);
+ fclose(fp);
+ return size;
+}
+
+/* get the contents of a file on 0: or 1: and return the result in the
+ client allocated memory */
+int
+pjl_get_named_resource(pjl_parser_state *pst, char *name, byte *data)
+{
+ long int size;
+ FILE *fp = get_fp(pst, name);
+ if ( fp == NULL )
+ return 0;
+ fseek(fp, 0L, SEEK_END);
+ size = ftell(fp);
+ rewind(fp);
+ if ( size != fread(data, 1, size, fp) ) {
+ fclose(fp);
+ return -1;
+ }
+ return 0;
+}
+
+/* set the initial environment to the default environment, this should
+ be done at the beginning of each job */
+ void
+pjl_set_init_from_defaults(pjl_parser_state_t *pst)
+{
+ memcpy(pst->envir, pst->defaults, sizeof(pjl_factory_defaults));
+ memcpy(pst->font_envir, pst->font_defaults, sizeof(pjl_fontsource_table));
+}
+
+/* sets fontsource to the next priority resource containing fonts */
+ void
+pjl_set_next_fontsource(pjl_parser_state_t* pst)
+{
+ int current_source;
+ pjl_envvar_t *current_font_source = pjl_get_envvar(pst, "fontsource");
+
+ /* find the index of the current resource then work backwards
+ until we find font resources. We assume the internal source
+ will have fonts */
+ for (current_source = 0; pst->font_envir[current_source].designator[0]; current_source++ )
+ if (!pjl_compare(pst->font_envir[current_source].designator, current_font_source))
+ break;
+
+ /* next resource is not internal 'I' */
+ if ( current_source != 0 ) {
+ while( current_source > 0 ) {
+ /* valid font number found */
+ if ( pst->font_envir[current_source].fontnumber[0] )
+ break;
+ current_source--;
+ }
+ }
+ /* set both default and environment font source, the spec is not clear about this */
+ pjl_set(pst, (char *)"fontsource", pst->font_envir[current_source].designator, true);
+ pjl_set(pst, (char *)"fontsource", pst->font_defaults[current_source].designator, false);
+}
+
+/* get a pjl environment variable from the current environment - not
+ the user default environment */
+ pjl_envvar_t *
+pjl_get_envvar(pjl_parser_state *pst, const char *pjl_var)
+{
+ int i;
+ pjl_envir_var_t *env = pst->envir;
+ /* lookup up the value */
+ for (i = 0; env[i].var[0]; i++)
+ if (!pjl_compare(env[i].var, pjl_var)) {
+ return env[i].value;
+ }
+ return NULL;
+}
+
+/* -- public functions - see pjparse.h for interface documentation -- */
+
+/* Process a buffer of PJL commands. */
+ int
+pjl_process(pjl_parser_state* pst, void *pstate, stream_cursor_read * pr)
+{
+ const byte *p = pr->ptr;
+ const byte *rlimit = pr->limit;
+ int code = 0;
+ /* first check if we are writing data to a file as part of the
+ file system commands */
+
+ while (p < rlimit) {
+ if ( pst->bytes_to_write != 0 ) {
+ p++;
+ if (pjl_write_remaining_data(pst, &p, &rlimit) == 0 ) {
+ p--;
+ continue;
+ }
+ else
+ return -1;
+ }
+
+ if (pst->pos == 0) { /* Look ahead for the @PJL prefix or a UEL. */
+ uint avail = rlimit - p;
+
+ if (!memcmp(p + 1, "\033%-12345X", min(avail, 9))) { /* Might be a UEL. */
+ if (avail < 9) { /* Not enough data to know yet. */
+ break;
+ }
+ /* Skip the UEL and continue. */
+ p += 9;
+ continue;
+ } else if (!memcmp(p + 1, "@PJL", min(avail, 4))) { /* Might be PJL. */
+ if (avail < 4) { /* Not enough data to know yet. */
+ break;
+ }
+ /* Definitely a PJL command. */
+ } else { /* Definitely not PJL. */
+ code = 1;
+ break;
+ }
+ }
+ if (p[1] == '\n') {
+ ++p;
+ /* null terminate, parse and set the pjl state */
+ pst->line[pst->pos] = '\0';
+ pjl_parse_and_process_line(pst);
+ pst->pos = 0;
+ continue;
+ }
+ /* Copy the PJL line into the parser's line buffer. */
+ /* Always leave room for a terminator. */
+ if (pst->pos < countof(pst->line) - 1)
+ pst->line[pst->pos] = p[1], pst->pos++;
+ ++p;
+ }
+ pr->ptr = p;
+ return code;
+}
+
+/* Discard the remainder of a job. Return true when we reach a UEL. */
+/* The input buffer must be at least large enough to hold an entire UEL. */
+ bool
+pjl_skip_to_uel(stream_cursor_read * pr)
+{
+ const byte *p = pr->ptr;
+ const byte *rlimit = pr->limit;
+
+ for (; p < rlimit; ++p)
+ if (p[1] == '\033') {
+ uint avail = rlimit - p;
+
+ if (memcmp(p + 1, "\033%-12345X", min(avail, 9)))
+ continue;
+ if (avail < 9)
+ break;
+ pr->ptr = p + 9;
+ return true;
+ }
+ pr->ptr = p;
+ return false;
+}
+
+/* PJL symbol set environment variable -> pcl symbol set numbers.
+ This probably should not be defined here :-( */
+static const struct {
+ const char *symname;
+ const char *pcl_selectcode;
+} symbol_sets[] = {
+ { "ROMAN8", "8U" },
+ { "ISOL1", "0N" },
+ { "ISOL2", "2N" },
+ { "ISOL5", "5N" },
+ { "PC8", "10U" },
+ { "PC8DN", "11U" },
+ { "PC850", "12U" },
+ { "PC852", "17U" },
+ { "PC8TK", "9T" }, /* pc-8 turkish ?? not sure */
+ { "WINL1", "9U" },
+ { "WINL2", "9E" },
+ { "WINL5", "5T" },
+ { "DESKTOP", "7J" },
+ { "PSTEXT", "10J" },
+ { "VNINTL", "13J" },
+ { "VNUS", "14J" },
+ { "MSPUBL", "6J" },
+ { "MATH8", "8M" },
+ { "PSMATH", "5M" },
+ { "VNMATH", "6M" },
+ { "PIFONT", "15U" },
+ { "LEGAL", "1U" },
+ { "ISO4", "1E" },
+ { "ISO6", "0U" },
+ { "ISO11", "0S" },
+ { "ISO15", "0I" },
+ { "ISO17", "2S" },
+ { "ISO21", "1G" },
+ { "ISO60", "OD" },
+ { "ISO69", "1F" },
+ { "WIN30", NULL }, /* don't know */
+ { "WIN31J", NULL }, /* don't know */
+ { "GB2312", NULL }, /* don't know */
+ { NULL, NULL }
+};
+
+/* map a pjl symbol table name to a pcl symbol table name */
+ int
+pjl_map_pjl_sym_to_pcl_sym(const char *symname)
+{
+ int i;
+ for (i = 0; symbol_sets[i].symname; i++)
+ if (!pjl_compare(symname, symbol_sets[i].symname)) {
+ /* convert the character code to it's integer
+ representation. NB peculiar code! */
+ char pcl_symbol[4], chr;
+ int char_pos;
+ strcpy(pcl_symbol, symbol_sets[i].pcl_selectcode);
+ char_pos = strlen(pcl_symbol) - 1;
+ chr = pcl_symbol[char_pos];
+ pcl_symbol[char_pos] = '\0';
+ return (atoi(pcl_symbol) << 5) + chr - 64;
+ }
+ return -1;
+}
+
+/* environment variable to integer */
+ int
+pjl_vartoi(const pjl_envvar_t *s)
+{
+ return atoi(s);
+}
+
+/* environment variable to float */
+ floatp
+pjl_vartof(const pjl_envvar_t *s)
+{
+ return atof(s);
+}
+
+
+/* convert a pjl font source to a pathname */
+ char *
+pjl_fontsource_to_path(const pjl_parser_state *pjls, const pjl_envvar_t *fontsource)
+{
+ int i;
+ /* if an environment variable is set we use it, otherwise use the PJL
+ machinery */
+ if ( pjls->environment_font_path != NULL )
+ return pjl_check_font_path(pjls->environment_font_path, pjls->mem);
+ for (i = 0; pjls->font_envir[i].designator[0]; i++)
+ if (!pjl_compare(pjls->font_envir[i].designator, fontsource))
+ return pjl_check_font_path(pjls->font_envir[i].pathname, pjls->mem);
+ return NULL;
+}
+
+/* Create and initialize a new state. */
+ pjl_parser_state *
+pjl_process_init(gs_memory_t *mem)
+{
+ pjl_parser_state_t *pjlstate =
+ (pjl_parser_state *)gs_alloc_bytes(mem,
+ sizeof(pjl_parser_state_t), "pjl_state" );
+ pjl_envir_var_t *pjl_env =
+ (pjl_envir_var_t *)gs_alloc_bytes(mem,
+ sizeof(pjl_factory_defaults), "pjl_envir" );
+ pjl_envir_var_t *pjl_def =
+ (pjl_envir_var_t *)gs_alloc_bytes(mem,
+ sizeof(pjl_factory_defaults), "pjl_defaults" );
+ pjl_fontsource_t *pjl_fontenv =
+ (pjl_fontsource_t *)gs_alloc_bytes(mem,
+ sizeof(pjl_fontsource_table), "pjl_font_envir" );
+ pjl_fontsource_t *pjl_fontdef =
+ (pjl_fontsource_t *)gs_alloc_bytes(mem,
+ sizeof(pjl_fontsource_table), "pjl_font_defaults" );
+
+ if ( pjlstate == NULL || pjl_env == NULL || pjl_def == NULL )
+ return NULL; /* should be fatal so we don't bother piecemeal frees */
+
+ /* check for an environment variable */
+ {
+ int pathlen, code;
+ /* The environment variable exists if the function fails to
+ fit in the null - odd but it works. We allow an
+ environment variable to override the font default PJL font
+ path for desktop setups */
+ pathlen = 0;
+ if ( (code = gp_getenv( "PCLFONTSOURCE", (char *)0, &pathlen)) < 0 ) {
+ char *path = (char *)gs_alloc_bytes(mem, pathlen, "pjl_font_path");
+ /* if the allocation fails we use the pjl fontsource */
+ if ( path == NULL )
+ pjlstate->environment_font_path = NULL;
+ else {
+ gp_getenv("PCLFONTSOURCE", path, &pathlen); /* can't fail */
+ pjlstate->environment_font_path = path;
+ }
+ } else /* environmet variable does not exist use pjl fontsource */
+ pjlstate->environment_font_path = NULL;
+ }
+ pjlstate->defaults = pjl_def;
+ pjlstate->envir = pjl_env;
+ pjlstate->font_envir = pjl_fontenv;
+ pjlstate->font_defaults = pjl_fontdef;
+ /* initialize the default and initial pjl environment. We assume
+ that these are the same layout as the factory defaults. */
+ memcpy(pjlstate->defaults, pjl_factory_defaults, sizeof(pjl_factory_defaults));
+ memcpy(pjlstate->envir, pjlstate->defaults, sizeof(pjl_factory_defaults));
+ /* initialize the font repository data as well */
+ memcpy(pjlstate->font_defaults, pjl_fontsource_table, sizeof(pjl_fontsource_table));
+ memcpy(pjlstate->font_envir, pjl_fontsource_table, sizeof(pjl_fontsource_table));
+ /* initialize the current position in the line array and bytes pending */
+ pjlstate->bytes_to_read = 0;
+ pjlstate->bytes_to_write = 0;
+ pjlstate->fp = 0;
+ /* line pos */
+ pjlstate->pos = 0;
+ pjlstate->mem = mem;
+ /* initialize available font sources */
+ pjl_reset_fontsource_fontnumbers(pjlstate);
+ {
+ int i;
+ for (i = 0; i < countof(pjl_permanent_soft_fonts); i++)
+ pjl_permanent_soft_fonts[i] = 0;
+ }
+ return (pjl_parser_state *)pjlstate;
+}
+
+/* case insensitive comparison of two null terminated strings. */
+ int
+pjl_compare(const pjl_envvar_t *s1, const char *s2)
+{
+ for (; toupper(*s1) == toupper(*s2); ++s1, ++s2)
+ if (*s1 == '\0')
+ return(0);
+ return 1;
+}
+
+/* free all memory associated with the PJL state */
+ void
+pjl_process_destroy(pjl_parser_state *pst, gs_memory_t *mem)
+{
+ gs_free_object(mem, pst->font_envir, "pjl_font_envir");
+ gs_free_object(mem, pst->font_defaults, "pjl_font_defaults");
+ gs_free_object(mem, pst->defaults, "pjl_defaults");
+ gs_free_object(mem, pst->envir, "pjl_envir");
+ if ( pst->environment_font_path )
+ gs_free_object(mem, pst->environment_font_path, "pjl_state");
+ gs_free_object(mem, pst, "pjl_state");
+}
+
+/* delete a permanent soft font */
+ int
+pjl_register_permanent_soft_font_deletion(pjl_parser_state *pst, int font_number)
+{
+ if ( (font_number > MAX_PERMANENT_FONTS - 1) || (font_number < 0) ) {
+ dprintf("pjparse.c:pjl_register_permanent_soft_font_deletion() bad font number\n");
+ return 0;
+ }
+ /* if the font is present. */
+ if ( (pjl_permanent_soft_fonts[font_number >> 3]) & (128 >> (font_number & 7)) ) {
+ /* set the bit to zero to indicate the fontnumber has been deleted */
+ pjl_permanent_soft_fonts[font_number >> 3] &= ~(128 >> (font_number & 7));
+ /* if the current font source is 'S' and the current font number
+ is the highest number, and *any* soft font was deleted or if
+ the last font has been removed, set the stage for changing to
+ the next priority font source. BLAME HP not me. */
+ {
+ bool is_S = !pjl_compare(pjl_get_envvar(pst, "fontsource"), "S");
+ bool empty = true;
+ int highest_fontnumber = -1;
+ int current_fontnumber = pjl_vartoi(pjl_get_envvar(pst, "fontnumber"));
+ int i;
+ /* check for no more fonts and the highest font number.
+ NB should look at longs not bits in the loop */
+ for ( i = 0; i < MAX_PERMANENT_FONTS; i++ )
+ if ( (pjl_permanent_soft_fonts[i >> 3]) & (128 >> (i & 7)) ) {
+ empty = false;
+ highest_fontnumber = i;
+ }
+ if ( is_S && ((highest_fontnumber == current_fontnumber) || empty) ) {
+#define SINDEX 4
+ pst->font_defaults[SINDEX].fontnumber[0] = '\0';
+ pst->font_envir[SINDEX].fontnumber[0] = '\0';
+ return 1;
+#undef SINDEX
+ }
+ }
+ }
+ return 0;
+}
+
+/* request that pjl add a soft font and return a pjl font number for
+ the font. */
+ int
+pjl_register_permanent_soft_font_addition(pjl_parser_state *pst)
+{
+ /* Find an empty slot in the table. We have no HP documentation
+ that says how a soft font gets associated with a font number */
+ int font_num;
+ bool slot_found;
+ for ( font_num = 0; font_num < MAX_PERMANENT_FONTS; font_num++ )
+ if ( !((pjl_permanent_soft_fonts[font_num >> 3]) & (128 >> (font_num & 7))) ) {
+ slot_found = true;
+ break;
+ }
+ /* yikes, shouldn't happen */
+ if ( !slot_found ) {
+ dprintf("pjparse.c:pjl_register_permanent_soft_font_addition()\
+ font table full recycling font number 0\n");
+ font_num = 0;
+ }
+ /* set the bit to 1 to indicate the fontnumber has been added */
+ pjl_permanent_soft_fonts[font_num >> 3] |= (128 >> (font_num & 7));
+ return font_num;
+}
diff --git a/pl/pjparse.h b/pl/pjparse.h
new file mode 100644
index 000000000..33c8b2112
--- /dev/null
+++ b/pl/pjparse.h
@@ -0,0 +1,122 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* A simplified version of the PJL parser and states for demonstration
+ purposes. It implements a subset of pjl - specifically PDL
+ settable PJL environmant variables. Clients should initialize the
+ pjl parser with pjl_process_init() and release it with
+ pjl_process_destroy(). The principle means of receiving
+ environment variables is by the function call pjl_get_envvar() see
+ below. The return value of this function call will return the
+ appropriate environment value requested. Note there is no
+ mechanism for clients to receive pjl default or factory default
+ setting. We assume clients are PDL's and only have to
+ reset their state values to the pjl environment. See PJLTRM for
+ more details */
+
+#ifndef pjparse_INCLUDED
+# define pjparse_INCLUDED
+
+#include "scommon.h" /* stream_cursor_read */
+
+/* opaque definition for the parser state */
+typedef struct pjl_parser_state_s pjl_parser_state;
+
+/* type definition for environment variable */
+#ifndef PJL_ENVAR_T
+#define PJL_ENVAR_T
+typedef char pjl_envvar_t;
+#endif /* PJL_ENVVAR_T */
+/* ---------------- Procedural interface ---------------- */
+
+/* Initialize the PJL parser and state. */
+pjl_parser_state *pjl_process_init(gs_memory_t *mem);
+
+/* Destroy an instance of the the PJL parser and state. */
+void pjl_process_destroy(pjl_parser_state *pst, gs_memory_t *mem);
+
+/* Process a buffer of PJL commands. */
+/* Return 1 if we are no longer in PJL mode. */
+int pjl_process(pjl_parser_state *pst, void *pstate,
+ stream_cursor_read *pr);
+
+/* Discard the remainder of a job. Return true when we reach a UEL. */
+/* The input buffer must be at least large enough to hold an entire UEL. */
+bool pjl_skip_to_uel(stream_cursor_read *pr);
+/* return the current setting of a pjl environment variable. The
+ input parameter should be the exact string used in PJLTRM.
+ Sample Usage:
+ char *formlines = pjl_get_envvar(pst, "formlines");
+ if (formlines) {
+ int fl = atoi(formlines);
+ .
+ .
+ }
+ Both variables and values are case insensitive.
+*/
+pjl_envvar_t *pjl_get_envvar(pjl_parser_state *pst, const char *pjl_var);
+
+/* compare a pjl environment variable to a string values. */
+int pjl_compare(const pjl_envvar_t *s1, const char *s2);
+
+/* map a pjl symbol set name to a pcl integer */
+int pjl_map_pjl_sym_to_pcl_sym(const pjl_envvar_t *symname);
+
+/* pjl environment variable to integer. */
+int pjl_vartoi(const pjl_envvar_t *s);
+
+/* pjl envioronment variable to float. */
+floatp pjl_vartof(const pjl_envvar_t *s);
+
+/* convert a pjl designated fontsource to a subdirectory pathname. */
+char *pjl_fontsource_to_path(const pjl_parser_state *pjls,
+ const pjl_envvar_t *fontsource);
+
+/* Change to next highest priority font source. The following events
+ automatically change the value of the FONTSOURCE variable to the
+ next highest priority font source containing a default-marked font:
+ if the currently set font source is C, C1, or C2, and the cartridge
+ is removed from the printer; if the currently set font source is S
+ and all soft fonts are deleted; if the currently set font source is
+ S, while the currently set font number is the highest-numbered soft
+ font, and any soft font is deleted. Ideally this function would be
+ solely responsible for these activities, with the current
+ architecture we depend in part on pcl to keep up with font resource
+ bookkeeping. PJLTRM is not careful to define distinguish between
+ default font source vs environment font source. Both are set when
+ the font source is changed. */
+void pjl_set_next_fontsource(pjl_parser_state* pst);
+
+/* tell pjl that a soft font is being deleted. We return 0 if no
+ state change is required and 1 if the pdl should update its font
+ state. (see discussion above) */
+int pjl_register_permanent_soft_font_deletion(pjl_parser_state *pst, int font_number);
+
+/* request that pjl add a soft font and return a pjl font number for
+ the font. */
+int pjl_register_permanent_soft_font_addition(pjl_parser_state *pst);
+
+/* set the initial environment to the default environment, this should
+ be done at the beginning of each job */
+void pjl_set_init_from_defaults(pjl_parser_state *pst);
+
+/* returns the size of an named resource, presumably the client can
+ use this number (bytes) to allocate memory for the object. 0
+ returned if the object is not found */
+long int pjl_get_named_resource_size(pjl_parser_state *pst, char *name);
+
+/* returns the contents of the resource in "mem" allocated by the
+ client. Returns < 0 if it fails to find the object */
+int pjl_get_named_resource(pjl_parser_state *pst, char *name, byte *data);
+
+#endif /* pjparse_INCLUDED */
diff --git a/pl/pjparsei.c b/pl/pjparsei.c
new file mode 100644
index 000000000..bd5720339
--- /dev/null
+++ b/pl/pjparsei.c
@@ -0,0 +1,413 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pjparsei.c PJL parser implementation glue file (To pjparse.c) */
+
+#include "string_.h"
+#include "gserrors.h"
+#include "pjtop.h"
+#include "pjparse.h"
+#include "plparse.h"
+#include "plver.h"
+
+/*
+ * PJL interpeter: derived from pl_interp_t
+ */
+typedef struct pjl_interp_s {
+ pl_interp_t pl; /* common part: must be first */
+ gs_memory_t *memory; /* memory allocator to use */
+} pjl_interp_t;
+
+/*
+ * PJL interpreter instance: derived from pl_interp_instance_t
+ */
+typedef struct pjl_interp_instance_s {
+ pl_interp_instance_t pl; /* common part: must be first */
+ gs_memory_t *memory; /* memory allocator to use */
+ pjl_parser_state *state; /* parser's state */
+} pjl_interp_instance_t;
+
+
+/* Get implemtation's characteristics */
+const pl_interp_characteristics_t * /* always returns a descriptor */
+pjl_impl_characteristics(
+ const pl_interp_implementation_t *impl /* implementation of interpereter to alloc */
+)
+{
+ static const pl_interp_characteristics_t pjl_characteristics = {
+ "PJL",
+ "",
+ "Artifex",
+ PJLVERSION,
+ PJLBUILDDATE,
+ 17 /* sizeof min buffer == sizeof UEL */
+ };
+ return &pjl_characteristics;
+}
+
+/* Allocate a PJL interp */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_allocate_interp(
+ pl_interp_t **interp, /* RETURNS abstract interpreter struct */
+ const pl_interp_implementation_t *impl, /* implementation of interpereter to alloc */
+ gs_memory_t *mem /* allocator to allocate interp from */
+)
+{
+ /* Allocate an interpreter */
+ pjl_interp_t *pjl /****** SHOULD HAVE A STRUCT DESCRIPTOR ******/
+ = (pjl_interp_t *)gs_alloc_bytes( mem,
+ sizeof(pjl_interp_t),
+ "pjl_impl_allocate_interp(pjl_interp_t)"
+ );
+ if (pjl == 0)
+ return gs_error_VMerror;
+ pjl->memory = mem;
+ *interp = (pl_interp_t *)pjl;
+ return 0; /* success */
+}
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_allocate_interp_instance(
+ pl_interp_instance_t **instance, /* RETURNS instance struct */
+ pl_interp_t *interp, /* dummy interpreter */
+ gs_memory_t *mem /* allocator to allocate instance from */
+)
+{
+ /* Allocate everything up front */
+ pjl_interp_instance_t *pjli /****** SHOULD HAVE A STRUCT DESCRIPTOR ******/
+ = (pjl_interp_instance_t *)gs_alloc_bytes( mem,
+ sizeof(pjl_interp_instance_t),
+ "pjl_impl_allocate_interp_instance(pjl_interp_instance_t)"
+ );
+ pjl_parser_state *pjls = pjl_process_init(mem);
+
+ /* If any allocation error simply return */
+ if (!pjli || !pjls)
+ return gs_error_VMerror;
+
+ /* Setup pointers to allocated mem within instance */
+ pjli->state = pjls;
+ pjli->memory = mem;
+
+ /* Return success */
+ *instance = (pl_interp_instance_t *)pjli;
+ return 0;
+}
+
+/* Set a client language into an interperter instance */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_set_client_instance(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_interp_instance_t *client, /* client to set */
+ pl_interp_instance_clients_t which_client
+)
+{
+ return 0;
+}
+
+/* Set a device into an interperter instance */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_set_device(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gx_device *device /* device to set (open or closed) */
+)
+{
+ return gs_error_undefined; /* this operation is undefined for PJL */
+}
+
+/* Set an interpreter instance's pre-page action */
+int /* ret 0 ok, else -ve err */
+pjl_impl_set_pre_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute */
+ void *closure /* closure to call action with */
+)
+{
+ return gs_error_undefined; /* this operation is undefined for PJL */
+}
+
+/* Set an interpreter instance's post-page action */
+int /* ret 0 ok, else -ve err */
+pjl_impl_set_post_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute */
+ void *closure /* closure to call action with */
+)
+{
+ return gs_error_undefined; /* this operation is undefined for PJL */
+}
+
+static int
+pjl_impl_get_device_memory(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gs_memory_t **pmem)
+{
+ return 0;
+}
+
+
+/* Prepare interp instance for the next "job" */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_init_job(
+ pl_interp_instance_t *instance /* interp instance to start job in */
+)
+{
+ int code = 0;
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)instance;
+ if (pjli->state == 0)
+ code = gs_error_VMerror;
+ /* copy the default state to the initial state */
+ pjl_set_init_from_defaults(pjli->state);
+ return code;
+}
+
+/* Parse a cursor-full of data */
+int /* The parser reads data from the input
+ * buffer and returns either:
+ * >=0 - OK, more input is needed.
+ * e_ExitLanguage - Non-PJL was detected.
+ * <0 value - an error was detected.
+ */
+pjl_impl_process(
+ pl_interp_instance_t *instance, /* interp instance to process data job in */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)instance;
+ int code = pjl_process(pjli->state, NULL, cursor);
+ return code == 1 ? e_ExitLanguage : code;
+}
+
+/* Skip to end of job ret 1 if done, 0 ok but EOJ not found, else -ve error code */
+int
+pjl_impl_flush_to_eoj(
+ pl_interp_instance_t *instance, /* interp instance to flush for */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ return pjl_skip_to_uel(cursor) ? 1 : 0;
+}
+
+/* Parser action for end-of-file */
+int /* ret 0 or +ve if ok, else -ve error code */
+pjl_impl_process_eof(
+ pl_interp_instance_t *instance /* interp instance to process data job in */
+)
+{
+ return 0;
+}
+
+/* Report any errors after running a job */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_report_errors(
+ pl_interp_instance_t *instance, /* interp instance to wrap up job in */
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+)
+{
+ return 0;
+}
+
+/* Wrap up interp instance after a "job" */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_dnit_job(
+ pl_interp_instance_t *instance /* interp instance to wrap up job in */
+)
+{
+ int code = 0;
+ return code;
+}
+
+/* Remove a device from an interperter instance */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_remove_device(
+ pl_interp_instance_t *instance /* interp instance to use */
+)
+{
+ return gs_error_undefined; /* this operation is undefined for PJL */
+}
+
+/* Deallocate a interpreter instance */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_deallocate_interp_instance(
+ pl_interp_instance_t *instance /* instance to dealloc */
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)instance;
+ gs_memory_t *mem = pjli->memory;
+
+ pjl_process_destroy(pjli->state, mem);
+ gs_free_object(mem, pjli, "pjl_impl_deallocate_interp_instance(pjl_interp_instance_t)");
+
+ return 0;
+}
+
+/* Do static deinit of PJL interpreter */
+int /* ret 0 ok, else -ve error code */
+pjl_impl_deallocate_interp(
+ pl_interp_t *interp /* interpreter to deallocate */
+)
+{
+ pjl_interp_t *pi = (pjl_interp_t *)interp;
+ gs_memory_t *mem = pi->memory;
+ gs_free_object(mem, pi, "pjl_impl_deallocte_interp(pjl_interp_t)");
+
+ return 0;
+}
+
+/* return the current setting of a pjl environment variable. */
+pjl_envvar_t *
+pjl_impl_get_envvar(
+ pl_interp_instance_t *pli,
+ const char *pjl_var
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ return pjl_get_envvar(pjli->state, pjl_var);
+}
+
+/* compare a pjl environment variable to a string values. */
+int
+pjl_impl_compare(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *s1,
+ const char *s2
+)
+{
+ return pjl_compare(s1, s2);
+}
+
+/* map a pjl symbol set name to a pcl integer */
+int
+pjl_impl_map_pjl_sym_to_pcl_sym(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *symname
+)
+{
+ return pjl_map_pjl_sym_to_pcl_sym(symname);
+}
+
+/* pjl environment variable to integer. */
+int
+pjl_impl_vartoi(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *s
+)
+{
+ return pjl_vartoi(s);
+}
+
+/* pjl envioronment variable to float. */
+floatp
+pjl_impl_vartof(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *s
+)
+{
+ return pjl_vartof(s);
+}
+
+/* convert a pjl designated fontsource to a subdirectory pathname. */
+char *
+pjl_impl_fontsource_to_path(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *fontsource
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ return pjl_fontsource_to_path(pjli->state, fontsource);
+}
+
+/* Change to next highest priority font source. */
+void
+pjl_impl_set_next_fontsource(
+ pl_interp_instance_t *pli
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ pjl_set_next_fontsource(pjli->state);
+}
+
+/* tell pjl that a soft font is being deleted. */
+int
+pjl_impl_register_permanent_soft_font_deletion(
+ pl_interp_instance_t *pli,
+ int font_number
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ return pjl_register_permanent_soft_font_deletion(pjli->state, font_number);
+}
+
+
+/* request that pjl add a soft font and return a pjl font number for the font. */
+int
+pjl_impl_register_permanent_soft_font_addition(
+ pl_interp_instance_t *pli
+)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ return pjl_register_permanent_soft_font_addition(pjli->state);
+}
+
+long int
+pjl_impl_get_named_resource_size(pl_interp_instance_t *pli, char *name)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ return pjl_get_named_resource_size(pjli->state, name);
+}
+
+int
+pjl_impl_get_named_resource(pl_interp_instance_t *pli, char *name, unsigned char *data)
+{
+ pjl_interp_instance_t *pjli = (pjl_interp_instance_t *)pli;
+ return pjl_get_named_resource(pjli->state, name, data);
+}
+
+
+/* Parser implementation descriptor */
+pjl_implementation_t pjl_implementation = {
+ /* Generic language parser portion */
+ { pjl_impl_characteristics,
+ pjl_impl_allocate_interp,
+ pjl_impl_allocate_interp_instance,
+ pjl_impl_set_client_instance,
+ pjl_impl_set_pre_page_action,
+ pjl_impl_set_post_page_action,
+ pjl_impl_set_device,
+ pjl_impl_init_job,
+ pjl_impl_process,
+ pjl_impl_flush_to_eoj,
+ pjl_impl_process_eof,
+ pjl_impl_report_errors,
+ pjl_impl_dnit_job,
+ pjl_impl_remove_device,
+ pjl_impl_deallocate_interp_instance,
+ pjl_impl_deallocate_interp,
+ pjl_impl_get_device_memory,
+ },
+ /* PJL-specific portion */
+ pjl_impl_get_envvar,
+ pjl_impl_compare,
+ pjl_impl_map_pjl_sym_to_pcl_sym,
+ pjl_impl_vartoi,
+ pjl_impl_vartof,
+ pjl_impl_fontsource_to_path,
+ pjl_impl_set_next_fontsource,
+ pjl_impl_register_permanent_soft_font_deletion,
+ pjl_impl_register_permanent_soft_font_addition,
+ pjl_impl_get_named_resource_size,
+ pjl_impl_get_named_resource
+};
diff --git a/pl/pjtop.c b/pl/pjtop.c
new file mode 100644
index 000000000..30c93df66
--- /dev/null
+++ b/pl/pjtop.c
@@ -0,0 +1,130 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pjtop.c */
+/* Interface to PJL-specific portions parser */
+
+#include "string_.h"
+#include "pjtop.h"
+
+/* return the current setting of a pjl environment variable. */
+pjl_envvar_t *
+pjl_proc_get_envvar(
+ pl_interp_instance_t *pli,
+ const char *pjl_var
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_get_envvar(pli, pjl_var);
+}
+
+/* compare a pjl environment variable to a string values. */
+int
+pjl_proc_compare(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *s1,
+ const char *s2
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_compare(pli, s1, s2);
+}
+
+/* map a pjl symbol set name to a pcl integer */
+int
+pjl_proc_map_pjl_sym_to_pcl_sym(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *symname
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_map_pjl_sym_to_pcl_sym(pli, symname);
+}
+
+/* pjl environment variable to integer. */
+int
+pjl_proc_vartoi(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *s
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_vartoi(pli, s);
+}
+
+/* pjl envioronment variable to float. */
+floatp
+pjl_proc_vartof(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *s
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_vartof(pli, s);
+}
+
+/* convert a pjl designated fontsource to a subdirectory pathname. */
+char *
+pjl_proc_fontsource_to_path(
+ pl_interp_instance_t *pli,
+ const pjl_envvar_t *fontsource
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_fontsource_to_path(pli, fontsource);
+}
+
+/* Change to next highest priority font source. */
+void
+pjl_proc_set_next_fontsource(
+ pl_interp_instance_t *pli
+)
+{
+ ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_set_next_fontsource(pli);
+}
+
+/* tell pjl that a soft font is being deleted. */
+int
+pjl_proc_register_permanent_soft_font_deletion(
+ pl_interp_instance_t *pli,
+ int font_number
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_register_permanent_soft_font_deletion(pli, font_number);
+}
+
+/* request that pjl add a soft font and return a pjl font number for the font. */
+int
+pjl_proc_register_permanent_soft_font_addition(
+ pl_interp_instance_t *pli
+)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_register_permanent_soft_font_addition(pli);
+}
+
+long int
+pjl_proc_get_named_resource_size(pl_interp_instance_t *pli, char *name)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_get_named_resource_size(pli, name);
+}
+
+int
+pjl_proc_get_named_resource(pl_interp_instance_t *pli, char *name, byte *data)
+{
+ return ((pjl_implementation_t *)pli->interp->implementation)
+ ->proc_get_named_resource(pli, name, data);
+}
diff --git a/pl/pjtop.h b/pl/pjtop.h
new file mode 100644
index 000000000..1c396794f
--- /dev/null
+++ b/pl/pjtop.h
@@ -0,0 +1,130 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pjtop.h */
+/* Interface to PJL parser */
+
+#ifndef pjtop_INCLUDED
+# define pjtop_INCLUDED
+
+#include "pltop.h"
+
+/*
+ * Generic PJL data types which may be subclassed by specific implementations
+ */
+struct pjl_implementation_s; /* fwd decl */
+
+#ifndef PJL_ENVAR_T
+#define PJL_ENVAR_T
+typedef char pjl_envvar_t; /* opaque decl */
+#endif /* PJL_ENVVAR_T */
+
+/*
+ * Define PJL-specific procedures
+ */
+/* return the current setting of a pjl environment variable. The
+ input parameter should be the exact string used in PJLTRM.
+ Sample Usage:
+ char *formlines = pjl_get_envvar(pst, "formlines");
+ if (formlines) {
+ int fl = atoi(formlines);
+ .
+ .
+ }
+ Both variables and values are case insensitive.
+*/
+typedef pjl_envvar_t * (*pjl_proc_get_envvar_t)(pl_interp_instance_t *pli, const char *pjl_var);
+pjl_envvar_t * pjl_proc_get_envvar(pl_interp_instance_t *pli, const char *pjl_var);
+
+/* compare a pjl environment variable to a string values. */
+typedef int (*pjl_proc_compare_t)(pl_interp_instance_t *pli, const pjl_envvar_t *s1, const char *s2);
+int pjl_proc_compare(pl_interp_instance_t *pli, const pjl_envvar_t *s1, const char *s2);
+
+/* map a pjl symbol set name to a pcl integer */
+typedef int (*pjl_proc_map_pjl_sym_to_pcl_sym_t)(pl_interp_instance_t *pli, const pjl_envvar_t *symname);
+int pjl_proc_map_pjl_sym_to_pcl_sym(pl_interp_instance_t *pli, const pjl_envvar_t *symname);
+
+/* pjl environment variable to integer. */
+typedef int (*pjl_proc_vartoi_t)(pl_interp_instance_t *pli, const pjl_envvar_t *s);
+int pjl_proc_vartoi(pl_interp_instance_t *pli, const pjl_envvar_t *s);
+
+/* pjl envioronment variable to float. */
+typedef floatp (*pjl_proc_vartof_t)(pl_interp_instance_t *pli, const pjl_envvar_t *s);
+floatp pjl_proc_vartof(pl_interp_instance_t *pli, const pjl_envvar_t *s);
+
+/* convert a pjl designated fontsource to a subdirectory pathname. */
+typedef char * (*pjl_proc_fontsource_to_path_t)(pl_interp_instance_t *pli,
+ const pjl_envvar_t *fontsource);
+char * pjl_proc_fontsource_to_path(pl_interp_instance_t *pli,
+ const pjl_envvar_t *fontsource);
+
+/* Change to next highest priority font source. The following events
+ automatically change the value of the FONTSOURCE variable to the
+ next highest priority font source containing a default-marked font:
+ if the currently set font source is C, C1, or C2, and the cartridge
+ is removed from the printer; if the currently set font source is S
+ and all soft fonts are deleted; if the currently set font source is
+ S, while the currently set font number is the highest-numbered soft
+ font, and any soft font is deleted. Ideally this function would be
+ solely responsible for these activities, with the current
+ architecture we depend in part on pcl to keep up with font resource
+ bookkeeping. PJLTRM is not careful to define distinguish between
+ default font source vs environment font source. Both are set when
+ the font source is changed. */
+typedef void (*pjl_proc_set_next_fontsource_t)(pl_interp_instance_t *pli);
+void pjl_proc_set_next_fontsource(pl_interp_instance_t *pli);
+
+/* tell pjl that a soft font is being deleted. We return 0 if no
+ state change is required and 1 if the pdl should update its font
+ state. (see discussion above) */
+typedef int (*pjl_proc_register_permanent_soft_font_deletion_t)(pl_interp_instance_t *pli,
+ int font_number);
+int pjl_proc_register_permanent_soft_font_deletion(pl_interp_instance_t *pli,
+ int font_number);
+
+/* request that pjl add a soft font and return a pjl font number for
+ the font. */
+typedef int (*pjl_proc_register_permanent_soft_font_addition_t)(pl_interp_instance_t *pli);
+int pjl_proc_register_permanent_soft_font_addition(pl_interp_instance_t *pli);
+
+typedef long int (*pjl_proc_get_named_resource_size_t)(pl_interp_instance_t *pli, char *name);
+long int pjl_proc_get_named_resource_size(pl_interp_instance_t *pli, char *name);
+
+typedef int (*pjl_proc_get_named_resource_t)(pl_interp_instance_t *pli, char *name, byte *data);
+int pjl_proc_get_named_resource(pl_interp_instance_t *pli, char *name, byte *data);
+
+/*
+ * Define a generic interpreter implementation
+ */
+typedef struct pjl_implementation_s {
+ pl_interp_implementation_t pl; /* MUST BE FIRST generic impl */
+
+ /* PJL-specific procedure vector */
+ pjl_proc_get_envvar_t proc_get_envvar;
+ pjl_proc_compare_t proc_compare;
+ pjl_proc_map_pjl_sym_to_pcl_sym_t proc_map_pjl_sym_to_pcl_sym;
+ pjl_proc_vartoi_t proc_vartoi;
+ pjl_proc_vartof_t proc_vartof;
+ pjl_proc_fontsource_to_path_t proc_fontsource_to_path;
+ pjl_proc_set_next_fontsource_t proc_set_next_fontsource;
+ pjl_proc_register_permanent_soft_font_deletion_t proc_register_permanent_soft_font_deletion;
+ pjl_proc_register_permanent_soft_font_addition_t proc_register_permanent_soft_font_addition;
+ pjl_proc_get_named_resource_size_t proc_get_named_resource_size;
+ pjl_proc_get_named_resource_t proc_get_named_resource;
+
+
+} pjl_implementation_t;
+
+
+#endif /* pjtop_INCLUDED */
+
diff --git a/pl/pl.mak b/pl/pl.mak
new file mode 100644
index 000000000..239cff225
--- /dev/null
+++ b/pl/pl.mak
@@ -0,0 +1,303 @@
+# Copyright (C) 1996, 1997, 1998 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# makefile for PCL* interpreter libraries and for PJL.
+# Users of this makefile must define the following:
+# GLSRCDIR - the GS library source directory
+# GLGENDIR - the GS library generated file directory
+# PLSRCDIR - the source directory
+# PLOBJDIR - the object / executable directory
+
+PLSRC=$(PLSRCDIR)$(D)
+PLOBJ=$(PLOBJDIR)$(D)
+PLO_=$(O_)$(PLOBJ)
+GLGEN=$(GLGENDIR)$(D)
+
+PLCCC=$(CC_) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(I_)$(GLGENDIR)$(_I) $(C_)
+
+# Define the name of this makefile.
+PL_MAK=$(PLSRC)pl.mak
+
+pl.clean: pl.config-clean pl.clean-not-config-clean
+
+pl.clean-not-config-clean:
+ $(RM_) $(PLOBJ)*.$(OBJ)
+
+pl.config-clean:
+ $(RM_) $(PLOBJ)*.dev
+
+########### Common definitions ######
+pltop_h=$(PLSRC)pltop.h $(scommon_h) $(gsgc_h)
+pltoputl_h=$(PLSRC)pltoputl.h $(scommon_h)
+
+
+################ Shared library include definitions ################
+
+pldebug_h=$(PLSRC)pldebug.h
+pldict_h=$(PLSRC)pldict.h
+pldraw_h=$(PLSRC)pldraw.h $(gsiparam_h)
+plht_h=$(PLSRC)plht.h
+pllfont_h=$(PLSRC)pllfont.h
+plmain_h=$(PLSRC)plmain.h $(gsargs_h) $(gsgc_h)
+plplatf_h=$(PLSRC)plplatf.h
+plparse_h=$(PLSRC)plparse.h $(scommon_h)
+plsymbol_h=$(PLSRC)plsymbol.h
+plsrgb_h=$(PLSRC)plsrgb.h
+plvalue_h=$(PLSRC)plvalue.h
+plvocab_h=$(PLSRC)plvocab.h
+romfnttab_h=$(PLSRC)romfnttab.h
+# Out of order because of inclusion
+plfont_h=$(PLSRC)plfont.h $(gsccode_h) $(plsymbol_h)
+
+################ PJL ################
+
+
+PJLVERSION="1.53 (unreleased snapshot)"
+
+# Translate pjl file system volume "0:" to a directory of your choice
+# Use forward slash '/' not '\\'; no trailing slash
+# PJL_VOLUME_0=./foo
+# PJL_VOLUME_0=/tmp/pjl0
+# PJL_VOLUME_0=c:/pjl_volume_0
+
+PJL_VOLUME_0=/tmp/pjl0
+PJL_VOLUME_1=/tmp/pjl1
+
+plver_h=$(PLSRC)plver.h
+
+$(PLSRC)plver.h: $(PLSRC)pl.mak
+ $(GLGEN)echogs$(XE) -e .h -w $(PLSRC)plver -n -x 23 "define PJLVERSION"
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -s -x 22 $(PJLVERSION) -x 22
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -n -x 23 "define PJLBUILDDATE"
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -s -x 22 -d -x 22
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -n -x 23 "define PJL_VOLUME_0"
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -s -x 22 $(PJL_VOLUME_0) -x 22
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -n -x 23 "define PJL_VOLUME_1"
+ $(GLGEN)echogs$(XE) -e .h -a $(PLSRC)plver -s -x 22 $(PJL_VOLUME_1) -x 22
+
+pjparse_h=$(PLSRC)pjparse.h
+pjtop_h=$(PLSRC)pjtop.h $(pltop_h)
+
+$(PLOBJ)pjparse.$(OBJ): $(PLSRC)pjparse.c\
+ $(ctype__h) \
+ $(stat__h) \
+ $(memory__h) \
+ $(scommon_h) \
+ $(gdebug_h) \
+ $(gp_h) \
+ $(pjparse_h) \
+ $(plfont_h) \
+ $(plver_h)
+ $(PLCCC) $(PLSRC)pjparse.c $(PLO_)pjparse.$(OBJ)
+
+$(PLOBJ)pjparsei.$(OBJ): $(PLSRC)pjparsei.c \
+ $(string__h) $(pjtop_h) $(pjparse_h) $(plparse_h) $(string__h) $(gserrors_h) $(plver_h)
+ $(PLCCC) $(PLSRC)pjparsei.c $(PLO_)pjparsei.$(OBJ)
+
+$(PLOBJ)pjtop.$(OBJ): $(PLSRC)pjtop.c $(AK) $(pjtop_h) $(string__h)
+ $(PLCCC) $(PLSRC)pjtop.c $(PLO_)pjtop.$(OBJ)
+
+pjl_obj=$(PLOBJ)pjparse.$(OBJ) $(PLOBJ)pjparsei.$(OBJ) $(PLOBJ)pjtop.$(OBJ) $(PLOBJ)pltop.$(OBJ)
+$(PLOBJ)pjl.dev: $(PL_MAK) $(ECHOGS_XE) $(pjl_obj)
+ $(SETMOD) $(PLOBJ)pjl $(pjl_obj)
+
+################ Shared libraries ################
+
+pldebug_h=$(PLSRC)pldebug.h
+pldict_h=$(PLSRC)pldict.h
+pldraw_h=$(PLSRC)pldraw.h $(gsiparam_h)
+pllfont_h=$(PLSRC)pllfont.h
+plmain_h=$(PLSRC)plmain.h $(gsargs_h) $(gsgc_h)
+plplatf_h=$(PLSRC)plplatf.h
+plparse_h=$(PLSRC)plparse.h $(scommon_h)
+plsymbol_h=$(PLSRC)plsymbol.h
+plvalue_h=$(PLSRC)plvalue.h
+plvocab_h=$(PLSRC)plvocab.h
+romfnttab_h=$(PLSRC)romfnttab.h
+# Out of order because of inclusion
+plfont_h=$(PLSRC)plfont.h $(gsccode_h) $(plsymbol_h)
+
+# artifex character module.
+$(PLOBJ)plchar.$(OBJ): $(PLSRC)plchar.c $(AK) $(math__h) $(memory__h) $(stdio__h)\
+ $(gdebug_h)\
+ $(gsbittab_h) $(gschar_h) $(gscoord_h) $(gserror_h) $(gserrors_h) $(gsimage_h)\
+ $(gsmatrix_h) $(gsmemory_h) $(gspaint_h) $(gspath_h)\
+ $(gsstate_h) $(gsstruct_h) $(gstypes_h)\
+ $(gxarith_h) $(gxchar_h) $(gxfcache_h) $(gxdevice_h) $(gxdevmem_h)\
+ $(gxfixed_h) $(gxfont_h) $(gxfont42_h) $(gxpath_h) $(gzstate_h)\
+ $(plfont_h) $(plvalue_h)
+ $(PLCCC) $(PLSRC)plchar.c $(PLO_)plchar.$(OBJ)
+
+# agfa ufst character module.
+$(PLOBJ)pluchar.$(OBJ): $(PLSRC)pluchar.c $(AK) $(math__h) $(memory__h) $(stdio__h)\
+ $(gdebug_h)\
+ $(gsbittab_h) $(gschar_h) $(gscoord_h) $(gserror_h) $(gserrors_h) $(gsimage_h)\
+ $(gsmatrix_h) $(gsmemory_h) $(gspaint_h) $(gspath_h)\
+ $(gsstate_h) $(gsstruct_h) $(gstypes_h)\
+ $(gxarith_h) $(gxchar_h) $(gxfcache_h) $(gxdevice_h) $(gxdevmem_h)\
+ $(gxpath_h) $(gxfixed_h) $(gxfont_h) $(gxfont42_h) $(gxpath_h) $(gzstate_h)\
+ $(gxchar_h) $(gxfcache_h) $(plfont_h) $(plvalue_h)
+ $(PLCCC) $(UFST_CFLAGS) $(UFST_INCLUDES) $(PLSRC)pluchar.c $(PLO_)pluchar.$(OBJ)
+
+$(PLOBJ)pldict.$(OBJ): $(PLSRC)pldict.c $(AK) $(memory__h)\
+ $(gsmemory_h) $(gsstruct_h) $(gstypes_h)\
+ $(pldict_h)
+ $(PLCCC) $(PLSRC)pldict.c $(PLO_)pldict.$(OBJ)
+
+$(PLOBJ)plht.$(OBJ): $(PLSRC)plht.c $(stdpre_h) $(plht_h) $(gxdevice_h)\
+ $(gsstate_h) $(gxtmap_h) $(gsmemory_h) $(gstypes_h) $(gxht_h)
+ $(PLCCC) $(PLSRC)plht.c $(PLO_)plht.$(OBJ)
+
+$(PLOBJ)plsrgb.$(OBJ): $(PLSRC)plsrgb.c $(math__h) $(string__h) $(plsrgb_h)\
+ $(gzstate_h) $(gxstate_h) $(gsparam_h) $(gscrd_h) $(gscrdp_h) $(gscie_h)\
+ $(gsstate_h) $(gscspace_h) $(gsmemory_h) $(gstypes_h)
+ $(PLCCC) $(PLSRC)plsrgb.c $(PLO_)plsrgb.$(OBJ)
+
+$(PLOBJ)pldraw.$(OBJ): $(PLSRC)pldraw.c $(AK) $(std_h)\
+ $(gsmemory_h) $(gstypes_h) $(gxdevice_h) $(gzstate_h)\
+ $(pldraw_h)
+ $(PLCCC) $(PLSRC)pldraw.c $(PLO_)pldraw.$(OBJ)
+
+
+#artifex font module.
+$(PLOBJ)plfont.$(OBJ): $(PLSRC)plfont.c $(AK) $(memory__h) $(stdio__h)\
+ $(gdebug_h) $(gp_h)\
+ $(gschar_h) $(gserror_h) $(gserrors_h) $(gsmatrix_h) $(gsmemory_h)\
+ $(gsstate_h) $(gsstruct_h) $(gsmatrix_h) $(gstypes_h) $(gsutil_h)\
+ $(gxfont_h) $(gxfont42_h)\
+ $(plfont_h) $(plvalue_h)
+ $(PLCCC) $(PLSRC)plfont.c $(PLO_)plfont.$(OBJ)
+
+#ufst font module.
+$(PLOBJ)plufont.$(OBJ): $(PLSRC)plufont.c $(AK) $(memory__h) $(stdio__h)\
+ $(gdebug_h)\
+ $(gschar_h) $(gserror_h) $(gserrors_h) $(gsmatrix_h) $(gsmemory_h)\
+ $(gsstate_h) $(gsstruct_h) $(gstypes_h) $(gsutil_h)\
+ $(gxfont_h) $(gxfont42_h)\
+ $(plfont_h) $(plvalue_h)
+ $(PLCCC) $(UFST_CFLAGS) $(UFST_INCLUDES) $(PLSRC)plufont.c $(PLO_)plufont.$(OBJ)
+
+$(PLOBJ)plplatf$(PLPLATFORM).$(OBJ): $(PLSRC)plplatf$(PLPLATFORM).c $(AK) $(string__h)\
+ $(string__h)\
+ $(gdebug_h) $(gp_h) $(gsio_h) $(gslib_h) $(gsmemory_h) $(gstypes_h)\
+ $(gsstruct_h) $(plplatf_h)
+ $(PLCCC) $(PLSRC)plplatf$(PLPLATFORM).c $(PLO_)plplatf$(PLPLATFORM).$(OBJ)
+
+plftable_h=$(PLSRC)plftable.h
+
+# hack - need ufst included for -DAGFA_FONT_TABLE
+$(PLOBJ)plftable.$(OBJ): $(PLSRC)plftable.c $(AK) $(plftable_h)\
+ $(ctype__h) $(gstypes_h) $(plfont_h)
+ $(PLCCC) $(UFST_INCLUDES) $(PLSRC)plftable.c $(PLO_)plftable.$(OBJ)
+
+$(PLOBJ)pltop.$(OBJ): $(PLSRC)pltop.c $(AK) $(string__h)\
+ $(gdebug_h) $(gsnogc_h) $(gsdevice_h) $(gsmemory_h) $(gsstruct_h)\
+ $(gstypes_h) $(pltop_h)
+ $(PLCCC) $(PLSRC)pltop.c $(PLO_)pltop.$(OBJ)
+
+$(PLOBJ)pltoputl.$(OBJ): $(PLSRC)pltoputl.c $(AK) $(string__h)\
+ $(gdebug_h) $(gsmemory_h) $(gstypes_h) $(gsstruct_h) $(pltoputl_h)
+ $(PLCCC) $(PLSRC)pltoputl.c $(PLO_)pltoputl.$(OBJ)
+
+$(PLOBJ)plsymbol.$(OBJ): $(PLSRC)plsymbol.c $(AK) $(stdpre_h)\
+ $(std_h) $(gdebug_h) $(plsymbol_h) $(plvocab_h) $(plvalue_h)
+ $(PLCCC) $(PLSRC)plsymbol.c $(PLO_)plsymbol.$(OBJ)
+
+$(PLOBJ)plvalue.$(OBJ): $(PLSRC)plvalue.c $(AK) $(std_h)\
+ $(plvalue_h)
+ $(PLCCC) $(PLSRC)plvalue.c $(PLO_)plvalue.$(OBJ)
+
+$(PLOBJ)plvocab.$(OBJ): $(PLSRC)plvocab.c $(AK) $(stdpre_h)\
+ $(plvocab_h)
+ $(PLCCC) $(PLSRC)plvocab.c $(PLO_)plvocab.$(OBJ)
+
+plalloc_h=$(PLSRC)plalloc.h
+
+$(PLOBJ)plalloc.$(OBJ): $(PLSRC)plalloc.c $(AK) \
+ $(malloc__h) $(memory__h) $(gdebug_h)\
+ $(gsmalloc_h) $(gsmemret_h) $(gsstype_h)\
+ $(plalloc_h)
+ $(PLCCC) $(PLSRC)plalloc.c $(PLO_)plalloc.$(OBJ)
+
+# ufst font loading module.
+uconfig_h=$(PLOBJ)uconfig.h
+
+$(uconfig_h): $(PLSRC)pl.mak
+ $(GLGEN)echogs$(XE) -e .h -w $(PLOBJ)uconfig -x 23 "define UFSTFONTDIR" -s -x 22 $(UFSTFONTDIR) -x 22
+
+$(PLOBJ)plulfont.$(OBJ): $(PLSRC)plulfont.c $(pllfont_h) $(uconfig_h) $(AK)\
+ $(stdio__h) $(string__h) $(gpgetenv_h) $(gsmemory_h) $(gp_h) $(gstypes_h)\
+ $(plfont_h) $(pldict_h) $(pllfont_h) $(plvalue_h)\
+ $(plftable_h) $(uconfig_h)
+ $(PLCCC) $(UFST_CFLAGS) $(UFST_INCLUDES) $(PLSRC)plulfont.c $(PLO_)plulfont.$(OBJ)
+
+# artifex font loading module.
+$(PLOBJ)pllfont.$(OBJ): $(PLSRC)pllfont.c $(pllfont_h) $(AK)\
+ $(ctype__h) $(stdio__h) $(string__h)\
+ $(gx_h) $(gp_h) $(gsccode_h) $(gserrors_h) $(gsmatrix_h) $(gsutil_h)\
+ $(gxfont_h) $(gxfont42_h) $(plfont_h) $(pldict_h) $(plvalue_h) $(plftable_h)
+ $(PLCCC) $(PLSRC)pllfont.c $(PLO_)pllfont.$(OBJ)
+
+# artifex rom font loading module
+$(PLOBJ)pllrfont.$(OBJ): $(PLSRC)pllrfont.c $(pllfont_h) $(romfnttab_h) $(AK)\
+ $(ctype__h) $(stdio__h) $(string__h)\
+ $(gx_h) $(gp_h) $(gsccode_h) $(gserrors_h) $(gsmatrix_h) $(gsutil_h)\
+ $(gxfont_h) $(gxfont42_h) $(plfont_h) $(pldict_h) $(plvalue_h)\
+ $(plftable_h) $(zlib_h)
+ $(PLCCC) $(PLSRC)pllrfont.c $(PLO_)pllrfont.$(OBJ)
+
+pl_obj1=$(PLOBJ)pldict.$(OBJ) $(PLOBJ)pldraw.$(OBJ) $(PLOBJ)plsymbol.$(OBJ) $(PLOBJ)plvalue.$(OBJ) $(PLOBJ)plht.$(OBJ) $(PLOBJ)plsrgb.$(OBJ)
+pl_obj2=$(PLOBJ)plvocab.$(OBJ) $(PLOBJ)pltop.$(OBJ) $(PLOBJ)pltoputl.$(OBJ)
+pl_obj3=$(PLOBJ)plplatf$(PLPLATFORM).$(OBJ) $(PLOBJ)plalloc.$(OBJ)
+
+# shared objects - non font
+pl_obj=$(pl_obj1) $(pl_obj2) $(pl_obj3)
+
+# common (afs and ufst systems) font objects
+font_common_obj=$(PLOBJ)plchar.$(OBJ) $(PLOBJ)plfont.$(OBJ) $(PLOBJ)plftable.$(OBJ)
+
+# artifex specific objects
+afs_obj=$(font_common_obj) $(PLOBJ)pllfont.$(OBJ)
+
+# ufst specific objects
+ufst_obj=$(font_common_obj) $(PLOBJ)pluchar.$(OBJ) $(PLOBJ)plufont.$(OBJ) $(PLOBJ)plulfont.$(OBJ)
+
+# artifex font device.
+$(PLOBJ)afs.dev: $(PL_MAK) $(ECHOGS_XE) $(afs_obj)
+ $(SETMOD) $(PLOBJ)afs $(afs_obj)
+
+# ufst font device. the libraries are expected to be linked in the
+# main platform makefile.
+$(PLOBJ)ufst.dev: $(PL_MAK) $(ECHOGS_XE) $(ufst_obj)
+ $(SETMOD) $(PLOBJ)ufst $(ufst_obj)
+
+
+### BROKEN #####
+# Bitstream font device
+$(PLOBJ)bfs.dev: $(PL_MAK) $(ECHOGS_XE) $(pl_obj1) $(pl_obj2)
+ $(SETMOD) $(PLOBJ)bfs $(pl_obj1) $(pl_obj2)
+### END BROKEN ###
+
+$(PLOBJ)pl.dev: $(PL_MAK) $(ECHOGS_XE) $(pl_obj)
+ $(SETMOD) $(PLOBJ)pl $(pl_obj1)
+ $(ADDMOD) $(PLOBJ)pl $(pl_obj2)
+ $(ADDMOD) $(PLOBJ)pl $(pl_obj3)
+ $(ADDMOD) $(PLOBJ)pl -include $(PLOBJ)$(PL_SCALER)
+
+###### Command-line driver's main program #####
+
+$(PLOBJ)plmain.$(OBJ): $(PLSRC)plmain.c $(AK) $(string__h)\
+ $(gdebug_h) $(gscdefs_h) $(gsio_h) $(gstypes_h) $(gserrors_h) \
+ $(gsmemory_h) $(plalloc_h) $(gsmalloc_h) $(gsstruct_h) $(gxalloc_h)\
+ $(gsalloc_h) $(gsargs_h) $(gp_h) $(gsdevice_h) $(gslib_h) $(gslibctx_h)\
+ $(gxdevice_h) $(gsparam_h) $(pjtop_h) $(plapi_h) $(plparse_h) $(plplatf_h)\
+ $(plmain_h) $(pltop_h) $(pltoputl_h) $(gsargs_h) $(dwtrace_h) $(vdtrace_h)
+ $(PLCCC) $(PLSRC)plmain.c $(PLO_)plmain.$(OBJ)
+
+$(PLOBJ)plimpl.$(OBJ): $(PLSRC)plimpl.c \
+ $(AK) \
+ $(memory__h) \
+ $(scommon_h) \
+ $(gxdevice_h) \
+ $(pltop_h)
+ $(PLCCC) $(PLSRC)plimpl.c $(PLO_)plimpl.$(OBJ)
diff --git a/pl/plalloc.c b/pl/plalloc.c
new file mode 100644
index 000000000..055ece5df
--- /dev/null
+++ b/pl/plalloc.c
@@ -0,0 +1,549 @@
+/* subclass the allocater for pcl and xl. Redefine methods to use the
+ standard C allocator. For a number of reasons the default
+ allocator is not necessary for pcl or pxl. Neither language
+ supports garbage collection nor do they use relocation. There is
+ no necessary distinction between system, global or local vm.
+ Hence a simple allocator based on malloc, realloc and free. */
+/*$Id$*/
+
+#include "malloc_.h"
+#include "memory_.h"
+#include "gdebug.h"
+#include "gsmemret.h" /* for gs_memory_type_ptr_t */
+#include "gsmalloc.h"
+#include "gsstype.h"
+#include "plalloc.h"
+
+/* a screwed up mess, we try to make it manageable here */
+extern const gs_memory_struct_type_t st_bytes;
+
+/* assume doubles are the largest primitive types and malloc alignment
+ is consistent. Covers the machines we care about */
+inline static uint
+round_up_to_align(uint size)
+{
+ return ARCH_ALIGN_MEMORY_MOD;
+}
+
+/* aceesors to get size and type given the pointer returned to the
+ client, *not* the pointer returned by malloc or realloc */
+inline static uint
+get_size(byte *ptr)
+{
+ /* unpack the unsigned long we stored 2 words behind the object at
+ alloc time... back up 2 */
+ byte *bptr = ptr - (round_up_to_align(1) * 2);
+ uint size;
+ /* unpack */
+ memcpy(&size, bptr, sizeof(uint));
+ return size;
+}
+
+inline gs_memory_type_ptr_t
+get_type(char *ptr)
+{
+ /* unpack the unsigned long we stored 1 word behind the object at
+ alloc time... back up 1 */
+ gs_memory_type_ptr_t type;
+ byte *bptr = ptr - round_up_to_align(1);
+ /* unpack */
+ memcpy(&type, bptr, sizeof(gs_memory_type_ptr_t));
+ return type;
+}
+
+/* aceesors to get size and typen give the pointer that was returned
+ by malloc or realloc, *not* the pointer returned by malloc or
+ realloc */
+inline void
+set_size(byte *bptr, uint size)
+{
+ memcpy(bptr, &size, sizeof(size));
+}
+
+inline void
+set_type(byte *bptr, gs_memory_type_ptr_t type)
+{
+ memcpy(&bptr[round_up_to_align(1)], &type, sizeof(type));
+ return;
+}
+
+#ifndef PL_KEEP_GLOBAL_FREE_LIST
+#error "feature binding PL_KEEP_GLOBAL_FREE_LIST is undefined"
+#endif
+
+struct pl_mem_node_s {
+ byte *address;
+ struct pl_mem_node_s *next;
+ const char *cname;
+#ifdef DEBUG
+ long op_count;
+#endif
+};
+
+#ifdef DEBUG
+/* each add operation increments the operation count. So if a
+ reference is reported unfreed in the remaining free list it's
+ allocation can easily be found with a conditional
+ breakpoint */
+ static long mem_node_operation_count = 0;
+ static long mem_node_operation_count_fastbreakpoint = 0xffffffff;
+#endif
+
+
+/* return -1 on error, 0 on success */
+int
+pl_mem_node_add(gs_memory_t * mem, byte *add, const char *cname)
+{
+ if( PL_KEEP_GLOBAL_FREE_LIST ) {
+ pl_mem_node_t *node = (pl_mem_node_t *)malloc(sizeof(pl_mem_node_t));
+ if ( node == NULL )
+ return -1;
+ if (mem->head == NULL) {
+ mem->head = node;
+ mem->head->next = NULL;
+ } else {
+ node->next = mem->head;
+ mem->head = node;
+ }
+ mem->head->address = add;
+ mem->head->cname = cname;
+#ifdef DEBUG
+ mem_node_operation_count++;
+ mem->head->op_count = mem_node_operation_count;
+ if ( mem_node_operation_count == mem_node_operation_count_fastbreakpoint )
+ return 0;
+#endif
+ }
+ return 0;
+}
+
+int
+pl_mem_node_remove(gs_memory_t *mem, byte *addr)
+{
+ if ( PL_KEEP_GLOBAL_FREE_LIST ) {
+ pl_mem_node_t *head = mem->head;
+ pl_mem_node_t *current;
+ /* check the head first */
+ if ( head == NULL ) {
+ dprintf("FAIL - no nodes to be removed\n" );
+ return -1;
+ }
+
+ if ( head && head->address == addr ) {
+ pl_mem_node_t *tmp = head->next;
+ free(head);
+ mem->head = tmp;
+ } else {
+ /* stop in front of element */
+ bool found = false;
+ for (current = head; current != NULL; current = current->next) {
+
+ if ( current->next && (current->next->address == addr) ) {
+ pl_mem_node_t *tmp = current->next->next;
+ free(current->next);
+ current->next = tmp;
+ found = true;
+ break;
+ }
+
+ }
+ if ( !found ) {
+ dprintf1("FAIL freeing wild pointer freed address %x not found\n", (uint)addr );
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
+void
+pl_mem_node_free_all_remaining(gs_memory_t *mem)
+{
+ if( PL_KEEP_GLOBAL_FREE_LIST ) {
+ pl_mem_node_t *head = mem->head;
+# ifdef DEBUG
+ static const bool print_recovered_block_info = true;
+# else
+ static const bool print_recovered_block_info = false;
+# endif
+ uint blk_count = 0;
+ uint size = 0;
+ uint total_size = 0;
+ byte* ptr;
+
+ pl_mem_node_t *current;
+ pl_mem_node_t *next;
+ current = head;
+ while ( current != NULL ) {
+ next = current->next;
+ if ( print_recovered_block_info ) {
+ ++blk_count;
+ ptr = ((byte*)current->address) + (2 * round_up_to_align(1));
+ size = get_size(ptr);
+ total_size += size;
+#ifdef DEBUG
+ dprintf4("Recovered %x size %d %ld'th allocation client %s\n",
+ (uint)ptr, size, current->op_count, current->cname);
+#endif
+ }
+ if ((void*)current->address != (void*)mem->gs_lib_ctx)
+ free(current->address);
+ free(current);
+ current = next;
+ }
+ if ( print_recovered_block_info && blk_count )
+ dprintf2("Recovered %d blocks, %d bytes\n",
+ blk_count, total_size);
+ mem->head = NULL;
+ }
+}
+
+
+/* all of the allocation routines modulo realloc reduce to the this
+ function */
+static byte *
+pl_alloc(gs_memory_t *mem, uint size, gs_memory_type_ptr_t type, client_name_t cname)
+{
+
+ uint minsize, newsize;
+ /* use 2 starting machine words for size and type - assumes
+ malloc() returns on max boundary and first 2 words will hold
+ two longs. Doesn't check for overflow - malloc will fail for
+ us. Update size. */
+ minsize = round_up_to_align(1);
+ newsize = size + minsize + minsize;
+ {
+
+ byte *ptr = (byte *)malloc(newsize);
+ if ( !ptr )
+ return NULL;
+#ifdef DEBUG
+ if_debug2('A', "[da]:malloc:%x:%s\n", (uint)&ptr[minsize * 2], cname );
+#endif
+ /* set the type and size */
+ set_type(ptr, type);
+ set_size(ptr, size);
+ /* initialize for debugging */
+#ifdef DEBUG
+ if ( gs_debug_c('@') )
+ memset(&ptr[minsize * 2], 0xff, get_size(&ptr[minsize * 2]));
+#endif
+ if ( pl_mem_node_add(mem, ptr, cname) ) {
+ free( ptr );
+ return NULL;
+ }
+ /* return the memory after the size and type words. */
+ return &ptr[minsize * 2];
+ }
+}
+
+static byte *
+pl_alloc_bytes_immovable(gs_memory_t * mem, uint size, client_name_t cname)
+{
+ return pl_alloc(mem, size, &st_bytes, cname);
+}
+
+static byte *
+pl_alloc_bytes(gs_memory_t * mem, uint size, client_name_t cname)
+{
+ return pl_alloc(mem, size, &st_bytes, cname);
+}
+
+static void *
+pl_alloc_struct_immovable(gs_memory_t * mem, gs_memory_type_ptr_t pstype,
+ client_name_t cname)
+{
+ return pl_alloc(mem, pstype->ssize, pstype, cname);
+}
+
+static void *
+pl_alloc_struct(gs_memory_t * mem, gs_memory_type_ptr_t pstype,
+ client_name_t cname)
+{
+ return pl_alloc(mem, pstype->ssize, pstype, cname);
+}
+
+static byte *
+pl_alloc_byte_array_immovable(gs_memory_t * mem, uint num_elements,
+ uint elt_size, client_name_t cname)
+{
+ return pl_alloc_bytes(mem, num_elements * elt_size, cname);
+}
+
+static byte *
+pl_alloc_byte_array(gs_memory_t * mem, uint num_elements, uint elt_size,
+ client_name_t cname)
+{
+ return pl_alloc_bytes(mem, num_elements * elt_size, cname);
+}
+
+static void *
+pl_alloc_struct_array_immovable(gs_memory_t * mem, uint num_elements,
+ gs_memory_type_ptr_t pstype, client_name_t cname)
+{
+ return pl_alloc(mem, num_elements * pstype->ssize, pstype, cname);
+}
+
+static void *
+pl_alloc_struct_array(gs_memory_t * mem, uint num_elements,
+ gs_memory_type_ptr_t pstype, client_name_t cname)
+{
+ return pl_alloc(mem, num_elements * pstype->ssize, pstype, cname);
+}
+
+
+static void *
+pl_resize_object(gs_memory_t * mem, void *obj, uint new_num_elements, client_name_t cname)
+{
+ byte *ptr;
+
+ /* get the type from the old object */
+ gs_memory_type_ptr_t objs_type = get_type(obj);
+ /* type and size header size */
+ ulong header_size = round_up_to_align(1) + round_up_to_align(1);
+ /* get new object's size */
+ ulong new_size = (objs_type->ssize * new_num_elements) + header_size;
+ byte *bptr = (byte *)obj - header_size;
+ /* replace the size field */
+ ptr = (byte *)realloc(bptr, new_size);
+ if ( !ptr )
+ return NULL;
+
+ pl_mem_node_remove(mem, bptr);
+ pl_mem_node_add(mem, ptr, cname);
+ /* da for debug allocator - so scripts can parse the trace */
+ if_debug2('A', "[da]:realloc:%x:%s\n", (uint)ptr, cname );
+ /* we reset size and type - the type in case realloc moved us */
+ set_size(ptr, new_size - header_size);
+ set_type(ptr, objs_type);
+ return &ptr[round_up_to_align(1) * 2];
+}
+
+
+static void
+pl_free_object(gs_memory_t * mem, void *ptr, client_name_t cname)
+{
+ if ( ptr != NULL ) {
+ uint header_size = round_up_to_align(1) + round_up_to_align(1);
+ byte *bptr = (byte *)ptr - header_size;
+ gs_memory_type_ptr_t ptype = get_type((byte *)ptr);
+ void (*finalize)(void *ptr) = ptype->finalize;
+ if ( finalize != NULL )
+ finalize(ptr);
+#ifdef DEBUG
+ if ( gs_debug_c('@') )
+ memset(bptr, 0xee, header_size + get_size(ptr));
+#endif
+ if (!pl_mem_node_remove(mem, bptr))
+ free(bptr);
+
+#ifdef DEBUG
+ /* da for debug allocator - so scripts can parse the trace */
+ if_debug2('A', "[da]:free:%x:%s\n", (uint)ptr, cname );
+#endif
+ }
+}
+
+static byte *
+pl_alloc_string_immovable(gs_memory_t * mem, uint nbytes, client_name_t cname)
+{
+ /* we just alloc bytes here */
+ return pl_alloc_bytes(mem, nbytes, cname);
+}
+
+static byte *
+pl_alloc_string(gs_memory_t * mem, uint nbytes, client_name_t cname)
+{
+ /* we just alloc bytes here */
+ return pl_alloc_bytes(mem, nbytes, cname);
+}
+
+static byte *
+pl_resize_string(gs_memory_t * mem, byte * data, uint old_num, uint new_num,
+ client_name_t cname)
+{
+ /* just resize object - ignores old_num */
+ return pl_resize_object(mem, data, new_num, cname);
+}
+
+static void
+pl_free_string(gs_memory_t * mem, byte * data, uint nbytes,
+ client_name_t cname)
+{
+ pl_free_object(mem, data, cname);
+ return;
+}
+
+
+static void
+pl_status(gs_memory_t * mem, gs_memory_status_t * pstat)
+{
+ return;
+}
+
+static void
+pl_enable_free(gs_memory_t * mem, bool enable)
+{
+ return;
+}
+
+static void
+pl_free_all(gs_memory_t * mem, uint free_mask, client_name_t cname)
+{
+ return;
+}
+
+static void
+pl_consolidate_free(gs_memory_t *mem)
+{
+ return;
+}
+
+
+static uint
+pl_object_size(const gs_memory_t * mem, const void /*obj_header_t */ *obj)
+{
+ return get_size((byte *)obj);
+}
+
+static gs_memory_type_ptr_t
+pl_object_type(const gs_memory_t * mem, const void /*obj_header_t */ *obj)
+{
+ return get_type((byte *)obj);
+}
+
+static int
+pl_register_root(gs_memory_t * mem, gs_gc_root_t * rp, gs_ptr_type_t ptype,
+ void **up, client_name_t cname)
+{
+ return 0;
+}
+
+static void
+pl_unregister_root(gs_memory_t * mem, gs_gc_root_t * rp, client_name_t cname)
+{
+ return;
+}
+
+/* Define a vacuous recovery procedure. */
+static gs_memory_recover_status_t
+no_recover_proc(gs_memory_retrying_t *rmem, void *proc_data)
+{
+ return RECOVER_STATUS_NO_RETRY;
+}
+
+
+/* forward decl */
+static gs_memory_t * pl_stable(gs_memory_t *mem);
+
+
+gs_memory_retrying_t pl_mem = {
+ (gs_memory_t *)&pl_mem, /* also this is stable_memory since no save/restore */
+ { pl_alloc_bytes_immovable, /* alloc_bytes_immovable */
+ pl_resize_object, /* resize_object */
+ pl_free_object, /* free_object */
+ pl_stable, /* stable */
+ pl_status, /* status */
+ pl_free_all, /* free_all */
+ pl_consolidate_free, /* consolidate_free */
+ pl_alloc_bytes, /* alloc_bytes */
+ pl_alloc_struct, /* alloc_struct */
+ pl_alloc_struct_immovable, /* alloc_struct_immovable */
+ pl_alloc_byte_array, /* alloc_byte_array */
+ pl_alloc_byte_array_immovable, /* alloc_byte_array_immovable */
+ pl_alloc_struct_array, /* alloc_struct_array */
+ pl_alloc_struct_array_immovable, /* alloc_struct_array_immovable */
+ pl_object_size, /* object_size */
+ pl_object_type, /* object_type */
+ pl_alloc_string, /* alloc_string */
+ pl_alloc_string_immovable, /* alloc_string_immovable */
+ pl_resize_string, /* resize_string */
+ pl_free_string, /* free_string */
+ pl_register_root, /* register_root */
+ pl_unregister_root, /* unregister_root */
+ pl_enable_free /* enable_free */
+ },
+ NULL, /* gs_lib_ctx */
+ NULL, /* head */
+ NULL, /* non_gc_memory */
+ NULL, /* target */
+ no_recover_proc, /* recovery procedure */
+ NULL /* recovery data */
+};
+
+static gs_memory_t *
+pl_stable(gs_memory_t *mem)
+{
+ return (gs_memory_t *)&pl_mem;
+}
+
+const gs_malloc_memory_t pl_malloc_memory = {
+ 0, /* stable */
+ { pl_alloc_bytes_immovable, /* alloc_bytes_immovable */
+ pl_resize_object, /* resize_object */
+ pl_free_object, /* free_object */
+ pl_stable, /* stable */
+ pl_status, /* status */
+ pl_free_all, /* free_all */
+ pl_consolidate_free, /* consolidate_free */
+ pl_alloc_bytes, /* alloc_bytes */
+ pl_alloc_struct, /* alloc_struct */
+ pl_alloc_struct_immovable, /* alloc_struct_immovable */
+ pl_alloc_byte_array, /* alloc_byte_array */
+ pl_alloc_byte_array_immovable, /* alloc_byte_array_immovable */
+ pl_alloc_struct_array, /* alloc_struct_array */
+ pl_alloc_struct_array_immovable, /* alloc_struct_array_immovable */
+ pl_object_size, /* object_size */
+ pl_object_type, /* object_type */
+ pl_alloc_string, /* alloc_string */
+ pl_alloc_string_immovable, /* alloc_string_immovable */
+ pl_resize_string, /* resize_string */
+ pl_free_string, /* free_string */
+ pl_register_root, /* register_root */
+ pl_unregister_root, /* unregister_root */
+ pl_enable_free /* enable_free */
+ },
+ NULL, /* gs_lib_ctx */
+ NULL, /* head */
+ NULL, /* non_gc_memory */
+ 0, /* allocated */
+ 0, /* limit */
+ 0, /* used */
+ 0 /* max used */
+};
+
+#ifndef PSI_INCLUDED
+/* retrun the c-heap manager set the global default as well. */
+static gs_memory_t *
+pl_malloc_init(void)
+{
+ return (gs_memory_t *)&pl_malloc_memory;
+}
+#endif
+
+gs_memory_t *
+pl_alloc_init()
+{
+#ifndef PSI_INCLUDED
+ if ( pl_malloc_init() == NULL )
+ return NULL;
+
+ gs_lib_ctx_init((gs_memory_t *)&pl_mem);
+
+ pl_mem.head = 0;
+ pl_mem.non_gc_memory = (gs_memory_t *)&pl_mem;
+
+ return (gs_memory_t *)&pl_mem;
+
+#else
+
+ gs_memory_t *local_memory_t_default = 0;
+
+ if( (local_memory_t_default = gs_malloc_init( 0 )) == 0 )
+ return 0;
+ local_memory_t_default->head = 0;
+
+ return local_memory_t_default;
+#endif
+}
+
diff --git a/pl/plalloc.h b/pl/plalloc.h
new file mode 100644
index 000000000..851d59156
--- /dev/null
+++ b/pl/plalloc.h
@@ -0,0 +1,31 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$*/
+
+/* A simple memory allocator for use by pcl and pxl */
+gs_memory_t *pl_alloc_init(void);
+
+
+
+/* If true PL_KEEP_GLOBAL_FREE_LIST will force all memory allocations to be stored
+ * in a linked list, calling mem_node_free_all_remaining() will free any remaining
+ * blocks. This can be used to force a return to zero memory usage prior to
+ * program termination. Since this isn't free not all system will need/want the overhead
+ * of searching for the block to be freed on every deallocation.
+ *
+ * To disable the feature define PL_KEEP_GLOBAL_FREE_LIST to false
+ */
+
+#define PL_KEEP_GLOBAL_FREE_LIST true
+
+/* free all remaining memory blocks */
+void pl_mem_node_free_all_remaining(gs_memory_t *mem);
diff --git a/pl/plapi.h b/pl/plapi.h
new file mode 100755
index 000000000..75853ee5f
--- /dev/null
+++ b/pl/plapi.h
@@ -0,0 +1,80 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plapi.h */
+/* pcl6 as a library or dll api */
+
+#ifndef plapi_INCLUDED
+# define plapi_INCLUDED
+
+/*
+ * This API level is intended to hide everything behind
+ * a simple main_like argc, argv interface
+ */
+
+/* Exported functions may need different prefix
+ * GSDLLEXPORT marks functions as exported
+ * GSDLLAPI is the calling convention used on functions exported
+ * When you include this header file in the caller, you may
+ * need to change the definitions by defining these
+ * before including this header file.
+ * Make sure you get the calling convention correct, otherwise your
+ * program will crash soon after returning due to stack corruption.
+ */
+
+#ifdef __WINDOWS__
+# define _Windows
+#endif
+
+#ifdef _Windows
+# ifndef GSDLLEXPORT
+# define GSDLLEXPORT __declspec(dllexport)
+# endif
+# ifndef GSDLLAPI
+# define GSDLLAPI __stdcall
+# endif
+#endif /* _Windows */
+
+#if defined(OS2) && defined(__IBMC__)
+# ifndef GSDLLAPI
+# define GSDLLAPI _System
+# endif
+#endif /* OS2 && __IBMC */
+
+#ifdef __MACINTOSH__
+# pragma export on
+#endif
+
+#ifndef GSDLLEXPORT
+# define GSDLLEXPORT
+#endif
+#ifndef GSDLLAPI
+# define GSDLLAPI
+#endif
+
+#if defined(__IBMC__)
+# define GSDLLAPIPTR * GSDLLAPI
+#else
+# define GSDLLAPIPTR GSDLLAPI *
+#endif
+
+
+/* Run this just like you would pcl6 on the command line.
+ *
+ * Returns: 0 success
+ * < 0 error code
+ */
+GSDLLEXPORT int GSDLLAPI
+pl_main(int argc, char *argv[]);
+
+#endif /* plapi_INCLUDED */
diff --git a/pl/plchar.c b/pl/plchar.c
new file mode 100644
index 000000000..7754b7ac7
--- /dev/null
+++ b/pl/plchar.c
@@ -0,0 +1,1747 @@
+ /* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plchar.c */
+/* PCL font handling library -- operations on individual characters */
+#include "math_.h"
+#include "memory_.h"
+#include "stdio_.h" /* for gdebug.h */
+#include "gdebug.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gschar.h"
+#include "gsimage.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gsbittab.h"
+#include "gxarith.h" /* for igcd */
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "plfont.h"
+#include "plvalue.h"
+#include "gscoord.h"
+#include "gsstate.h"
+#include "gxdevice.h"
+#include "gxdevmem.h"
+#include "gxpath.h"
+/* We really shouldn't need the following, but currently they are needed */
+/* for pgs->path and penum->log2_current_scale in pl_tt_build_char. */
+#include "gxfixed.h"
+#include "gxchar.h"
+#include "gxfcache.h"
+#include "gzstate.h"
+
+/* Define whether to cache TrueType characters. */
+/* This would only be disabled for debugging. */
+#define CACHE_TRUETYPE_CHARS
+
+/* Structure descriptors */
+gs_private_st_ptrs1(st_pl_font_glyph, pl_font_glyph_t, "pl_font_glyph_t",
+ pl_font_glyph_enum_ptrs, pl_font_glyph_reloc_ptrs, data);
+gs_private_st_element(st_pl_font_glyph_element, pl_font_glyph_t,
+ "pl_font_glyph_t[]",
+ pl_font_glyph_elt_enum_ptrs, pl_font_glyph_elt_reloc_ptrs, st_pl_font_glyph);
+
+int
+pl_prepend_xl_dummy_header(gs_memory_t *mem, byte **ppheader)
+{
+ return 0;
+}
+
+int
+pl_swap_header(byte *header, uint gifct)
+{
+ return 0;
+}
+
+/* ---------------- Utilities ---------------- */
+
+/* Look up a glyph in a font. Return a pointer to the glyph's slot */
+/* (data != 0) or where it should be added (data == 0). */
+pl_font_glyph_t *
+pl_font_lookup_glyph(const pl_font_t *plfont, gs_glyph glyph)
+{ uint size = plfont->glyphs.size;
+ uint skip = plfont->glyphs.skip;
+ uint index = glyph % size;
+ pl_font_glyph_t *pfg;
+ pl_font_glyph_t *result = 0;
+
+ while ( (pfg = plfont->glyphs.table + index)->data ?
+ pfg->glyph != glyph : pfg->glyph != 0
+ )
+ { if ( !pfg->data )
+ result = pfg;
+ index = (index >= skip ? index : index + size) - skip;
+ }
+ return (!pfg->data && result) ? result : pfg;
+}
+
+/* ---------------- Bitmap font support ---------------- */
+
+/* Encode a character for a bitmap font. This is simple, because */
+/* bitmap fonts are always bound. */
+static gs_glyph
+pl_bitmap_encode_char(gs_font *pfont, gs_char chr, gs_glyph not_used)
+{ return (gs_glyph)chr;
+}
+
+/* Get character existence and escapement for a bitmap font. */
+/* This is simple for the same reason. */
+static int
+pl_bitmap_char_width(const pl_font_t *plfont, const void *pgs, uint char_code, gs_point *pwidth)
+{
+ const byte *cdata = pl_font_lookup_glyph(plfont, char_code)->data;
+
+ pwidth->x = pwidth->y = 0;
+ if ( !pwidth ) {
+#ifdef DEBUG
+ dprintf("Warning should not call width function without width\n" );
+#endif
+ return (cdata == 0 ? 1 : 0);
+ }
+ if ( cdata == 0 ) {
+ return 1;
+ }
+ if ( cdata[0] == 0 ) { /* PCL XL characters don't have an escapement. */
+ pwidth->x = pwidth->y = 0;
+ return 0;
+ }
+
+ {
+ const byte *params = cdata + 6;
+ pwidth->x = (plfont->header[13] ? /* variable pitch */
+ pl_get_int16(params + 8) * 0.25 :
+ pl_get_int16(params) /*lsb*/ + pl_get_int16(params + 4) /*width*/);
+ }
+ return 0;
+}
+
+static int
+pl_bitmap_char_metrics(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4])
+{
+ gs_point width;
+ const byte *cdata = pl_font_lookup_glyph(plfont, char_code)->data;
+ /* never a vertical substitute */
+ metrics[0] = metrics[1] = metrics[2] = metrics[3] = 0;
+ /* no data - character not found */
+ if ( cdata == 0 )
+ return 1;
+ /* We are not concerned about PCL XL characters */
+ if ( cdata[0] == 0 )
+ return 0;
+
+ metrics[0] = pl_get_int16(cdata + 6);
+ pl_bitmap_char_width(plfont, pgs, char_code, &width);
+ metrics[2] = width.x;
+ return 0;
+}
+
+/*
+ * For pseudo-bolding, we have to "smear" a bitmap horizontally and
+ * vertically by ORing together a rectangle of bits below and to the left of
+ * each output bit. We do this separately for horizontal and vertical
+ * smearing. Eventually, we will replace the current procedure, which takes
+ * time proportional to W * H * (N + log2(N)), with one that is only
+ * proportional to N (but takes W * N additional buffer space).
+ */
+
+/* Allocate the line buffer for bolding. We need 2 + bold scan lines. */
+static byte *
+alloc_bold_lines(gs_memory_t *mem, uint width, int bold, client_name_t cname)
+{ return gs_alloc_byte_array(mem, 2 + bold, bitmap_raster(width + bold),
+ cname);
+}
+
+/* Merge one (aligned) scan line into another, for vertical smearing. */
+static void
+bits_merge(byte *dest, const byte *src, uint nbytes)
+{ long *dp = (long *)dest;
+ const long *sp = (const long *)src;
+ uint n = (nbytes + sizeof(long) - 1) >> arch_log2_sizeof_long;
+
+ for ( ; n >= 4; sp += 4, dp += 4, n -= 4 )
+ dp[0] |= sp[0], dp[1] |= sp[1], dp[2] |= sp[2], dp[3] |= sp[3];
+ for ( ; n; ++sp, ++dp, --n )
+ *dp |= *sp;
+}
+
+/* Smear a scan line horizontally. Note that the output is wider than */
+/* the input by the amount of bolding (smear_width). */
+static void
+bits_smear_horizontally(byte *dest, const byte *src, uint width,
+ uint smear_width)
+{ uint bits_on = 0;
+ const byte *sp = src;
+ uint sbyte = *sp;
+ byte *dp = dest;
+ uint dbyte = sbyte;
+ uint sdmask = 0x80;
+ const byte *zp = src;
+ uint zmask = 0x80;
+ uint i = 0;
+
+ /* Process the first smear_width bits. */
+ { uint stop = min(smear_width, width);
+
+ for ( ; i < stop; ++i ) {
+ if ( sbyte & sdmask )
+ bits_on++;
+ else if ( bits_on )
+ dbyte |= sdmask;
+ if ( (sdmask >>= 1) == 0 )
+ sdmask = 0x80, *dp++ = dbyte, dbyte = sbyte = *++sp;
+ }
+ }
+
+ /* Process all but the last smear_width bits. */
+ { for ( ; i < width; ++i ) {
+ if ( sbyte & sdmask )
+ bits_on++;
+ else if ( bits_on )
+ dbyte |= sdmask;
+ if ( *zp & zmask )
+ --bits_on;
+ if ( (sdmask >>= 1) == 0 ) {
+ sdmask = 0x80;
+ *dp++ = dbyte;
+on: switch ( (dbyte = sbyte = *++sp) ) {
+ case 0xff:
+ if ( width - i <= 8 )
+ break;
+ *dp++ = 0xff;
+ bits_on += 8 -
+ byte_count_bits[(*zp & (zmask - 1)) + (zp[1] & -zmask)];
+ ++zp;
+ i += 8;
+ goto on;
+ case 0:
+ if ( bits_on || width - i <= 8 )
+ break;
+ *dp++ = 0;
+ /* We know there can't be any bits to be zeroed, */
+ /* because bits_on can't go negative. */
+ ++zp;
+ i += 8;
+ goto on;
+ default:
+ ;
+ }
+ }
+ if ( (zmask >>= 1) == 0 )
+ zmask = 0x80, ++zp;
+ }
+ }
+
+ /* Process the last smear_width bits. */
+ /****** WRONG IF width < smear_width ******/
+ { uint stop = width + smear_width;
+
+ for ( ; i < stop; ++i ) {
+ if ( bits_on )
+ dbyte |= sdmask;
+ if ( (sdmask >>= 1) == 0 )
+ sdmask = 0x80, *dp++ = dbyte, dbyte = 0;
+ if ( *zp & zmask )
+ --bits_on;
+ if ( (zmask >>= 1) == 0 )
+ zmask = 0x80, ++zp;
+ }
+ }
+
+ if ( sdmask != 0x80 )
+ *dp = dbyte;
+}
+
+/* Image a bitmap character, with or without bolding. */
+int
+image_bitmap_char(gs_image_enum *ienum, const gs_image_t *pim,
+ const byte *bitmap_data, uint sraster, int bold, byte *bold_lines,
+ gs_state *pgs)
+{ uint dest_bytes = (pim->Width + 7) >> 3;
+ gx_device *dev = pgs->device;
+ void *iinfo;
+ const byte *planes[1];
+ int code;
+
+ gx_set_dev_color(pgs);
+ code = (*dev_proc(dev, begin_image))
+ (dev, (const gs_imager_state *)pgs, pim, gs_image_format_chunky,
+ NULL, pgs->dev_color, pgs->clip_path, pgs->memory, (gx_image_enum_common_t **)&iinfo);
+ if ( code < 0 )
+ return code;
+ if ( bold )
+ { /* Pass individual smeared lines. */
+ uint src_width = pim->Width - bold;
+ uint src_height = pim->Height - bold;
+ uint dest_raster = bitmap_raster(pim->Width);
+ int n1 = bold + 1;
+#define merged_line(i) (bold_lines + ((i) % n1 + 1) * dest_raster)
+ int y;
+
+ planes[0] = bold_lines;
+ for ( y = 0; y < pim->Height; ++y ) {
+ int y0 = (y < bold ? 0 : y - bold);
+ int y1 = min(y + 1, src_height);
+
+ if ( y < src_height ) {
+ bits_smear_horizontally(merged_line(y),
+ bitmap_data + y * sraster,
+ src_width, bold);
+ { /* Now re-establish the invariant -- see below. */
+ int kmask = 1;
+
+ for ( ; (y & kmask) == kmask && y - kmask >= y0;
+ kmask = (kmask << 1) + 1
+ )
+ bits_merge(merged_line(y - kmask),
+ merged_line(y - (kmask >> 1)),
+ dest_bytes);
+ }
+ }
+
+ /*
+ * As of this point in the loop, we maintain the following
+ * invariant to cache partial merges of groups of lines: for
+ * each Y, y0 <= Y < y1, let K be the maximum k such that Y
+ * mod 2^k = 0 and Y + 2^k < y1; then merged_line(Y) holds
+ * the union of horizontally smeared source lines Y through
+ * Y + 2^k - 1. The idea behind this is similar to the idea
+ * of quicksort.
+ */
+
+ { /* Now construct the output line. */
+ bool first = true;
+ int iy;
+
+ for ( iy = y1 - 1; iy >= y0; --iy ) {
+ int kmask = 1;
+
+ while ( (iy & kmask) == kmask && iy - kmask >= y0 )
+ iy -= kmask, kmask <<= 1;
+ if ( first ) {
+ memcpy(bold_lines, merged_line(iy), dest_bytes);
+ first = false;
+ }
+ else
+ bits_merge(bold_lines, merged_line(iy), dest_bytes);
+ }
+ }
+
+
+ code = (*dev_proc(dev, image_data))
+ (dev, iinfo, planes, 0, dest_bytes, 1);
+ if ( code != 0 )
+ break;
+ }
+#undef merged_line
+ }
+ else
+ { /* Pass the entire image at once. */
+ planes[0] = bitmap_data;
+ code = (*dev_proc(dev, image_data))
+ (dev, iinfo, planes, 0, dest_bytes, pim->Height);
+ }
+ (*dev_proc(dev, end_image))(dev, iinfo, code >= 0);
+ return code;
+}
+
+
+/* Render a character for a bitmap font. */
+/* This handles both format 0 (PCL XL) and format 4 (PCL5 bitmap). */
+static int
+pl_bitmap_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont,
+ gs_char chr, gs_glyph glyph)
+{ pl_font_t *plfont = (pl_font_t *)pfont->client_data;
+ const byte *cdata = pl_font_lookup_glyph(plfont, glyph)->data;
+ bool orient = plfont->orient;
+
+ if ( cdata == 0 )
+ return 0;
+ { const byte *params;
+ const byte *bitmap_data;
+ int lsb, ascent;
+ float delta_x;
+ gs_image_t image;
+ gs_image_enum *ienum;
+ int code;
+ uint bold;
+ byte *bold_lines = 0;
+
+ if ( cdata[0] == 0 )
+ { /* PCL XL format */
+ params = cdata + 2;
+ bitmap_data = cdata + 10;
+ delta_x = 0; /* irrelevant */
+ lsb = pl_get_int16(params);
+ ascent = pl_get_int16(params + 2);
+ }
+ else
+ { /* PCL5 format */
+ params = cdata + 6;
+ bitmap_data = cdata + 16;
+ delta_x = (plfont->header[13] ? /* variable pitch */
+ pl_get_int16(params + 8) * 0.25 :
+ (short)(pl_get_int16(params) /*lsb*/ + pl_get_int16(params + 4)) /*width*/);
+ lsb = pl_get_int16(params);
+ ascent = pl_get_int16(params + 2);
+ }
+ ienum = gs_image_enum_alloc(pgs->memory, "pl_bitmap_build_char");
+ if ( ienum == 0 )
+ return_error(gs_error_VMerror);
+ gs_image_t_init_mask(&image, true);
+ image.Width = pl_get_uint16(params + 4);
+ image.Height = pl_get_uint16(params + 6);
+ /* Determine the amount of pseudo-bolding. */
+ if ( plfont->bold_fraction != 0 ) {
+ bold = (uint)(2 * image.Height * plfont->bold_fraction + 0.5);
+ bold_lines = alloc_bold_lines(pgs->memory, image.Width, bold,
+ "pl_bitmap_build_char(bold_line)");
+ if ( bold_lines == 0 )
+ { code = gs_note_error(gs_error_VMerror);
+ goto out;
+ }
+ image.Width += bold;
+ image.Height += bold;
+ ascent += bold;
+ }
+ else
+ bold = 0;
+
+ gs_make_identity(&image.ImageMatrix);
+ gs_matrix_rotate(&image.ImageMatrix, orient * -90, &image.ImageMatrix);
+ image.ImageMatrix.tx -= lsb;
+ image.ImageMatrix.ty += ascent;
+ image.adjust = true;
+ if (bold || orient != 0)
+ code = gs_setcharwidth(penum, pgs, delta_x, 0);
+ else {
+ /* we use cache device for portrait bitmap fonts to
+ avoid image setup overhead. */
+ float m[6];
+ m[0] = delta_x; m[1] = 0;
+ m[2] = lsb; m[3] = image.Height - ascent;
+ m[4] = image.Width + m[2];
+ m[5] = -ascent;
+ code = gs_setcachedevice(penum, pgs, m);
+ }
+ if ( code < 0 )
+ return code;
+#ifdef DEBUG
+ if ( gs_debug_c('B') ) {
+ int i;
+ int pixels = round_up(image.Width,8) * image.Height;
+ dprintf7("bitmap font data chr=%ld, width=%d, height=%d, lsb=%d, ascent=%d, top offset=%d left offset=%d\n",
+ chr, image.Width, image.Height, lsb, ascent, pl_get_int16(params + 2), pl_get_int16(params));
+ for ( i = 0; i < pixels; i++ ) {
+ if ( i % round_up(image.Width, 8) == 0 )
+ dprintf("\n");
+ dprintf1("%d", bitmap_data[i >> 3] & (128 >> (i & 7)) ? 1 : 0);
+ }
+ dprintf("\n");
+ }
+#endif
+ code = image_bitmap_char(ienum, &image, bitmap_data,
+ (image.Width - bold + 7) >> 3, bold,
+ bold_lines, pgs);
+out: gs_free_object(pgs->memory, bold_lines,
+ "pl_bitmap_build_char(bold_lines)");
+ gs_free_object(pgs->memory, ienum, "pl_bitmap_build_char");
+ return (code < 0 ? code : 0);
+ }
+}
+
+/* ---------------- TrueType font support ---------------- */
+
+/* Look up a character in the TrueType character-to-TT-glyph map. */
+/* Return a pointer to the glyph's slot (chr != gs_no_char) or where */
+/* it should be added (chr == gs_no_char). */
+static pl_tt_char_glyph_t *
+pl_tt_lookup_char(const pl_font_t *plfont, gs_glyph glyph)
+{ uint size = plfont->char_glyphs.size;
+ uint skip = plfont->char_glyphs.skip;
+ uint index = glyph % size;
+ pl_tt_char_glyph_t *ptcg;
+ pl_tt_char_glyph_t *result = 0;
+
+ while ( (ptcg = plfont->char_glyphs.table + index)->chr != gs_no_char ?
+ ptcg->chr != glyph : ptcg->glyph
+ )
+ { if ( ptcg->chr == gs_no_char )
+ result = ptcg;
+ index = (index >= skip ? index : index + size) - skip;
+ }
+ return (result ? result : ptcg);
+}
+
+/* Get a string from a TrueType font. */
+static int
+pl_tt_string_proc(gs_font_type42 *pfont, ulong offset, uint length, const byte **pdata)
+{ pl_font_t *plfont = pfont->client_data;
+
+ *pdata = plfont->header + plfont->offsets.GT +
+ (plfont->large_sizes ? 6 : 4) + offset;
+ return 0;
+}
+
+/* Return the vertical substitute for a glyph, if it has one; */
+/* otherwise return gs_no_glyph. */
+static gs_glyph
+pl_font_vertical_glyph(gs_glyph glyph, const pl_font_t *plfont)
+{ long VT = plfont->offsets.VT;
+ const byte *vtseg;
+ uint i, len;
+
+ if ( VT < 0 )
+ return gs_no_glyph;
+ vtseg = plfont->header + VT;
+ if ( plfont->large_sizes )
+ len = pl_get_uint32(vtseg + 2),
+ i = 6;
+ else
+ len = pl_get_uint16(vtseg + 2),
+ i = 4;
+ len += i;
+ for ( ; i < len; i += 4 )
+ if ( glyph == pl_get_uint16(vtseg + i) )
+ return pl_get_uint16(vtseg + i + 2);
+ return gs_no_glyph;
+}
+
+/* get metrics with support for XL tt class 1 and 2
+ * pl overrides gstype42_default_get_metrics
+ */
+
+int
+pl_tt_get_metrics(gs_font_type42 * pfont, uint glyph_index,
+ gs_type42_metrics_options_t options, float *sbw)
+{
+ pl_font_t *plfont = pfont->client_data;
+ const pl_font_glyph_t *pfg = 0;
+ const byte *cdata = 0;
+ int wmode = gs_type42_metrics_options_wmode(options);
+
+ if ( plfont->glyphs.table != 0 ) {
+ /* at least one caller calls before the glyph.table is valid, no chars yet
+ * test routes caller to gs_type42_default_get_metrics
+ */
+ pfg = pl_font_lookup_glyph(plfont, glyph_index);
+ cdata = pfg->data;
+
+ if (cdata && (cdata[1] == 1 || cdata[1] == 2)) {
+ double factor = 1.0 / pfont->data.unitsPerEm;
+ uint width;
+ int lsb;
+
+ lsb = pl_get_int16(cdata + 4);
+ width = pl_get_int16(cdata + 6);
+
+ /* foo NB what about the top side bearing in class 2 ? */
+
+ if (wmode) {
+ /* NB BUG all other fonts work without this sign
+ change it should already be accounted for in the
+ character ctm */
+ factor = -factor; /* lsb and width go down the page */
+ sbw[0] = 0, sbw[1] = lsb * factor;
+ sbw[2] = 0, sbw[3] = width * factor;
+ } else {
+ sbw[0] = lsb * factor, sbw[1] = 0;
+ sbw[2] = width * factor, sbw[3] = 0;
+ }
+ return 0; /* tt class 1,2 */
+ }
+ }
+ /* else call default implementation for tt class 0, incomplete font */
+ /* first check for a vertical substitute if writing mode is
+ vertical. We unpleasantly replace the glyph_index parameter
+ passed to procedure to be consist with the pl_tt_build_char()
+ debacle */
+ {
+ pl_font_t *plfont = pfont->client_data;
+ if (plfont->allow_vertical_substitutes) {
+ gs_glyph vertical = pl_font_vertical_glyph(glyph_index, plfont);
+ if ( vertical != gs_no_glyph )
+ glyph_index = vertical;
+ }
+ }
+
+ /* the graphics library does not do this correctly. If there
+ aren't two sets of metrics WMode should be ignored. We work
+ around that here. */
+
+ if (wmode == 1) {
+ const gs_type42_mtx_t *pmtx = &pfont->data.metrics[wmode];
+ if (pmtx->length == 0) {
+ wmode = 0;
+ }
+ else {
+ if ( gs_debug_c('=') ) {
+ dprintf("Found vertical metrics\n");
+ }
+ }
+ }
+ return gs_type42_default_get_metrics(pfont, glyph_index, wmode, sbw);
+}
+
+
+/* Get the outline data for a glyph in a downloaded TrueType font. */
+int
+pl_tt_get_outline(gs_font_type42 *pfont, uint index, gs_glyph_data_t *pdata)
+{
+ pl_font_t *plfont = pfont->client_data;
+ const pl_font_glyph_t *pfg = pl_font_lookup_glyph(plfont, index);
+ const byte *cdata = pfg->data;
+
+ if ( cdata == 0 ) {
+ /* undefined glyph */
+ gs_glyph_data_from_null(pdata);
+ }
+ else {
+ uint desc_size = (*cdata == 15 ? cdata[2] /* PCL5 */ : 0 /* PCL XL */);
+ uint data_size = pl_get_uint16(cdata + 2 + desc_size);
+
+ if ( data_size <= 4 ) {
+ /* empty outline */
+ gs_glyph_data_from_null(pdata);
+ } else if ( cdata[1] == 0) {
+ gs_glyph_data_from_bytes(pdata,
+ cdata,
+ 6 + desc_size,
+ data_size - 4,
+ NULL);
+ } else if ( cdata[1] == 1) {
+ gs_glyph_data_from_bytes(pdata,
+ cdata,
+ 10,
+ data_size - 8,
+ NULL);
+ } else if ( cdata[1] == 2) {
+ gs_glyph_data_from_bytes(pdata,
+ cdata,
+ 12,
+ data_size - 10,
+ NULL);
+ }
+ }
+ return 0;
+}
+
+#define access(base, length, vptr)\
+ (*pfont->data.string_proc)(pfont, (ulong)(base), length, &vptr)
+
+/* Find a table in a TrueType font. */
+/* Return the data offset of the table; store the length in *plen. */
+/* If the table is missing, return 0. */
+ulong
+tt_find_table(gs_font_type42 *pfont, const char *tname, uint *plen)
+{ const byte *OffsetTable;
+ uint numTables;
+ const byte *TableDirectory;
+ uint i;
+ ulong table_dir_offset = 0;
+
+ access(0, 12, OffsetTable);
+ access(table_dir_offset, 12, OffsetTable);
+ numTables = pl_get_uint16(OffsetTable + 4);
+ access(table_dir_offset + 12, numTables * 16, TableDirectory);
+ for ( i = 0; i < numTables; ++i )
+ { const byte *tab = TableDirectory + i * 16;
+ if ( !memcmp(tab, tname, 4) )
+ { if ( plen )
+ *plen = pl_get_uint32(tab + 12);
+ return pl_get_uint32(tab + 8);
+ }
+ }
+ return 0;
+}
+
+#ifndef gs_imager_state_DEFINED
+# define gs_imager_state_DEFINED
+typedef struct gs_imager_state_s gs_imager_state;
+#endif
+
+/* Opaque type for a path */
+#ifndef gx_path_DEFINED
+# define gx_path_DEFINED
+typedef struct gx_path_s gx_path;
+#endif
+
+/*
+ * Map a key through a cmap sub-table. We export this so we can use
+ * it someday for mapping between glyph vocabularies. If the key is
+ * not mappable, return gs_error_undefined; if the sub-table type is
+ * unknown, return gs_error_invalidfont.
+ */
+int
+pl_cmap_lookup(const uint key, const byte *table, uint *pvalue)
+{ /* Dispatch according to the table type. */
+ switch ( pl_get_uint16(table) )
+ {
+ case 0:
+ { /* Apple standard 1-to-1 mapping. */
+ *pvalue = table[key + 6];
+ if_debug2('J', "[J]%u => %u\n", key, *pvalue);
+ break;
+ }
+ case 4:
+ { /* Microsoft/Adobe segmented mapping. What a mess! */
+ uint segCount2 = pl_get_uint16(table + 6);
+ const byte *endCount = table + 14;
+ const byte *startCount = endCount + segCount2 + 2;
+ const byte *idDelta = startCount + segCount2;
+ const byte *idRangeOffset = idDelta + segCount2;
+ /*const byte *glyphIdArray = idRangeOffset + segCount2;*/
+ uint i2;
+
+ for ( i2 = 0; i2 < segCount2 - 3; i2 += 2 )
+ { int delta, roff;
+ uint start = pl_get_uint16(startCount + i2);
+ uint glyph;
+
+ if_debug4('J', "[J]start=%u end=%u delta=%d roff=%d\n",
+ start, pl_get_uint16(endCount + i2), pl_get_int16(idDelta + i2),
+ pl_get_int16(idRangeOffset + i2));
+ if ( key < start )
+ { if_debug1('J', "[J]%u out of range\n", key);
+ return_error(gs_error_undefined);
+ }
+ if ( key > pl_get_uint16(endCount + i2) )
+ continue;
+ delta = pl_get_int16(idDelta + i2);
+ roff = pl_get_int16(idRangeOffset + i2);
+ if ( roff == 0 )
+ { *pvalue = ( key + delta ) & 0xffff; /* mod 65536 */
+ if_debug2('J', "[J]%u => %u\n", key, *pvalue);
+ return 0;
+ }
+ glyph = pl_get_uint16(idRangeOffset + i2 + roff +
+ ((key - start) << 1));
+ *pvalue = (glyph == 0 ? 0 : glyph + delta);
+ if_debug2('J', "[J]%u => %u\n", key, *pvalue);
+ return 0;
+ }
+ /*
+ * The TrueType documentation says that the last range is
+ * always supposed to end with 0xffff, so this shouldn't
+ * happen; however, in some real fonts, it does.
+ */
+ if_debug1('J', "[J]%u out of range\n", key);
+ return_error(gs_error_undefined);
+ }
+ case 6:
+ { /* Single interval lookup. */
+ uint firstCode = pl_get_uint16(table + 6);
+ uint entryCount = pl_get_uint16(table + 8);
+
+ if ( key < firstCode || key >= firstCode + entryCount )
+ { if_debug1('J', "[J]%u out of range\n", key);
+ return_error(gs_error_undefined);
+ }
+ *pvalue = pl_get_uint16(table + 10 + ((key - firstCode) << 1));
+ if_debug2('J', "[J]%u => %u\n", key, *pvalue);
+ break;
+ }
+ default:
+ return_error(gs_error_invalidfont);
+ }
+ return 0;
+}
+
+/* Encode a character using the TrueType cmap tables. */
+/* (We think this is never used for downloaded fonts.) */
+static gs_glyph
+pl_tt_cmap_encode_char(gs_font_type42 *pfont, ulong cmap_offset,
+ uint cmap_len, gs_char chr)
+{ const byte *cmap;
+ const byte *cmap_sub;
+ const byte *table;
+ uint value;
+ int code;
+
+ access(cmap_offset, cmap_len, cmap);
+ /* Since the Apple cmap format is of no help in determining */
+ /* the encoding, look for a Microsoft table; but if we can't */
+ /* find one, take the first one. */
+ cmap_sub = cmap + 4;
+ { uint i;
+ for ( i = 0; i < pl_get_uint16(cmap + 2); ++i )
+ { if_debug3('j', "[j]cmap %d: platform %u encoding %u\n",
+ i, pl_get_uint16(cmap_sub + i * 8), pl_get_uint16(cmap_sub + i * 8 + 2));
+ if ( pl_get_uint16(cmap_sub + i * 8) == 3 )
+ { cmap_sub += i * 8;
+ break;
+ }
+ }
+ }
+ { uint offset = cmap_offset + pl_get_uint32(cmap_sub + 4);
+ access(offset, cmap_offset + cmap_len - offset, table);
+ }
+ code = pl_cmap_lookup((uint)chr, table, &value);
+ return (code < 0 ? gs_no_glyph : value);
+}
+
+/* Encode a character using the map built for downloaded TrueType fonts. */
+static gs_glyph
+pl_tt_dynamic_encode_char(const gs_font_type42 *pfont, gs_char chr)
+{ pl_font_t *plfont = pfont->client_data;
+ const pl_tt_char_glyph_t *ptcg = pl_tt_lookup_char(plfont, chr);
+
+ return (ptcg->chr == gs_no_char ? gs_no_glyph : ptcg->glyph);
+}
+
+/* Return the galley character for a character code, if any; */
+/* otherwise return gs_no_char. */
+/* Note that we return 0xffff for a character that is explicitly */
+/* designated as undefined. */
+static gs_char
+pl_font_galley_character(gs_char chr, const pl_font_t *plfont)
+{ long GC = plfont->offsets.GC;
+ const byte *gcseg;
+ uint b0, b1;
+ uint i, len;
+ uint default_char;
+
+ if ( GC < 0 )
+ return gs_no_char;
+ gcseg = plfont->header + GC;
+ if ( plfont->large_sizes )
+ len = pl_get_uint32(gcseg + 2),
+ i = 12;
+ else
+ len = pl_get_uint16(gcseg + 2),
+ i = 10;
+ if ( len != pl_get_uint16(gcseg + i - 2) * 6 + 6 ) /* bad data */
+ return gs_no_char;
+ default_char = pl_get_uint16(gcseg + i - 4); /* default character */
+ len += i - 6;
+ b0 = chr >> 8;
+ b1 = chr & 0xff;
+ for ( ; i < len; i += 6 )
+ if ( b0 >= gcseg[i] && b0 <= gcseg[i + 1] &&
+ b1 >= gcseg[i + 2] && b1 <= gcseg[i + 3]
+ )
+ return pl_get_uint16(gcseg + i + 4);
+ return default_char;
+}
+
+/* NB major hack. This is used by pl_decode_glyph; */
+gs_char last_char = 0;
+
+/* Encode a character for a TrueType font. */
+/* What we actually return is the TT glyph index. Note that */
+/* we may return either gs_no_glyph or 0 for an undefined character. */
+gs_glyph
+pl_tt_encode_char(gs_font *pfont_generic, gs_char chr, gs_glyph not_used)
+{
+ gs_font_type42 *pfont = (gs_font_type42 *)pfont_generic;
+ uint cmap_len;
+ ulong cmap_offset = tt_find_table(pfont, "cmap", &cmap_len);
+ gs_glyph glyph =
+ (cmap_offset == 0 ?
+ /* This is a downloaded font with no cmap. */
+ pl_tt_dynamic_encode_char(pfont, chr) :
+ pl_tt_cmap_encode_char(pfont, cmap_offset, cmap_len, chr));
+ pl_font_t *plfont = pfont->client_data;
+ pl_font_glyph_t *pfg;
+
+ last_char = chr;
+
+ if ( plfont->offsets.GC < 0 )
+ return glyph; /* no substitute */
+ pfg = pl_font_lookup_glyph(plfont, glyph);
+ /* If the character is missing, use the galley character instead. */
+ if ( !pfg->data )
+ { gs_char galley_char = pl_font_galley_character(chr, plfont);
+
+ if ( galley_char != gs_no_char )
+ { return
+ (galley_char == 0xffff ? 0 :
+ cmap_offset == 0 ?
+ pl_tt_dynamic_encode_char(pfont, galley_char) :
+ pl_tt_cmap_encode_char(pfont, cmap_offset, cmap_len,
+ galley_char));
+ }
+ }
+ return glyph; /* no substitute */
+}
+
+
+/* Get metrics */
+static int
+pl_tt_char_metrics(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4])
+{
+ gs_glyph unused_glyph = gs_no_glyph;
+ gs_glyph glyph = pl_tt_encode_char(plfont->pfont, char_code, unused_glyph);
+ if ( glyph == gs_no_glyph ) {
+ return 1;
+ }
+ return gs_type42_get_metrics((gs_font_type42 *)plfont->pfont,
+ glyph, metrics);
+}
+
+/* Get character existence and escapement for a TrueType font. */
+static int
+pl_tt_char_width(const pl_font_t *plfont, const void *pgs, uint char_code, gs_point *pwidth)
+{ gs_font *pfont = plfont->pfont;
+ gs_char chr = char_code;
+ gs_glyph unused_glyph = gs_no_glyph;
+ gs_glyph glyph = pl_tt_encode_char(pfont, chr, unused_glyph);
+ int code;
+ float sbw[4];
+
+ pwidth->x = pwidth->y = 0;
+
+ /* Check for a vertical substitute. */
+ if ( pfont->WMode & 1 ) {
+ gs_glyph vertical = pl_font_vertical_glyph(glyph, plfont);
+ if ( vertical != gs_no_glyph )
+ glyph = vertical;
+ }
+
+ /* undefined character */
+ if ( glyph == 0xffff || glyph == gs_no_glyph )
+ return 1;
+
+ code = gs_type42_get_metrics((gs_font_type42 *)pfont, glyph, sbw);
+ if ( code < 0 )
+ return code;
+ /* character exists */
+ pwidth->x = sbw[2];
+ return 0;
+}
+
+
+/* Render a TrueType character. */
+static int
+pl_tt_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont,
+ gs_char chr, gs_glyph orig_glyph)
+{ gs_glyph glyph = orig_glyph;
+#define pbfont ((gs_font_base *)pfont)
+#define pfont42 ((gs_font_type42 *)pfont)
+ int code;
+ pl_font_t *plfont = (pl_font_t *)pfont->client_data;
+ float bold_fraction = gs_show_in_charpath(penum) != cpm_show ? 0.0 : plfont->bold_fraction;
+ uint bold_added;
+ double scale;
+ float sbw[4], w2[6];
+ int ipx, ipy, iqx, iqy;
+ gx_device_memory mdev;
+ bool ctm_modified = false;
+ gs_matrix save_ctm;
+#define isDownloaded(p42) ((p42)->data.proc_data == 0)
+#ifdef CACHE_TRUETYPE_CHARS
+# define tt_set_cache(penum, pgs, w2)\
+ gs_setcachedevice(penum, pgs, w2)
+#else
+# define tt_set_cache(penum, pgs, w2)\
+ gs_setcharwidth(penum, pgs, w2[0], w2[1]);
+#endif
+ /* undefined */
+ if ( glyph == gs_no_glyph )
+ return 0;
+ /* Get the metrics and set the cache device. */
+ code = gs_type42_get_metrics(pfont42, glyph, sbw);
+ if ( code < 0 )
+ return code;
+ w2[0] = sbw[2], w2[1] = sbw[3];
+
+ /* Adjust the bounding box for stroking if needed. */
+
+ { const gs_rect *pbbox = &pbfont->FontBBox;
+
+ w2[2] = pbbox->p.x, w2[3] = pbbox->p.y;
+ w2[4] = pbbox->q.x, w2[5] = pbbox->q.y;
+ if ( pfont->PaintType )
+ { double expand = max(1.415, gs_currentmiterlimit(pgs)) *
+ gs_currentlinewidth(pgs) / 2;
+
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+ }
+
+ /* Establish a current point. */
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ {
+ bool madesub = false;
+ /* Check for a vertical substitute. */
+ if ( plfont->allow_vertical_substitutes ) {
+ pl_font_t *plfont = pfont->client_data;
+ gs_glyph vertical = pl_font_vertical_glyph(glyph, plfont);
+ if ( vertical != gs_no_glyph ) {
+ glyph = vertical;
+ madesub = true;
+ }
+ }
+ /* now check for rotation. This is the ringer, fonts with
+ escapement 1 em get rotated. If you hold an HP
+ engineer's head close to your ear you can hear the
+ ocean. */
+ if ( (pfont->WMode & 1) && sbw[2] == 1.0 ) {
+ /* save the ctm */
+ gs_currentmatrix(pgs, &save_ctm);
+ ctm_modified = true;
+ /* magic numbers - we don't completelely understand
+ the translation magic used by HP. This provides a
+ good approximation */
+ gs_translate(pgs, 1.0/1.15, -(1.0 - 1.0/1.15));
+ gs_rotate(pgs, 90);
+ }
+ }
+
+
+ /*
+ * If we want pseudo-bold, render untransformed to an intermediate
+ * bitmap, smear it, and then transform it to produce the output.
+ * This is really messy.
+ */
+ if ( bold_fraction == 0 )
+ { code = tt_set_cache(penum, pgs, w2);
+ if ( code < 0 )
+ return code;
+ bold_added = 0;
+ }
+ else
+ { gs_matrix mat, smat;
+ gs_rect sbox;
+
+ code = gs_gsave(pgs);
+ if ( code < 0 )
+ return code;
+ gs_currentmatrix(pgs, &mat);
+ /* Determine an appropriate scale for the bitmap. */
+ scale = max(fabs(mat.xx) + fabs(mat.yx),
+ fabs(mat.xy) + fabs(mat.yy));
+ gs_make_scaling(scale, scale, &smat);
+ sbox.p.x = w2[2], sbox.p.y = w2[3];
+ sbox.q.x = w2[4], sbox.q.y = w2[5];
+ gs_bbox_transform(&sbox, &smat, &sbox);
+ ipx = (int)sbox.p.x, ipy = (int)sbox.p.y;
+ iqx = (int)ceil(sbox.q.x), iqy = (int)ceil(sbox.q.y);
+ /* Set up the memory device for the bitmap. */
+ gs_make_mem_mono_device(&mdev, pgs->memory, pgs->device);
+ /* due to rounding, bold added (integer) can be zero while
+ bold fraction (float) is non zero in which case we add
+ 1 scan line. We do not "0" bold simply because it is
+ inconvenient to back out at this point. We don't have
+ any HP tests which would show measurable difference
+ either way (0 or 1). */
+ bold_added = max((int)(scale * bold_fraction * 2 + 0.5), 1);
+ mdev.width = iqx - ipx + bold_added;
+ mdev.height = iqy - ipy;
+ mdev.bitmap_memory = pgs->memory;
+ code = (*dev_proc(&mdev, open_device))((gx_device *)&mdev);
+ if ( code < 0 )
+ { gs_grestore(pgs);
+ return code;
+ }
+ /* Don't allow gs_setdevice to reset things. */
+ pgs->device = (gx_device *)&mdev;
+ { gs_fixed_rect cbox;
+ cbox.p.x = cbox.p.y = fixed_0;
+ cbox.q.x = int2fixed(mdev.width);
+ cbox.q.y = int2fixed(mdev.height);
+ gx_clip_to_rectangle(pgs, &cbox);
+ }
+ /* Make sure we clear the entire bitmap. */
+ memset(mdev.base, 0, bitmap_raster(mdev.width) * mdev.height);
+ gx_set_device_color_1(pgs); /* write 1's */
+ smat.tx = -ipx;
+ smat.ty = -ipy;
+ gs_setmatrix(pgs, &smat);
+ }
+ code = gs_type42_append(glyph, pgs, pgs->path,
+ (gs_text_enum_t *)penum, pfont,
+ gs_show_in_charpath(penum) != cpm_show);
+ if ( code >= 0 )
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ if (ctm_modified)
+ gs_setmatrix(pgs, &save_ctm);
+ if ( bold_added )
+ gs_grestore(pgs);
+ if ( code < 0 || !bold_added )
+ return (code < 0 ? code : 0);
+
+ /* Now smear the bitmap and copy it to the destination. */
+
+ { gs_image_t image;
+ gs_image_enum *ienum =
+ gs_image_enum_alloc(pgs->memory, "pl_tt_build_char");
+ byte *bold_lines =
+ alloc_bold_lines(pgs->memory, mdev.width - bold_added, bold_added,
+ "pl_tt_build_char(bold_lines)");
+
+ if ( ienum == 0 || bold_lines == 0 )
+ { code = gs_note_error(gs_error_VMerror);
+ goto out;
+ }
+ gs_image_t_init_mask(&image, true);
+ image.Width = mdev.width;
+ image.Height = mdev.height + bold_added;
+ gs_make_scaling(scale, scale, &image.ImageMatrix);
+ image.ImageMatrix.tx = -ipx;
+ image.ImageMatrix.ty = -ipy;
+ image.adjust = true;
+ code = gs_setcharwidth(penum, pgs, w2[0], w2[1]);
+ if ( code < 0 )
+ goto out;
+ code = image_bitmap_char(ienum, &image, mdev.base,
+ bitmap_raster(mdev.width), bold_added,
+ bold_lines, pgs);
+out: gs_free_object(pgs->memory, bold_lines, "pl_tt_build_char(bold_lines)");
+ gs_free_object(pgs->memory, ienum, "pl_tt_build_char(image enum)");
+ gs_free_object(pgs->memory, mdev.base, "pl_tt_build_char(bitmap)");
+ }
+ return (code < 0 ? code : 0);
+#undef pfont42
+#undef pbfont
+}
+
+/* We don't have to do any character encoding, since Intellifonts are */
+/* indexed by character code (if bound) or MSL code (if unbound). */
+static gs_glyph
+pl_intelli_encode_char(gs_font *pfont, gs_char pchr, gs_glyph not_used)
+{ return (gs_glyph)pchr;
+}
+
+/* Define the structure of the Intellifont metrics. */
+typedef struct intelli_metrics_s {
+ byte charSymbolBox[4][2];
+ byte charEscapementBox[4][2];
+ byte halfLine[2];
+ byte centerline[2];
+} intelli_metrics_t;
+
+/* Merge the bounding box of a character into the composite box, */
+/* and set the escapement. Return true if the character is defined. */
+static bool
+pl_intelli_merge_box(float wbox[6], const pl_font_t *plfont, gs_glyph glyph)
+{ const byte *cdata = pl_font_lookup_glyph(plfont, glyph)->data;
+
+ if ( cdata == 0 )
+ return false;
+ wbox[1] = 0;
+ if ( cdata[3] == 4 )
+ { /* Compound character. Merge the component boxes; */
+ /* use the compound character's escapement. */
+ bool found = false;
+ uint i;
+
+ for ( i = 0; i < cdata[6]; ++i )
+ found |= pl_intelli_merge_box(wbox, plfont,
+ pl_get_uint16(cdata + 8 + i * 6));
+ wbox[0] = pl_get_int16(cdata + 4);
+ return found;
+ }
+ /* Non-compound character. */
+ cdata += 4; /* skip PCL character header */
+ { const intelli_metrics_t *metrics =
+ (const intelli_metrics_t *)(cdata + pl_get_uint16(cdata + 2));
+ int llx = pl_get_int16(metrics->charSymbolBox[0]);
+ int lly = pl_get_int16(metrics->charSymbolBox[1]);
+ int urx = pl_get_int16(metrics->charSymbolBox[2]);
+ int ury = pl_get_int16(metrics->charSymbolBox[3]);
+
+ wbox[0] = pl_get_int16(metrics->charEscapementBox[2]) -
+ pl_get_int16(metrics->charEscapementBox[0]);
+ wbox[2] = min(wbox[2], llx);
+ wbox[3] = min(wbox[3], lly);
+ wbox[4] = max(wbox[4], urx);
+ wbox[5] = max(wbox[5], ury);
+ }
+ return true;
+}
+
+/* Do the work for rendering an Intellifont character. */
+/* The caller has done the setcachedevice. */
+static int
+pl_intelli_show_char(gs_state *pgs, const pl_font_t *plfont, gs_glyph glyph)
+{
+ int code;
+ const byte *cdata;
+ pl_font_glyph_t *font_glyph;
+ const intelli_metrics_t *metrics;
+ int *xBuffer, *yBuffer;
+ client_name_t cname = (client_name_t)"pl_intelli_show_char";
+ font_glyph = pl_font_lookup_glyph(plfont, glyph);
+ cdata = font_glyph->data;
+
+ if ( cdata == 0 ) {
+ if_debug1('1', "[1] no character data for glyph %ld\n",glyph);
+ return 0;
+ }
+ if ( cdata[3] == 4 ) { /* Compound character */
+ gs_matrix save_ctm;
+ int i;
+ gs_currentmatrix(pgs, &save_ctm);
+ for ( i = 0; i < cdata[6]; ++i ) {
+ const byte *edata = cdata + 8 + i * 6;
+ floatp x_offset = pl_get_int16(edata + 2);
+ floatp y_offset = pl_get_int16(edata + 4);
+ gs_translate(pgs, x_offset, y_offset);
+ code = pl_intelli_show_char(pgs, plfont, pl_get_uint16(edata));
+ gs_setmatrix(pgs, &save_ctm);
+ if ( code < 0 )
+ return code;
+ }
+ return 0;
+ } /* compound character */
+
+ /* not compound character */
+ {
+ const byte *outlines;
+ uint num_loops;
+ uint i;
+ cdata += 4; /* skip PCL character header */
+ outlines = cdata + pl_get_uint16(cdata + 6);
+ num_loops = pl_get_uint16(outlines);
+
+ if_debug2('1', "[1]ifont glyph %lu: loops=%u\n",(ulong)glyph, num_loops);
+
+ if (num_loops == 0)
+ return -1;
+
+ for ( i = 0; i < num_loops; ++i ) {
+ const byte *xyc = cdata + pl_get_uint16(outlines + 4 + i * 8);
+ uint num_points;
+ uint num_aux_points;
+ const byte *x_coords, *y_coords, *x_coords_last;
+ const byte *x_aux_coords, *y_aux_coords, *x_aux_coords_last;
+ int llx, lly, urx, ury; /* character bounding box */
+ int x, y;
+ int xAux, yAux;
+ int *xLimit, *yLimit, *xScan, *yScan, *xLast;
+ int pointBufferSize;
+ uint sz;
+
+ num_points = pl_get_uint16(xyc);
+ num_aux_points = pl_get_uint16(xyc + 2);
+
+ x_coords = xyc + 4;
+ y_coords = x_coords + num_points * 2;
+ x_coords_last = y_coords;
+
+ metrics = (const intelli_metrics_t *)(cdata + pl_get_uint16(cdata + 2));
+ llx = pl_get_int16(metrics->charSymbolBox[0]);
+ lly = pl_get_int16(metrics->charSymbolBox[1]);
+ urx = pl_get_int16(metrics->charSymbolBox[2]);
+ ury = pl_get_int16(metrics->charSymbolBox[3]);
+
+ pointBufferSize = num_points; /* allocate enough to hold all points */
+ if ( num_aux_points != 0xffff ) {
+ pointBufferSize += num_aux_points;
+ x_aux_coords = y_coords + num_points * 2;
+ y_aux_coords = x_aux_coords + num_aux_points;
+ x_aux_coords_last = y_coords;
+ }
+ else {
+ x_aux_coords = NULL;
+ y_aux_coords = NULL;
+ x_aux_coords_last = NULL;
+ }
+
+ sz = pointBufferSize * sizeof(int);
+
+ if (i == 0) {
+ xBuffer = (int *)gs_alloc_bytes(pgs->memory, sz, cname);
+ yBuffer = (int *)gs_alloc_bytes(pgs->memory, sz, cname);
+ } else {
+ /* NB we don't have a font that tests this yet */
+ xBuffer = (int *)gs_resize_object(pgs->memory, xBuffer, sz, cname);
+ yBuffer = (int *)gs_resize_object(pgs->memory, yBuffer, sz, cname);
+ }
+
+ if (xBuffer == NULL || yBuffer == NULL) {
+ if( xBuffer != NULL)
+ gs_free_object(pgs->memory, xBuffer, "x point buffer");
+ if( yBuffer != NULL)
+ gs_free_object(pgs->memory, yBuffer, "y point buffer");
+ if_debug1('1', "[1]cannot allocate point buffers %i\n",pointBufferSize * sizeof(int));
+ return_error(gs_error_VMerror);
+ }
+
+ xLimit = xBuffer + pointBufferSize;
+ yLimit = yBuffer + pointBufferSize;
+ xLast = NULL;
+
+ if_debug2('1', "[1]num_points=%u num_aux_points=%u\n", num_points, num_aux_points);
+
+ /* collect the points in the buffers, since we need to clean them up later */
+ /* only points inside the bounding box are allowed */
+ /* aux points are points inserted between two points, making the outline smoother */
+ /* the aux points could be used for curve fitting, but we add line segments */
+ for ( xScan = xBuffer, yScan = yBuffer; x_coords < x_coords_last; x_coords += 2, y_coords += 2 ) {
+ x = pl_get_uint16(x_coords) & 0x3fff;
+ y = pl_get_uint16(y_coords) & 0x3fff;
+
+ if_debug4('1', "[1]%s (%d,%d) %s\n",
+ (*x_coords & 0x80 ? " line" : "curve"), x, y,
+ (*y_coords & 0x80 ? " line" : "curve"));
+
+ if (xScan > xBuffer) { /* not first point, therefore aux is possible */
+ if ( x_aux_coords < x_aux_coords_last &&!(*x_coords & 0x80) ) { /* use an aux point */
+ /* The auxiliary dx and dy values are signed. */
+ int dx = (*x_aux_coords++ ^ 0x80) - 0x80;
+ int dy = (*y_aux_coords++ ^ 0x80) - 0x80;
+
+ if_debug2('1', "[1]... aux (%d,%d)\n", dx, dy);
+
+ xAux = (x + *(xScan-1)) / 2 + dx;
+ yAux = (y + *(yScan-1)) / 2 + dy;
+ if ((xAux >= llx && xAux <= urx) && (yAux >= lly && yAux <= ury)) { /* aux point is inside bounding box */
+ *xScan++ = xAux;
+ *yScan++ = yAux;
+ } /* end point inside bounding box */
+ /* what do points outside the bounding box mean? */
+ } /* use an aux point */
+ } /* not first point */
+
+ if ( (x >= llx && x <= urx) && (y >= lly && y <= ury) ) { /* point inside bounding box */
+ *xScan++ = x;
+ *yScan++ = y;
+ } /* point inside bounding box */
+ } /* for num_points - first time through */
+
+ if ( num_aux_points != 0xffff )
+ xLast = xScan;
+ else
+ xLast = xScan - 1; /* discard the last point */
+
+ xScan = xBuffer;
+ yScan = yBuffer;
+ if (xLast > xBuffer) {
+ code = gs_moveto(pgs, (floatp)*xScan++, (floatp)*yScan++);
+ if ( code < 0 )
+ goto cleanup;
+ }
+
+ for (; xScan < xLast; ) {
+ code = gs_lineto(pgs, (floatp)*xScan++, (floatp)*yScan++);
+ if ( code < 0 )
+ goto cleanup;
+ }
+ /* close the path of this loop */
+ code = gs_closepath(pgs);
+ if ( code < 0 )
+ break;
+
+ } /* for num_loops */
+
+cleanup:
+ gs_free_object(pgs->memory, xBuffer, "x point buffer");
+ gs_free_object(pgs->memory, yBuffer, "y point buffer");
+ } /* end not compound */
+ return code;
+}
+
+/* Get character existence and escapement for an Intellifont. */
+static int
+pl_intelli_char_width(const pl_font_t *plfont, const void *pgs, uint char_code, gs_point *pwidth)
+{
+ const byte *cdata = pl_font_lookup_glyph(plfont, char_code)->data;
+ int wx;
+
+ if ( !pwidth )
+ return (cdata == 0 ? 1 : 0);
+ if ( cdata == 0 )
+ { pwidth->x = pwidth->y = 0;
+ return 1;
+ }
+ switch ( cdata[3] )
+ {
+ case 3: /* non-compound character */
+ cdata += 4; /* skip PCL character header */
+ { const intelli_metrics_t *metrics =
+ (const intelli_metrics_t *)(cdata + pl_get_uint16(cdata + 2));
+ wx =
+ pl_get_int16(metrics->charEscapementBox[2]) -
+ pl_get_int16(metrics->charEscapementBox[0]);
+ }
+ break;
+ case 4: /* compound character */
+ wx = pl_get_int16(cdata + 4);
+ break;
+ default: /* shouldn't happen */
+ pwidth->x = pwidth->y = 0;
+ return 0;
+ }
+ pwidth->x = (floatp)wx / 8782.0;
+
+#ifdef DEBUG
+ {
+ pl_font_glyph_t *cglyph = pl_font_lookup_glyph(plfont, char_code);
+ if_debug1('1', "[1] glyph %ld\n", cglyph->glyph);
+ if_debug2('1', "[1] intelli width of %d %f\n", char_code, pwidth->x);
+ }
+#endif
+ return 0;
+}
+
+static int
+pl_intelli_char_metrics(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4])
+
+{
+ gs_point width;
+ const byte *cdata = pl_font_lookup_glyph(plfont, char_code)->data;
+
+ metrics[0] = metrics[1] = metrics[2] = metrics[3] = 0;
+
+ if ( cdata == 0 ) {
+ return 1;
+ }
+
+ /* compound */
+ if ( cdata[3] == 4 ) {
+ dprintf("warning compound intellifont metrics not supported" );
+ return 0;
+ }
+
+ cdata += 4;
+
+ {
+ const intelli_metrics_t *intelli_metrics =
+ (const intelli_metrics_t *)(cdata + pl_get_uint16(cdata + 2));
+
+ /* NB probably not right */
+ /* never a vertical substitute, doesn't yet handle compound characters */
+ metrics[0] = (float)pl_get_int16(intelli_metrics->charSymbolBox[0]);
+ metrics[0] /= 8782.0;
+ pl_intelli_char_width(plfont, pgs, char_code, &width);
+ metrics[2] = width.x;
+ return 0;
+ }
+}
+
+/* Render a character for an Intellifont. */
+static int
+pl_intelli_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont,
+ gs_char chr, gs_glyph glyph)
+{ const pl_font_t *plfont = (const pl_font_t *)pfont->client_data;
+ float wbox[6];
+ int code;
+
+ wbox[0] = wbox[1] = 0;
+ wbox[2] = wbox[3] = 65536.0;
+ wbox[4] = wbox[5] = -65536.0;
+ if ( !pl_intelli_merge_box(wbox, plfont, glyph) )
+ { wbox[2] = wbox[3] = wbox[4] = wbox[5] = 0;
+ code = gs_setcachedevice(penum, pgs, wbox);
+ return (code < 0 ? code : 0);
+ }
+ code = gs_setcachedevice(penum, pgs, wbox);
+ if ( code < 0 )
+ return code;
+ code = pl_intelli_show_char(pgs, plfont, glyph);
+ if ( code < 0 )
+ return code;
+ /* Since we don't take into account which side of the loops is */
+ /* outside, we take the easy way out.... */
+ code = gs_eofill(pgs);
+ return (code < 0 ? code : 0);
+}
+
+
+/* ---------------- Internal initialization ---------------- */
+
+/* Initialize the procedures for a bitmap font. */
+void
+pl_bitmap_init_procs(gs_font_base *pfont)
+{ pfont->procs.encode_char = (void *)pl_bitmap_encode_char; /* FIX ME (void *) */
+ pfont->procs.build_char = (void *)pl_bitmap_build_char; /* FIX ME (void *) */
+#define plfont ((pl_font_t *)pfont->client_data)
+ plfont->char_width = pl_bitmap_char_width;
+ plfont->char_metrics = pl_bitmap_char_metrics;
+#undef plfont
+}
+
+/* Initialize the procedures for a TrueType font. */
+void
+pl_tt_init_procs(gs_font_type42 *pfont)
+{
+ pfont->procs.encode_char = (void *)pl_tt_encode_char; /* FIX ME (void *) */
+ pfont->procs.build_char = (void *)pl_tt_build_char; /* FIX ME (void *) */
+ pfont->data.string_proc = pl_tt_string_proc;
+#define plfont ((pl_font_t *)pfont->client_data)
+ plfont->char_width = pl_tt_char_width;
+ plfont->char_metrics = pl_tt_char_metrics;
+#undef plfont
+}
+
+uint
+pl_tt_get_glyph_index(gs_font_type42 *pfont42, gs_glyph glyph)
+{
+ /* identity */
+ return glyph;
+}
+
+/* Finish initializing a TrueType font. */
+void
+pl_tt_finish_init(gs_font_type42 *pfont, bool downloaded)
+{ float upem = pfont->data.unitsPerEm;
+ ulong head = tt_find_table(pfont, "head", NULL);
+ const byte *hdata;
+
+ pfont->data.get_glyph_index = pl_tt_get_glyph_index;
+ if ( downloaded )
+ pfont->data.get_outline = pl_tt_get_outline;
+ /* Set the FontBBox. */
+ access(head, 44, hdata);
+ pfont->FontBBox.p.x = pl_get_int16(hdata + 36) / upem;
+ pfont->FontBBox.p.y = pl_get_int16(hdata + 38) / upem;
+ pfont->FontBBox.q.x = pl_get_int16(hdata + 40) / upem;
+ pfont->FontBBox.q.y = pl_get_int16(hdata + 42) / upem;
+#ifdef DEBUG
+ if ( gs_debug_c('m') )
+ { const byte *OffsetTable;
+ uint numTables;
+ const byte *TableDirectory;
+ uint i;
+
+ access(0, 12, OffsetTable);
+ numTables = pl_get_uint16(OffsetTable + 4);
+ access(12, numTables * 16, TableDirectory);
+ for ( i = 0; i < numTables; ++i )
+ { const byte *tab = TableDirectory + i * 16;
+ dprintf6("%c%c%c%c offset = %lu length = %lu\n",
+ tab[0], tab[1], tab[2], tab[3],
+ (ulong)pl_get_uint32(tab + 8), (ulong)pl_get_uint32(tab + 12));
+ }
+ }
+#endif
+ /* override default get metrics */
+ pfont->data.get_metrics = pl_tt_get_metrics;
+}
+
+void
+pl_intelli_init_procs(gs_font_base *pfont)
+{ pfont->procs.encode_char = (void *)pl_intelli_encode_char; /* FIX ME (void *) */
+ pfont->procs.build_char = (void *)pl_intelli_build_char; /* FIX ME (void *) */
+#define plfont ((pl_font_t *)pfont->client_data)
+ plfont->char_width = pl_intelli_char_width;
+ plfont->char_metrics = pl_intelli_char_metrics;
+#undef plfont
+}
+/* ---------------- Public procedures ---------------- */
+
+/* Allocate the glyph table. */
+int
+pl_font_alloc_glyph_table(pl_font_t *plfont, uint num_glyphs, gs_memory_t *mem,
+ client_name_t cname)
+{ uint size = num_glyphs + (num_glyphs >> 2) + 5;
+ pl_font_glyph_t *glyphs =
+ gs_alloc_struct_array(mem, size, pl_font_glyph_t,
+ &st_pl_font_glyph_element, cname);
+
+ if ( glyphs == 0 )
+ return_error(gs_error_VMerror);
+ { uint i;
+ for ( i = 0; i < size; ++i )
+ glyphs[i].glyph = 0, glyphs[i].data = 0;
+ }
+ plfont->glyphs.table = glyphs;
+ plfont->glyphs.used = 0;
+ plfont->glyphs.limit = num_glyphs;
+ plfont->glyphs.size = size;
+ plfont->glyphs.skip = size * 2 / 3;
+ while ( igcd(plfont->glyphs.skip, size) > 1 )
+ plfont->glyphs.skip++;
+ return 0;
+}
+
+/* Expand the glyph table. */
+static int
+expand_glyph_table(pl_font_t *plfont, gs_memory_t *mem)
+{ pl_glyph_table_t old_table;
+ int code;
+ uint i;
+
+ old_table = plfont->glyphs;
+ code = pl_font_alloc_glyph_table(plfont, old_table.size, mem,
+ "expand_glyph_table(new table)");
+ if ( code < 0 )
+ return code;
+ for ( i = 0; i < old_table.size; ++i )
+ if ( old_table.table[i].data )
+ *pl_font_lookup_glyph(plfont, old_table.table[i].glyph) =
+ old_table.table[i];
+ gs_free_object(mem, old_table.table, "expand_glyph_table(old table)");
+ plfont->glyphs.used = old_table.used;
+ return 0;
+}
+
+/* Allocate the TrueType character to glyph index map. */
+int
+pl_tt_alloc_char_glyphs(pl_font_t *plfont, uint num_chars, gs_memory_t *mem,
+ client_name_t cname)
+{ uint size = num_chars + (num_chars >> 2) + 5;
+ pl_tt_char_glyph_t *char_glyphs =
+ (pl_tt_char_glyph_t *)
+ gs_alloc_byte_array(mem, size, sizeof(pl_tt_char_glyph_t), cname);
+
+ if ( char_glyphs == 0 )
+ return_error(gs_error_VMerror);
+ { uint i;
+ for ( i = 0; i < size; ++i )
+ char_glyphs[i].chr = gs_no_char, char_glyphs[i].glyph = 0;
+ }
+ plfont->char_glyphs.table = char_glyphs;
+ plfont->char_glyphs.used = 0;
+ plfont->char_glyphs.limit = num_chars;
+ plfont->char_glyphs.size = size;
+ plfont->char_glyphs.skip = size * 2 / 3;
+ while ( igcd(plfont->char_glyphs.skip, size) > 1 )
+ plfont->char_glyphs.skip++;
+ return 0;
+}
+
+/* Expand the character to glyph index map. */
+static int
+expand_char_glyph_table(pl_font_t *plfont, gs_memory_t *mem)
+{ pl_tt_char_glyph_table_t old_table;
+ int code;
+ uint i;
+
+ old_table = plfont->char_glyphs;
+ code = pl_tt_alloc_char_glyphs(plfont, old_table.size, mem,
+ "expand_char_glyphs(new table)");
+ if ( code < 0 )
+ return code;
+ for ( i = 0; i < old_table.size; ++i )
+ if ( old_table.table[i].chr != gs_no_char )
+ *pl_tt_lookup_char(plfont, old_table.table[i].chr) =
+ old_table.table[i];
+ gs_free_object(mem, old_table.table, "expand_char_glyphs(old table)");
+ plfont->char_glyphs.used = old_table.used;
+ return 0;
+}
+
+/* Add a glyph to a font. Return -1 if the table is full. */
+typedef struct font_glyph_s {
+ gs_font *font;
+ gs_glyph glyph;
+} font_glyph_t;
+static bool
+match_font_glyph(const gs_memory_t *mem, cached_char *cc, void *vpfg)
+{ const font_glyph_t *pfg = vpfg;
+ return (cc->pair->font == pfg->font && cc->code == pfg->glyph);
+}
+int
+pl_font_add_glyph(pl_font_t *plfont, gs_glyph glyph, const byte *cdata)
+{ gs_font *pfont = plfont->pfont;
+ gs_glyph key = glyph;
+ pl_tt_char_glyph_t *ptcg = 0;
+ pl_font_glyph_t *pfg;
+ /*
+ * If this is a downloaded TrueType font, the "glyph" is actually
+ * a character code, and the actual TrueType glyph index is in the
+ * character header. In this case, the character data must be either
+ * a PCL5 format 15 or a PCL XL format 1 downloaded character.
+ */
+tcg: if ( plfont->char_glyphs.table )
+ { ptcg = pl_tt_lookup_char(plfont, key);
+ if ( ptcg->chr == gs_no_char &&
+ plfont->char_glyphs.used >= plfont->char_glyphs.limit
+ )
+ { /* Table is full, try to expand it. */
+ int code = expand_char_glyph_table(plfont, pfont->memory);
+ if ( code < 0 )
+ return code;
+ goto tcg;
+ }
+ /* get glyph id from character download */
+ if ( cdata[0] == 1 )
+ /* pxl truetype format 1,
+ * class 0 at offset 4, class 1 at offset 8 or class 2 at 10 */
+ key = pl_get_uint16(cdata + ((cdata[1] == 0) ? 4 : ((cdata[1] == 1) ? 8 : 10)));
+ else
+ /* pcl truetype format 15 */
+ key = pl_get_uint16(cdata + cdata[2] + 4);
+ }
+fg: pfg = pl_font_lookup_glyph(plfont, key);
+ if ( pfg->data != 0 )
+ { /* Remove the glyph from the character cache. */
+ font_glyph_t match_fg;
+
+ match_fg.font = pfont;
+ match_fg.glyph = key;
+ gx_purge_selected_cached_chars(pfont->dir, match_font_glyph,
+ &match_fg);
+ gs_free_object(pfont->memory, (void *)pfg->data,
+ "pl_font_add_glyph(old data)");
+ }
+ else
+ { if ( plfont->glyphs.used >= plfont->glyphs.limit )
+ { /* Table is full, try to expand it. */
+ int code = expand_glyph_table(plfont, pfont->memory);
+ if ( code < 0 )
+ return code;
+ goto fg;
+ }
+ plfont->glyphs.used++;
+ }
+ if ( ptcg )
+ { if ( ptcg->chr == gs_no_char )
+ plfont->char_glyphs.used++;
+ ptcg->chr = glyph;
+ ptcg->glyph = key;
+ }
+ pfg->glyph = key;
+ pfg->data = cdata;
+ return 0;
+}
+
+/* Remove a glyph from a font. Return 1 if the glyph was present. */
+int
+pl_font_remove_glyph(pl_font_t *plfont, gs_glyph glyph)
+{ gs_font *pfont = plfont->pfont;
+ gs_glyph key = glyph;
+ pl_font_glyph_t *pfg;
+
+ /* See above regarding downloaded TrueType fonts. */
+ if ( plfont->char_glyphs.table )
+ { pl_tt_char_glyph_t *ptcg = pl_tt_lookup_char(plfont, key);
+ if ( ptcg->chr == gs_no_char )
+ return 0;
+ key = ptcg->glyph;
+ ptcg->chr = gs_no_char;
+ ptcg->glyph = 1; /* mark as deleted */
+ plfont->char_glyphs.used--;
+ }
+ /* may not have a glyph table in case of cloned resident */
+ if ( plfont->glyphs.table == 0 )
+ return 0;
+ pfg = pl_font_lookup_glyph(plfont, key);
+ if ( pfg->data == 0 )
+ return 0; /* character not defined */
+ { /* Remove the glyph from the character cache. */
+ font_glyph_t match_fg;
+
+ match_fg.font = pfont;
+ match_fg.glyph = key;
+ gx_purge_selected_cached_chars(pfont->dir, match_font_glyph,
+ &match_fg);
+ gs_free_object(pfont->memory, (void *)pfg->data,
+ "pl_font_remove_glyph(data)");
+ }
+ pfg->data = 0;
+ pfg->glyph = 1; /* mark as deleted */
+ plfont->glyphs.used--;
+ return 1;
+}
diff --git a/pl/pldebug.h b/pl/pldebug.h
new file mode 100644
index 000000000..55126652c
--- /dev/null
+++ b/pl/pldebug.h
@@ -0,0 +1,23 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* Miscellaneous debugging facilities */
+
+#ifndef pldebug_INCLUDED
+# define pldebug_INCLUDED
+
+#include "assert.h"
+
+#define PL_ASSERT assert
+
+#endif /* pldebug_INCLUDED */
diff --git a/pl/pldict.c b/pl/pldict.c
new file mode 100644
index 000000000..de306d1e0
--- /dev/null
+++ b/pl/pldict.c
@@ -0,0 +1,311 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pldict.h */
+/* Dictionary implementation for PCL parsers */
+
+#include "memory_.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "pldict.h"
+
+/*
+ * The current implementation of dictionaries is a simple linked list. The
+ * only concession to efficiency is that we store keys of up to
+ * pl_dict_max_short_key characters in the node itself rather than a separately
+ * allocated string.
+ */
+struct pl_dict_entry_s {
+ gs_const_string key; /* data pointer = 0 if short key */
+ void *value;
+ pl_dict_entry_t *next;
+ pl_dict_entry_t *link; /* a link to the actual entry (supports aliases). */
+ byte short_key[pl_dict_max_short_key];
+};
+#define entry_key_data(pde)\
+ ((pde)->key.size <= pl_dict_max_short_key ? (pde)->short_key : (pde)->key.data)
+
+/* GC descriptors */
+public_st_pl_dict();
+gs_private_st_composite(st_pl_dict_entry, pl_dict_entry_t, "pl_dict_entry_t",
+ pl_dict_entry_enum_ptrs, pl_dict_entry_reloc_ptrs);
+#define pde ((pl_dict_entry_t *)vptr)
+static ENUM_PTRS_BEGIN(pl_dict_entry_enum_ptrs) return 0;
+ ENUM_CONST_STRING_PTR(0, pl_dict_entry_t, key);
+ ENUM_PTR(1, pl_dict_entry_t, value);
+ ENUM_PTR(2, pl_dict_entry_t, next);
+ ENUM_PTR(3, pl_dict_entry_t, link);
+ENUM_PTRS_END
+static RELOC_PTRS_BEGIN(pl_dict_entry_reloc_ptrs) {
+ RELOC_CONST_STRING_PTR(pl_dict_entry_t, key);
+ RELOC_PTR(pl_dict_entry_t, value);
+ RELOC_PTR(pl_dict_entry_t, next);
+ RELOC_PTR(pl_dict_entry_t, link);
+} RELOC_PTRS_END
+#undef pde
+
+/* ---------------- Utilities ---------------- */
+
+/* Provide a standard procedure for freeing a value. */
+static void
+pl_dict_value_free(gs_memory_t *mem, void *value, client_name_t cname)
+{ gs_free_object(mem, value, cname);
+}
+
+/*
+ * Look up an entry in a dictionary. Return a pointer to the pointer to the
+ * entry.
+ */
+static pl_dict_entry_t **
+pl_dict_lookup_entry(pl_dict_t *pdict, const byte *kdata, uint ksize)
+{ pl_dict_entry_t **ppde = &pdict->entries;
+ pl_dict_entry_t *pde;
+ for ( ; (pde = *ppde) != 0; ppde = &pde->next )
+ { if ( pde->key.size == ksize &&
+ !memcmp(entry_key_data(pde), kdata, ksize)
+ )
+ return ppde;
+ }
+ return 0;
+}
+
+/* Delete a dictionary entry. */
+static void
+pl_dict_free(pl_dict_t *pdict, pl_dict_entry_t **ppde, client_name_t cname)
+{ pl_dict_entry_t *pde = *ppde;
+ gs_memory_t *mem = pdict->memory;
+
+ *ppde = pde->next;
+ if ( !pde->link ) /* values are not freed for links */
+ (*pdict->free_proc)(mem, pde->value, cname);
+ if ( pde->key.size > pl_dict_max_short_key )
+ gs_free_string(mem, (byte *)pde->key.data, pde->key.size, cname);
+ gs_free_object(mem, pde, cname);
+ pdict->entry_count--;
+}
+
+/* ---------------- API procedures ---------------- */
+
+/* Initialize a dictionary. */
+void
+pl_dict_init(pl_dict_t *pdict, gs_memory_t *mem,
+ pl_dict_value_free_proc_t free_proc)
+{ pdict->memory = mem;
+ pdict->free_proc = (free_proc ? free_proc : pl_dict_value_free);
+ pdict->entries = 0;
+ pdict->entry_count = 0;
+ pdict->parent = 0;
+}
+
+/*
+ * Look up an entry in a dictionary, optionally searching the stack, and
+ * optionally returning a pointer to the actual dictionary where the
+ * entry was found. Return true, setting *pvalue (and, if ppdict is not
+ * NULL, *ppdict), if found. Note that this is the only routine that
+ * searches the stack.
+ */
+bool
+pl_dict_lookup(pl_dict_t *pdict, const byte *kdata, uint ksize, void **pvalue,
+ bool with_stack, pl_dict_t **ppdict)
+{ pl_dict_t *pdcur = pdict;
+ pl_dict_entry_t **ppde;
+
+ while ( (ppde = pl_dict_lookup_entry(pdcur, kdata, ksize)) == 0 )
+ { if ( !with_stack || (pdcur = pdcur->parent) == 0 )
+ return false;
+ }
+ *pvalue = (*ppde)->value;
+ if ( ppdict )
+ *ppdict = pdcur;
+ return true;
+}
+
+/*
+ * make a new dictionary entry.
+ */
+static int
+pl_dict_build_new_entry(pl_dict_t *pdict, const byte *kdata, uint ksize,
+ void *value, pl_dict_entry_t *link)
+{ /* Make a new entry. */
+ byte *kstr;
+ gs_memory_t *mem = pdict->memory;
+ pl_dict_entry_t *pde;
+ pde = gs_alloc_struct(mem, pl_dict_entry_t, &st_pl_dict_entry,
+ "pl_dict_put(entry)");
+ kstr = (ksize <= pl_dict_max_short_key ? pde->short_key :
+ gs_alloc_string(mem, ksize, "pl_dict_put(key)"));
+ if ( pde == 0 || kstr == 0 )
+ { if ( kstr && kstr != pde->short_key )
+ gs_free_string(mem, kstr, ksize, "pl_dict_put(key)");
+ gs_free_object(mem, pde, "pl_dict_put(entry)");
+ return -1;
+ }
+ memcpy(kstr, kdata, ksize);
+ pde->key.data = (ksize <= pl_dict_max_short_key ? 0 : kstr);
+ pde->key.size = ksize;
+ pde->link = link;
+ pde->value = value;
+ pde->next = pdict->entries;
+ pdict->entries = pde;
+ pdict->entry_count++;
+ return 0;
+}
+
+/*
+ * Add an entry to a dictionary. Return 1 if it replaces an existing entry.
+ * Return -1 if we couldn't allocate memory. pl_dict_put copies the key
+ * string, but takes ownership of the value object (i.e., it will free it
+ * when the entry is deleted, using the free_proc).
+ */
+int
+pl_dict_put(pl_dict_t *pdict, const byte *kdata, uint ksize, void *value)
+{ pl_dict_entry_t **ppde = pl_dict_lookup_entry(pdict, kdata, ksize);
+ if ( !ppde )
+ { void *link = 0;
+ return pl_dict_build_new_entry(pdict, kdata, ksize, value, link);
+ }
+ else
+ { /* Replace the value in an existing entry. */
+ pl_dict_entry_t *pde;
+ pde = *ppde;
+ (*pdict->free_proc)(pdict->memory, pde->value,
+ "pl_dict_put(old value)");
+ pde->value = value;
+ return 1;
+ }
+}
+
+/*
+ * link entry or alias
+ */
+int
+pl_dict_put_synonym(pl_dict_t *pdict, const byte *old_kdata, uint old_ksize,
+ const byte *new_kdata, uint new_ksize)
+{ pl_dict_entry_t **old_ppde = pl_dict_lookup_entry(pdict, old_kdata, old_ksize);
+ pl_dict_entry_t *old_pde;
+ pl_dict_entry_t **new_ppde = pl_dict_lookup_entry(pdict, new_kdata, new_ksize);
+ /* old value doesn't exist or new value does exist */
+ if ( !old_ppde || new_ppde )
+ return -1;
+ /* find the original data if this is a link to a link */
+ old_pde = *old_ppde;
+ if ( old_pde->link != 0 )
+ old_pde = old_pde->link;
+
+ return pl_dict_build_new_entry(pdict, new_kdata, new_ksize,
+ old_pde->value, old_pde);
+}
+
+/*
+ * Purge alias entries. A bit tricky but this doesn't fowl the
+ * enumeration code since links are always prior to their entries. We
+ * insert at the head of the list and a real entry must be present to
+ * insert a link. Also deleting an entry deletes *all* associated
+ * links and deleting a link deletes the corresponding entry.
+ */
+void
+pl_dict_undef_purge_synonyms(pl_dict_t *pdict, const byte *kdata, uint ksize)
+{ pl_dict_entry_t **ppde = &pdict->entries;
+ pl_dict_entry_t **pptarget = pl_dict_lookup_entry(pdict, kdata, ksize);
+ pl_dict_entry_t *pde;
+ pl_dict_entry_t *ptarget;
+
+ if ( !pptarget )
+ return;
+ ptarget = *pptarget;
+ /* get the real entry if this is a link. */
+ if ( ptarget->link )
+ ptarget = ptarget->link;
+#define dict_get_key_data(entry) ((entry)->key.size > pl_dict_max_short_key ?\
+ (entry)->key.data : (entry)->short_key)
+ pl_dict_undef(pdict, dict_get_key_data(ptarget), ptarget->key.size);
+ /* delete links to the target */
+ pde = *ppde;
+ while ( pde )
+ {
+ pl_dict_entry_t *npde = pde->next; /* next entry */
+ if ( pde->link && pde->link == ptarget )
+ pl_dict_undef(pdict, dict_get_key_data(pde), pde->key.size);
+ pde = npde;
+ }
+#undef dict_get_key_data
+}
+
+/*
+ * Remove an entry from a dictionary. Return true if the entry was present.
+ */
+bool
+pl_dict_undef(pl_dict_t *pdict, const byte *kdata, uint ksize)
+{ pl_dict_entry_t **ppde = pl_dict_lookup_entry(pdict, kdata, ksize);
+
+ if ( !ppde )
+ return false;
+ pl_dict_free(pdict, ppde, "pl_dict_undef");
+ return true;
+}
+
+/*
+ * Return the number of entries in a dictionary.
+ */
+uint
+pl_dict_length(const pl_dict_t *pdict, bool with_stack)
+{ uint count = pdict->entry_count;
+
+ if ( with_stack )
+ { const pl_dict_t *pdcur;
+ for ( pdcur = pdict->parent; pdcur != 0; pdcur = pdcur->parent )
+ count += pdcur->entry_count;
+ }
+ return count;
+}
+
+/*
+ * Enumerate a dictionary with or without its stack.
+ * See pldict.h for details.
+ */
+void
+pl_dict_enum_stack_begin(const pl_dict_t *pdict, pl_dict_enum_t *penum,
+ bool with_stack)
+{ penum->pdict = pdict;
+ penum->next = 0;
+ penum->first = true;
+ penum->next_dict = (with_stack ? pdict->parent : 0);
+}
+
+bool
+pl_dict_enum_next(pl_dict_enum_t *penum, gs_const_string *pkey,
+ void **pvalue)
+{ pl_dict_entry_t *pde;
+ while ( (pde = (penum->first ? penum->pdict->entries : penum->next)) == 0 )
+ { if ( penum->next_dict == 0 )
+ return false;
+ penum->next_dict = (penum->pdict = penum->next_dict)->parent;
+ penum->first = true;
+ }
+ pkey->data = entry_key_data(pde);
+ pkey->size = pde->key.size;
+ *pvalue = pde->value;
+ penum->next = pde->next;
+ penum->first = false;
+ return true;
+}
+
+/*
+ * Release a dictionary by freeing all keys, values, and other storage.
+ */
+void
+pl_dict_release(pl_dict_t *pdict)
+{ while ( pdict->entries )
+ pl_dict_free(pdict, &pdict->entries, "pl_dict_release");
+}
diff --git a/pl/pldict.h b/pl/pldict.h
new file mode 100644
index 000000000..b18da8902
--- /dev/null
+++ b/pl/pldict.h
@@ -0,0 +1,164 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pldict.h */
+/* Dictionary interface for PCL parsers */
+/* Requires gsmemory.h */
+
+#ifndef pldict_INCLUDED
+# define pldict_INCLUDED
+
+/*
+ * We use dictionaries to catalog various kinds of entities. The keys are
+ * strings; the values are 'objects'. The current implementation is slow
+ * but simple.
+ *
+ * Dictionaries can be stacked. Lookups search the stack, but additions,
+ * deletions, and replacements always work in the top dictionary.
+ *
+ * The implementation copies keys, but does not copy values. Instead, it
+ * calls a client-supplied freeing procedure whenever a value must be freed
+ * (by being deleted or replaced). The prototype for this procedure is
+ * identical to that of gs_free_object (which, however, is a macro.)
+ */
+typedef void (*pl_dict_value_free_proc_t)(gs_memory_t *, void *,
+ client_name_t);
+#ifndef pl_dict_entry_DEFINED
+# define pl_dict_entry_DEFINED
+typedef struct pl_dict_entry_s pl_dict_entry_t;
+#endif
+typedef struct pl_dict_s pl_dict_t;
+struct pl_dict_s {
+ pl_dict_entry_t *entries;
+ uint entry_count;
+ pl_dict_value_free_proc_t free_proc;
+ pl_dict_t *parent; /* next dictionary up the stack */
+ gs_memory_t *memory;
+};
+#ifdef extern_st
+extern_st(st_pl_dict); /* only for embedders */
+#endif
+#define public_st_pl_dict() /* in pldict.c */\
+ gs_public_st_ptrs2(st_pl_dict, pl_dict_t, "pl_dict_t",\
+ pl_dict_enum_ptrs, pl_dict_reloc_ptrs, entries, parent)
+#define st_pl_dict_max_ptrs 2
+
+/*
+ * Define the maximum length of keys stored in the dictionary entries
+ * themselves. This is a time/space tradeoff.
+ */
+#define pl_dict_max_short_key 16
+
+/* Initialize a dictionary. */
+void pl_dict_init(pl_dict_t *pdict, gs_memory_t *memory,
+ pl_dict_value_free_proc_t free_proc);
+
+/*
+ * Look up an entry in a dictionary, optionally searching the stack, and
+ * optionally returning a pointer to the actual dictionary where the
+ * entry was found. Return true, setting *pvalue (and, if ppdict is not
+ * NULL, *ppdict), if found.
+ */
+bool pl_dict_lookup(pl_dict_t *pdict, const byte *kdata, uint ksize,
+ void **pvalue, bool with_stack, pl_dict_t **ppdict);
+#define pl_dict_find(pdict, kdata, ksize, pvalue)\
+ pl_dict_lookup(pdict, kdata, ksize, pvalue, true, (pl_dict_t **)0)
+
+#define pl_dict_find_no_stack(pdict, kdata, ksize, pvalue)\
+ pl_dict_lookup(pdict, kdata, ksize, pvalue, false, (pl_dict_t **)0)
+
+/*
+ * Add an entry to a dictionary. Return 1 if it replaces an existing entry.
+ * Return -1 if we couldn't allocate memory.
+ */
+int pl_dict_put(pl_dict_t *pdict, const byte *kdata, uint ksize,
+ void *value);
+
+/*
+ * When a dictionary entry is created, it can be designated as being a
+ * synonym or alias of an existing entry, rather than having a value
+ * of its own. All entries in a synonym group are equivalent: there
+ * is no distinction between the "original" entry and subsequent ones,
+ * and synonymy is commutative and transitive. All entries in a
+ * synonym group have the same value: when the value of one member of
+ * a group is changed, the values of all members of the group are
+ * changed. When any member of a synonym group is deleted, all
+ * members of the group are deleted. (Note that the client-supplied
+ * freeing procedure is only called once in the case of a change or
+ * deletion.) When deleting an entry that is potentially a synonym or
+ * an entry that has associated synonyms the client should use
+ * pl_undef_purge_synonyms() (see below).
+ */
+
+int pl_dict_put_synonym(pl_dict_t *pdict, const byte *old_kdata,
+ uint old_ksize, const byte *new_kdata,
+ uint new_ksize);
+
+/*
+ * Remove an entry from a dictionary. Return true if the entry was present.
+ */
+bool pl_dict_undef(pl_dict_t *pdict, const byte *kdata, uint ksize);
+
+/*
+ * Get or set the parent of a dictionary.
+ */
+#define pl_dict_parent(pdict) ((pdict)->parent)
+#define pl_dict_set_parent(pdict, pardict) ((pdict)->parent = (pardict))
+
+/*
+ * Return the number of entries in a dictionary.
+ */
+uint pl_dict_length(const pl_dict_t *pdict, bool with_stack);
+
+/*
+ * Enumerate a dictionary. If entries are added during enumeration,
+ * they may or may not be enumerated; it is OK to delete entries that have
+ * already been enumerated (including the current entry), but not
+ * entries that have not been enumerated yet. Use as follows:
+ * gs_const_string keyvar;
+ * void *valuevar;
+ * pl_dict_enum_t denum;
+ * ...
+ * pl_dict_enum_begin(pdict, &denum);
+ * -or-
+ * pl_dict_enum_stack_begin(pdict, &denum, with_stack);
+ * while ( pl_dict_enum_next(&denum, &keyvar, &valuevar) )
+ * ... process <keyvar, valuevar> ...
+ */
+typedef struct pl_dict_enum_s {
+ const pl_dict_t *pdict;
+ pl_dict_entry_t *next;
+ bool first;
+ const pl_dict_t *next_dict;
+} pl_dict_enum_t;
+void pl_dict_enum_stack_begin(const pl_dict_t *pdict, pl_dict_enum_t *penum,
+ bool with_stack);
+#define pl_dict_enum_begin(pdict, penum)\
+ pl_dict_enum_stack_begin(pdict, penum, true)
+bool pl_dict_enum_next(pl_dict_enum_t *penum, gs_const_string *pkey,
+ void **pvalue);
+
+/*
+ * Release a dictionary by freeing all keys, values, and other storage.
+ */
+void pl_dict_release(pl_dict_t *pdict);
+
+/*
+ * Delete an entry that is a synonym or a canonical entry that has
+ * related synonyms. The entire group of entries is deleted. Note
+ * that this routine should be used in liueu of pl_dict_undef() if
+ * synonyms are potentially used.
+ */
+void pl_dict_undef_purge_synonyms(pl_dict_t *pdict, const byte *kdata, uint ksize);
+
+#endif /* pldict_INCLUDED */
diff --git a/pl/pldraw.c b/pl/pldraw.c
new file mode 100644
index 000000000..2e0c377b7
--- /dev/null
+++ b/pl/pldraw.c
@@ -0,0 +1,35 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pldraw.c */
+/* Common drawing routines for PCL5 and PCL XL */
+#include "std.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gxdevice.h"
+#include "gzstate.h"
+#include "pldraw.h"
+
+/* Begin an image with parameters derived from a graphics state. */
+int
+pl_begin_image(gs_state *pgs, const gs_image_t *pim,
+ void **pinfo)
+{ gx_device *dev = pgs->device;
+
+ if ( pim->ImageMask | pim->CombineWithColor )
+ gx_set_dev_color(pgs);
+ return (*dev_proc(dev, begin_image))
+ (dev, (const gs_imager_state *)pgs, pim,
+ gs_image_format_chunky, (const gs_int_rect *)0,
+ pgs->dev_color, pgs->clip_path, pgs->memory, (gx_image_enum_common_t **)pinfo);
+}
diff --git a/pl/pldraw.h b/pl/pldraw.h
new file mode 100644
index 000000000..40abb6d1e
--- /dev/null
+++ b/pl/pldraw.h
@@ -0,0 +1,24 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pldraw.h */
+/* Interface to pldraw.c */
+#include "gsiparam.h"
+#ifndef gs_state_DEFINED
+# define gs_state_DEFINED
+typedef struct gs_state_s gs_state;
+#endif
+
+/* Begin an image with parameters derived from a graphics state. */
+int pl_begin_image(gs_state *pgs, const gs_image_t *pim,
+ void **pinfo);
diff --git a/pl/plfont.c b/pl/plfont.c
new file mode 100644
index 000000000..e4a2cb9ad
--- /dev/null
+++ b/pl/plfont.c
@@ -0,0 +1,1054 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plfont.c */
+/* PCL font handling library -- operations on entire fonts */
+#include "memory_.h"
+#include "stdio_.h"
+#include "gdebug.h"
+#include "gp.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gschar.h"
+#include "gsutil.h"
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "plfont.h"
+#include "plvalue.h"
+#include "strmio.h"
+
+/* Structure descriptors */
+private_st_pl_font();
+
+/* Define accessors for unaligned, big-endian quantities. */
+#define u16(bptr) pl_get_uint16(bptr)
+#define s16(bptr) pl_get_int16(bptr)
+/**** ASSUME uint >= 32 BITS ****/
+#define u32(bptr) (uint)pl_get_uint32(bptr)
+
+/* ---------------- Utilities ---------------- */
+
+/* Free a font. This is the freeing procedure in the font dictionary. */
+void
+pl_free_font(gs_memory_t *mem, void *plf, client_name_t cname)
+{ pl_font_t *plfont = plf;
+ /* Free the characters. */
+ if ( !plfont->data_are_permanent )
+ { if ( plfont->glyphs.table )
+ { uint i;
+ for ( i = plfont->glyphs.size; i > 0; )
+ { void *data = (void *)plfont->glyphs.table[--i].data;
+ if ( data )
+ gs_free_object(mem, data, cname);
+ }
+ }
+ gs_free_object(mem, (void *)plfont->header, cname);
+ plfont->header = 0; /* see hack note above */
+ }
+ /* Free the font data itself. */
+ gs_free_object(mem, (void *)plfont->char_glyphs.table, cname);
+ gs_free_object(mem, (void *)plfont->glyphs.table, cname);
+ if ( plfont->pfont ) { /* might be only partially constructed */
+ gs_purge_font(plfont->pfont);
+ gs_purge_font_from_char_caches_completely(plfont->pfont);
+ gs_free_object(mem, plfont->pfont, cname);
+ }
+ if ( plfont->font_file ) {
+ gs_free_object(mem, plfont->font_file, cname);
+ plfont->font_file = 0;
+ }
+ gs_free_object(mem, plf, cname);
+}
+
+/* ---------------- Library callbacks ---------------- */
+
+const char *pl_mac_names[258] = {
+ ".notdef",
+ ".null",
+ "nonmarkingreturn",
+ "space",
+ "exclam",
+ "quotedbl",
+ "numbersign",
+ "dollar",
+ "percent",
+ "ampersand",
+ "quotesingle",
+ "parenleft",
+ "parenright",
+ "asterisk",
+ "plus",
+ "comma",
+ "hyphen",
+ "period",
+ "slash",
+ "zero",
+ "one",
+ "two",
+ "three",
+ "four",
+ "five",
+ "six",
+ "seven",
+ "eight",
+ "nine",
+ "colon",
+ "semicolon",
+ "less",
+ "equal",
+ "greater",
+ "question",
+ "at",
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ "bracketleft",
+ "backslash",
+ "bracketright",
+ "asciicircum",
+ "underscore",
+ "grave",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "braceleft",
+ "bar",
+ "braceright",
+ "asciitilde",
+ "Adieresis",
+ "Aring",
+ "Ccedilla",
+ "Eacute",
+ "Ntilde",
+ "Odieresis",
+ "Udieresis",
+ "aacute",
+ "agrave",
+ "acircumflex",
+ "adieresis",
+ "atilde",
+ "aring",
+ "ccedilla",
+ "eacute",
+ "egrave",
+ "ecircumflex",
+ "edieresis",
+ "iacute",
+ "igrave",
+ "icircumflex",
+ "idieresis",
+ "ntilde",
+ "oacute",
+ "ograve",
+ "ocircumflex",
+ "odieresis",
+ "otilde",
+ "uacute",
+ "ugrave",
+ "ucircumflex",
+ "udieresis",
+ "dagger",
+ "degree",
+ "cent",
+ "sterling",
+ "section",
+ "bullet",
+ "paragraph",
+ "germandbls",
+ "registered",
+ "copyright",
+ "trademark",
+ "acute",
+ "dieresis",
+ "notequal",
+ "AE",
+ "Oslash",
+ "infinity",
+ "plusminus",
+ "lessequal",
+ "greaterequal",
+ "yen",
+ "mu",
+ "partialdiff",
+ "summation",
+ "product",
+ "pi",
+ "integral",
+ "ordfeminine",
+ "ordmasculine",
+ "Omega",
+ "ae",
+ "oslash",
+ "questiondown",
+ "exclamdown",
+ "logicalnot",
+ "radical",
+ "florin",
+ "approxequal",
+ "Delta",
+ "guillemotleft",
+ "guillemotright",
+ "ellipsis",
+ "nonbreakingspace",
+ "Agrave",
+ "Atilde",
+ "Otilde",
+ "OE",
+ "oe",
+ "endash",
+ "emdash",
+ "quotedblleft",
+ "quotedblright",
+ "quoteleft",
+ "quoteright",
+ "divide",
+ "lozenge",
+ "ydieresis",
+ "Ydieresis",
+ "fraction",
+ "currency",
+ "guilsinglleft",
+ "guilsinglright",
+ "fi",
+ "fl",
+ "daggerdbl",
+ "periodcentered",
+ "quotesinglbase",
+ "quotedblbase",
+ "perthousand",
+ "Acircumflex",
+ "Ecircumflex",
+ "Aacute",
+ "Edieresis",
+ "Egrave",
+ "Iacute",
+ "Icircumflex",
+ "Idieresis",
+ "Igrave",
+ "Oacute",
+ "Ocircumflex",
+ "apple",
+ "Ograve",
+ "Uacute",
+ "Ucircumflex",
+ "Ugrave",
+ "dotlessi",
+ "circumflex",
+ "tilde",
+ "macron",
+ "breve",
+ "dotaccent",
+ "ring",
+ "cedilla",
+ "hungarumlaut",
+ "ogonek",
+ "caron",
+ "Lslash",
+ "lslash",
+ "Scaron",
+ "scaron",
+ "Zcaron",
+ "zcaron",
+ "brokenbar",
+ "Eth",
+ "eth",
+ "Yacute",
+ "yacute",
+ "Thorn",
+ "thorn",
+ "minus",
+ "multiply",
+ "onesuperior",
+ "twosuperior",
+ "threesuperior",
+ "onehalf",
+ "onequarter",
+ "threequarters",
+ "franc",
+ "Gbreve",
+ "gbreve",
+ "Idotaccent",
+ "Scedilla",
+ "scedilla",
+ "Cacute",
+ "cacute",
+ "Ccaron",
+ "ccaron",
+ "dcroat"
+};
+
+extern ulong tt_find_table(gs_font_type42 *pfont, const char *tname, uint *plen);
+
+static int
+pl_glyph_name(gs_font *pfont, gs_glyph glyph, gs_const_string *pstr)
+{
+ uint table_length;
+ ulong table_offset;
+ /* guess if the font type is not truetype */
+ if ( pfont->FontType != ft_TrueType ) {
+ glyph -= 29;
+ if ( glyph >= 0 && glyph < 258 ) {
+ pstr->data = pl_mac_names[glyph];
+ pstr->size = strlen(pstr->data);
+ return 0;
+ } else {
+ dprintf1("glyph index %lx out of range", (ulong)glyph);
+ return -1;
+ }
+ }
+
+ table_offset = tt_find_table((gs_font_type42 *)pfont, "post", &table_length);
+ /* no post table */
+ if ( table_offset == 0 )
+ return -1;
+ /* this shoudn't happen but... */
+ if ( table_length == 0 )
+ return -1;
+
+ {
+ ulong format;
+ uint numGlyphs;
+ uint glyph_name_index;
+ const byte *postp; /* post table pointer */
+
+ ((gs_font_type42 *)pfont)->data.string_proc((gs_font_type42 *)pfont,
+ table_offset, table_length, &postp);
+ format = u32(postp);
+ if ( format != 0x20000 ) {
+ /* format 1.0 (mac encoding) is a simple table see the TT
+ spec. We don't implement this because we don't see it
+ in practice */
+ dprintf1("unkonwn post table format %lX\n", format);
+ return -1;
+ }
+ /* skip over the post header */
+ numGlyphs = u16(postp + 32);
+ if ( glyph < 0 || glyph > numGlyphs - 1) {
+ dprintf1("glyph index %lx out of range", glyph);
+ return -1;
+ }
+ /* glyph name index starts at post + 34 each entry is 2 bytes */
+ glyph_name_index = u16(postp + 34 + (glyph * 2));
+ /* this shouldn't happen */
+ if ( glyph_name_index < 0 && glyph_name_index > 0x7fff )
+ return -1;
+ /* mac easy */
+ if ( glyph_name_index < 258 ) {
+
+ pstr->data = pl_mac_names[glyph_name_index];
+ pstr->size = strlen(pstr->data);
+ return 0;
+ /* not mac */
+ } else {
+ char *mydata;
+ /* and here's the tricky part */
+ const byte *pascal_stringp =
+ postp + 34 + (numGlyphs * 2);
+ /* 0 - 257 lives in the mac table above */
+ glyph_name_index -= 258;
+ /* The string we want is the index'th pascal string,
+ so we "hop" to each length byte "index" times. */
+ while (glyph_name_index > 0) {
+ pascal_stringp += ((int)(*pascal_stringp)+1);
+ glyph_name_index--;
+ }
+ /* length byte */
+ pstr->size = (int)(*pascal_stringp);
+ /* + 1 is for the length byte */
+ pstr->data = pascal_stringp + 1;
+ /* sanity check */
+ if ( pstr->data + pstr->size > postp + table_length ||
+ pstr->data - 1 < postp) {
+ dprintf("data out of range\n");
+ return -1;
+ }
+ /* sigh - we have to allocate a copy of the data - by the
+ time a high level device makes use of it the font data
+ may be freed. This is a necessary leak. */
+ mydata = gs_alloc_bytes(pfont->memory, pstr->size + 1, "glyph to name");
+ if ( mydata == 0 )
+ return -1;
+ memcpy(mydata, pascal_stringp + 1, pstr->size);
+ pstr->data = mydata;
+ return 0;
+ }
+ }
+ return 0;
+}
+
+extern gs_char last_char;
+/* Get the unicode valude for a glyph */
+static gs_char
+pl_decode_glyph(gs_font *font, gs_glyph glyph)
+{
+ return last_char;
+}
+
+/* ---------------- Public procedures ---------------- */
+
+/* character width */
+int pl_font_char_width(const pl_font_t *plfont, const void *pgs, uint char_code, gs_point *pwidth)
+{
+ return (*(plfont)->char_width)(plfont, pgs, char_code, pwidth);
+}
+
+/* character width */
+int pl_font_char_metrics(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4])
+{
+ return (*(plfont)->char_metrics)(plfont, pgs, char_code, metrics);
+}
+
+/* Allocate a font. */
+pl_font_t *
+pl_alloc_font(gs_memory_t *mem, client_name_t cname)
+{ pl_font_t *plfont =
+ gs_alloc_struct(mem, pl_font_t, &st_pl_font, cname);
+
+ if ( plfont )
+ { /* Initialize pointers. */
+ plfont->pfont = 0;
+ plfont->header = 0;
+ plfont->glyphs.table = 0;
+ plfont->char_glyphs.table = 0;
+ /* Initialize other defaults. */
+ plfont->orient = 0;
+ plfont->allow_vertical_substitutes = false;
+ plfont->bold_fraction = 0;
+ plfont->font_file = 0;
+ plfont->resolution.x = plfont->resolution.y = 0;
+ plfont->params.proportional_spacing = true;
+ memset(plfont->character_complement, 0xff, 8);
+ plfont->offsets.GC = plfont->offsets.GT = plfont->offsets.VT = -1;
+ plfont->pts_per_inch = 72.0; /* normal value */
+ }
+ return plfont;
+}
+/* import from plchar.c - used to determine if this is a downloaded
+ true type font or a resident font - yuck. */
+extern int pl_tt_get_outline(gs_font_type42 *pfont, uint index, gs_glyph_data_t *pdata);
+
+/* Structure descriptors for cloning fonts */
+gs_private_st_ptrs1(st_pl_font_glyph_f, pl_font_glyph_t, "pl_font_glyph_t",
+ pl_font_glyph_enum_ptrs_f, pl_font_glyph_reloc_ptrs_f, data);
+gs_private_st_element(st_pl_font_glyph_element_f, pl_font_glyph_t,
+ "pl_font_glyph_t[]",
+ pl_font_glyph_elt_enum_ptrs_f, pl_font_glyph_elt_reloc_ptrs_f, st_pl_font_glyph_f);
+
+pl_font_t *
+pl_clone_font(const pl_font_t *src, gs_memory_t *mem, client_name_t cname)
+{
+ pl_font_t *plfont =
+ gs_alloc_struct(mem, pl_font_t, &st_pl_font, cname);
+ if ( plfont == 0 )
+ return 0;
+ /* copy technology common parts */
+ plfont->storage = src->storage;
+ plfont->header_size = src->header_size;
+ plfont->scaling_technology = src->scaling_technology;
+ plfont->is_xl_format = src->is_xl_format;
+ plfont->allow_vertical_substitutes = src->allow_vertical_substitutes;
+ plfont->font_type = src->font_type;
+ plfont->char_width = src->char_width;
+ plfont->char_metrics = src->char_metrics;
+ plfont->large_sizes = src->large_sizes;
+ plfont->resolution = src->resolution;
+ plfont->params = src->params;
+ plfont->pts_per_inch = src->pts_per_inch;
+ plfont->font_file_loaded = src->font_file_loaded;
+ plfont->orient = src->orient;
+ plfont->bold_fraction = src->bold_fraction;
+ {
+ int i;
+ for (i = 0; i < sizeof(src->character_complement); i++ )
+ plfont->character_complement[i] = src->character_complement[i];
+ }
+ plfont->offsets = src->offsets;
+ plfont->header = gs_alloc_bytes(mem, src->header_size, cname);
+ if ( plfont->header == 0 )
+ return 0;
+ memcpy(plfont->header, src->header, src->header_size);
+
+ if ( src->font_file ) {
+ plfont->font_file = gs_alloc_bytes(mem, strlen(src->font_file) + 1,
+ "pl_clone_font");
+ if ( plfont->font_file == 0 )
+ return 0; /* #NB errors!!! */
+ strcpy(plfont->font_file, src->font_file);
+ }
+ else
+ plfont->font_file = 0;
+ /* technology specific setup */
+ switch ( plfont->scaling_technology )
+ {
+ case plfst_bitmap:
+ {
+ gs_font_base *pfont =
+ gs_alloc_struct(mem, gs_font_base, &st_gs_font_base, cname);
+ if ( pfont == 0 )
+ return 0;
+ pl_fill_in_font((gs_font *)pfont, plfont, src->pfont->dir, mem, "nameless_font");
+ pl_fill_in_bitmap_font(pfont, gs_next_ids(mem, 1));
+ break;
+ }
+ case plfst_Intellifont:
+ {
+ gs_font_base *pfont =
+ gs_alloc_struct(mem, gs_font_base, &st_gs_font_base, cname);
+ if ( pfont == 0 )
+ return 0;
+ pl_fill_in_font((gs_font *)pfont, plfont, src->pfont->dir, mem, "nameless_font");
+ pl_fill_in_intelli_font(pfont, gs_next_ids(mem, 1));
+ break;
+ }
+ case plfst_TrueType:
+ {
+ {
+ gs_font_type42 *pfont =
+ gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42, cname);
+ /* detect if a truetype font is downloaded or
+ internal. There must be a better way... */
+ gs_font_type42 *pfont_src = (gs_font_type42 *)src->pfont;
+ bool downloaded = (pfont_src->data.get_outline == pl_tt_get_outline);
+ if ( pfont == 0 )
+ return 0;
+ pl_fill_in_font((gs_font *)pfont, plfont, src->pfont->dir, mem, "nameless_font");
+ pl_fill_in_tt_font(pfont, downloaded ? NULL : src->header, gs_next_ids(mem, 1));
+ }
+ break;
+ }
+ default:
+ return 0;
+ }
+ if ( src->char_glyphs.table != 0 )
+ {
+ /* HAS may gs_alloc_struct_array() here but this is
+ consistant with pl_tt_alloc_char_glyphs() */
+ pl_tt_char_glyph_t *char_glyphs =
+ (pl_tt_char_glyph_t *) gs_alloc_byte_array(mem,
+ src->char_glyphs.size,
+ sizeof(pl_tt_char_glyph_t), cname);
+ int i;
+ if ( char_glyphs == 0 )
+ return 0;
+ for ( i = 0; i < src->char_glyphs.size; i++ )
+ char_glyphs[i] = src->char_glyphs.table[i];
+ /* once again a copy struct shortcut and then are restore
+ of the char_glyphs.table pointer */
+ plfont->char_glyphs = src->char_glyphs;
+ plfont->char_glyphs.table = char_glyphs;
+ }
+ else /* no character glyph table data */
+ plfont->char_glyphs = src->char_glyphs;
+
+ if ( src->glyphs.table != 0 )
+ {
+ int i;
+ plfont->glyphs.table =
+ gs_alloc_struct_array(mem, src->glyphs.size, pl_font_glyph_t,
+ &st_pl_font_glyph_element_f, cname);
+ plfont->glyphs.used = src->glyphs.used;
+ plfont->glyphs.limit = src->glyphs.limit;
+ plfont->glyphs.size = src->glyphs.size;
+ plfont->glyphs.skip = src->glyphs.skip;
+ for ( i = 0; i < src->glyphs.size; i++ )
+ {
+ const byte *data = src->glyphs.table[i].data;
+ byte *char_data;
+ plfont->glyphs.table[i].glyph =
+ src->glyphs.table[i].glyph;
+ plfont->glyphs.table[i].data = 0;
+ if ( data )
+ { /* ARGH --- */
+ uint size;
+ if ( plfont->scaling_technology == plfst_bitmap )
+ {
+ size = 16 +
+ ((pl_get_uint16(data + 10) + 7) >> 3) *
+ pl_get_uint16(data + 12);
+ }
+ else if ( plfont->scaling_technology == plfst_Intellifont ) {
+ /* non compound characters */
+ if ( data[3] == 3 )
+ size = 6 + pl_get_uint16(data + 4);
+ else /* assume data[3] == 4 (compound) */
+ size = 8 + data[6] * 6 + 2;
+ }
+ else /* truetype */
+ size = 2 + 2 + data[2] +
+ pl_get_uint16(data + 2 + data[2]);
+ char_data = gs_alloc_bytes(mem, size, cname);
+ if ( char_data == 0 )
+ return 0;
+ memcpy(char_data, data, size);
+ plfont->glyphs.table[i].data = char_data;
+ }
+
+ }
+ }
+ else /* no glyph table */
+ plfont->glyphs = src->glyphs;
+ return plfont;
+}
+
+/* Fill in generic font boilerplate. NB TODO examine duplication with
+ gs_font_alloc() */
+int
+pl_fill_in_font(gs_font *pfont, pl_font_t *plfont, gs_font_dir *pdir, gs_memory_t *mem, const char *font_name)
+{
+ int i;
+ plfont->pfont = pfont;
+ /* Initialize generic font data. */
+ gs_make_identity(&pfont->orig_FontMatrix);
+ pfont->next = pfont->prev = 0;
+ pfont->memory = mem;
+ pfont->dir = pdir;
+ pfont->is_resource = false;
+ gs_notify_init(&pfont->notify_list, gs_memory_stable(mem));
+ pfont->base = pfont;
+ pfont->client_data = plfont;
+ pfont->WMode = 0;
+ pfont->PaintType = 0;
+ pfont->StrokeWidth = 0;
+ pfont->is_cached = 0;
+ pfont->procs.init_fstack = gs_default_init_fstack;
+ pfont->procs.next_char_glyph = gs_default_next_char_glyph;
+
+ pfont->procs.glyph_name = pl_glyph_name;
+ pfont->procs.decode_glyph = pl_decode_glyph;
+ /* NB pfont->procs.callbacks.known_encode = pl_known_encode; */
+ pfont->procs.define_font = gs_no_define_font;
+ pfont->procs.make_font = gs_no_make_font;
+ pfont->procs.font_info = gs_default_font_info;
+ pfont->procs.glyph_info = gs_default_glyph_info;
+ pfont->procs.glyph_outline = gs_no_glyph_outline;
+ pfont->id = gs_next_ids(mem, 1);
+ pfont->font_name.size = strlen(font_name);
+ strncpy(pfont->font_name.chars, font_name, pfont->font_name.size);
+ /* replace spaces with '-', seems acrobat doesn't like spaces. */
+ for (i = 0; i < pfont->font_name.size; i++) {
+ if (pfont->font_name.chars[i] == ' ')
+ pfont->font_name.chars[i] = '-';
+ }
+ strncpy(pfont->key_name.chars, font_name, sizeof(pfont->font_name.chars));
+ pfont->key_name.size = strlen(font_name);
+ return 0;
+}
+
+/* Fill in bitmap font boilerplate. */
+void
+pl_fill_in_bitmap_font(gs_font_base *pfont, long unique_id)
+{ pfont->FontType = ft_user_defined;
+ pfont->BitmapWidths = true;
+ pfont->ExactSize = fbit_use_bitmaps;
+ pfont->InBetweenSize = fbit_use_bitmaps;
+ pfont->TransformedChar = fbit_transform_bitmaps;
+ pl_bitmap_init_procs(pfont);
+ /* We have no idea what the FontBBox should be. */
+ pfont->FontBBox.p.x = pfont->FontBBox.p.y =
+ pfont->FontBBox.q.x = pfont->FontBBox.q.y = 0;
+ uid_set_UniqueID(&pfont->UID, unique_id);
+ pfont->encoding_index = 1; /****** WRONG ******/
+ pfont->nearest_encoding_index = 1; /****** WRONG ******/
+}
+
+/* Fill in TrueType font boilerplate. */
+void
+pl_fill_in_tt_font(gs_font_type42 *pfont, void *data, long unique_id)
+{ pfont->FontType = ft_TrueType;
+ pfont->BitmapWidths = true;
+ pfont->ExactSize = fbit_use_outlines;
+ pfont->InBetweenSize = fbit_use_outlines;
+ pfont->TransformedChar = fbit_use_outlines;
+ /* Initialize base font data. */
+ /*
+ * We can't set the FontBBox correctly until we've initialized the
+ * Type 42 specific data, but we need to set it to an empty box now
+ * for the sake of gs_type42_font_init.
+ */
+ pfont->FontBBox.p.x = pfont->FontBBox.p.y =
+ pfont->FontBBox.q.x = pfont->FontBBox.q.y = 0;
+ uid_set_UniqueID(&pfont->UID, unique_id);
+ pfont->encoding_index = 1; /****** WRONG ******/
+ pfont->nearest_encoding_index = 1; /****** WRONG ******/
+ /* Initialize Type 42 specific data. */
+ pfont->data.proc_data = data;
+ pl_tt_init_procs(pfont);
+ gs_type42_font_init(pfont, 0);
+ /* disable unused FAPI */
+ pfont->FAPI = 0;
+ pfont->FAPI_font_data = 0;
+
+ pl_tt_finish_init(pfont, !data);
+}
+
+/* Fill in Intellifont boilerplate. */
+void
+pl_fill_in_intelli_font(gs_font_base *pfont, long unique_id)
+{ /* Intellifonts have an 8782-unit design space. */
+ { gs_matrix mat;
+ gs_make_scaling(1.0/8782, 1.0/8782, &mat);
+ gs_matrix_translate(&mat, -2980.0, -5380.0, &pfont->orig_FontMatrix);
+ }
+ pfont->FontType = ft_user_defined;
+ pfont->BitmapWidths = true;
+ pfont->ExactSize = fbit_use_outlines;
+ pfont->InBetweenSize = fbit_use_outlines;
+ pfont->TransformedChar = fbit_use_outlines;
+ /* We have no idea what the FontBBox should be. */
+ pfont->FontBBox.p.x = pfont->FontBBox.p.y =
+ pfont->FontBBox.q.x = pfont->FontBBox.q.y = 0;
+ uid_set_UniqueID(&pfont->UID, unique_id);
+ pfont->encoding_index = 1; /****** WRONG ******/
+ pfont->nearest_encoding_index = 1; /****** WRONG ******/
+ pl_intelli_init_procs(pfont);
+}
+
+/*
+ * Set large_sizes, scaling_technology, character_complement, offsets
+ * (for TrueType fonts), and resolution (for bitmap fonts) by scanning
+ * the segments of a segmented downloaded font.
+ * This is used for PCL5 Format 15 and 16 fonts and for PCL XL fonts.
+ * fst_offset is the offset of the Font Scaling Technology and Variety bytes;
+ * the segment data runs from start_offset up to end_offset.
+ * large_sizes = false indicates 2-byte segment sizes, true indicates 4-byte.
+ */
+int
+pl_font_scan_segments(const gs_memory_t *mem,
+ pl_font_t *plfont, int fst_offset, int start_offset,
+ long end_offset, bool large_sizes, const pl_font_offset_errors_t *pfoe)
+{ const byte *header = plfont->header;
+ pl_font_scaling_technology_t fst = header[fst_offset];
+ int wsize = (large_sizes ? 4 : 2);
+ const byte *segment = header + start_offset;
+ const byte *end = header + end_offset;
+ const byte *null_segment = end - (2 + wsize);
+ bool found = false;
+ ulong seg_size;
+ int illegal_font_data = pfoe->illegal_font_data;
+
+#define return_scan_error(err)\
+ return_error((err) ? (err) : illegal_font_data);
+
+ if ( memcmp(null_segment, "\377\377", 2) /* NULL segment header */ )
+ return_scan_error(pfoe->missing_required_segment);
+ if ( memcmp(null_segment + 2, "\0\0\0\0", wsize) /* NULL segment size */ )
+ return_scan_error(pfoe->illegal_null_segment_size);
+ switch ( fst )
+ {
+ case plfst_bitmap:
+ case plfst_TrueType:
+ break;
+ default:
+ return_scan_error(pfoe->illegal_font_header_fields);
+ }
+ if ( header[fst_offset + 1] ) /* variety, must be 0 */
+ return_scan_error(pfoe->illegal_font_header_fields);
+ /* Scan the segments. */
+ for ( ; end - segment >= 2 + wsize; segment += 2 + wsize + seg_size )
+ { uint seg_id = u16(segment);
+ const byte *sdata = segment + 2 + wsize;
+#define id2(c1,c2) (((uint)(c1) << 8) + (c2))
+
+ seg_size = (large_sizes ? u32(segment + 2) : u16(segment + 2));
+ if ( seg_size + 2 + wsize > end - segment )
+ return_error(illegal_font_data);
+ /* Handle segments common to all fonts. */
+ switch ( seg_id )
+ {
+ case 0xffff: /* NULL segment ID */
+ if ( segment != null_segment )
+ return_error(illegal_font_data);
+ continue;
+ case id2('V','I'):
+ continue;
+ case id2('C', 'C'):
+ if ( seg_size != 8 )
+ return_error(illegal_font_data);
+ memcpy(plfont->character_complement, sdata, 8);
+ continue;
+ default:
+ ;
+ }
+ /* Handle segments specific to the scaling technology. */
+ if ( fst == plfst_bitmap )
+ switch ( seg_id )
+ {
+ case id2('B','R'):
+ if ( seg_size != 4 )
+ return_scan_error(pfoe->illegal_BR_segment);
+ { uint xres = pl_get_uint16(sdata);
+ uint yres = pl_get_uint16(sdata + 2);
+ if ( xres == 0 || yres == 0 )
+ return_scan_error(pfoe->illegal_BR_segment);
+ plfont->resolution.x = xres;
+ plfont->resolution.y = yres;
+ }
+ found = true;
+ break;
+ default:
+ if ( pfoe->illegal_font_segment < 0 )
+ return_error(pfoe->illegal_font_segment);
+ }
+ else /* fst == plfst_TrueType */
+ switch ( seg_id )
+ {
+ case id2('G','T'):
+ /*
+ * We don't do much checking here, but we do check that
+ * the segment starts with a table directory that
+ * includes at least 3 elements (gdir, head,
+ * maxp -- but we don't check the actual names).
+ */
+ if ( seg_size < 12 + 5 * 16 ||
+ /* memcmp(sdata, "\000\001\000\000", 4) || */
+ u16(sdata + 4) < 3
+ )
+ return_scan_error(pfoe->illegal_GT_segment);
+ plfont->offsets.GT = segment - header;
+ found = true;
+ break;
+ case id2('G','C'):
+ if ( seg_size < 6 || u16(sdata) != 0 ||
+ seg_size != u16(sdata + 4) * 6 + 6
+ )
+ return_scan_error(pfoe->illegal_GC_segment);
+ plfont->offsets.GC = segment - header;
+ break;
+ case id2('V','T'):
+ /* Check for end of table mark */
+ if ( (seg_size & 3) != 0 || seg_size < 4 ||
+ u16(sdata + seg_size - 4) != 0xffff
+ )
+ return_scan_error(pfoe->illegal_VT_segment);
+ /* Check for table sorted by horizontal glyph ID */
+ { uint i;
+ for ( i = 0; i < seg_size - 4; i += 4 )
+ if ( u16(sdata + i) > u16(sdata + i + 4) )
+ return_scan_error(pfoe->illegal_VT_segment);
+ }
+ plfont->offsets.VT = segment - header;
+ break;
+ case id2('V', 'E'): /* nb unimplemented */
+ break;
+ case id2('V', 'R'): /* nb unimplemented */
+ break;
+ case id2('C', 'E'): /* nb unimplemented */
+ break;
+ default:
+ if ( pfoe->illegal_font_segment < 0 )
+ return_error(pfoe->illegal_font_segment);
+ }
+#undef id2
+ }
+ if ( !found )
+ return_scan_error(pfoe->missing_required_segment);
+ if ( segment != end )
+ return_error(illegal_font_data);
+ plfont->large_sizes = large_sizes;
+ plfont->scaling_technology = fst;
+ return 0;
+#undef return_scan_error
+}
+
+int
+pl_free_tt_fontfile_buffer(gs_memory_t *mem, byte *ptt_font_data)
+{
+ gs_free_object(mem, ptt_font_data, "pl_tt_load_font data");
+ return 0;
+}
+
+int
+pl_alloc_tt_fontfile_buffer(stream *in, gs_memory_t *mem, byte **pptt_font_data, ulong *size)
+{
+ ulong len = (sfseek(in, 0L, SEEK_END), sftell(in));
+ *size = 6 + len; /* leave room for segment header */
+ if ( *size != (uint)(*size) ) {
+ /*
+ * The font is too big to load in a single piece -- punt.
+ * The error message is bogus, but there isn't any more
+ * appropriate one.
+ */
+ sfclose(in);
+ return_error(gs_error_VMerror);
+ }
+ srewind(in);
+ *pptt_font_data = gs_alloc_bytes(mem, *size, "pl_tt_load_font data");
+ if ( *pptt_font_data == 0 ) {
+ sfclose(in);
+ return_error(gs_error_VMerror);
+ }
+ sfread(*pptt_font_data + 6, 1, len, in);
+ sfclose(in);
+ return 0;
+}
+
+/* Load a built-in (TrueType) font from external storage. */
+int
+pl_load_tt_font(stream *in, gs_font_dir *pdir, gs_memory_t *mem,
+ long unique_id, pl_font_t **pplfont, char *font_name)
+{
+ byte *tt_font_datap;
+ ulong size;
+ int code;
+ gs_font_type42 *pfont;
+ pl_font_t *plfont;
+ /* get the data from the file */
+ code = pl_alloc_tt_fontfile_buffer(in, mem, &tt_font_datap, &size);
+ if ( code < 0 )
+ return_error(gs_error_VMerror);
+ /* Make a Type 42 font out of the TrueType data. */
+ pfont = gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42,
+ "pl_tt_load_font(gs_font_type42)");
+ plfont = pl_alloc_font(mem, "pl_tt_load_font(pl_font_t)");
+
+ if ( pfont == 0 || plfont == 0 )
+ code = gs_note_error(gs_error_VMerror);
+ else { /* Initialize general font boilerplate. */
+ code = pl_fill_in_font((gs_font *)pfont, plfont, pdir, mem, font_name);
+ if ( code >= 0 ) { /* Initialize TrueType font boilerplate. */
+ plfont->header = tt_font_datap;
+ plfont->header_size = size;
+ plfont->scaling_technology = plfst_TrueType;
+ plfont->font_type = plft_Unicode;
+ plfont->large_sizes = true;
+ plfont->offsets.GT = 0;
+ plfont->is_xl_format = false;
+ pl_fill_in_tt_font(pfont, tt_font_datap, unique_id);
+ code = gs_definefont(pdir, (gs_font *)pfont);
+ }
+ }
+ if ( code < 0 ) {
+ gs_free_object(mem, plfont, "pl_tt_load_font(pl_font_t)");
+ gs_free_object(mem, pfont, "pl_tt_load_font(gs_font_type42)");
+ pl_free_tt_fontfile_buffer(mem, tt_font_datap);
+ return code;
+ }
+ *pplfont = plfont;
+ return 0;
+}
+
+/* load resident font data to ram */
+int
+pl_load_resident_font_data_from_file(gs_memory_t *mem, pl_font_t *plfont)
+{
+
+ ulong len, size;
+ byte *data;
+ if (plfont->font_file && !plfont->font_file_loaded) {
+ stream *in = sfopen(plfont->font_file, gp_fmode_rb, mem);
+ if ( in == NULL )
+ return -1;
+ /* note this is exactly the same as the code in pl_load_tt_font */
+ len = (sfseek(in, 0L, SEEK_END), sftell(in));
+ size = 6 + len; /* leave room for segment header */
+
+ if ( size != (uint)size ) {
+ /*
+ * The font is too big to load in a single piece -- punt.
+ * The error message is bogus, but there isn't any more
+ * appropriate one.
+ */
+ sfclose(in);
+ return_error(gs_error_VMerror);
+ }
+ srewind(in);
+ data = gs_alloc_bytes(mem, size, "pl_tt_load_font data");
+ if ( data == 0 ) {
+ sfclose(in);
+ return_error(gs_error_VMerror);
+ }
+ sfread(data + 6, 1, len, in);
+ sfclose(in);
+ plfont->header = data;
+ plfont->header_size = size;
+ plfont->font_file_loaded = true;
+ }
+ return 0;
+}
+
+/* Keep resident font data in (header) and deallocate the memory */
+int
+pl_store_resident_font_data_in_file(char *font_file, gs_memory_t *mem, pl_font_t *plfont)
+{
+ /* Free the header data */
+ if ( plfont->header ) {
+ gs_free_object(mem, plfont->header, "pl_store_resident_font_data_in_file");
+ plfont->header = 0;
+ plfont->header_size = 0;
+ } else {
+ /* nothing to do */
+ return 0;
+ }
+ /* we don't yet have a filename for this font object. create one
+ and store it in the font. */
+ if ( !plfont->font_file ) {
+ plfont->font_file = gs_alloc_bytes(mem, strlen(font_file) + 1, "pl_store_resident_font_data_in_file");
+ if ( plfont->font_file == 0 )
+ return -1;
+ strcpy(plfont->font_file, font_file);
+ }
+ /* designate that the font data is not in RAM */
+ plfont->font_file_loaded = false;
+ return 0;
+}
diff --git a/pl/plfont.h b/pl/plfont.h
new file mode 100644
index 000000000..f43186b0a
--- /dev/null
+++ b/pl/plfont.h
@@ -0,0 +1,326 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plfont.h */
+/* Interface to PCL font utilities */
+
+#ifndef plfont_INCLUDED
+# define plfont_INCLUDED
+
+#include "gsccode.h"
+#include "plsymbol.h"
+#include "strmio.h"
+
+/* ---------------- PCL-specified definitions ---------------- */
+
+/*
+ * Define a types for 16-bit (Unicode/MSL) characters.
+ * Note that these are always unsigned.
+ */
+typedef bits16 char16;
+
+/* Define the Font Type for PCL5 downloaded fonts. */
+typedef enum {
+ plft_7bit_printable = 0, /* bound, 32-127 printable */
+ plft_8bit_printable = 1, /* bound, 32-127 & 160-255 printable */
+ plft_8bit = 2, /* bound, 0-255 printable */
+ plft_16bit = 3, /* bound, 0-65534 printable */
+ plft_MSL = 10, /* unbound, MSL codes */
+ plft_Unicode = 11 /* unbound, Unicode codes */
+} pl_font_type_t;
+#define pl_font_is_bound(plfont)\
+ ((plfont)->font_type < 10)
+
+/* Define the Font Scaling Technology for PCL downloaded fonts. */
+typedef enum {
+ plfst_Intellifont = 0,
+ plfst_TrueType = 1,
+ plfst_MicroType = 63,
+ plfst_bitmap = 254
+} pl_font_scaling_technology_t;
+#define pl_font_is_scalable(plfont)\
+ ((plfont)->scaling_technology != plfst_bitmap)
+
+/*
+ * Define the matching characteristics for PCL5 fonts. Note that there
+ * are two different values representing pitch: one in centipoints,
+ * one in characters/inch * 100.
+ */
+#define pl_fp_pitch_cp(pfp) ((pfp)->pitch.cp)
+#define pl_fp_set_pitch_cp(pfp, cpv)\
+ ((pfp)->pitch.cp = (cpv),\
+ (pfp)->pitch.per_inch_x100 = ( (cpv) == 0 ? (cpv) : 720000.0 / (cpv)))
+#define pl_fp_pitch_per_inch(pfp) ((pfp)->pitch.per_inch_x100 / 100.0)
+#define pl_fp_pitch_per_inch_x100(pfp) ((pfp)->pitch.per_inch_x100)
+#define pl_fp_set_pitch_per_inch(pfp, cpi)\
+ ((pfp)->pitch.cp = 7200.0 / (cpi),\
+ (pfp)->pitch.per_inch_x100 = (cpi) * 100.0)
+typedef struct pl_font_pitch_s {
+ floatp cp;
+ floatp per_inch_x100;
+} pl_font_pitch_t;
+#define fp_pitch_value_cp(cpv)\
+ { (cpv), 720000 / (cpv) }
+typedef struct pl_font_params_s {
+ uint symbol_set;
+ bool proportional_spacing;
+ pl_font_pitch_t pitch;
+ uint height_4ths; /* unused in scalable fonts */
+ uint style;
+ int stroke_weight;
+ uint typeface_family;
+ /**** HACK, unfortunately there is not a better way to do this at
+ the current time. ****/
+ int pjl_font_number;
+} pl_font_params_t;
+
+/* ---------------- Internal structures ---------------- */
+
+/*
+ * Define the size values for hash tables.
+ * We require used <= limit < size.
+ */
+#define pl_table_sizes\
+ uint used; /* # of entries in use */\
+ uint limit; /* max # of entries in use */\
+ uint size; /* allocated size of table */\
+ uint skip /* rehashing interval */
+
+/*
+ * Define the hash table for mapping glyphs to character data.
+ * Empty entries have data == 0 and glyph == 0;
+ * deleted entries have data == 0 and glyph != 0.
+ */
+typedef struct pl_font_glyph_s {
+ gs_glyph glyph;
+ const byte *data;
+} pl_font_glyph_t;
+typedef struct pl_glyph_table_s {
+ pl_font_glyph_t *table;
+ pl_table_sizes;
+} pl_glyph_table_t;
+
+/*
+ * Define the hash table for mapping character codes to TrueType glyph indices.
+ * Empty entries have chr == gs_no_char and glyph == 0;
+ * deleted entries have chr == gs_no_char and glyph != 0.
+ */
+typedef struct pl_tt_char_glyph_s {
+ gs_char chr;
+ gs_glyph glyph;
+} pl_tt_char_glyph_t;
+typedef struct pl_tt_char_glyph_table_s {
+ pl_tt_char_glyph_t *table;
+ pl_table_sizes;
+} pl_tt_char_glyph_table_t;
+
+/* Define an abstract type for library fonts. */
+#ifndef gs_font_DEFINED
+# define gs_font_DEFINED
+typedef struct gs_font_s gs_font;
+#endif
+
+/* Define an abstract type for transformation matrices. */
+#ifndef gs_matrix_DEFINED
+# define gs_matrix_DEFINED
+typedef struct gs_matrix_s gs_matrix;
+#endif
+
+/*
+ * We 'wrap' gs_fonts in our own structure.
+ *
+ */
+#ifndef pl_font_t_DEFINED
+# define pl_font_t_DEFINED
+typedef struct pl_font_s pl_font_t;
+#endif
+struct pl_font_s {
+ gs_font *pfont; /* Type 42 if TrueType, Type 3 if bitmap. */
+ int storage; /* where the font is stored */
+ bool data_are_permanent; /* glyph data stored in rom */
+ char *font_file; /* non null only if data is stored in a
+ file only relevant to pcl resident
+ fonts. NB this should be done
+ dynamically */
+ bool font_file_loaded; /* contents of the font file have be read into memory */
+ byte *header; /* downloaded header, or built-in font data */
+ ulong header_size;
+ /* Information extracted from the font or supplied by the client. */
+ pl_font_scaling_technology_t scaling_technology;
+ bool is_xl_format; /* this is required for the agfa ufst scaler */
+ pl_font_type_t font_type;
+ bool allow_vertical_substitutes;
+ /* Implementation of pl_font_char_width, see below */
+ int (*char_width)(const pl_font_t *plfont, const void *pgs, uint char_code, gs_point *pwidth);
+ int (*char_metrics)(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4]);
+ bool large_sizes; /* segment sizes are 32 bits if true, 16 if false */
+ /* (for segmented fonts only) */
+ struct { uint x, y; } resolution; /* resolution (for bitmap fonts) */
+ float bold_fraction; /* for PXL algorithmic bolding */
+ int orient; /* true if pcl bitmap font designed in landscape */
+ pl_font_params_t params;
+ byte character_complement[8]; /* character complement (for unbound fonts) */
+ struct o_ {
+ long GC; /* Galley Character (optional) */
+ long GT; /* Global TrueType data (required, for TT fonts) */
+ long VT; /* VerTical substitution (optional) */
+ } offsets; /* segment offsets, -1 if segment missing */
+ /* Glyph table for downloaded fonts. */
+ pl_glyph_table_t glyphs;
+ /* Character to glyph map for downloaded TrueType fonts. */
+ pl_tt_char_glyph_table_t char_glyphs;
+
+ float pts_per_inch; /* either 72 or 72.307 (for Intellifont) */
+};
+#define private_st_pl_font() /* in plfont.c */\
+ gs_private_st_ptrs4(st_pl_font, pl_font_t, "pl_font_t",\
+ pl_font_enum_ptrs, pl_font_reloc_ptrs, pfont, header, glyphs.table,\
+ char_glyphs.table)
+
+/* ---------------- Procedural interface ---------------- */
+
+/* Allocate and minimally initialize a font. */
+pl_font_t *pl_alloc_font(gs_memory_t *mem, client_name_t cname);
+
+/* copy a font */
+pl_font_t *pl_clone_font(const pl_font_t *src, gs_memory_t *mem, client_name_t cname);
+
+/* Allocate the glyph table. num_glyphs is just an estimate -- the table */
+/* expands automatically as needed. */
+int pl_font_alloc_glyph_table(pl_font_t *plfont, uint num_glyphs,
+ gs_memory_t *mem, client_name_t cname);
+
+/* Allocate the glyph-to-character map for a downloaded TrueType font. */
+int pl_tt_alloc_char_glyphs(pl_font_t *plfont, uint num_chars,
+ gs_memory_t *mem, client_name_t cname);
+
+/* Fill in generic gs_font boilerplate. */
+#ifndef gs_font_dir_DEFINED
+# define gs_font_dir_DEFINED
+typedef struct gs_font_dir_s gs_font_dir;
+#endif
+int pl_fill_in_font(gs_font *pfont, pl_font_t *plfont, gs_font_dir *pdir,
+ gs_memory_t *mem, const char *font_name);
+
+/* Fill in bitmap and intellifont gs_font boilerplate. */
+#ifndef gs_font_base_DEFINED
+# define gs_font_base_DEFINED
+typedef struct gs_font_base_s gs_font_base;
+#endif
+void pl_fill_in_bitmap_font(gs_font_base *pfont, long unique_id);
+void pl_fill_in_intelli_font(gs_font_base *pfont, long unique_id);
+/* Initialize the callback procedures for a bitmap and intellifont
+ fonts. */
+void pl_bitmap_init_procs(gs_font_base *pfont);
+void pl_intelli_init_procs(gs_font_base *pfont);
+/* Fill in TrueType gs_font boilerplate. */
+/* data = NULL for downloaded fonts, the TT data for complete fonts. */
+#ifndef gs_font_type42_DEFINED
+# define gs_font_type42_DEFINED
+typedef struct gs_font_type42_s gs_font_type42;
+#endif
+void pl_fill_in_tt_font(gs_font_type42 *pfont, void *data,
+ long unique_id);
+
+/* Initialize the callback procedures for a TrueType font. */
+void pl_tt_init_procs(gs_font_type42 *pfont);
+/* Finish initializing a TrueType font. */
+void pl_tt_finish_init(gs_font_type42 *pfont, bool downloaded);
+
+/*
+ * Set large_sizes, scaling_technology, character_complement, offsets
+ * (for TrueType fonts), and resolution (for bitmap fonts) by scanning
+ * the segments of a segmented downloaded font.
+ * This is used for PCL5 Format 15 and 16 fonts and for PCL XL fonts.
+ * fst_offset is the offset of the Font Scaling Technology and Variety bytes;
+ * the segment data runs from start_offset up to end_offset.
+ * large_sizes = false indicates 2-byte segment sizes, true indicates 4-byte.
+ */
+typedef struct pl_font_offset_errors_s {
+ int illegal_font_data;
+ int illegal_font_segment; /* 0 means ignore unknown segments */
+ /* 0 in any of the remaining values means return illegal_font_data */
+ int illegal_font_header_fields;
+ int illegal_null_segment_size;
+ int missing_required_segment;
+ int illegal_GT_segment;
+ int illegal_GC_segment;
+ int illegal_VT_segment;
+ int illegal_BR_segment;
+} pl_font_offset_errors_t;
+int pl_font_scan_segments(const gs_memory_t *mem,
+ pl_font_t *plfont, int fst_offset,
+ int start_offset, long end_offset,
+ bool large_sizes,
+ const pl_font_offset_errors_t *pfoe);
+
+/* Load a built-in (TrueType) font from external storage. */
+int pl_load_tt_font(stream *in, gs_font_dir *pdir, gs_memory_t *mem,
+ long unique_id, pl_font_t **pplfont, char *font_name);
+
+/* allocate, read in and free tt font files to and from memory */
+int pl_alloc_tt_fontfile_buffer(stream *in, gs_memory_t *mem, byte **pptt_font_data, ulong *size);
+int pl_free_tt_fontfile_buffer(gs_memory_t *mem, byte *ptt_font_data);
+
+
+/* Add a glyph to a font. Return -1 if the table is full. */
+int pl_font_add_glyph(pl_font_t *plfont, gs_glyph glyph, const byte *data);
+
+/* Determine the escapement of a character in a font / symbol set. */
+/* If the font is bound, the symbol set is ignored. */
+/* If the character is undefined, set the escapement to (0,0) and return 1. */
+/* If pwidth is NULL, don't store the escapement. */
+int pl_font_char_width(const pl_font_t *plfont, const void *pgs, uint char_code, gs_point *pwidth);
+
+/* Determine the character metrics. If vertical substitution is in
+ effect metrics[1] = lsb, metrics[3] = width otherwise metrics[0] =
+ lsb and metrics 2 = width. The same rules for character width apply */
+int pl_font_char_metrics(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4]);
+
+/* Look up a glyph in a font. Return a pointer to the glyph's slot */
+/* (data != 0) or where it should be added (data == 0). */
+pl_font_glyph_t *pl_font_lookup_glyph(const pl_font_t *plfont,
+ gs_glyph glyph);
+
+/* Determine whether a font, with a given symbol set, includes a given */
+/* character. If the font is bound, the symbol set is ignored. */
+#define pl_font_includes_char(plfont, maps, matrix, char_code)\
+ (pl_font_char_width(plfont, maps, matrix, char_code, (gs_point *)0) == 0)
+
+/* Remove a glyph from a font. Return 1 if the glyph was present. */
+int pl_font_remove_glyph(pl_font_t *plfont, gs_glyph glyph);
+
+/* Free a font. This is the freeing procedure in the font dictionary. */
+void pl_free_font(gs_memory_t *mem, void *plf, client_name_t cname);
+
+/* load resident font data to ram */
+int pl_load_resident_font_data_from_file(gs_memory_t *mem, pl_font_t *plfont);
+
+/* keep resident font data in its original file */
+int pl_store_resident_font_data_in_file(char *font_file, gs_memory_t *mem, pl_font_t *plfont);
+
+/* check if the font is zlib deflated. This test is sufficient
+ because we are only checking if the header is a TT header or a zlib
+ compressed header, exclusively. */
+#define pl_is_tt_zlibC(header)\
+ ((header[0] & 0xf) == 8)
+/* agfa requires prepending a dummy header to xl fonts */
+int pl_prepend_xl_dummy_header(gs_memory_t *mem, byte **ppheader);
+/* agfa requires swapping downloaded intellifont headers */
+int pl_swap_header(byte *header, uint gifct);
+
+/* UFST callbacks if needed */
+void plu_set_callbacks(void);
+
+
+#endif /* plfont_INCLUDED */
diff --git a/pl/plftable.c b/pl/plftable.c
new file mode 100644
index 000000000..35397ad90
--- /dev/null
+++ b/pl/plftable.c
@@ -0,0 +1,630 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$*/
+
+/* plftable.c */
+/* resident font table */
+#include "ctype_.h"
+#include "gstypes.h"
+#include "plfont.h"
+#include "plftable.h"
+
+/* The AGFA_FONT_TABLE definition is defined when the system is
+ compiled to use the MonoType font scaler. It can also be defined
+ here locally withe AGFA_SCREENFONTS to use Monotype font names with
+ the TrueType screen fonts distributed with the UFST. The latter
+ configuration uses the artifex fontscaler. NB configuration is
+ awkward. */
+
+/* #define AGFA_FONT_TABLE */
+/* #define AGFA_SCREENFONTS */
+
+#ifdef AGFA_FONT_TABLE
+#ifdef AGFA_SCREENFONTS
+#define fontnames(agfascreenfontname, agfaname, urwname) agfascreenfontname
+#else
+#define fontnames(agfascreenfontname, agfaname, urwname) agfaname
+#endif
+#else
+#define fontnames(agfascreenfontname, agfaname, urwname) urwname
+#endif
+
+
+const font_resident_t resident_table[] = {
+#define C(b) ((byte)((b) ^ 0xff))
+#define cc_alphabetic\
+ { C(0), C(0), C(0), C(0), C(0xff), C(0xc0), C(0), C(plgv_Unicode) }
+#define cc_symbol\
+ { C(0), C(0), C(0), C(4), C(0), C(0), C(0), C(plgv_MSL) }
+#define cc_dingbats\
+ { C(0), C(0), C(0), C(1), C(0), C(0), C(0), C(plgv_MSL) }
+ /*
+ * Per TRM 23-87, PCL5 printers are supposed to have Univers
+ * and CG Times fonts. Substitute Arial for Univers and
+ * Times for CG Times.
+ */
+ /* hack the vendor value to be agfa's. */
+#define agfa (4096)
+ /* definition for style word as defined on 11-19 PCLTRM */
+#define style_word(posture, width, structure) \
+ ((posture) + (4 * (width)) + (32 * (structure)))
+#define REGULAR (style_word(0, 0, 0))
+#define ITALIC (style_word(1, 0, 0))
+#define CONDENSEDITALIC (style_word(1, 1, 0))
+#define CONDENSED (style_word(0, 1, 0))
+#define LIGHT (-3)
+#define NOBOLD (0)
+#define MEDIUMBOLD (1)
+#define TWOBOLD (2)
+#define BOLD (3)
+#define EXBOLD (4)
+
+ {
+ fontnames("Courier", "CourierMT", "NimbusMono-Reg"),
+ {'C','o','u','r','i','e','r',' ',' ',' ',' ',' ',' ',' ',' ',' '},
+ {0, 0, {60.0, 72000.0/60.0}, 0, REGULAR, NOBOLD, 4099, 0}, cc_alphabetic
+ },
+
+ {
+ fontnames("CGTimes", "CGTimes", "NimbusRomanNo4-Lig"),
+ {'C','G',' ','T','i','m','e','s',' ',' ',' ',' ',' ',' ',' ',' '},
+ {0, 1, {29.5, 72000.0/29.5}, 0, REGULAR, NOBOLD, 4101, 1},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGTimesBold", "CGTimes-Bold", "NimbusRomanNo4-Bol"),
+ {'C','G',' ','T','i','m','e','s',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {29.5, 72000.0/29.5}, 0, REGULAR, BOLD, 4101, 2},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGTimesItalic", "CGTimes-Italic", "NimbusRomanNo4-LigIta"),
+ {'C','G',' ','T','i','m','e','s',' ',' ',' ',' ',' ',' ','I','t'},
+ {0, 1, {29.5, 72000.0/29.5}, 0, ITALIC, NOBOLD, 4101, 3},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGTimesBoldItalic", "CGTimes-BoldItalic", "NimbusRomanNo4-BolIta"),
+ {'C','G',' ','T','i','m','e','s',' ',' ',' ',' ','B','d','I','t'},
+ {0, 1, {29.5, 72000.0/29.5}, 0, ITALIC, BOLD, 4101, 4},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGOmega", "CGOmega", "URWClassico-Reg"),
+ {'C','G',' ','O','m','e','g','a',' ',' ',' ',' ',' ',' ',' ',' '},
+ {0, 1, {27.6, 72000.0/27.6}, 0, REGULAR, NOBOLD, 4113, 5},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGOmegaBold", "CGOmega-Bold", "URWClassico-Bol"),
+ {'C','G',' ','O','m','e','g','a',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {27.6, 72000.0/27.6}, 0, REGULAR, BOLD, 4113, 6},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGOmegaItalic", "CGOmega-Italic", "URWClassico-Ita"),
+ {'C','G',' ','O','m','e','g','a',' ',' ',' ',' ',' ',' ','I','t'},
+ {0, 1, {27.6, 72000.0/27.6}, 0, ITALIC, NOBOLD, 4113, 7},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CGOmegaBoldItalic", "CGOmega-BoldItalic", "URWClassico-BolIta"),
+ {'C','G',' ','O','m','e','g','a',' ',' ',' ',' ','B','d','I','t'},
+ {0, 1, {27.6, 72000.0/27.6}, 0, ITALIC, BOLD, 4113, 8},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Coronet", "Coronet", "Coronet"),
+ {'C','o','r','o','n','e','t',' ',' ',' ',' ',' ',' ',' ',' ',' '},
+ {0, 1, {20.3, 72000.0/20.3}, 0, ITALIC, NOBOLD, 4116, 9},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("ClarendonCondensedBold", "Clarendon-Condensed-Bold", "ClarendonURW-BolCon"),
+ {'C','l','a','r','e','n','d','o','n',' ',' ',' ','C','d','B','d'},
+ {0, 1, {22.1, 72000.0/22.1}, 0, CONDENSED, BOLD, 4140, 10},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversMedium", "Univers-Medium", "U001-Reg"),
+ {'U','n','i','v','e','r','s',' ',' ',' ',' ',' ',' ',' ','M','d'},
+ {0, 1, {33.2, 72000.0/33.2}, 0, REGULAR, NOBOLD, 4148, 11},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversBold", "Univers-Bold", "U001-Bol"),
+ {'U','n','i','v','e','r','s',' ',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {33.2, 72000.0/33.2}, 0, REGULAR, BOLD, 4148, 12},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversMediumItalic", "Univers-MediumItalic", "U001-Ita"),
+ {'U','n','i','v','e','r','s',' ',' ',' ',' ',' ','M','d','I','t'},
+ {0, 1, {33.2, 72000.0/33.2}, 0, ITALIC, NOBOLD, 4148, 13},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversBoldItalic", "Univers-BoldItalic", "U001-BolIta"),
+ {'U','n','i','v','e','r','s',' ',' ',' ',' ',' ','B','d','I','t'},
+ {0, 1, {33.2, 72000.0/33.2}, 0, ITALIC, BOLD, 4148, 14},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversCondensedMedium", "Univers-Condensed-Medium", "U001Con-Reg"),
+ {'U','n','i','v','e','r','s',' ',' ',' ',' ',' ','C','d','M','d'},
+ {0, 1, {22.1, 72000.0/22.1}, 0, CONDENSED, NOBOLD, 4148, 15},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversCondensedBold", "Univers-Condensed-Bold", "U001Con-Bol"),
+ {'U','n','i','v','e','r','s',' ',' ',' ',' ',' ','C','d','B','d'},
+ {0, 1, {22.1, 72000.0/22.1}, 0, CONDENSED, BOLD, 4148, 16},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversCondensedMediumItalic", "Univers-Condensed-MediumItalic", "U001Con-Ita"),
+ {'U','n','i','v','e','r','s',' ',' ',' ','C','d','M','d','I','t'},
+ {0, 1, {22.1, 72000.0/22.1}, 0, CONDENSEDITALIC, NOBOLD, 4148, 17},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("UniversCondensedBoldItalic", "Univers-Condensed-BoldItalic", "U001Con-BolIta"),
+ {'U','n','i','v','e','r','s',' ',' ',' ','C','d','B','d','I','t'},
+ {0, 1, {22.1, 72000.0/22.1}, 0, CONDENSEDITALIC, BOLD, 4148, 18},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("AntiqueOlive", "AntiqueOlive", "AntiqueOlive-Reg"),
+ {'A','n','t','i','q','O','l','i','v','e',' ',' ',' ',' ',' ',' '},
+ {0, 1, {29.5, 72000.0/29.5}, 0, REGULAR, NOBOLD, 4168, 19},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("AntiqueOliveBold", "AntiqueOlive-Bold", "AntiqueOlive-Bol"),
+ {'A','n','t','i','q','O','l','i','v','e',' ',' ',' ',' ','B','d'},
+ {0, 1, {33.2, 72000.0/33.2}, 0, REGULAR, BOLD, 4168, 20},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("AntiqueOliveItalic", "AntiqueOlive-Italic", "AntiqueOlive-Ita"),
+ {'A','n','t','i','q','O','l','i','v','e',' ',' ',' ',' ','I','t'},
+ {0, 1, {29.4, 72000.0/29.4}, 0, ITALIC, NOBOLD, 4168, 21},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("GaramondAntiqua", "Garamond-Antiqua", "GaramondNo8-Reg"),
+ {'G','a','r','a','m','o','n','d',' ','A','n','t','i','q','u','a'},
+ {0, 1, {25.8, 72000.0/25.8}, 0, REGULAR, NOBOLD, 4197, 22}, cc_alphabetic
+ },
+
+ {
+ fontnames("GaramondHalbfett", "Garamond-Halbfett", "GaramondNo8-Med"),
+ {'G','a','r','a','m','o','n','d',' ',' ',' ',' ',' ','H','l','b'},
+ {0, 1, {27.6, 72000.0/27.6}, 0, REGULAR, BOLD, 4197, 23}, cc_alphabetic
+ },
+
+ {
+ fontnames("GaramondKursiv", "Garamond-Kursiv", "GaramondNo8-Ita"),
+ {'G','a','r','a','m','o','n','d',' ',' ',' ',' ','K','r','s','v'},
+ {0, 1, {24.0, 72000.0/24.0}, 0, ITALIC, NOBOLD, 4197, 24}, cc_alphabetic
+ },
+
+ {
+ fontnames("GaramondKursivHalbfett", "Garamond-KursivHalbfett", "GaramondNo8-MedIta"),
+ {'G','a','r','a','m','o','n','d',' ','K','r','s','v','H','l','b'},
+ {0, 1, {25.8, 72000.0/25.8}, 0, ITALIC, BOLD, 4197, 25}, cc_alphabetic
+ },
+
+ {
+ fontnames("Marigold", "Marigold", "Mauritius-Reg"),
+ {'M','a','r','i','g','o','l','d',' ',' ',' ',' ',' ',' ',' ',' '},
+ {0, 1, {22.1, 72000.0/22.1}, 0, REGULAR, NOBOLD, 4297, 26},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("AlbertusMedium", "Albertus-Medium", "A028-Med"),
+ {'A','l','b','e','r','t','u','s',' ',' ',' ',' ',' ',' ','M','d'},
+ {0, 1, {31.3, 72000.0/31.3}, 0, REGULAR, MEDIUMBOLD, 4362, 27}, cc_alphabetic
+ },
+
+ {
+ fontnames("AlbertusExtraBold", "Albertus-ExtraBold", "A028-Ext"),
+ {'A','l','b','e','r','t','u','s',' ',' ',' ',' ',' ',' ','X','b'},
+ {0, 1, {36.9, 72000.0/36.9}, 0, REGULAR, EXBOLD, 4362, 28}, cc_alphabetic
+ },
+
+ {
+ fontnames("Arial", "Arial", "A030-Reg"),
+ {'A','r','i','a','l',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
+ {0, 1, {27.8, 72000.0/27.8}, 0, REGULAR, NOBOLD, 16602, 29}, cc_alphabetic
+ },
+
+ {
+ fontnames("Arial-BoldMT", "Arial-Bold", "A030-Bol"),
+ {'A','r','i','a','l',' ',' ',' ',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, REGULAR, BOLD, 16602, 30}, cc_alphabetic
+ },
+
+ {
+ fontnames("Arial-ItalicMT", "Arial-Italic", "A030-Ita"),
+ {'A','r','i','a','l',' ',' ',' ',' ',' ',' ',' ',' ',' ','I','t'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, ITALIC, NOBOLD, 16602, 31}, cc_alphabetic
+ },
+
+ {
+ fontnames("Arial-BoldItalicMT", "Arial-BoldItalic", "A030-BolIta"),
+ {'A','r','i','a','l',' ',' ',' ',' ',' ',' ',' ','B','d','I','t'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, ITALIC, BOLD, 16602, 32}, cc_alphabetic
+ },
+
+ {
+ fontnames("TimesNewRoman", "TimesNewRoman", "NimbusRomanNo9-Reg"),
+ {'T','i','m','e','s','N','e','w','R','m','n',' ',' ',' ',' ',' '},
+ {0, 1, {25, 72000.0/25.0}, 0, REGULAR, NOBOLD, 16901, 33},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("TimesNewRoman-Bold", "TimesNewRoman-Bold", "NimbusRomanNo9-Med"),
+ {'T','i','m','e','s','N','e','w','R','m','n',' ',' ',' ','B','d'},
+ {0, 1, {25, 72000.0/25.0}, 0, REGULAR, BOLD, 16901, 34},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("TimesNewRoman-Italic", "TimesNewRoman-Italic", "NimbusRomanNo9-Ita"),
+ {'T','i','m','e','s','N','e','w','R','m','n',' ',' ',' ','I','t'},
+ {0, 1, {25, 72000.0/25.0}, 0, ITALIC, NOBOLD, 16901, 36},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("TimesNewRoman-BoldItalic", "TimesNewRoman-BoldItalic", "NimbusRomanNo9-MedIta"),
+ {'T','i','m','e','s','N','e','w','R','m','n',' ','B','d','I','t'},
+ {0, 1, {25, 72000.0/25.0}, 0, ITALIC, BOLD, 16901, 35},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica", "Helvetica", "NimbusSanL-Regu"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ',' ',' ',' ',' '},
+ {0, 1, {27.8, 72000.0/27.8}, 0, REGULAR, NOBOLD, 24580, 37}, cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-Bold", "Helvetica-Bold", "NimbusSanL-Bold"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, REGULAR, BOLD, 24580, 38}, cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-BoldOblique", "Helvetica-BoldOblique", "NimbusSanL-BoldItal"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ','B','d','O','b'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, ITALIC, BOLD, 24580, 40},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-Narrow", "Helvetica-Narrow", "NimbusSanL-ReguCond"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ',' ',' ','N','r'},
+ {0, 1, {22.8, 72000.0/22.8}, 0, CONDENSED, NOBOLD, 24580, 41},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-Narrow-Bold", "Helvetica-Narrow-Bold", "NimbusSanL-BoldCond"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ','N','r','B','d'},
+ {0, 1, {22.8, 72000.0/22.8}, 0, CONDENSED, BOLD, 24580, 42},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-Narrow-BoldOblique", "Helvetica-Narrow-BoldOblique", "NimbusSanL-BoldCondItal"),
+ {'H','e','l','v','e','t','i','c','a',' ','N','r','B','d','O','b'},
+ {0, 1, {22.8, 72000.0/22.8}, 0, CONDENSEDITALIC, BOLD, 24580, 44}, cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-Narrow-Oblique", "Helvetica-Narrow-Oblique", "NimbusSanL-ReguCondItal"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ','N','r','O','b'},
+ {0, 1, {22.8, 72000.0/22.8}, 0, CONDENSEDITALIC, NOBOLD, 24580, 43}, cc_alphabetic
+ },
+
+ {
+ fontnames("Helvetica-Oblique", "Helvetica-Oblique", "NimbusSanL-ReguItal"),
+ {'H','e','l','v','e','t','i','c','a',' ',' ',' ',' ',' ','O','b'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, ITALIC, NOBOLD, 24580, 39}, cc_alphabetic
+ },
+
+ {
+ fontnames("Palatino-Roman", "Palatino-Roman", "URWPalladioL-Roma"),
+ {'P','a','l','a','t','i','n','o',' ',' ',' ',' ',' ','R','m','n'},
+ {0, 1, {25, 72000.0/25.0}, 0, REGULAR, NOBOLD, 24591, 45}, cc_alphabetic
+ },
+
+ {
+ fontnames("Palatino-Italic", "Palatino-Italic", "URWPalladioL-Ital"),
+ {'P','a','l','a','t','i','n','o',' ',' ',' ',' ',' ',' ','I','t'},
+ {0, 1, {25, 72000.0/25.0}, 0, ITALIC, NOBOLD, 24591, 47}, cc_alphabetic
+ },
+
+ {
+ fontnames("Palatino-Bold", "Palatino-Bold", "URWPalladioL-Bold"),
+ {'P','a','l','a','t','i','n','o',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {25, 72000.0/25.0}, 0, REGULAR, BOLD, 24591, 46}, cc_alphabetic
+ },
+
+ {
+ fontnames("Palatino-BoldItalic", "Palatino-BoldItalic", "URWPalladioL-BoldItal"),
+ {'P','a','l','a','t','i','n','o',' ',' ',' ',' ','B','d','I','t'},
+ {0, 1, {25, 72000.0/25.0}, 0, ITALIC, BOLD, 24591, 48}, cc_alphabetic
+ },
+
+ {
+ fontnames("AvantGarde-Book", "AvantGarde-Book", "URWGothicL-Book"),
+ {'I','T','C','A','v','a','n','t','G','a','r','d',' ',' ','B','k'},
+ {0, 1, {27.7, 72000.0/27.7}, 0, REGULAR, NOBOLD, 24607, 49}, cc_alphabetic
+ },
+
+ {
+ fontnames("AvantGarde-Demi", "AvantGarde-Demi", "URWGothicL-Demi"),
+ {'I','T','C','A','v','a','n','t','G','a','r','d',' ',' ','D','b'},
+ {0, 1, {28.0, 72000.0/28.0}, 0, REGULAR, TWOBOLD, 24607, 50}, cc_alphabetic
+ },
+
+ {
+ fontnames("AvantGarde-BookOblique", "AvantGarde-BookOblique", "URWGothicL-BookObli"),
+ {'I','T','C','A','v','a','n','t','G','a','r','d','B','k','O','b'},
+ {0, 1, {27.7, 72000.0/27.7}, 0, ITALIC, NOBOLD, 24607, 51}, cc_alphabetic
+ },
+
+ {
+ fontnames("AvantGarde-DemiOblique", "AvantGarde-DemiOblique", "URWGothicL-DemiObli"),
+ {'I','T','C','A','v','a','n','t','G','a','r','d','D','b','O','b'},
+ {0, 1, {28.0, 72000.0/28.0}, 0, ITALIC, TWOBOLD, 24607, 52}, cc_alphabetic
+ },
+
+ {
+ fontnames("Bookman-Light", "Bookman-Light", "URWBookmanL-Ligh"),
+ {'I','T','C','B','o','o','k','m','a','n',' ',' ',' ',' ','L','t'},
+ {0, 1, {32.0, 72000.0/32.0}, 0, REGULAR, LIGHT, 24623, 53}, cc_alphabetic
+ },
+
+ {
+ fontnames("Bookman-Demi", "Bookman-Demi", "URWBookmanL-DemiBold"),
+ {'I','T','C','B','o','o','k','m','a','n',' ',' ',' ',' ','D','b'},
+ {0, 1, {34, 72000.0/34.0}, 0, REGULAR, TWOBOLD, 24623, 54}, cc_alphabetic
+ },
+
+ {
+ fontnames("Bookman-LightItalic", "Bookman-LightItalic", "URWBookmanL-LighItal"),
+ {'I','T','C','B','o','o','k','m','a','n',' ',' ','L','t','I','t'},
+ {0, 1, {30, 72000.0/30.0}, 0, ITALIC, LIGHT, 24623, 55}, cc_alphabetic
+ },
+
+ {
+ fontnames("Bookman-DemiItalic", "Bookman-DemiItalic", "URWBookmanL-DemiBoldItal"),
+ {'I','T','C','B','o','o','k','m','a','n',' ',' ','D','b','I','t'},
+ {0, 1, {34, 72000.0/34.0}, 0, ITALIC, TWOBOLD, 24623, 56}, cc_alphabetic
+ },
+
+ {
+ fontnames("NewCenturySchlbk-Bold", "NewCenturySchlbk-Bold", "CenturySchL-Bold"),
+ {'N','w','C','e','n','t','S','c','h','l','b','k',' ',' ','B','d'},
+ {0, 1, {28.7, 72000.0/28.7}, 0, REGULAR, BOLD, 24703, 58}, cc_alphabetic
+ },
+
+ {
+ fontnames("NewCenturySchlbk-BoldItalic", "NewCenturySchlbk-BoldItalic", "CenturySchL-BoldItal"),
+ {'N','w','C','e','n','t','S','c','h','l','b','k','B','d','I','t'},
+ {0, 1, {28.7, 72000.0/28.7}, 0, ITALIC, BOLD, 24703, 60}, cc_alphabetic
+ },
+
+ {
+ fontnames("NewCenturySchlbk-Italic", "NewCenturySchlbk-Italic", "CenturySchL-Ital"),
+ {'N','w','C','e','n','t','S','c','h','l','b','k',' ',' ','I','t'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, ITALIC, NOBOLD, 24703, 59}, cc_alphabetic
+ },
+
+ {
+ fontnames("NewCenturySchlbk-Roman", "NewCenturySchlbk-Roman", "CenturySchL-Roma"),
+ {'N','w','C','e','n','t','S','c','h','l','b','k',' ','R','m','n'},
+ {0, 1, {27.8, 72000.0/27.8}, 0, REGULAR, NOBOLD, 24703, 57}, cc_alphabetic
+ },
+
+ {
+ fontnames("Times-Roman", "Times-Roman", "NimbusRomNo9L-Regu"),
+ {'T','i','m','e','s',' ',' ',' ',' ',' ',' ',' ',' ','R','m','n'},
+ {0, 1, {25, 72000.0/25.0}, 0, REGULAR, NOBOLD, 25093, 61},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Times-Bold", "Times-Bold", "NimbusRomNo9L-Medi"),
+ {'T','i','m','e','s',' ',' ',' ',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 1, {25, 72000.0/25.0}, 0, REGULAR, BOLD, 25093, 62},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Times-Italic", "Times-Italic", "NimbusRomNo9L-ReguItal"),
+ {'T','i','m','e','s',' ',' ',' ',' ',' ',' ',' ',' ',' ','I','t'},
+ {0, 1, {25, 72000.0/25.0}, 0, ITALIC, NOBOLD, 25093, 63},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Times-BoldItalic", "Times-BoldItalic", "NimbusRomNo9L-MediItal"),
+ {'T','i','m','e','s',' ',' ',' ',' ',' ',' ',' ','B','d','I','t'},
+ {0, 1, {25, 72000.0/25.0}, 0, ITALIC, BOLD, 25093, 64},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("ZapfChancery-MediumItalic", "ZapfChancery-MediumItalic", "URWChanceryL-MediItal"),
+ {'Z','a','p','f','C','h','a','n','c','e','r','y','M','d','I','t'},
+ {0, 1, {22, 72000.0/22.0},0, ITALIC, NOBOLD, 45099, 65},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("SymbolMT", "Symbol", "StandardSymL"),
+ {'S','y','m','b','o','l',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
+ {621, 1, {25, 72000.0/25.0}, 0, REGULAR, NOBOLD, 16686, 66},
+ cc_symbol
+ },
+
+ /* NB Symbol - Symbol PS for URW are the same. Adding the
+ confusion AGFA has 2 different fonts presumably Symbol and
+ SymbolPS, each called Symbol. */
+ {
+ fontnames("SymbPS", "SymbPS", "StandardSymL"),
+ {'S','y','m','b','o','l','P','S',' ',' ',' ',' ',' ',' ',' ',' '},
+ {621, 1, {25, 72000.0/25.0}, 0, REGULAR, NOBOLD, 45358, 67},
+ cc_symbol
+ },
+
+ {
+ fontnames("Wingdings-Regular", "Wingdings-Regular", "WingSub"),
+ {'W','i','n','g','d','i','n','g','s',' ',' ',' ',' ',' ',' ',' '},
+ {18540, 1, {100, 72000.0/100.0},0, REGULAR, NOBOLD, 31402, 68},
+ cc_dingbats
+ },
+
+ {
+ fontnames("ZapfDingbats", "ZapfDingbats", "Dingbats"),
+ {'Z','a','p','f','D','i','n','g','b','a','t','s',' ',' ',' ',' '},
+ {460, 1, {28, 72000.0/28.0},0, REGULAR, NOBOLD, 45101, 69},
+ cc_dingbats
+ },
+
+ {
+ fontnames("CourierBold", "CourierMT-Bold", "NimbusMono-Bol"),
+ {'C','o','u','r','i','e','r',' ',' ',' ',' ',' ',' ',' ','B','d'},
+ {0, 0, {60, 72000.0/60.0}, 0, REGULAR, BOLD, 4099, 70},
+ cc_alphabetic
+ },
+
+
+ {
+ fontnames("CourierItalic", "CourierMT-Italic", "NimbusMono-Ita"),
+ {'C','o','u','r','i','e','r',' ',' ',' ',' ',' ',' ',' ','I','t'},
+ {0, 0, {60, 72000.0/60.0}, 0, ITALIC, NOBOLD, 4099, 71},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("CourierBoldItalic", "CourierMT-BoldItalic", "NimbusMono-BolIta"),
+ {'C','o','u','r','i','e','r',' ',' ',' ',' ',' ','B','d','I','t'},
+ {0, 0, {60, 72000.0/60.0}, 0, ITALIC, BOLD, 4099, 72},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("LetterGothic", "LetterGothic", "LetterGothic-Reg"),
+ {'L','e','t','t','e','r','G','o','t','h','i','c',' ',' ',' ',' '},
+ {0, 0, {50, 72000.0/50.0}, 0, REGULAR, NOBOLD, 4102, 73},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("LetterGothicBold", "LetterGothic-Bold", "LetterGothic-Bol"),
+ {'L','e','t','t','e','r','G','o','t','h','i','c',' ',' ','B','d'},
+ {0, 0, {50, 72000.0/50.0}, 0, REGULAR, BOLD, 4102, 74},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("LetterGothicItalic", "LetterGothic-Italic", "LetterGothic-Ita"),
+ {'L','e','t','t','e','r','G','o','t','h','i','c',' ',' ','I','t'},
+ {0, 0, {50, 72000.0/50.0}, 0, ITALIC, NOBOLD, 4102, 75},
+ cc_alphabetic
+ },
+
+
+ {
+ fontnames("Courier", "Courier", "NimbusMonL-Regu"),
+ {'C','o','u','r','i','e','r','P','S',' ',' ',' ',' ',' ',' ',' '},
+ {0, 0, {60, 72000.0/60.0}, 0, REGULAR, NOBOLD, 24579, 76},
+ cc_alphabetic
+ },
+
+ {
+ fontnames("Courier-Bold", "Courier-Bold", "NimbusMonL-Bold"),
+ {'C','o','u','r','i','e','r','P','S',' ',' ',' ',' ',' ','B','d'},
+ {0, 0, {60, 72000.0/60.0}, 0, REGULAR, BOLD, 24579, 77}, cc_alphabetic
+ },
+
+ {
+ fontnames("Courier-BoldOblique", "Courier-BoldOblique", "NimbusMonL-BoldObli"),
+ {'C','o','u','r','i','e','r','P','S',' ',' ',' ','B','d','O','b'},
+ {0, 0, {60, 72000.0/60.0}, 0, ITALIC, BOLD, 24579, 79}, cc_alphabetic
+ },
+
+ {
+ fontnames("Courier-Oblique", "Courier-Oblique", "NimbusMonL-ReguObli"),
+ {'C','o','u','r','i','e','r','P','S',' ',' ',' ',' ',' ','O','b'},
+ {0, 0, {60, 72000.0/60.0}, 0, ITALIC, NOBOLD, 24579, 78}, cc_alphabetic
+ },
+
+ /************** NB SEMI-WRONG the artifex lineprinter is unbound ****************/
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','0','N'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 82}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','6','N'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 88}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','9','N'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 89}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ','1','0','U'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 80}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ','1','1','U'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 83}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ','1','2','U'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 84}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','1','U'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 85}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','2','N'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 86}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','5','N'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 0, 87}, cc_alphabetic},
+ {fontnames("noname", "noname", "ArtLinePrinter"), {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','8','U'},
+ {0, 0, {43.1, 72000.0/43.1}, 34, REGULAR, NOBOLD, 81}, cc_alphabetic},
+ {fontnames("","", ""), {'0','0'},
+ {0, 0, {0, 0}, 0, 0, 0, 0} }
+#undef C
+#undef cc_alphabetic
+#undef cc_symbol
+#undef cc_dingbats
+#undef pitch_1
+#undef agfa_value
+};
diff --git a/pl/plftable.h b/pl/plftable.h
new file mode 100644
index 000000000..311ca5fd1
--- /dev/null
+++ b/pl/plftable.h
@@ -0,0 +1,23 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$*/
+
+/* plftable.h */
+/* resident font table */
+typedef struct font_resident {
+ const char full_font_name[40]; /* name entry 4 in truetype fonts */
+ const short unicode_fontname[16]; /* pxl name */
+ pl_font_params_t params;
+ byte character_complement[8];
+} font_resident_t;
+
+extern const font_resident_t resident_table[];
diff --git a/pl/plht.c b/pl/plht.c
new file mode 100644
index 000000000..1dc090e47
--- /dev/null
+++ b/pl/plht.c
@@ -0,0 +1,54 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plht.c - shared halftone resource. */
+#include "stdpre.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gxtmap.h"
+/* Define an abstract type for the PostScript graphics state. */
+#ifndef gs_state_DEFINED
+# define gs_state_DEFINED
+typedef struct gs_state_s gs_state;
+#endif
+#include "gsstate.h"
+#include "gxht.h"
+#include "gxdevice.h"
+#include "plht.h"
+
+int
+pl_set_pcl_halftone(gs_state *pgs, gs_mapping_proc transfer_proc,
+ int width, int height,
+ gs_string threshold_data,
+ int phase_x,
+ int phase_y)
+{
+
+ int code;
+ gs_halftone ht;
+ /* nothing to do for a contone device */
+ if ( !gx_device_must_halftone(gs_currentdevice(pgs)) )
+ return 0;
+ gs_settransfer(pgs, transfer_proc);
+ ht.type = ht_type_threshold;
+ ht.params.threshold.width = width;
+ ht.params.threshold.height = height;
+ ht.params.threshold.thresholds.data = threshold_data.data;
+ ht.params.threshold.thresholds.size = threshold_data.size;
+ ht.params.threshold.transfer = 0;
+ ht.params.threshold.transfer_closure.proc = 0;
+ code = gs_sethalftone(pgs, &ht);
+ if ( code < 0 )
+ return code;
+ return gs_sethalftonephase(pgs, phase_x, phase_y);
+}
diff --git a/pl/plht.h b/pl/plht.h
new file mode 100644
index 000000000..ca246bbdb
--- /dev/null
+++ b/pl/plht.h
@@ -0,0 +1,25 @@
+/* Portions Copyright (C) 2004 artofcode LLC.
+ Portions Copyright (C) 1996, 2004 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plht.h - shared (pcl + pxl) haltone header */
+
+#ifndef plht_INCLUDED
+# define plht_INCLUDED
+
+int pl_set_pcl_halftone(gs_state *pgs, gs_mapping_proc transfer_proc,
+ int width, int height,
+ gs_string threshold_data,
+ int phase_x,
+ int phase_y);
+
+#endif /* plht_INCLUDED */
diff --git a/pl/plimpl.c b/pl/plimpl.c
new file mode 100644
index 000000000..e92dae23b
--- /dev/null
+++ b/pl/plimpl.c
@@ -0,0 +1,48 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pcimpl.c - PCL5c & PCL/XL pl_interp_implementation_t descriptor */
+
+#include "memory_.h"
+#include "scommon.h"
+#include "gxdevice.h"
+#include "pltop.h"
+
+extern pl_interp_implementation_t pcl_implementation;
+extern pl_interp_implementation_t pxl_implementation;
+extern pl_interp_implementation_t xps_implementation;
+extern pl_interp_implementation_t svg_implementation;
+
+#ifdef PSI_INCLUDED
+extern pl_interp_implementation_t ps_implementation;
+#endif
+
+/* Zero-terminated list of pointers to implementations */
+pl_interp_implementation_t const * const pdl_implementation[] = {
+#ifdef XPS_INCLUDED
+ &xps_implementation,
+#endif
+#ifdef SVG_INCLUDED
+ &svg_implementation,
+#endif
+#ifdef PCL_INCLUDED
+ &pcl_implementation,
+ &pxl_implementation,
+#endif
+#ifdef PSI_INCLUDED
+ &ps_implementation,
+#endif
+ 0
+};
+
+
diff --git a/pl/pllfont.c b/pl/pllfont.c
new file mode 100644
index 000000000..bfc95194e
--- /dev/null
+++ b/pl/pllfont.c
@@ -0,0 +1,389 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pclfont.c */
+/* PCL5 font preloading */
+#include "ctype_.h"
+#include "stdio_.h"
+#include "string_.h"
+/* The following are all for gxfont42.h, except for gp.h. */
+#include "gx.h"
+#include "gp.h"
+#include "gsccode.h"
+#include "gserrors.h"
+#include "gsmatrix.h"
+#include "gsutil.h"
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "strmio.h"
+#include "plfont.h"
+#include "pldict.h"
+#include "pllfont.h"
+#include "plftable.h"
+#include "plvalue.h"
+
+/* Load some built-in fonts. This must be done at initialization time, but
+ * after the state and memory are set up. Return an indication of whether
+ * at least one font was successfully loaded. XXX The existing code is more
+ * than a bit of a hack. Approach: expect to find some fonts in one or more
+ * of a given list of directories with names *.ttf. Load whichever ones are
+ * found in the table below. Probably very little of this code can be
+ * salvaged for later.
+ */
+
+/* utilities for poking around in tt files. It returns true if it a tt
+ file, false if not. Also returns false if there are any I/O
+ failures */
+static bool
+is_ttfile(stream *ttfile)
+{
+ /* check if an open file a ttfile saving and restoring the file position */
+ long pos; /* saved file position */
+ byte buffer[4]; /* version number buffer */
+ bool is_tt; /* true if a tt file */
+ if ( (pos = sftell( ttfile )) < 0 )
+ return false;
+ /* seek to beginning */
+ if ( sfseek( ttfile, 0L, SEEK_SET ) )
+ return false;
+ /* read 4 byte version number */
+ is_tt = false;
+ if ( ( sfread( &buffer, 1, 4, ttfile ) == 4 ) &&
+ ( pl_get_uint32( buffer ) == 0x10000 ) )
+ is_tt = true;
+ /* restore the file position */
+ if ( sfseek( ttfile, pos, SEEK_SET ) < 0 )
+ return false;
+ return is_tt;
+}
+
+/* get the windows truetype font file name - position 4 in the name
+ table. Assumes file is a reasonable tt_file - use is_ttfile() to
+ check before calling this procedure. */
+#define WINDOWSNAME 4
+#define PSNAME 6
+
+static
+int get_name_from_tt_file(stream *tt_file, gs_memory_t *mem, char *pfontfilename, int nameoffset)
+{
+ /* check if an open file a ttfile saving and restoring the file position */
+ long pos; /* saved file position */
+ unsigned long len;
+ char *ptr = pfontfilename;
+ byte *ptt_font_data;
+
+ if ( (pos = sftell( tt_file )) < 0 )
+ return -1;
+ /* seek to end and get the file length and allocate a buffer
+ for the entire file */
+ if ( sfseek( tt_file, 0L, SEEK_END ) )
+ return -1;
+ len = sftell( tt_file );
+
+ /* allocate a buffer for the entire file */
+ ptt_font_data = gs_alloc_bytes( mem, len, "get_name_from_tt_file" );
+ if ( ptt_font_data == NULL )
+ return_error(gs_error_VMerror );
+
+ /* seek back to the beginning of the file and read the data
+ into the buffer */
+ if ( ( sfseek( tt_file, 0L, SEEK_SET ) == 0 ) &&
+ ( sfread( ptt_font_data, 1, len, tt_file ) == len ) )
+ ; /* ok */
+ else {
+ gs_free_object( mem, ptt_font_data, "get_name_from_tt_file" );
+ return -1;
+ }
+
+ {
+ /* find the "name" table */
+ byte *pnum_tables_data = ptt_font_data + 4;
+ byte *ptable_directory_data = ptt_font_data + 12;
+ int table;
+ for ( table = 0; table < pl_get_uint16( pnum_tables_data ); table++ )
+ if ( !memcmp( ptable_directory_data + (table * 16), "name", 4 ) ) {
+ unsigned int offset =
+ pl_get_uint32( ptable_directory_data + (table * 16) + 8 );
+ byte *name_table = ptt_font_data + offset;
+ /* the offset to the string pool */
+ unsigned short storageOffset = pl_get_uint16( name_table + 4 );
+ byte *name_recs = name_table + 6;
+ {
+ /* 4th entry in the name table - the complete name */
+ unsigned short length =
+ pl_get_uint16( name_recs + (12 * nameoffset) + 8 );
+ unsigned short offset =
+ pl_get_uint16( name_recs + (12 * nameoffset) + 10 );
+ int k;
+ for ( k = 0; k < length; k++ ) {
+ /* hack around unicode if necessary */
+ int c = name_table[storageOffset + offset + k];
+ if ( isprint( c ) )
+ *ptr++ = (char)c;
+ }
+ }
+ break;
+ }
+ }
+ /* free up the data and restore the file position */
+ gs_free_object( mem, ptt_font_data, "get_name_from_tt_file" );
+ if ( sfseek( tt_file, pos, SEEK_SET ) < 0 )
+ return -1;
+ /* null terminate the fontname string and return success. Note
+ the string can be 0 length if no fontname was found. */
+ *ptr = '\0';
+
+ /* trim trailing white space */
+ {
+ int i = strlen(pfontfilename);
+ while (--i >= 0) {
+ if (!isspace(pfontfilename[i]))
+ break;
+ }
+ pfontfilename[++i] = '\0';
+ }
+
+ return 0;
+}
+
+#ifdef DEBUG
+static bool
+lookup_pjl_number(pl_dict_t *pfontdict, int pjl_font_number)
+{
+ pl_dict_enum_t dictp;
+ gs_const_string key;
+ void *value;
+ pl_dict_enum_begin(pfontdict, &dictp);
+ while ( pl_dict_enum_next(&dictp, &key, &value) ) {
+ pl_font_t *plfont = value;
+ if (plfont->params.pjl_font_number == pjl_font_number)
+ return true;
+ }
+ return false;
+}
+
+static void
+check_resident_fonts(pl_dict_t *pfontdict, gs_memory_t *mem)
+{
+ int i;
+ for (i = 0;
+ strlen(resident_table[i].full_font_name) != 0;
+ i ++)
+ if (!lookup_pjl_number(pfontdict, i)) {
+ int j;
+ dprintf2("%s (entry %d) not found\n", resident_table[i].full_font_name, i);
+ dprintf("pxl unicode name:");
+ for (j = 0;
+ j < sizeof(resident_table[i].unicode_fontname);
+ j++)
+ dprintf1("'%c'", resident_table[i].unicode_fontname[j]);
+ dprintf("\n");
+ }
+}
+#endif
+
+/* NOTES ABOUT NB NB - if the font dir necessary */
+ int
+pl_load_built_in_fonts(const char *pathname, gs_memory_t *mem,
+ pl_dict_t *pfontdict, gs_font_dir *pdir,
+ int storage, bool use_unicode_names_for_keys)
+{
+ const font_resident_t *residentp;
+ /* get rid of this should be keyed by pjl font number */
+ byte key[3];
+ bool one_font_found = false;
+
+ if ( pathname == NULL ) {
+ /* no font pathname */
+ return 0;
+ }
+ /* don't load fonts more than once */
+ if (pl_dict_length(pfontdict, true) > 0 ) {
+ return true;
+ }
+
+ /* Enumerate through the files in the path */
+ {
+ /* max pathname of 1024 including pattern */
+ char tmp_path_copy[1024];
+ char *tmp_pathp;
+ const char pattern[] = "*";
+ /* make a copy of the path for strtok */
+ strcpy( tmp_path_copy, pathname );
+ for ( tmp_pathp = tmp_path_copy;
+ (tmp_pathp = strtok( tmp_pathp, ";" ) ) != NULL; /* NB shouldn't use strtok */
+ tmp_pathp = NULL ) {
+ int code;
+ file_enum *fe;
+ stream *in = NULL;
+
+ /* handle trailing separator */
+ bool append_separator = false;
+ int separator_length = strlen(gp_file_name_directory_separator());
+ int offset = strlen(tmp_pathp) - separator_length;
+ /* make sure the filename string ends in directory separator */
+ if (strcmp(tmp_pathp + offset, gp_file_name_directory_separator()) != 0)
+ append_separator = true;
+
+ /* concatenate path and pattern */
+ if ( (strlen( pattern ) +
+ strlen( tmp_pathp) + 1 ) +
+ (append_separator ? separator_length : 0) > sizeof( tmp_path_copy ) ) {
+ dprintf1("path name %s too long\n", tmp_pathp );
+ continue;
+ }
+
+ strcpy( tmp_path_copy, tmp_pathp );
+
+ if (append_separator == true)
+ strcat(tmp_path_copy, gp_file_name_directory_separator());
+
+ /* NOTE the gp code code takes care of converting * to *.* */
+ strcat( tmp_path_copy, pattern );
+
+ /* enumerate all files on the current path */
+ fe = gp_enumerate_files_init( tmp_path_copy,
+ strlen( tmp_path_copy ), mem );
+
+ /* loop through the files */
+ while ( ( code = gp_enumerate_files_next( fe,
+ tmp_path_copy,
+ sizeof( tmp_path_copy ) ) ) >= 0 ) {
+ char buffer[1024];
+
+
+ pl_font_t *plfont;
+
+ /* loop failed/continued and left the file open */
+ if ( in != NULL )
+ sfclose( in );
+
+ if ( code > sizeof( tmp_path_copy ) ) {
+ dprintf("filename length exceeds file name storage buffer length\n");
+ continue;
+ }
+ /* null terminate the string */
+ tmp_path_copy[code] = '\0';
+
+ in = sfopen( tmp_path_copy, "rb", mem);
+ if ( in == NULL ) { /* shouldn't happen */
+ dprintf1("cannot open file %s\n", tmp_path_copy );
+ continue;
+ }
+
+ if ( !is_ttfile( in ) ) {
+ #ifdef DEBUG
+ if ( gs_debug_c('=') ) {
+ dprintf1("%s not a TrueType file\n", tmp_path_copy);
+ }
+ #endif
+ continue;
+ }
+ code = get_name_from_tt_file( in, mem, buffer, PSNAME);
+ if ( code < 0 ) {
+ dprintf1("input output failure on TrueType File %s\n", tmp_path_copy );
+ continue;
+ }
+
+ if ( strlen( buffer ) == 0 ) {
+ dprintf1("could not extract font file name from file %s\n", tmp_path_copy );
+ continue;
+ }
+
+ /* lookup the font file name in the resident table */
+ for ( residentp = resident_table; strlen(residentp->full_font_name); ++residentp )
+ if ( strcmp( buffer, residentp->full_font_name ) == 0 )
+ /* found it */
+ break;
+
+ /* hit sentinnel, nothing found */
+ if ( !strlen(residentp->full_font_name) ) {
+ #ifdef DEBUG
+ if ( gs_debug_c('=') ) {
+ dprintf2("TrueType font %s in file %s not found in table\n", buffer, tmp_path_copy);
+ code = get_name_from_tt_file( in, mem, buffer, WINDOWSNAME);
+ dprintf1("Windows name %s\n", buffer);
+ }
+ #endif
+ continue;
+ }
+
+ /* load the font file into memory. NOTE: this closes the file - argh... */
+ if ( pl_load_tt_font(in, pdir, mem,
+ gs_next_ids(mem, 1), &plfont,
+ buffer) < 0 ) {
+ /* vm error but we continue anyway */
+ dprintf1("Failed loading font %s\n", tmp_path_copy);
+ continue;
+ }
+
+ /* save some bookkepping in the loop, if in is not
+ NULL at the beginning we know the file was left
+ open because of an error */
+ in = NULL;
+
+ plfont->storage = storage;
+ plfont->data_are_permanent = false;
+ if ( residentp->params.symbol_set != 0 )
+ plfont->font_type = plft_8bit;
+ plfont->params = residentp->params;
+ memcpy(plfont->character_complement,
+ residentp->character_complement, 8);
+ /* use the offset in the table as the pjl font number */
+ /* for unicode keying of the dictionary use the unicode
+ font name, otherwise use the keys. */
+ if ( use_unicode_names_for_keys )
+ pl_dict_put( pfontdict, (const byte *)residentp->unicode_fontname, 32, plfont );
+ else {
+ key[2] = (byte)(residentp - resident_table);
+ key[0] = key[1] = 0;
+ pl_dict_put( pfontdict, key, sizeof(key), plfont );
+
+ }
+ /* leave data stored in the file */
+ if ( pl_store_resident_font_data_in_file( tmp_path_copy, mem, plfont ) < 0 ) {
+ dprintf1("%s could not store data", tmp_path_copy );
+ continue;
+ }
+ /* mark the font as found */
+ one_font_found = true;
+ } /* next file */
+ } /* next directory */
+ }
+#ifdef DEBUG
+ if ( gs_debug_c('=') )
+ check_resident_fonts(pfontdict, mem);
+#endif
+ if ( one_font_found )
+ return true;
+ else
+ return false;
+}
+
+/* These are not implemented */
+
+/* load simm fonts given a path */
+ int
+pl_load_simm_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage)
+{
+ /* not implemented */
+ return 0;
+}
+
+/* load simm fonts given a path */
+ int
+pl_load_cartridge_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage)
+{
+ /* not implemented */
+ return 0;
+}
diff --git a/pl/pllfont.h b/pl/pllfont.h
new file mode 100644
index 000000000..745869ed8
--- /dev/null
+++ b/pl/pllfont.h
@@ -0,0 +1,26 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pllfont.h */
+/* Interface for pcl and xl resident fonts */
+
+#ifndef pllfont_INCLUDED
+# define pllfont_INCLUDED
+/* This interface is used to load resident or more exactly font
+ resources that are not downloaded */
+/* NB - pass in store data in a file and permanent data */
+int pl_load_built_in_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage, bool use_unicode_names_for_keys);
+int pl_load_simm_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage);
+int pl_load_cartridge_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage);
+
+#endif /* plfont_INCLUDED */
diff --git a/pl/pllrfont.c b/pl/pllrfont.c
new file mode 100644
index 000000000..3471f3503
--- /dev/null
+++ b/pl/pllrfont.c
@@ -0,0 +1,268 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+/*$Id: */
+/* pllrfont.c */
+/* PCL5 font preloading */
+#include "ctype_.h"
+#include "stdio_.h"
+#include "string_.h"
+/* The following are all for gxfont42.h, except for gp.h. */
+#include "gx.h"
+#include "gp.h"
+#include "gsccode.h"
+#include "gserrors.h"
+#include "gsmatrix.h"
+#include "gsutil.h"
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "plfont.h"
+#include "pldict.h"
+#include "pllfont.h"
+#include "plftable.h"
+#include "plvalue.h"
+#include "romfnttab.h"
+#include "zlib.h"
+
+/* Load some built-in fonts. This must be done at initialization time, but
+ * after the state and memory are set up. Return an indication of whether
+ * at least one font was successfully loaded. XXX The existing code is more
+ * than a bit of a hack. Approach: expect to find some fonts in one or more
+ * of a given list of directories with names *.ttf. Load whichever ones are
+ * found in the table below.
+ */
+
+
+/* Load a built-in (TrueType) font from external storage. */
+static int
+pl_append_tt_data(gs_memory_t *mem, char **ppheader, char *buffer, int length)
+{
+ if (*ppheader == NULL) {
+ *ppheader = gs_alloc_bytes(mem, length, "pl_append_tt_data");
+ if (*ppheader == NULL)
+ return -1;
+ memcpy(*ppheader, buffer, length);
+ }else {
+ uint size = gs_object_size(mem, *ppheader);
+ byte *new_header = gs_resize_object(mem, *ppheader, size + length,
+ "pl_append_tt_data");
+ if (new_header == NULL)
+ return -1;
+ memcpy(new_header + size, buffer, length);
+ *ppheader = new_header;
+ }
+ return 0;
+}
+
+static int
+pl_load_romtt_font(gs_font_dir *pdir, gs_memory_t *mem, long unique_id, pl_font_t **pplfont, char *font_name, unsigned char *font_data)
+{
+ bool compressed;
+ int code;
+ gs_font_type42 *pfont;
+ pl_font_t *plfont;
+ char *uncompressed_header = NULL;
+ compressed = pl_is_tt_zlibC(font_data);
+
+ if (compressed) {
+ char buf[1024];
+ z_stream zs;
+ char *start = font_data;
+ zs.next_in = start;
+ zs.avail_in = 1024;
+ zs.next_out = &buf;
+ zs.avail_out = 1024;
+ zs.zalloc = Z_NULL;
+ zs.zfree = Z_NULL;
+ zs.opaque = Z_NULL;
+
+ code = inflateInit (&zs);
+ while ((code = inflate (&zs, Z_NO_FLUSH)) == Z_OK) {
+ if (zs.avail_out == 0) {
+ pl_append_tt_data(mem, &uncompressed_header, buf, 1024);
+ zs.next_out = &buf;
+ zs.avail_out = 1024;
+ }
+ if (zs.avail_in == 0) {
+ zs.avail_in = 1024;
+ }
+ }
+ while ((code = inflate (&zs, Z_FINISH)) == Z_OK) {
+ if (zs.avail_out == 0) {
+ pl_append_tt_data(mem, &uncompressed_header, buf, 1024);
+ zs.next_out = &buf;
+ zs.avail_out = 1024;
+ }
+ if (zs.avail_in == 0) {
+ zs.avail_in = 1024;
+ }
+ }
+
+ if ( code != Z_OK && code != Z_STREAM_END ) {
+ dprintf1(mem, "fatal zlib failure code %d\n", code);
+ /* since this is fatal we don't cleanup */
+ return -1;
+ }
+
+ code = inflateEnd(&zs);
+ if (code != Z_OK) {
+ dprintf1(mem, "fatal zlib failure code %d\n", code);
+ /* since this is fatal we don't cleanup */
+ return -1;
+ }
+
+ }
+
+ /* Make a Type 42 font out of the TrueType data. */
+ pfont = gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42,
+ "pl_fill_in_romtt_font(gs_font_type42)");
+ plfont = pl_alloc_font(mem, "pl_fill_in_romtt_load_font(pl_font_t)");
+
+ if ( pfont == 0 || plfont == 0 )
+ code = gs_note_error(mem, gs_error_VMerror);
+ else { /* Initialize general font boilerplate. */
+ code = pl_fill_in_font((gs_font *)pfont, plfont, pdir, mem, font_name);
+ if ( code >= 0 ) { /* Initialize TrueType font boilerplate. */
+ plfont->header = compressed ? uncompressed_header : font_data;
+ plfont->header_size = 0; /* nb clone fonts won't work */
+ plfont->scaling_technology = plfst_TrueType;
+ plfont->font_type = plft_Unicode;
+ plfont->large_sizes = true;
+ plfont->offsets.GT = 0;
+ plfont->is_xl_format = false;
+ plfont->allow_vertical_substitutes = false;
+ pl_fill_in_tt_font(pfont, font_data, unique_id);
+ code = gs_definefont(pdir, (gs_font *)pfont);
+ if ( code >= 0 ) {
+ /*
+ * Set the nominal design width to the
+ * width of a small 'x' character. If
+ * there isn't one, set the design
+ * width arbitrarily at 0.6 em. */
+ gs_char space = ' ';
+ float sbw[4];
+ uint glyph_index =
+ (*pfont->procs.encode_char)
+ ((gs_font *)pfont, space, gs_no_glyph);
+
+ if (glyph_index == gs_no_glyph || glyph_index == 0xffff)
+ glyph_index = 0;
+ if ( gs_type42_get_metrics(pfont, glyph_index, sbw) < 0 )
+ sbw[2] = 0.6;
+ pl_fp_set_pitch_cp(&plfont->params, sbw[2] * 100);
+ }
+ }
+ }
+ if ( code < 0 ) {
+ gs_free_object(mem, plfont, "pl_tt_load_font(pl_font_t)");
+ gs_free_object(mem, pfont, "pl_tt_load_font(gs_font_type42)");
+ return code;
+ }
+ *pplfont = plfont;
+ return 0;
+}
+
+ int
+pl_load_built_in_fonts(const char *pathname, gs_memory_t *mem,
+ pl_dict_t *pfontdict, gs_font_dir *pdir,
+ int storage, bool use_unicode_names_for_keys)
+{
+ const font_resident_t *residentp;
+ /* get rid of this should be keyed by pjl font number */
+ byte key[3];
+ bool one_font_found = false;
+
+ /* don't load fonts more than once */
+ if (pl_dict_length(pfontdict, true) > 0 ) {
+ return true;
+ }
+
+ /* Enumerate through the files in the path */
+ {
+ int i;
+ for (i = 0; pcl_font_variable_name_table[i].data != 0; i++) {
+ pl_font_t *plfont;
+ pcl_font_variable_name_t rec =
+ pcl_font_variable_name_table[i];
+ const char *buffer = rec.font_name;
+
+ /* lookup the font file name in the resident table */
+ for ( residentp = resident_table; strlen(residentp->full_font_name); ++residentp )
+ if ( strcmp( buffer, residentp->full_font_name ) == 0 )
+ /* found it */
+ break;
+ /* hit sentinnel, nothing found */
+ if ( !strlen(residentp->full_font_name) )
+ continue;
+
+ if ( pl_load_romtt_font(pdir, mem, gs_next_ids(mem, 1), &plfont, buffer, rec.data) < 0 ) {
+ /* vm error but we continue anyway */
+ dprintf1(mem, "Failed loading font %s\n", rec.font_name);
+ continue;
+ }
+
+ plfont->storage = storage;
+ plfont->data_are_permanent = true;
+ if ( residentp->params.symbol_set != 0 )
+ plfont->font_type = plft_8bit;
+ /*
+ * Don't smash the pitch, which was obtained
+ * from the actual font.
+ */
+ {
+ pl_font_pitch_t save_pitch;
+ save_pitch = plfont->params.pitch;
+ plfont->params = residentp->params;
+ plfont->params.pitch = save_pitch;
+ }
+
+ memcpy(plfont->character_complement,
+ residentp->character_complement, 8);
+ /* use the offset in the table as the pjl font number */
+ plfont->params.pjl_font_number = (int)(residentp - resident_table);
+ /* for unicode keying of the dictionary use the unicode
+ font name, otherwise use the keys. */
+ if ( use_unicode_names_for_keys )
+ pl_dict_put( pfontdict, (const byte *)residentp->unicode_fontname, 32, plfont );
+ else {
+ key[2] = (byte)(residentp - resident_table);
+ key[0] = key[1] = 0;
+ pl_dict_put( pfontdict, key, sizeof(key), plfont );
+
+ }
+ /* mark the font as found */
+ one_font_found = true;
+ } /* next file */
+ if ( one_font_found )
+ return true;
+ else
+ return false;
+ }
+}
+
+/* These are not implemented */
+
+/* load simm fonts given a path */
+ int
+pl_load_simm_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage)
+{
+ /* not implemented */
+ return 0;
+}
+
+/* load simm fonts given a path */
+ int
+pl_load_cartridge_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage)
+{
+ /* not implemented */
+ return 0;
+}
diff --git a/pl/plmain.c b/pl/plmain.c
new file mode 100644
index 000000000..f0449b9e8
--- /dev/null
+++ b/pl/plmain.c
@@ -0,0 +1,1274 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plmain.c */
+/* Main program command-line interpreter for PCL interpreters */
+#include "string_.h"
+#include "gdebug.h"
+#include "gscdefs.h"
+#include "gsio.h"
+#include "gstypes.h"
+#include "gserrors.h"
+#include "gsmemory.h"
+#include "plalloc.h"
+#include "gsmalloc.h"
+#include "gsstruct.h"
+#include "gxalloc.h"
+#include "gsalloc.h"
+#include "gsargs.h"
+#include "gp.h"
+#include "gsdevice.h"
+#include "gxdevice.h"
+#include "gsparam.h"
+#include "gslib.h"
+#include "pjtop.h"
+#include "plparse.h"
+#include "plplatf.h"
+#include "plmain.h"
+#include "pltop.h"
+#include "pltoputl.h"
+#include "plapi.h"
+#include "gslibctx.h"
+#if defined(DEBUG) && defined(ALLOW_VD_TRACE)
+#include "dwtrace.h"
+#include "vdtrace.h"
+#endif
+
+/*
+ * Define bookeeping for interperters and devices
+ */
+typedef struct pl_main_universe_s {
+ gs_memory_t *mem; /* mem alloc to dealloc devices */
+ pl_interp_implementation_t const * const *
+ pdl_implementation; /* implementations to choose from */
+ pl_interp_instance_t * pdl_instance_array[100]; /* parallel to pdl_implementation */
+ pl_interp_t * pdl_interp_array[100]; /* parallel to pdl_implementation */
+ pl_interp_implementation_t const
+ *curr_implementation;
+ pl_interp_instance_t * curr_instance;
+ gx_device *curr_device;
+} pl_main_universe_t;
+
+
+/* Include the extern for the device list. */
+extern_gs_lib_device_list();
+
+/* Extern for PJL */
+extern pl_interp_implementation_t pjl_implementation;
+
+/* Extern for PDL(s): currently in one of: plimpl.c (XL & PCL), */
+/* pcimpl.c (PCL only), or pximpl (XL only) depending on make configuration.*/
+extern pl_interp_implementation_t const * const pdl_implementation[]; /* zero-terminated list */
+
+/* Define the usage message. */
+static const char *pl_usage = "\
+Usage: %s [option* file]+...\n\
+Options: -dNOPAUSE -E[#] -h -C -L<PCL|PCLXL> -n -K<maxK> -P<PCL5C|PCL5E|RTL> -Z...\n\
+ -sDEVICE=<dev> -g<W>x<H> -r<X>[x<Y>] -d{First|Last}Page=<#>\n\
+ -sOutputFile=<file> (-s<option>=<string> | -d<option>[=<value>])*\n\
+ -J<PJL commands>\n";
+
+/* ---------------- Static data for memory management ------------------ */
+
+#ifdef PSI_INCLUDED
+static gs_gc_root_t device_root;
+#endif
+
+#if defined(DEBUG) && defined(ALLOW_VD_TRACE)
+void *hwndtext; /* Hack: Should be of HWND type. */
+#endif
+
+/* ---------------- Forward decls ------------------ */
+/* Functions to encapsulate pl_main_universe_t */
+int /* 0 ok, else -1 error */
+pl_main_universe_init(
+ pl_main_universe_t *universe, /* universe to init */
+ char *err_str, /* RETURNS error str if error */
+ gs_memory_t *mem, /* deallocator for devices */
+ pl_interp_implementation_t const * const
+ pdl_implementation[], /* implementations to choose from */
+ pl_interp_instance_t *pjl_instance, /* pjl to reference */
+ pl_main_instance_t *inst, /* instance for pre/post print */
+ pl_page_action_t pl_pre_finish_page, /* pre-page action */
+ pl_page_action_t pl_post_finish_page /* post-page action */
+);
+int /* 0 ok, else -1 error */
+pl_main_universe_dnit(
+ pl_main_universe_t *universe, /* universe to dnit */
+ char *err_str /* RETRUNS errmsg if error return */
+);
+pl_interp_instance_t * /* rets current interp_instance, 0 if err */
+pl_main_universe_select(
+ pl_main_universe_t *universe, /* universe to select from */
+ char *err_str, /* RETURNS error str if error */
+ pl_interp_instance_t *pjl_instance, /* pjl */
+ pl_interp_implementation_t const *desired_implementation,/* impl to select */
+ pl_main_instance_t *pti, /* inst contains device */
+ gs_param_list *params /* device params to use */
+);
+
+static pl_interp_implementation_t const *
+pl_auto_sense(
+ const char* name, /* stream */
+ int buffer_length, /* length of stream */
+ pl_interp_implementation_t const * const impl_array[] /* implementations to choose from */
+);
+
+static pl_interp_implementation_t const *
+pl_select_implementation(
+ pl_interp_instance_t *pjl_instance,
+ pl_main_instance_t *pmi,
+ pl_top_cursor_t r
+);
+
+
+/* Process the options on the command line. */
+static FILE *pl_main_arg_fopen(const char *fname, void *ignore_data);
+
+/* Initialize the instance parameters. */
+void pl_main_init_instance(pl_main_instance_t *pmi, gs_memory_t *memory);
+void pl_main_reinit_instance(pl_main_instance_t *pmi);
+
+/* Process the options on the command line, including making the
+ initial device and setting its parameters. */
+int pl_main_process_options(pl_main_instance_t *pmi, arg_list *pal,
+ gs_c_param_list *params,
+ pl_interp_instance_t *pjl_instance,
+ pl_interp_implementation_t const * const impl_array[],
+ char **filename);
+
+/* Find default language implementation */
+pl_interp_implementation_t const *
+pl_auto_sense(const char* buf, int buf_len, pl_interp_implementation_t const * const impl_array[]);
+
+static pl_interp_implementation_t const *
+pl_pjl_select(pl_interp_instance_t *pjl_instance,
+ pl_interp_implementation_t const * const impl_array[]);
+
+/* Pre-page portion of page finishing routine */
+int /* ret 0 if page should be printed, 1 if no print, else -ve error */
+pl_pre_finish_page(pl_interp_instance_t *interp, void *closure);
+
+/* Post-page portion of page finishing routine */
+int /* ret 0, else -ve error */
+pl_post_finish_page(pl_interp_instance_t *interp, void *closure);
+
+ /* -------------- Read file cursor operations ---------- */
+/* Open a read cursor w/specified file */
+int pl_main_cursor_open(const gs_memory_t *, pl_top_cursor_t *, const char *, byte *, unsigned);
+
+#ifdef DEBUG
+/* Refill from input, avoid extra call level for efficiency */
+int pl_main_cursor_next(pl_top_cursor_t *cursor);
+#else
+ #define pl_main_cursor_next(curs) (pl_top_cursor_next(curs))
+#endif
+
+/* Read back curr file position */
+long pl_main_cursor_position(pl_top_cursor_t *cursor);
+
+/* Close read cursor */
+void pl_main_cursor_close(pl_top_cursor_t *cursor);
+
+
+/* return index in gs device list -1 if not found */
+static inline int
+get_device_index(const gs_memory_t *mem, const char *value)
+{
+ const gx_device *const *dev_list;
+ int num_devs = gs_lib_device_list(&dev_list, NULL);
+ int di;
+
+ for ( di = 0; di < num_devs; ++di )
+ if ( !strcmp(gs_devicename(dev_list[di]), value) )
+ break;
+ if ( di == num_devs ) {
+ errprintf("Unknown device name %s.\n", value);
+ return -1;
+ }
+ return di;
+}
+
+static int
+close_job(pl_main_universe_t *universe, pl_main_instance_t *pti)
+{
+ if ( pti->print_page_count )
+ dlprintf1("%%%%PageCount: %d\n", pti->page_count);
+ return pl_dnit_job(universe->curr_instance);
+}
+
+/* ----------- Command-line driver for pl_interp's ------ */
+/*
+ * Here is the real main program.
+ */
+GSDLLEXPORT int GSDLLAPI
+pl_main(
+ int argc,
+ char * argv[]
+)
+{
+ gs_memory_t * mem;
+ gs_memory_t * pjl_mem;
+ pl_main_instance_t inst;
+ arg_list args;
+ char * filename = NULL;
+ char err_buf[256];
+ pl_interp_t * pjl_interp;
+ pl_interp_instance_t * pjl_instance;
+ pl_main_universe_t universe;
+ pl_interp_instance_t * curr_instance = 0;
+ gs_c_param_list params;
+
+ mem = pl_alloc_init();
+ pl_platform_init(mem->gs_lib_ctx->fstdout);
+
+
+ pjl_mem = mem;
+
+ gs_lib_init1(pjl_mem);
+
+ /* Create a memory allocator to allocate various states from */
+ {
+ /*
+ * gs_iodev_init has to be called here (late), rather than
+ * with the rest of the library init procedures, because of
+ * some hacks specific to MS Windows for patching the
+ * stdxxx IODevices.
+ */
+ extern void gs_iodev_init(gs_memory_t *);
+ gs_iodev_init(pjl_mem);
+ }
+
+ /* Init the top-level instance */
+ gs_c_param_list_write(&params, pjl_mem);
+ gs_param_list_set_persistent_keys((gs_param_list*)&params, false);
+ pl_main_init_instance(&inst, mem);
+ arg_init(&args, (const char **)argv, argc, pl_main_arg_fopen, NULL);
+
+
+ /* Create PJL instance */
+ if ( pl_allocate_interp(&pjl_interp, &pjl_implementation, pjl_mem) < 0
+ || pl_allocate_interp_instance(&pjl_instance, pjl_interp, pjl_mem) < 0 ) {
+ errprintf("Unable to create PJL interpreter.");
+ return -1;
+ }
+
+ /* Create PDL instances, etc */
+ if (pl_main_universe_init(&universe, err_buf, mem, pdl_implementation,
+ pjl_instance, &inst, &pl_pre_finish_page, &pl_post_finish_page) < 0) {
+ errprintf(err_buf);
+ return -1;
+ }
+
+#ifdef DEBUG
+ if (gs_debug_c(':'))
+ pl_print_usage(&inst, "Start");
+#endif
+
+
+ /* ------ Begin Main LOOP ------- */
+ for (;;) {
+ /* Process one input file. */
+ /* for debugging we test the parser with a small 256 byte
+ buffer - for production systems use 8192 bytes */
+#ifdef DEBUG
+ byte buf[1<<9];
+#else
+ byte buf[1<<13];
+#endif
+ pl_top_cursor_t r;
+ int code = 0;
+ bool in_pjl = true;
+ bool new_job = false;
+
+
+ if ( pl_init_job(pjl_instance) < 0 ) {
+ errprintf("Unable to init PJL job.\n");
+ return -1;
+ }
+
+ /* Process any new options. May request new device. */
+ if (argc==1 ||
+ pl_main_process_options(&inst,
+ &args,
+ &params,
+ pjl_instance, pdl_implementation, &filename) < 0) {
+ /* Print error verbage and return */
+ int i;
+ const gx_device **dev_list;
+ int num_devs = gs_lib_device_list((const gx_device * const **)&dev_list, NULL);
+
+ errprintf(pl_usage, argv[0]);
+
+ if (pl_characteristics(&pjl_implementation)->version)
+ errprintf("Version: %s\n", pl_characteristics(&pjl_implementation)->version);
+ if (pl_characteristics(&pjl_implementation)->build_date)
+ errprintf("Build date: %s\n", pl_characteristics(&pjl_implementation)->build_date);
+ errprintf("Devices:");
+ for ( i = 0; i < num_devs; ++i ) {
+ if ( ( (i + 1) ) % 9 == 0 )
+ errprintf("\n");
+ errprintf(" %s", gs_devicename(dev_list[i]));
+ }
+ errprintf("\n");
+
+ return -1;
+ }
+
+ if (!filename)
+ break; /* no nore files to process */
+
+
+ /* open file for reading - NB we should respect the minimum
+ requirements specified by each implementation in the
+ characteristics structure */
+ if (pl_main_cursor_open(mem, &r, filename, buf, sizeof(buf)) < 0) {
+ errprintf("Unable to open %s for reading.\n", filename);
+ return -1;
+ }
+#if defined(DEBUG) && defined(ALLOW_VD_TRACE)
+ vd_trace0 = visual_tracer_init();
+#endif
+
+#ifdef DEBUG
+ if (gs_debug_c(':'))
+ dprintf1("%% Reading %s:\n", filename);
+#endif
+ /* pump data thru PJL/PDL until EOD or error */
+ new_job = false;
+ in_pjl = true;
+ for (;;) {
+ if_debug1('i', "[i][file pos=%ld]\n", pl_main_cursor_position(&r));
+ /* end of data - if we are not back in pjl the job has
+ ended in the middle of the data stream. */
+ if (pl_main_cursor_next(&r) <= 0) {
+ if_debug0('|', "End of of data\n");
+ if ( !in_pjl ) {
+ if_debug0('|', "end of data stream found in middle of job\n");
+ pl_process_eof(curr_instance);
+ if ( close_job(&universe, &inst) < 0 ) {
+ dprintf("Unable to deinit PDL job.\n");
+ return -1;
+ }
+ }
+ break;
+ }
+ if ( in_pjl ) {
+ if_debug0('|', "Processing pjl\n");
+ code = pl_process(pjl_instance, &r.cursor);
+ if (code == e_ExitLanguage) {
+ if_debug0('|', "Exiting pjl\n" );
+ in_pjl = false;
+ new_job = true;
+ }
+ }
+ if ( new_job ) {
+ if (mem->gs_lib_ctx->gs_next_id > 0xFF000000) {
+ dprintf("Once a year reset the gs_next_id.\n");
+ return -1;
+ }
+
+ if_debug0('|', "Selecting PDL\n" );
+ curr_instance = pl_main_universe_select(&universe, err_buf,
+ pjl_instance,
+ pl_select_implementation(pjl_instance, &inst, r),
+ &inst, (gs_param_list *)&params);
+ if ( curr_instance == NULL ) {
+ dprintf(err_buf);
+ return -1;
+ }
+
+ if ( pl_init_job(curr_instance) < 0 ) {
+ dprintf("Unable to init PDL job.\n");
+ return -1;
+ }
+ if_debug1('|', "selected and initializing (%s)\n",
+ pl_characteristics(curr_instance->interp->implementation)->language);
+ new_job = false;
+ }
+ if ( curr_instance ) {
+ code = pl_process(curr_instance, &r.cursor);
+ if_debug1('|', "processing (%s) job\n",
+ pl_characteristics(curr_instance->interp->implementation)->language);
+ if (code == e_ExitLanguage) {
+ in_pjl = true;
+ if_debug1('|', "exiting (%s) job back to pjl\n",
+ pl_characteristics(curr_instance->interp->implementation)->language);
+ if ( close_job(&universe, &inst) < 0 ) {
+ dprintf( "Unable to deinit PDL job.\n");
+ return -1;
+ }
+ if ( pl_init_job(pjl_instance) < 0 ) {
+ dprintf("Unable to init PJL job.\n");
+ return -1;
+ }
+ pl_renew_cursor_status(&r);
+ } else if ( code < 0 ) { /* error and not exit language */
+ dprintf1("Warning interpreter exited with error code %d\n", code );
+ dprintf("Flushing to end of job\n" );
+ /* flush eoj may require more data */
+ while ((pl_flush_to_eoj(curr_instance, &r.cursor)) == 0) {
+ if_debug1('|', "flushing to eoj for (%s) job\n",
+ pl_characteristics(curr_instance->interp->implementation)->language);
+ if (pl_main_cursor_next(&r) <= 0) {
+ if_debug0('|', "end of data found while flushing\n");
+ break;
+ }
+ }
+ pl_report_errors(curr_instance, code,
+ pl_main_cursor_position(&r),
+ inst.error_report > 0);
+ if ( close_job(&universe, &inst) < 0 ) {
+ dprintf("Unable to deinit PJL.\n");
+ return -1;
+ }
+ /* Print PDL status if applicable, then dnit PDL job */
+ code = 0;
+ new_job = true;
+ /* go back to pjl */
+ in_pjl = true;
+ }
+ }
+ }
+ pl_main_cursor_close(&r);
+ }
+
+ /* ----- End Main loop ----- */
+
+ /* Dnit PDLs */
+ if (pl_main_universe_dnit(&universe, err_buf)) {
+ dprintf(err_buf);
+ return -1;
+ }
+ /* dnit pjl */
+ if ( pl_deallocate_interp_instance(pjl_instance) < 0
+ || pl_deallocate_interp(pjl_interp) < 0 ) {
+ dprintf("Unable to close out PJL instance.\n");
+ return -1;
+ }
+
+ /* We lost the ability to print peak memory usage with the loss
+ * of the memory wrappers.
+ */
+
+ /* release param list */
+ gs_c_param_list_release(&params);
+ arg_finit(&args);
+
+#if defined(DEBUG) && defined(ALLOW_VD_TRACE)
+ visual_tracer_close();
+#endif
+ if ( gs_debug_c('A') )
+ dprintf("Final time" );
+ pl_platform_dnit(0);
+
+ if ( inst.mem_cleanup ) {
+ pl_mem_node_free_all_remaining(mem);
+ }
+ return 0;
+}
+
+/* --------- Functions operating on pl_main_universe_t ----- */
+/* Init main_universe from pdl_implementation */
+int /* 0 ok, else -1 error */
+pl_main_universe_init(
+ pl_main_universe_t *universe, /* universe to init */
+ char *err_str, /* RETURNS error str if error */
+ gs_memory_t *mem, /* deallocator for devices */
+ pl_interp_implementation_t const * const
+ pdl_implementation[], /* implementations to choose from */
+ pl_interp_instance_t *pjl_instance, /* pjl to
+ reference */
+ pl_main_instance_t *inst, /* instance for pre/post print */
+ pl_page_action_t pl_pre_finish_page, /* pre-page action */
+ pl_page_action_t pl_post_finish_page /* post-page action */
+)
+{
+ int index;
+
+ /* 0-init everything */
+ memset(universe, 0, sizeof(*universe));
+ universe->pdl_implementation = pdl_implementation;
+ universe->mem = mem;
+ mem->gs_lib_ctx->top_of_system = universe;
+ inst->device_memory = mem;
+
+ /* Create & init PDL all instances. Could do this lazily to save memory, */
+ /* but for now it's simpler to just create all instances up front. */
+ for (index = 0; pdl_implementation[index] != 0; ++index) {
+ pl_interp_instance_t *instance;
+
+ if ( pl_allocate_interp(&universe->pdl_interp_array[index],
+ pdl_implementation[index], mem) < 0
+ || pl_allocate_interp_instance(&universe->pdl_instance_array[index],
+ universe->pdl_interp_array[index], mem) < 0 ) {
+ if (err_str)
+ sprintf(err_str, "Unable to create %s interpreter.\n",
+ pl_characteristics(pdl_implementation[index])->language);
+ goto pmui_err;
+ }
+
+ instance = universe->pdl_instance_array[index];
+ if ( pl_set_client_instance(instance, pjl_instance, PJL_CLIENT) < 0 ||
+ pl_set_client_instance(instance, universe->pdl_instance_array[0], PCL_CLIENT) ||
+ pl_set_pre_page_action(instance, pl_pre_finish_page, inst) < 0 ||
+ pl_set_post_page_action(instance, pl_post_finish_page, inst) < 0 ||
+ pl_get_device_memory(instance, &inst->device_memory) < 0
+ ) {
+ if (err_str)
+ sprintf(err_str, "Unable to init %s interpreter.\n",
+ pl_characteristics(pdl_implementation[index])->language);
+ goto pmui_err;
+ }
+ }
+ return 0;
+
+pmui_err:
+ pl_main_universe_dnit(universe, 0);
+ return -1;
+}
+
+pl_interp_instance_t *get_interpreter_from_memory( const gs_memory_t *mem )
+{
+ pl_main_universe_t *universe = (pl_main_universe_t *) mem->gs_lib_ctx->top_of_system;
+ return universe->curr_instance;
+}
+
+
+/* Undo pl_main_universe_init */
+int /* 0 ok, else -1 error */
+pl_main_universe_dnit(
+ pl_main_universe_t *universe, /* universe to dnit */
+ char *err_str /* RETRUNS errmsg if error return */
+)
+{
+ int index;
+
+ /* Deselect last-selected device */
+ if (universe->curr_instance
+ && pl_remove_device(universe->curr_instance) < 0) {
+ if (err_str)
+ sprintf(err_str, "Unable to close out PDL instance.\n");
+ return -1;
+ }
+
+ /* dnit interps */
+ for (index = 0;
+ universe->pdl_implementation[index] != 0;
+ ++index, universe->curr_instance = universe->pdl_instance_array[index])
+ if ( (universe->pdl_instance_array[index]
+ && pl_deallocate_interp_instance(universe->pdl_instance_array[index]) < 0)
+ || (universe->pdl_interp_array[index]
+ && pl_deallocate_interp(universe->pdl_interp_array[index]) < 0 )) {
+ if (err_str)
+ sprintf(err_str, "Unable to close out %s instance.\n",
+ pl_characteristics(universe->pdl_implementation[index])->language);
+ return -1;
+ }
+
+ /* dealloc device if sel'd */
+ if (universe->curr_device) {
+#ifdef PSI_INCLUDED
+ gs_unregister_root(universe->curr_device->memory, &device_root, "pl_main_universe_select");
+ /* ps allocator retain's the device, pl_alloc doesn't */
+ gx_device_retain(universe->curr_device, false);
+ universe->curr_device = NULL;
+#else
+ gs_free_object(universe->mem, universe->curr_device,
+ "pl_main_universe_dnit(gx_device)");
+#endif
+ }
+
+ return 0;
+}
+
+/* Select new device and/or implementation, deselect one one (opt) */
+pl_interp_instance_t * /* rets current interp_instance, 0 if err */
+pl_main_universe_select(
+ pl_main_universe_t *universe, /* universe to select from */
+ char *err_str, /* RETURNS error str if error */
+ pl_interp_instance_t *pjl_instance, /* pjl */
+ pl_interp_implementation_t const *desired_implementation,/* impl to select */
+ pl_main_instance_t *pti, /* inst contains device */
+ gs_param_list *params /* device params to set */
+)
+{
+ int params_are_set = 0;
+
+ /* requesting the device in the main instance */
+ gx_device *desired_device = pti->device;
+ /* If new interpreter/device is different, deselect it from old interp */
+ if ((universe->curr_implementation
+ && universe->curr_implementation != desired_implementation)
+ || (universe->curr_device && universe->curr_device != desired_device)) {
+ if (universe->curr_instance
+ && pl_remove_device(universe->curr_instance) < 0) {
+ if (err_str)
+ strcpy(err_str, "Unable to deselect device from interp instance.\n");
+ return 0;
+ }
+ if (universe->curr_device && universe->curr_device != desired_device) {
+ /* Here, we close the device. Note that this is not an absolute */
+ /* requirement: we could have a pool of open devices & select them */
+ /* into interp_instances as needed. The reason we force a close */
+ /* here is that multiple *async* devices would need coordination */
+ /* since an async device is not guaranteed to have completed */
+ /* rendering until it is closed. So, we close devices here to */
+ /* avoid things like intevermingling of output streams. */
+ if (gs_closedevice(universe->curr_device) < 0) {
+ if (err_str)
+ strcpy(err_str, "Unable to close device.\n");
+ return 0;
+ } else {
+ /* Delete the device. */
+# ifdef PSI_INCLUDED
+ gs_unregister_root(universe->curr_device->memory, &device_root, "pl_main_universe_select");
+# endif
+ gs_free_object(universe->curr_device->memory,
+ universe->curr_device, "pl_main_universe_select(gx_device)");
+ universe->curr_device = 0;
+ }
+ }
+ }
+
+ /* Switch to/select new interperter if indicated. */
+ /* Here, we assume that instances of all interpreters are open & ready */
+ /* to go. If memory were scarce, we could dynamically destroy/create */
+ /* interp_instances here (or even de/init the entire interp for greater */
+ /* memory savings). */
+ if ((!universe->curr_implementation
+ || universe->curr_implementation != desired_implementation)
+ || !universe->curr_device) {
+ int index;
+
+ /* Select/change PDL if needed */
+ if (!universe->curr_implementation
+ || universe->curr_implementation != desired_implementation) {
+ /* find instance corresponding to implementation */
+ for (index = 0;
+ desired_implementation != universe->pdl_implementation[index];
+ ++index)
+ ;
+ universe->curr_instance = universe->pdl_instance_array[index];
+ universe->curr_implementation = desired_implementation;
+ }
+
+ /* Open a new device if needed. */
+ if (!universe->curr_device) { /* remember that curr_device==0 if we closed it above */
+ /* Set latest params into device BEFORE setting into device. */
+ /* Do this here because PCL5 will do some 1-time initializations based */
+ /* on device geometry when pl_set_device, below, selects the device. */
+ if ( gs_putdeviceparams(desired_device, params) < 0 ) {
+ strcpy(err_str, "Unable to set params into device.\n");
+ return 0;
+ }
+ params_are_set = 1;
+
+ if (gs_opendevice(desired_device) < 0) {
+ if (err_str)
+ strcpy(err_str, "Unable to open new device.\n");
+ return 0;
+ } else
+ universe->curr_device = desired_device;
+ }
+
+ /* NB fix me this parameter should not be passed this way */
+ universe->curr_instance->pcl_personality = pti->pcl_personality;
+ /* Select curr/new device into PDL instance */
+ if ( pl_set_device(universe->curr_instance, universe->curr_device) < 0 ) {
+ if (err_str)
+ strcpy(err_str, "Unable to install device into PDL interp.");
+ return 0;
+ }
+ /* potentially downgrade the resolution */
+ if ( ( pti->page_count + 1 ) < pti->first_page ) {
+ if ( !pti->saved_hwres ) {
+ gx_device *pdev = universe->curr_device;
+ pti->saved_hwres = true;
+ pti->hwres[0] = pdev->HWResolution[0];
+ pti->hwres[1] = pdev->HWResolution[1];
+
+ if (!pjl_proc_compare(pjl_instance,
+ pjl_proc_get_envvar(pjl_instance, "viewer"),
+ "on")) {
+ /* NB: new_logical_page shouldn't be called for every page
+ */
+ pti->viewer = true; /* cache pjl variable on language select */
+ gx_device_set_resolution(pdev, 10, 10);
+ }
+ else {
+ pti->viewer = false;
+ gx_device_set_resolution(pti->device,
+ pti->hwres[0], pti->hwres[1]);
+ }
+ }
+ }
+ }
+
+ /* Set latest params into device. Write them all in case any changed */
+ if ( !params_are_set
+ && gs_putdeviceparams(universe->curr_device, params) < 0 ) {
+ strcpy(err_str, "Unable to set params into device.\n");
+ return 0;
+ }
+ return universe->curr_instance;
+}
+
+/* ------- Functions related to pl_main_instance_t ------ */
+
+/* Initialize the instance parameters. */
+void
+pl_main_init_instance(pl_main_instance_t *pti, gs_memory_t *mem)
+{
+ pti->memory = mem;
+ pti->error_report = -1;
+ pti->pause = true;
+ pti->print_page_count = false;
+ pti->device = 0;
+ pti->implementation = 0;
+ gp_get_usertime(pti->base_time);
+ pti->first_page = 1;
+ pti->last_page = max_int;
+ pti->page_count = 0;
+ pti->saved_hwres = false;
+ pti->mem_cleanup = true;
+ strncpy(&pti->pcl_personality[0], "PCL", sizeof(pti->pcl_personality)-1);
+}
+
+/* -------- Command-line processing ------ */
+
+/* Create a default device if not already defined. */
+static int
+pl_top_create_device(pl_main_instance_t *pti, int index, bool is_default)
+{
+ int code = 0;
+ if ( index < 0 )
+ return -1;
+ if ( !is_default || !pti->device ) {
+ const gx_device **list;
+
+# ifdef PSI_INCLUDED
+ /* We assume that nobody else changes pti->device,
+ and this function is called from this module only.
+ Due to that device_root is always consistent with pti->device,
+ and it is regisrtered if and only if pti-<device != NULL.
+ */
+ if (pti->device != NULL) {
+ pti->device = NULL;
+ gs_unregister_root(pti->device_memory, &device_root, "pl_main_universe_select");
+ }
+# endif
+
+ gs_lib_device_list((const gx_device * const **)&list, NULL);
+ code = gs_copydevice(&pti->device, list[index],
+ pti->device_memory);
+# ifdef PSI_INCLUDED
+ if (pti->device != NULL)
+ gs_register_struct_root(pti->device_memory, &device_root,
+ &pti->device, "pl_top_create_device");
+# endif
+ }
+ return code;
+}
+
+
+/* Process the options on the command line. */
+static FILE *
+pl_main_arg_fopen(const char *fname, void *ignore_data)
+{ return fopen(fname, "r");
+}
+
+static void
+set_debug_flags(const char *arg, char *flags)
+{
+ byte value = (*arg == '-' ? (++arg, 0) : 0xff);
+
+ while (*arg)
+ flags[*arg++ & 127] = value;
+}
+
+#define arg_heap_copy(str) arg_copy(str, pmi->memory)
+int
+pl_main_process_options(pl_main_instance_t *pmi, arg_list *pal,
+ gs_c_param_list *params,
+ pl_interp_instance_t *pjl_instance,
+ pl_interp_implementation_t const * const impl_array[], char **filename)
+{
+ int code = 0;
+ bool help = false;
+ char *arg;
+
+ gs_c_param_list_write_more(params);
+ while ( (arg = (char *)arg_next(pal, &code)) != 0 &&
+ *arg == '-' ) { /* just - read from stdin */
+ if (code < 0)
+ break;
+ if ( arg[1] == '\0' )
+ break;
+ arg += 2;
+ switch ( arg[-1] ) {
+ default:
+ dprintf1("Unrecognized switch: %s\n", arg);
+ return -1;
+ case '\0':
+ /* read from stdin - must be last arg */
+ continue;
+ case 'c':
+ case 'C':
+ pmi->print_page_count = true;
+ break;
+ case 'd':
+ case 'D':
+ if ( !strcmp(arg, "BATCH") )
+ continue;
+ if ( !strcmp(arg, "NOPAUSE") ) {
+ pmi->pause = false;
+ continue;
+ }
+ {
+ /* We're setting a device parameter to a non-string value. */
+ char *eqp = strchr(arg, '=');
+ const char *value;
+ int vi;
+ float vf;
+ bool bval = true;
+ char buffer[128];
+
+ if ( eqp || (eqp = strchr(arg, '#')) )
+ value = eqp + 1;
+ else {
+ /* -dDefaultBooleanIs_TRUE */
+ code = param_write_bool((gs_param_list *)params, arg_heap_copy(arg), &bval);
+ continue;
+ }
+ /* search for an int (no decimal), if fail try a float */
+ if ( ( !strchr(value, '.' ) ) &&
+ ( sscanf(value, "%d", &vi) == 1 ) ) {
+ if ( !strncmp(arg, "FirstPage", 9) )
+ pmi->first_page = max(vi, 1);
+ else if ( !strncmp(arg, "LastPage", 8) )
+ pmi->last_page = vi;
+ else {
+ /* create a null terminated string */
+ strncpy(buffer, arg, eqp - arg);
+ buffer[eqp - arg] = '\0';
+ code = param_write_int((gs_param_list *)params, arg_heap_copy(buffer), &vi);
+ }
+ } else if ( sscanf(value, "%f", &vf) == 1 ) {
+ /* create a null terminated string. NB duplicated code. */
+ strncpy(buffer, arg, eqp - arg);
+ buffer[eqp - arg] = '\0';
+ code = param_write_float((gs_param_list *)params, arg_heap_copy(buffer), &vf);
+ } else if ( !strcmp(value, "true") ) {
+ /* bval = true; */
+ strncpy(buffer, arg, eqp - arg);
+ buffer[eqp - arg] = '\0';
+ code = param_write_bool((gs_param_list *)params, arg_heap_copy(buffer), &bval);
+ } else if ( !strcmp(value, "false") ) {
+ bval = false;
+ strncpy(buffer, arg, eqp - arg);
+ buffer[eqp - arg] = '\0';
+ code = param_write_bool((gs_param_list *)params, arg_heap_copy(buffer), &bval);
+ } else {
+ dprintf("Usage for -d is -d<option>=[<integer>|<float>|true|false]\n");
+ continue;
+ }
+ }
+ break;
+ case 'E':
+ if ( *arg == 0 )
+ gs_debug['#'] = 1;
+ else
+ sscanf(arg, "%d", &pmi->error_report);
+ break;
+ case 'g':
+ {
+ int geom[2];
+ gs_param_int_array ia;
+
+ if ( sscanf(arg, "%ux%u", &geom[0], &geom[1]) != 2 ) {
+ dprintf("-g must be followed by <width>x<height>\n");
+ return -1;
+ }
+ ia.data = geom;
+ ia.size = 2;
+ ia.persistent = false;
+ code = param_write_int_array((gs_param_list *)params, "HWSize", &ia);
+ }
+ break;
+ case 'h':
+ help = true;
+ goto out;
+ /* job control line follows - PJL */
+ case 'j':
+ case 'J':
+ /* set up the read cursor and send it to the pjl parser */
+ {
+ stream_cursor_read cursor;
+
+ /* PJL lines have max length of 80 character + null terminator */
+ byte buf[81];
+ /* length of arg + newline (expected by PJL parser) + null */
+ int buf_len = strlen(arg) + 2;
+ if ( (buf_len ) > sizeof(buf) ) {
+ dprintf("pjl sequence too long\n");
+ return -1;
+ }
+ /* copy and concatenate newline */
+ strcpy(buf, arg); strcat(buf, "\n");
+ /* starting pos for pointer is always one position back */
+ cursor.ptr = buf - 1;
+ /* set the end of data pointer */
+ cursor.limit = cursor.ptr + strlen(buf);
+ /* process the pjl */
+ code = pl_process(pjl_instance, &cursor);
+ if ( code < 0 ) {
+ dprintf("illegal pjl sequence in -J option\n");
+ return code;
+ }
+ }
+ break;
+ case 'K': /* max memory in K */
+ {
+ int maxk;
+ gs_malloc_memory_t *rawheap = gs_malloc_wrapped_contents(pmi->memory);
+
+ if ( sscanf(arg, "%d", &maxk) != 1 ) {
+ dprintf("-K must be followed by a number\n");
+ return -1;
+ }
+ rawheap->limit = (long)maxk << 10;
+ }
+ break;
+ case 'n':
+ case 'N':
+ pmi->mem_cleanup = false;
+ break;
+ case 'p':
+ case 'P':
+ {
+ if ( !strcmp(arg, "RTL") || !strcmp(arg, "PCL5E") ||
+ !strcmp(arg, "PCL5C") )
+ strcpy(pmi->pcl_personality, arg);
+ else
+ dprintf("PCL personality must be RTL, PCL5E or PCL5C\n");
+ }
+ break;
+ case 'r':
+ {
+ float res[2];
+ gs_param_float_array fa;
+
+ switch ( sscanf(arg, "%fx%f", &res[0], &res[1]) ) {
+ default:
+ dprintf("-r must be followed by <res> or <xres>x<yres>\n");
+ return -1;
+ case 1: /* -r<res> */
+ res[1] = res[0];
+ case 2: /* -r<xres>x<yres> */
+ ;
+ }
+ fa.data = res;
+ fa.size = 2;
+ fa.persistent = false;
+ code = param_write_float_array((gs_param_list *)params, "HWResolution", &fa);
+ }
+ break;
+ case 's':
+ case 'S':
+ { /* We're setting a device parameter to a string. */
+ char *eqp;
+ const char *value;
+ gs_param_string str;
+ eqp = strchr(arg, '=');
+ if ( !(eqp || (eqp = strchr(arg, '#'))) ) {
+ dprintf("Usage for -s is -s<option>=<string>\n");
+ return -1;
+ }
+ value = eqp + 1;
+ if ( !strncmp(arg, "DEVICE", 6) ) {
+ int code =
+ pl_top_create_device(pmi,
+ get_device_index(pmi->memory, value),
+ false);
+ if ( code < 0 ) return code;
+ }
+ else {
+ char buffer[128];
+ strncpy(buffer, arg, eqp - arg);
+ buffer[eqp - arg] = '\0';
+ param_string_from_transient_string(str, value);
+ code = param_write_string((gs_param_list *)params, buffer,
+ &str);
+ }
+ }
+ break;
+#if defined(DEBUG) && defined(ALLOW_VD_TRACE)
+ case 'T':
+ set_debug_flags(arg, vd_flags);
+ break;
+#endif
+ case 'Z':
+ set_debug_flags(arg, gs_debug);
+ break;
+ case 'L': /* language */
+ {
+ int index;
+ for (index = 0; impl_array[index] != 0; ++index)
+ if (!strcmp(arg,
+ pl_characteristics(impl_array[index])->language))
+ break;
+ if (impl_array[index] != 0)
+ pmi->implementation = impl_array[index];
+ else {
+ dprintf("Choose language in -L<language> from: ");
+ for (index = 0; impl_array[index] != 0; ++index)
+ dprintf1("%s ",
+ pl_characteristics(impl_array[index])->language);
+ dprintf("\n");
+ return -1;
+ }
+ break;
+ }
+ }
+ }
+ out: if ( help ) {
+ arg_finit(pal);
+ gs_c_param_list_release(params);
+ return -1;
+ }
+ gs_c_param_list_read(params);
+ pl_top_create_device(pmi, 0, true); /* create default device if needed */
+
+ /* The last argument wasn't a switch filename else NULL*/
+ *filename = arg;
+ return 0;
+}
+
+/* either the (1) implementation has been selected on the command line or
+ (2) it has been selected in PJL or (3) we need to auto sense. */
+static pl_interp_implementation_t const *
+pl_select_implementation(pl_interp_instance_t *pjl_instance, pl_main_instance_t *pmi, pl_top_cursor_t r)
+{
+ /* Determine language of file to interpret. We're making the incorrect */
+ /* assumption that any file only contains jobs in one PDL. The correct */
+ /* way to implement this would be to have a language auto-detector. */
+ pl_interp_implementation_t const *impl;
+ if (pmi->implementation)
+ return pmi->implementation; /* was specified as cmd opt */
+ /* select implementation */
+ if ( (impl = pl_pjl_select(pjl_instance, pdl_implementation)) != 0 )
+ return impl;
+ /* lookup string in name field for each implementation */
+ return pl_auto_sense(r.cursor.ptr + 1, (r.cursor.limit - r.cursor.ptr), pdl_implementation);
+}
+
+/* Find default language implementation */
+static pl_interp_implementation_t const *
+pl_pjl_select(pl_interp_instance_t *pjl_instance,
+ pl_interp_implementation_t const * const impl_array[] /* implementations to choose from */
+)
+{
+ pjl_envvar_t *language;
+ pl_interp_implementation_t const * const * impl;
+ language = pjl_proc_get_envvar(pjl_instance, "language");
+ for (impl = impl_array; *impl != 0; ++impl) {
+ if ( !strcmp(pl_characteristics(*impl)->language, language) )
+ return *impl;
+ }
+ /* Defaults to NULL */
+ return 0;
+}
+
+/* Find default language implementation */
+static pl_interp_implementation_t const *
+pl_auto_sense(
+ const char* name, /* stream */
+ int buffer_length, /* length of stream */
+ pl_interp_implementation_t const * const impl_array[] /* implementations to choose from */
+)
+{
+ /* Lookup this string in the auto sense field for each implementation */
+ pl_interp_implementation_t const * const * impl;
+ for (impl = impl_array; *impl != 0; ++impl) {
+ if ( buffer_length >= (strlen(pl_characteristics(*impl)->auto_sense_string)) )
+ if ( !strncmp(pl_characteristics(*impl)->auto_sense_string,
+ name,
+ (strlen(pl_characteristics(*impl)->auto_sense_string))) )
+ return *impl;
+ }
+ /* Defaults to PCL */
+ return impl_array[0];
+}
+
+/* Print memory and time usage. */
+void
+pl_print_usage(const pl_main_instance_t *pti,
+ const char *msg)
+{
+ long utime[2];
+ gp_get_usertime(utime);
+ dprintf3("%% %s time = %g, pages = %d\n",
+ msg, utime[0] - pti->base_time[0] +
+ (utime[1] - pti->base_time[1]) / 1000000000.0,
+ pti->page_count);
+}
+
+/* Log a string to console, optionally wait for input */
+void
+pl_log_string(const gs_memory_t *mem, const char *str, int wait_for_key)
+{
+ errwrite(str, strlen(str));
+ if (wait_for_key)
+ fgetc(mem->gs_lib_ctx->fstdin);
+}
+
+/* Pre-page portion of page finishing routine */
+int /* ret 0 if page should be printed, 1 if no print, else -ve error */
+pl_pre_finish_page(pl_interp_instance_t *interp, void *closure)
+{
+ pl_main_instance_t *pti = (pl_main_instance_t *)closure;
+
+ /* up the page count */
+ ++(pti->page_count);
+
+ /* if the next page is in range we want to restore the resolution */
+ if ( (pti->page_count + 1) >= pti->first_page &&
+ (pti->page_count + 1) <= pti->last_page ) {
+ /* check if we downgraded the resolution */
+ if ( pti->saved_hwres ) {
+ pti->saved_hwres = false;
+ gx_device_set_resolution(pti->device,
+ pti->hwres[0], pti->hwres[1]);
+ }
+ }
+ /* nothing to do now if we are in range */
+ if ( pti->page_count >= pti->first_page && pti->page_count <= pti->last_page )
+ return 0;
+ /* past page count we return an error so the interpreter will exit early */
+ if ( pti->page_count > pti->last_page )
+ return -1;
+ /* finally if the next page is out of range -- must be before
+ the first page if we are here. We have to render the page
+ but can optimize by downgrading the resolution. */
+ if ( (pti->page_count + 1) < pti->first_page ) {
+ /* If we haven't saved the hardware resolution save the
+ default resolution for the device and set the
+ diminished resolution if it hasn't been done
+ already. NB what if language sets resolution? */
+ if ( !pti->saved_hwres ) {
+ gx_device *pdev = pti->device;
+ pti->saved_hwres = true;
+ pti->hwres[0] = pdev->HWResolution[0];
+ pti->hwres[1] = pdev->HWResolution[1];
+ if ( pti->viewer ) {
+ /* NB: new_logical_page shouldn't be called for every page
+ * viewer optimizations sometimes fail!
+ */
+ gx_device_set_resolution(pdev, 10, 10);
+ }
+ else
+ gx_device_set_resolution(pti->device,
+ pti->hwres[0], pti->hwres[1]);
+ }
+ }
+ /* out of range don't allow printing the page */
+ return 1;
+}
+
+/* Post-page portion of page finishing routine */
+int /* ret 0, else -ve error */
+pl_post_finish_page(pl_interp_instance_t *interp, void *closure)
+{
+ pl_main_instance_t *pti = (pl_main_instance_t *)closure;
+ if ( pti->pause )
+ { char strbuf[256];
+ sprintf(strbuf, "End of page %d, press <enter> to continue.\n",
+ pti->page_count);
+ pl_log_string(pti->memory, strbuf, 1);
+ }
+ else if ( gs_debug_c(':') )
+ pl_print_usage(pti, " done :");
+
+ return 0;
+}
+
+/* ---------------- Stubs ---------------- */
+/* Error termination, called back from plplatf.c */
+/* Only called back if abnormal termination */
+void
+pl_exit(int exit_status)
+{
+ gp_do_exit(exit_status);
+}
+
+/* -------------- Read file cursor operations ---------- */
+/* Open a read cursor w/specified file */
+int /* returns 0 ok, else -ve error code */
+pl_main_cursor_open(const gs_memory_t *mem,
+ pl_top_cursor_t *cursor, /* cursor to init/open */
+ const char *fname, /* name of file to open */
+ byte *buffer, /* buffer to use for reading */
+ unsigned buffer_length /* length of *buffer */
+)
+{
+ /* try to open file */
+ if (fname[0] == '-' && fname[1] == 0)
+ cursor->strm = mem->gs_lib_ctx->fstdin;
+ else
+ cursor->strm = fopen(fname, "rb");
+ if (!cursor->strm)
+ return gs_error_ioerror;
+
+ return pl_top_cursor_init(cursor, cursor->strm, buffer, buffer_length);
+}
+
+#ifdef DEBUG
+/* Refill from input */
+int /* rets 1 ok, else 0 EOF, -ve error */
+pl_main_cursor_next(
+ pl_top_cursor_t *cursor /* cursor to operate on */
+)
+{
+ return pl_top_cursor_next(cursor);
+}
+#endif /* DEBUG */
+
+/* Read back curr file position */
+long /* offset from beginning of file */
+pl_main_cursor_position(
+ pl_top_cursor_t *cursor /* cursor to operate on */
+)
+{
+ return (long)ftell(cursor->strm)
+ - (cursor->cursor.limit - cursor->cursor.ptr);
+}
+
+/* Close read cursor */
+void
+pl_main_cursor_close(
+ pl_top_cursor_t *cursor /* cursor to operate on */
+)
+{
+ pl_top_cursor_dnit(cursor);
+ fclose(cursor->strm);
+}
+
+#ifndef NO_MAIN
+/* ----------- Command-line driver for pl_interp's ------ */
+int
+main(int argc, char **argv) {
+ return pl_main(argc, argv);
+}
+#endif /* !defined(NO_MAIN) */
+
diff --git a/pl/plmain.h b/pl/plmain.h
new file mode 100644
index 000000000..cdef45cf1
--- /dev/null
+++ b/pl/plmain.h
@@ -0,0 +1,83 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plmain.h */
+/* Interface to main program utilities for PCL interpreters */
+
+#ifndef plmain_INCLUDED
+# define plmain_INCLUDED
+
+#include "gsargs.h"
+#include "gsgc.h"
+/*
+ * Define the parameters for running the interpreter.
+ */
+#ifndef gx_device_DEFINED
+# define gx_device_DEFINED
+typedef struct gx_device_s gx_device;
+#endif
+
+/*
+ * Define the parameters for running the interpreter.
+ */
+typedef struct pl_main_instance_s {
+ /* The following are set at initialization time. */
+ gs_memory_t *memory;
+ gs_memory_t *device_memory;
+ long base_time[2]; /* starting usertime */
+ int error_report; /* -E# */
+ bool pause; /* -dNOPAUSE => false */
+ bool print_page_count; /* print the page number to stdout at
+ the end of the job. */
+ int first_page; /* -dFirstPage= */
+ int last_page; /* -dLastPage= */
+ gx_device *device;
+ pl_interp_implementation_t const *implementation; /*-L<Language>*/
+ /* The following are updated dynamically. */
+ int page_count; /* # of pages printed */
+
+ bool saved_hwres;
+ float hwres[2];
+ bool viewer; /* speed optimizations for viewer; NB MAY not always be correct! */
+ bool mem_cleanup;
+ char pcl_personality[6]; /* a character string to set pcl's
+ personality - rtl, pcl5c, pcl5e, and
+ pcl == default. NB doesn't belong here. */
+
+} pl_main_instance_t;
+
+/* initialize gs_stdin, gs_stdout, and gs_stderr. Eventually the gs
+ library should provide an interface for doing this */
+void pl_main_init_standard_io(void);
+
+/* Initialize the instance parameters. */
+void pl_main_init(pl_main_instance_t *pmi, gs_memory_t *memory);
+
+/* Allocate and initialize the first graphics state. */
+#ifndef gs_state_DEFINED
+# define gs_state_DEFINED
+typedef struct gs_state_s gs_state;
+#endif
+int pl_main_make_gstate(pl_main_instance_t *pmi, gs_state **ppgs);
+
+#ifdef DEBUG
+/* Print memory and time usage. */
+void pl_print_usage(const pl_main_instance_t *pmi,
+ const char *msg);
+#endif
+
+/* Finish a page, possibly printing usage statistics and/or pausing. */
+int pl_finish_page(pl_main_instance_t *pmi, gs_state *pgs,
+ int num_copies, int flush);
+
+#endif /* plmain_INCLUDED */
diff --git a/pl/plparse.h b/pl/plparse.h
new file mode 100644
index 000000000..ede05f4c7
--- /dev/null
+++ b/pl/plparse.h
@@ -0,0 +1,62 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plparse.h */
+/* Interface to all (H-P) language parsers */
+
+#ifndef plparse_INCLUDED
+# define plparse_INCLUDED
+
+#include "scommon.h"
+
+/*
+ * H-P printers can switch languages more or less ad lib. Currently,
+ * we have to be able to handle 4 languages: PJL, PCL5*, HP-GL/2,
+ * and PCL XL. This file provides a tiny bit of structure common to
+ * all languages and parsers, for the use of front-end programs that
+ * don't want to worry about such things.
+ *
+ * At any given moment, the interpreter's state consists of:
+ * - Job parameters set by some mix of PJL and the current language;
+ * - User defaults for the current language;
+ * - Parsing state for the current language;
+ * - Parameters, graphics state, and downloaded data for the current
+ * language.
+ * Currently we don't try to impose much structure on this, only enough
+ * to make it possible to write the language switching code.
+ */
+/*
+ * Define an abstract type for the switchable input processor state.
+ */
+typedef struct pl_process_state_s pl_process_state_t;
+/*
+ * Define the type for a parser. The parser reads data from the input
+ * buffer and returns either:
+ * >=0 - OK, more input is needed.
+ * e_ExitLanguage - A UEL or other return to the default parser was
+ * detected.
+ * other <0 value - an error was detected.
+ */
+#define e_ExitLanguage (-102) /* e_InterpreterExit */
+#define pl_process_proc(proc)\
+ int proc(pl_process_state_t *process_data, stream_cursor_read *pr)
+typedef pl_process_proc((*pl_process_proc_t));
+/*
+ * Define the input processor state. There's hardly anything here....
+ */
+struct pl_process_state_s {
+ pl_process_proc_t process;
+ void *process_data; /* closure data for process procedure */
+};
+
+#endif /* plparse_INCLUDED */
diff --git a/pl/plplatf.c b/pl/plplatf.c
new file mode 100644
index 000000000..da4ecd47b
--- /dev/null
+++ b/pl/plplatf.c
@@ -0,0 +1,71 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plplatf.c Platform-related utils */
+
+#include "string_.h"
+#include "gdebug.h"
+#include "gsio.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gp.h"
+#include "gslib.h"
+#include "plplatf.h"
+
+
+/* ------------- Platform de/init --------- */
+void
+pl_platform_init(FILE *debug_out)
+{
+ gp_init();
+ /* debug flags we reset this out of gs_lib_init0 which sets these
+ and the allocator we want the debug setting but we do our own
+ allocator */
+ memset(gs_debug, 0, 128);
+ gs_log_errors = 0;
+}
+
+void
+pl_platform_dnit(int exit_status)
+{
+ /* Do platform-specific cleanup. */
+ gp_exit(exit_status, 0);
+}
+
+/* ---------------- Stubs ---------------- */
+
+/* Stubs for GC */
+const gs_ptr_procs_t ptr_struct_procs = { NULL, NULL, NULL };
+const gs_ptr_procs_t ptr_string_procs = { NULL, NULL, NULL };
+const gs_ptr_procs_t ptr_const_string_procs = { NULL, NULL, NULL };
+void * /* obj_header_t * */
+gs_reloc_struct_ptr(const void * /* obj_header_t * */ obj, gc_state_t *gcst)
+{ return (void *)obj;
+}
+void
+gs_reloc_string(gs_string *sptr, gc_state_t *gcst)
+{
+}
+void
+gs_reloc_const_string(gs_const_string *sptr, gc_state_t *gcst)
+{
+}
+
+/* Stub for abnormal termination */
+void
+gs_exit(int exit_status)
+{ pl_platform_dnit(exit_status);
+ pl_exit(exit_status); /* must be implemeted by caller */
+}
+
diff --git a/pl/plplatf.h b/pl/plplatf.h
new file mode 100644
index 000000000..f218eeadf
--- /dev/null
+++ b/pl/plplatf.h
@@ -0,0 +1,32 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plplatf.h Platform-related utils */
+
+#ifndef plplatf_INCLUDED
+# define plplatf_INCLUDED
+
+/* ------------- Platform de/init --------- */
+void
+pl_platform_init(FILE *debug_out);
+
+void
+pl_platform_dnit(int exit_status);
+
+
+/*----- The following is declared here, but must be implemented by client ----*/
+/* Terminate execution */
+void pl_exit(int exit_status);
+
+#endif /* plplatf_INCLUDED */
+
diff --git a/pl/plplatfps.c b/pl/plplatfps.c
new file mode 100644
index 000000000..ba3d34dd7
--- /dev/null
+++ b/pl/plplatfps.c
@@ -0,0 +1,68 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plplatf.c Platform-related utils */
+
+#include "string_.h"
+#include "gdebug.h"
+#include "gsio.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gp.h"
+#include "gslib.h"
+#include "plplatf.h"
+
+
+/* ------------- Platform de/init --------- */
+void
+pl_platform_init(FILE *debug_out)
+{
+ gp_init();
+ /* debug flags we reset this out of gs_lib_init0 which sets these
+ and the allocator we want the debug setting but we do our own
+ allocator */
+ memset(gs_debug, 0, 128);
+ gs_log_errors = 0;
+}
+
+void
+pl_platform_dnit(int exit_status)
+{
+ // hack
+ // fflush(gs_stderr); /* in case of error exit */
+ /* Do platform-specific cleanup. */
+ gp_exit(exit_status, 0);
+}
+
+/* ---------------- Stubs ---------------- */
+
+void * /* obj_header_t * */
+gs_reloc_struct_ptr(const void * /* obj_header_t * */ obj, gc_state_t *gcst)
+{ return (void *)obj;
+}
+void
+gs_reloc_string(gs_string *sptr, gc_state_t *gcst)
+{
+}
+void
+gs_reloc_const_string(gs_const_string *sptr, gc_state_t *gcst)
+{
+}
+
+int
+gp_check_interrupts(void)
+{
+ return 0;
+}
+
diff --git a/pl/plsrgb.c b/pl/plsrgb.c
new file mode 100644
index 000000000..251f9aee6
--- /dev/null
+++ b/pl/plsrgb.c
@@ -0,0 +1,402 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plsrgb.c - setting of srgb device independent color space. */
+#include "math_.h"
+#include "string_.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gscspace.h"
+#include "gsstate.h"
+#include "gscie.h"
+#include "gscolor2.h"
+#include "gscrdp.h"
+#include "gscrd.h"
+#include "gsparam.h"
+#include "gxstate.h"
+#include "gzstate.h"
+#include "plsrgb.h"
+
+/* uncomment the following definition to specify the device does the
+ color conversion. If the definition is commented out we set up an
+ srgb color space and associated color rendering dictionary using
+ the regular color conversion machinery in the graphics library
+ pipeline. The wtsimdi device is an example device that does color
+ conversion as a "postprocess" and requires the definition. If
+ defined all additive colors are passed through as Device RGB but
+ the device assumes the triples are in fact sRGB. NB eventually
+ this should be decided at run time. */
+
+#define DEVICE_DOES_COLOR_CONVERSION
+
+bool
+pl_device_does_color_conversion()
+{
+#ifdef DEVICE_DOES_COLOR_CONVERSION
+ return true;
+#endif
+ return false;
+}
+
+
+/* shared language (pcl and pclxl) for setting up sRGB to XYZ and an
+ associated default CRD to be used. The code will request a crd
+ from the driver which will override the default crd. We use the
+ postscript definitions (converted to C) from www.srgb.com, these
+ definitions are repeated here
+
+ [ /CIEBasedABC <<
+ % sRGB gamma transform
+ /DecodeLMN [
+ {dup 0.03928 le {12.92321 div}{0.055 add 1.055 div 2.4 exp}ifelse}
+ bind dup dup ]
+
+ % sRGB to XYZ (D65) matrix (ITU-R BT.709-2 Primaries)
+ /MatrixLMN [
+ 0.412457 0.212673 0.019334
+ 0.357576 0.715152 0.119192
+ 0.180437 0.072175 0.950301 ]
+ /WhitePoint [ 0.9505 1 1.0890 ] % D65
+ /BlackPoint[0 0 0]
+ >> ] setcolorspace
+
+ <<
+ % sRGB output CRD, D65 white point
+ /ColorRenderingType 1
+ /RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+
+ % Bradford Cone Space
+ /MatrixPQR [0.8951 -0.7502 0.0389
+ 0.2664 1.7135 -0.0685
+ -0.1614 0.0367 1.0296]
+
+ % VonKries-like transform in Bradford Cone Space
+ /TransformPQR
+ [{exch pop exch 3 get mul exch pop exch 3 get div} bind
+ {exch pop exch 4 get mul exch pop exch 4 get div} bind
+ {exch pop exch 5 get mul exch pop exch 5 get div} bind]
+
+ /MatrixLMN [3.240449 -0.969265 0.055643
+ -1.537136 1.876011 -0.204026
+ -0.498531 0.041556 1.057229]
+
+ % Inverse sRGB gamma transform
+ /EncodeABC [{dup 0.00304 le {12.92321 mul}
+ {1 2.4 div exp 1.055 mul 0.055 sub}ifelse}
+ bind dup dup]
+
+ /WhitePoint[0.9505 1 1.0890] % D65
+ /BlackPoint [0 0 0]
+ >> setcolorrendering
+*/
+
+
+/* CIEBasedABC definitions */
+/* Decode LMN procedures for srgb color spaces or sRGB gamma transform. */
+inline static float
+pl_decodeLMN(floatp val, const gs_cie_common *pcie)
+{
+ if ( val <= 0.03928 )
+ return (float)(val / 12.92321);
+ else
+ return (float)pow((val + 0.055) / 1.055, (double)2.4);
+}
+
+
+static float
+pl_DecodeLMN_0(floatp val, const gs_cie_common *pcie)
+{
+ return pl_decodeLMN(val, pcie);
+}
+
+static float
+pl_DecodeLMN_1(floatp val, const gs_cie_common *pcie)
+{
+ return pl_decodeLMN(val, pcie);
+}
+
+static float
+pl_DecodeLMN_2(floatp val, const gs_cie_common *pcie)
+{
+ return pl_decodeLMN(val, pcie);
+}
+
+static const gs_cie_common_proc3 pl_DecodeLMN = {
+ { pl_DecodeLMN_0, pl_DecodeLMN_1, pl_DecodeLMN_2 }
+};
+
+/* LMN matrix for srgb. sRGB to XYZ (D65) matrix (ITU-R BT.709-2 Primaries) */
+static const gs_matrix3 pl_MatrixLMN = {
+ {0.412457, 0.212673, 0.019334},
+ {0.357576, 0.715152, 0.119192},
+ {0.180437, 0.072175, 0.950301},
+ false
+};
+
+/* LMN matrix for the crd, just the inverse of the color spaces LMN. */
+static const gs_matrix3 pl_MatrixCRDLMN = {
+ {3.240449, -0.969265, 0.055643},
+ {-1.537136, 1.876011, -0.204026},
+ {-0.498531, 0.041556, 1.057229},
+ false
+};
+
+/* D65 white point */
+static const gs_vector3 pl_WhitePoint = {0.9505, 1.0, 1.0890};
+static const gs_vector3 pl_BlackPoint = {0.0, 0.0, 0.0};
+
+/* Bradford Cone Space - www.srgb.com */
+static const gs_matrix3 pl_MatrixPQR = {
+ {0.8951, -0.7502, 0.0389},
+ {0.2664, 1.7135, -0.0685},
+ {-0.1614, 0.0367, 1.0296},
+ false
+};
+
+static const gs_range3 pl_RangePQR = {
+ {{-0.5, 2.0},
+ {-0.5, 2.0},
+ {-0.5, 2.0}}
+};
+
+
+/* tranform pqr */
+static int
+pl_TransformPQR_proc(int indx, floatp val, const gs_cie_wbsd *cs_wbsd,
+ gs_cie_render *pcrd, float *pnew_val)
+{
+ const float *pcrd_wht = (float *)&(cs_wbsd->wd.pqr);
+ const float *pcs_wht = (float *)&(cs_wbsd->ws.pqr);
+ *pnew_val = val * pcrd_wht[indx] / pcs_wht[indx];
+ return 0;
+}
+
+static const gs_cie_transform_proc3 pl_TransformPQR = {
+ pl_TransformPQR_proc,
+ NULL,
+ { NULL, 0 },
+ NULL
+};
+
+
+/* ABC - inverse srgb gamma transform */
+inline static float
+pl_encodeABC(floatp in, const gs_cie_render * pcrd)
+{
+ if ( in <= 0.00304 )
+ return (float)(in * 12.92321);
+ return (float)(pow(in, (1.0 / 2.4)) * 1.055 - 0.055);
+}
+
+static float
+pl_EncodeABC_0(floatp in, const gs_cie_render * pcrd)
+{
+ return pl_encodeABC(in, pcrd);
+}
+
+static float
+pl_EncodeABC_1(floatp in, const gs_cie_render * pcrd)
+{
+ return pl_encodeABC(in, pcrd);
+}
+
+static float
+pl_EncodeABC_2(floatp in, const gs_cie_render * pcrd)
+{
+ return pl_encodeABC(in, pcrd);
+}
+
+static const gs_cie_render_proc3 pl_EncodeABC_procs = {
+ {pl_EncodeABC_0, pl_EncodeABC_1, pl_EncodeABC_2}
+};
+
+/*
+ * See if the default CRD is specified by the device.
+ *
+ * To simplify selection of more than one default CRD, this code allows more
+ * than one CRD to be included in the parameters associated with a device,
+ * and uses the device parameter "CRDName" to select the one that is to be
+ * used as a default.
+ *
+ */
+
+static bool
+pl_read_device_CRD(gs_cie_render *pcrd, gs_state *pgs)
+{
+ gx_device * pdev = gs_currentdevice(pgs);
+ gs_c_param_list list;
+ gs_param_string dstring;
+ char nbuff[64]; /* ample size */
+ int code = 0;
+
+ /*get the CRDName parameter from the device */
+ gs_c_param_list_write(&list, gs_state_memory(pgs));
+ if (param_request((gs_param_list *)&list, "CRDName") < 0)
+ return false;
+
+ if ((code = gs_getdeviceparams(pdev, (gs_param_list *)&list)) >= 0) {
+ gs_c_param_list_read(&list);
+ if ( (code = param_read_string( (gs_param_list *)&list,
+ "CRDName",
+ &dstring
+ )) == 0 ) {
+ if (dstring.size > sizeof(nbuff) - 1)
+ code = 1;
+ else {
+ strncpy(nbuff, (char *)dstring.data, dstring.size);
+ nbuff[dstring.size] = '\0';
+ }
+ }
+ }
+ gs_c_param_list_release(&list);
+ if (code != 0)
+ return false;
+
+ gs_c_param_list_write(&list, gs_state_memory(pgs));
+ if (param_request((gs_param_list *)&list, nbuff) < 0)
+ return false;
+ if ((code = gs_getdeviceparams(pdev, (gs_param_list *)&list)) >= 0) {
+ gs_param_dict dict;
+
+ gs_c_param_list_read(&list);
+ if ( (code = param_begin_read_dict( (gs_param_list *)&list,
+ nbuff,
+ &dict,
+ false
+ )) == 0 ) {
+ code = param_get_cie_render1(pcrd, dict.list, pdev);
+ param_end_read_dict((gs_param_list *)&list, nbuff, &dict);
+ if (code > 0)
+ code = 0;
+ }
+ }
+ gs_c_param_list_release(&list);
+ return (code == 0);
+}
+
+
+/* statics to see if the crd has been built, in practice the crd is a
+ singleton. */
+gs_cie_render *pl_pcrd;
+bool pl_pcrd_built = false; /* the crd has been built */
+
+
+static int
+pl_build_crd(gs_state *pgs)
+{
+ int code;
+ /* nothing to do */
+ if ( pl_pcrd_built == true )
+ return gs_setcolorrendering(pgs, pl_pcrd);
+
+ code = gs_cie_render1_build(&pl_pcrd, gs_state_memory(pgs), "build_crd");
+ if ( code < 0 )
+ return code;
+ pl_pcrd_built = true;
+
+ if ( pl_read_device_CRD(pl_pcrd, pgs) ) {
+ dprintf("CRD initialized from device\n");
+ return 0;
+ }
+
+ code = gs_cie_render1_initialize(pgs->memory,
+ pl_pcrd,
+ NULL,
+ &pl_WhitePoint,
+ &pl_BlackPoint,
+ &pl_MatrixPQR,
+ &pl_RangePQR,
+ &pl_TransformPQR,
+ &pl_MatrixCRDLMN,
+ NULL, /* EncodeLMN */
+ NULL, /* RangeLMN */
+ NULL, /* MatrixABC */
+ &pl_EncodeABC_procs,
+ NULL,
+ NULL);
+ if ( code < 0 )
+ return code; /* should not fail */
+ code = gs_setcolorrendering(pgs, pl_pcrd);
+ return code;
+}
+
+
+/* return SRGB color space to the client */
+int
+pl_cspace_init_SRGB(gs_color_space **ppcs, const gs_state *pgs)
+{
+
+ int code;
+ /* make sure we have a crd set up */
+#ifdef DEVICE_DOES_COLOR_CONVERSION
+ *ppcs = gs_cspace_new_DeviceRGB(pgs->memory);
+ return 0;
+#endif
+
+ code = pl_build_crd((gs_state *)pgs);
+ if ( code < 0 )
+ return code;
+
+
+
+ code = gs_cspace_build_CIEABC(ppcs, NULL, gs_state_memory(pgs));
+ if ( code < 0 )
+ return code;
+ *(gs_cie_DecodeLMN(*ppcs)) = pl_DecodeLMN;
+ *(gs_cie_MatrixLMN(*ppcs)) = pl_MatrixLMN;
+ (gs_cie_WhitePoint(*ppcs)) = pl_WhitePoint;
+ (gs_cie_BlackPoint(*ppcs)) = pl_BlackPoint;
+ return 0;
+}
+
+/* set the srgb color space */
+static int
+pl_setSRGB(gs_state *pgs)
+{
+ gs_color_space *pcs;
+ int code;
+
+ code = pl_cspace_init_SRGB(&pcs, pgs);
+ if ( code < 0 )
+ return code;
+ code = gs_setcolorspace(pgs, pcs);
+ rc_decrement(pcs, "ps_setSRGB");
+ return code;
+}
+
+/* set an srgb color */
+int
+pl_setSRGBcolor(gs_state *pgs, float r, float g, float b)
+{
+ int code;
+ gs_client_color color;
+
+#ifdef DEVICE_DOES_COLOR_CONVERSION
+ return gs_setrgbcolor(pgs, r, g, b);
+#endif
+ /* make sure we have a crd set up */
+ code = pl_build_crd(pgs);
+ if ( code < 0 )
+ return code;
+
+ code = pl_setSRGB(pgs);
+ if ( code < 0 )
+ return code;
+
+ /* set the color */
+ color.paint.values[0] = r;
+ color.paint.values[1] = g;
+ color.paint.values[2] = b;
+ code = gs_setcolor(pgs, &color);
+ return code;
+}
diff --git a/pl/plsrgb.h b/pl/plsrgb.h
new file mode 100644
index 000000000..ea62244ab
--- /dev/null
+++ b/pl/plsrgb.h
@@ -0,0 +1,32 @@
+/* Portions Copyright (C) 2004 artofcode LLC.
+ Portions Copyright (C) 1996, 2004 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plsrgb.h - interface for controlling srgb colorspace as used by pcl. */
+
+#ifndef plsrgb_INCLUDED
+# define plsrgb_INCLUDED
+
+/* note each of the following will set up a color rendering dictionary
+ if one is not present, possibly reading the dictionary from the
+ device. */
+
+/* return an srgb color space to the client */
+int pl_cspace_init_SRGB(gs_color_space **ppcs, const gs_state *pgs);
+
+/* set an srgb color */
+int pl_setSRGBcolor(gs_state *pgs, float r, float g, float b);
+
+/* true if device does color conversion as a post process */
+bool pl_device_does_color_conversion(void);
+
+#endif /* plsrgb_INCLUDED */
diff --git a/pl/plsymbol.c b/pl/plsymbol.c
new file mode 100644
index 000000000..8fddbc857
--- /dev/null
+++ b/pl/plsymbol.c
@@ -0,0 +1,2271 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plsymbol.c */
+/* Built-in PCL symbol sets */
+
+#include "stdpre.h"
+#include "std.h"
+#include "gdebug.h"
+#include "plsymbol.h"
+#include "plvocab.h"
+#include "plvalue.h"
+
+/* Define the MSL code for unmapped characters. */
+#define ffff 0xffff
+
+/* Define a macro for generating the header for built-in symbol sets. */
+#define map_number(n, l) ((n) * 32 + (l) - '@')
+#define map_header(n, l, vocab, t, cc0, cc1, cc2, cc3, cc4, cc5, cc6, cc7, mapping_type)\
+ {0, 18}, {map_number(n, l) >> 8, map_number(n, l) & 0xff},\
+ (vocab) * 2 + 1, t, {0, 0}, {0, 255},\
+ {cc0, cc1, cc2, cc3, cc4, cc5, cc6, ((cc7) & 0xf8) | (vocab)},\
+ (mapping_type)
+
+/*
+ * This file may exist in many different source formats over time.
+ * To help convert between formats, if this file is compiled with the
+ * -dMAIN switch, it will include a 'main' program that will write out
+ * the data in directly usable format.
+ */
+#ifdef MAIN
+#include <stdio.h>
+#undef printf
+int
+main(int argc, char *argv[])
+{ const pl_symbol_map_t **ppmap = pl_built_in_symbol_maps;
+
+ for ( ; *ppmap; ++ppmap )
+ { const pl_symbol_map_t *pmap = *ppmap;
+ uint id = (pmap->id[0] << 8) + pmap->id[1];
+ int n = id >> 5;
+ int l = (id & 31) + '@';
+ uint i;
+
+ printf("\n/**** %d%c ****/", n, l);
+ for ( i = 0; i < 256; ++i )
+ { if ( !(i & 7) )
+ { if ( !(i & 15) )
+ printf("\n/* 0x%02x */\n ", i);
+ else
+ fputs("\n ", stdout);
+ }
+ printf(" 0x%04x", (uint)pmap->codes[i]);
+ if ( i != 255 )
+ putchar(',');
+ }
+ puts("\n");
+ }
+ return 0;
+}
+#endif /* MAIN */
+
+/* Define common symbol set elements. */
+
+/***************************************
+ * ASCII and national variant mappings *
+ ***************************************/
+/* ISO ASCII */
+static const pl_symbol_map_t map_0U_unicode = {
+ map_header(0, 'U', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* United Kingdom */
+static const pl_symbol_map_t map_1E_unicode = {
+ map_header(1, 'E', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x00a3, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x00af, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* French */
+static const pl_symbol_map_t map_1F_unicode = {
+ map_header(1, 'F', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x00a3, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x00e0, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x00b0, 0x00e7, 0x00a7, 0x005e, 0x005f,
+/* 0x60 */
+ 0x00b5, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00e9, 0x00f9, 0x00e8, 0x00a8, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* German */
+static const pl_symbol_map_t map_1G_unicode = {
+ map_header(1, 'G', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x00a7, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x00c4, 0x00d6, 0x00dc, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00e4, 0x00f6, 0x00fc, 0x00df, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* Italian */
+static const pl_symbol_map_t map_0I_unicode = {
+ map_header(0, 'I', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x00a3, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x00a7, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x00b0, 0x00e7, 0x00e9, 0x02c6, 0x005f,
+/* 0x60 */
+ 0x00f9, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00e0, 0x00f2, 0x00e8, 0x00ec, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* Swedish for names */
+static const pl_symbol_map_t map_0S_unicode = {
+ map_header(0, 'S', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x00a4, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x00c9, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x00c4, 0x00d6, 0x00c5, 0x00dc, 0x005f,
+/* 0x60 */
+ 0x00e9, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00e4, 0x00f6, 0x00e5, 0x00fc, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* Spanish */
+static const pl_symbol_map_t map_2S_unicode = {
+ map_header(2, 'S', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x00a3, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x00a7, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x00a1, 0x00d1, 0x00bf, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00b0, 0x00f1, 0x00e7, 0x02dc, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+/* Norwegian version 1 */
+static const pl_symbol_map_t map_0D_unicode = {
+ map_header(0, 'D', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x00c6, 0x00d8, 0x00c5, 0x02c6, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00e6, 0x00f8, 0x00e5, 0x00af, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+
+/***************************
+ * Roman-8 Unicode mapping *
+ ***************************/
+const pl_symbol_map_t map_8U_unicode = {
+ map_header(8, 'U', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0x00a0, 0x00c0, 0x00c2, 0x00c8, 0x00ca, 0x00cb, 0x00ce, 0x00cf,
+ 0x00b4, 0x0060, 0x02c6, 0x00a8, 0x02dc, 0x00d9, 0x00db, 0x00a3,
+/* 0xb0 */
+ 0x00af, 0x00dd, 0x00fd, 0x00b0, 0x00c7, 0x00e7, 0x00d1, 0x00f1,
+ 0x00a1, 0x00bf, 0x00a4, 0x00a3, 0x00a5, 0x00a7, 0x0192, 0x00a2,
+/* 0xc0 */
+ 0x00e2, 0x00ea, 0x00f4, 0x00fb, 0x00e1, 0x00e9, 0x00f3, 0x00fa,
+ 0x00e0, 0x00e8, 0x00f2, 0x00f9, 0x00e4, 0x00eb, 0x00f6, 0x00fc,
+/* 0xd0 */
+ 0x00c5, 0x00ee, 0x00d8, 0x00c6, 0x00e5, 0x00ed, 0x00f8, 0x00e6,
+ 0x00c4, 0x00ec, 0x00d6, 0x00dc, 0x00c9, 0x00ef, 0x00df, 0x00d4,
+/* 0xe0 */
+ 0x00c1, 0x00c3, 0x00e3, 0x0110, 0x00f0, 0x00cd, 0x00cc, 0x00d3,
+ 0x00d2, 0x00d5, 0x00f5, 0x0160, 0x0161, 0x00da, 0x0178, 0x00ff,
+/* 0xf0 */
+ 0x00de, 0x00fe, 0x00b7, 0x00b5, 0x00b6, 0x00be, 0x2212, 0x00bc,
+ 0x00bd, 0x00aa, 0x00ba, 0x00ab, 0x25a0, 0x00bb, 0x00b1, 0xffff
+ }
+};
+
+/***************************
+ * Desktop Unicode mapping *
+ ***************************/
+static const pl_symbol_map_t map_7J_unicode = {
+ map_header(7, 'J', plgv_Unicode, 1, 0, 0, 0, 0, 0x88, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/* 0x10 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0x0001, 0x00b6, 0x00a7, 0x2020, 0x2021, 0x00a9, 0x00ae, 0x2122,
+ 0x2105, 0x00a2, 0x2013, 0x2014, 0x2026, 0xf001, 0xf002, 0xffff,
+/* 0xb0 */
+ 0x201c, 0x201d, 0x00b5, 0x2030, 0x2022, 0x25cf, 0x25e6, 0x25cb,
+ 0x25aa, 0x25a0, 0x25ab, 0x25a1, 0x0027, 0x00ac, 0x00a6, 0x2017,
+/* 0xc0 */
+ 0x2212, 0x00b1, 0x00d7, 0x00f7, 0x00b0, 0x2032, 0x2033, 0x00bc,
+ 0x00bd, 0x00be, 0x00b9, 0x00b2, 0x00b3, 0x2215, 0xffff, 0xffff,
+/* 0xd0 */
+ 0x2039, 0x203a, 0x00ab, 0x00bb, 0x201a, 0x201e, 0x2219, 0x00a1,
+ 0x00bf, 0x20A7, 0x2113, 0x00a3, 0x00a5, 0x00a4, 0x0192, 0x00df,
+/* 0xe0 */
+ 0x00aa, 0x00ba, 0x00e6, 0x00c6, 0x00f0, 0x00d0, 0x0133, 0x0132,
+ 0x0142, 0x0141, 0x0153, 0x0152, 0x00f8, 0x00d8, 0x00fe, 0x00de,
+/* 0xf0 */
+ 0x00b4, 0x0060, 0x02c6, 0x00a8, 0x02dc, 0x02c7, 0x02d8, 0x02dd,
+ 0x02da, 0x02d9, 0x02c9, 0x00b8, 0x02db, 0x00b7, 0x0131, 0xffff
+ }
+};
+
+/***************************
+ * PC-1004 OS/2 9J *
+ ***************************/
+static const pl_symbol_map_t map_9J_unicode = {
+ map_header(9, 'J', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0xffff, 0xffff, 0xffff, 0xffff, 0x02c9, 0x02d8, 0x02d9, 0xffff,
+0x02da, 0xffff, 0x02dd, 0x02db, 0x02c7, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/*0x60*/
+0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+/*0x80*/
+0xffff, 0xffff, 0x002c, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xffff, 0xffff, 0xffff,
+ /*0x90*/
+0xffff, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xffff, 0xffff, 0x0178,
+/*0xa0*/
+0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+0x00a8, 0x00a9, 0x0061, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+/*0xb0*/
+0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+0x00b8, 0x00b9, 0x2070, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+/*0xc0*/
+0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+/*0xd0*/
+0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+/*0xe0*/
+0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+/*0xf0*/
+0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+ }
+};
+
+
+/**************************************
+ * ISO 8859/1 Latin 1 Unicode mapping *
+ **************************************/
+static const pl_symbol_map_t map_0N_unicode = {
+ map_header(0, 'N', plgv_Unicode, 1, 0, 0, 0, 0, 0xc4, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x02dc, 0x2592,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x02c9,
+/* 0xb0 */
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+/* 0xc0 */
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+/* 0xd0 */
+ 0x0110, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+/* 0xe0 */
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+/* 0xf0 */
+ 0x0111, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+ }
+};
+
+/***************************************
+ * Windows 3.1 Latin 1 Unicode mapping *
+ ***************************************/
+/*
+ * This is identical to the ISO 8859/1 Latin 1 mapping, except that
+ * it has added characters in positions 0x80 - 0x9f.
+ */
+static const pl_symbol_map_t map_19U_unicode = {
+ map_header(19, 'U', plgv_Unicode, 2, 0, 0, 0, 0, 0xc6, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
+/* 0x80 */
+ 0x20ac, 0xffff, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xffff, 0x017d, 0xffff,
+/* 0x90 */
+ 0xffff, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xffff, 0x017e, 0x0178,
+/* 0xa0 */
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x02c9,
+/* 0xb0 */
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+/* 0xc0 */
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+/* 0xd0 */
+ 0x0110, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+/* 0xe0 */
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+/* 0xf0 */
+ 0x0111, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
+ }
+};
+
+/**************************************
+ * PC-8 Code Page 437 Unicode mapping *
+ **************************************/
+/*
+ * Codes 0x00-0x1f are shared with other PC mappings;
+ * codes 0x80-0xaf are (almost) shared with the PC-850 Multilingual map.
+ */
+static const pl_symbol_map_t map_10U_unicode = {
+ map_header(10, 'U', plgv_Unicode, 2, 0, 0, 0, 0, 0xc2, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
+/* 0x10 */
+ 0x25ba, 0x25c4, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bC,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+/* 0x80 */
+ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+ 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+/* 0x90 */
+ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+ 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+/* 0xa0 */
+ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
+ 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+/*0xb0*/
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+/*0xc0*/
+ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
+ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+/*0xd0*/
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
+ 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+/*0xe0*/
+ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x2211, 0x03c3, 0x00b5, 0x03c4,
+ 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+/*0xf0*/
+ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
+ 0x00b0, 0x2219, 0x2219, 0x221a, 0x006e, 0x00b2, 0x25a0, 0x00a0
+ }
+};
+
+/***************************************
+ * PC-850 Multilingual Unicode mapping *
+ ***************************************/
+static const pl_symbol_map_t map_12U_unicode = {
+ map_header(12, 'U', plgv_Unicode, 2, 0, 0, 0, 0, 0xe6, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
+/* 0x10 */
+ 0x25ba, 0x25c4, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bc,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+/* 0x80 */
+ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+ 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+/* 0x90 */
+ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+ 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192,
+/* 0xa0 */
+ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
+ 0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+/*0xb0*/
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0,
+ 0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510,
+/*0xc0*/
+ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3,
+ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4,
+/*0xd0*/
+ 0x00f0, 0x0110, 0x00c9, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce,
+ 0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580,
+/*0xe0*/
+ 0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe,
+ 0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4,
+/*0xf0*/
+ 0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8,
+ 0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25aa, 0x00a0
+ }
+};
+
+/********************************
+ * PS Text (TS) Unicode mapping *
+ ********************************/
+static const pl_symbol_map_t map_10J_unicode = {
+ map_header(10, 'J', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0x80, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+ 0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x01*/
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x02*/
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/*0x60*/
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0097,
+/*0x80*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x002f, 0x00a5, 0x0192, 0x00a7,
+ 0x00a4, 0x0027, 0x201c, 0x00ab, 0x2039, 0x203a, 0xf001, 0xf002,
+/*0xb0*/
+ 0xffff, 0x2013, 0x2020, 0x2021, 0x00b7, 0xffff, 0x00b6, 0x2022,
+ 0x002c, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030, 0xffff, 0x00bf,
+/*0xc0*/
+ 0xffff, 0x0060, 0x2032, 0x02c6, 0x02dc, 0x02c9, 0x02d8, 0x02d9,
+ 0x00a8, 0xffff, 0x02d9, 0x00b8, 0xffff, 0x02dd, 0x02db, 0x02c7,
+/*0xd0*/
+ 0x2014, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xe0*/
+ 0xffff, 0x00c6, 0xffff, 0x0061, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x0141, 0x00d8, 0x0152, 0x2070, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xf0*/
+ 0xffff, 0x00e6, 0xffff, 0xffff, 0xffff, 0x0131, 0xffff, 0xffff,
+ 0x0142, 0x00f8, 0x0153, 0x00df, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+
+/********************************
+ * MC Text (MC) Unicode mapping *
+ ********************************/
+static const pl_symbol_map_t map_12J_unicode = {
+ map_header(12, 'J', plgv_Unicode, 2, 0, 0, 0, 0, 0xc1, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+ 0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0013, /* urw 14 bad */ 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/*0x60*/
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0xffff,
+/*0x80*/
+ 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1,
+ 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8,
+/*0x90*/
+ 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3,
+ 0x00f3, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc,
+/*0xa0*/
+ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df,
+ 0x00ae, 0x00a9, 0x2122, 0x2032, 0x00a8, 0x2260, 0x00c6, 0x00d8,
+/*0xb0*/
+ 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211,
+ 0x220f, 0x03c0, 0x222b, 0x0061, 0x2070, 0x03a9, 0x00e6, 0x00f8,
+/*0xc0*/
+ 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab,
+ 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153,
+/*0xd0*/
+ 0x2212, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25c7,
+ 0x00ff, 0x0178, 0x002f, 0x20ac, 0x2039, 0x203a, 0xf001, 0xf002,
+/*0xe0*/
+ 0x2021, 0x00b7, 0x002c, 0x201e, 0x2030, 0x00c2, 0x00c9, 0x00c1,
+ 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4,
+/*0xf0*/
+ 0xffff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c9, 0x02dc,
+ 0x02c9, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7
+ }
+};
+
+/***********************************************
+ * PC-8 Danish/Norweigian (PD) Unicode mapping *
+ ***********************************************/
+static const pl_symbol_map_t map_11U_unicode = {
+ map_header(11, 'U', plgv_Unicode, 2, 0, 0, 0, 0, 0xc0, 0x40, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
+/* 0x10 */
+ 0x25ba, 0x25c4, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bC,
+/*0x20*/
+ 0xffff, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/*0x60*/
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+/*0x80*/
+ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+ 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+/*0x90*/
+ 0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+ 0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x013f, 0x0140,
+/*0xa0*/
+ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00f5, 0x00d5,
+ 0x00bf, 0x00e3, 0x00c3, 0x2113, 0x0149, 0x00a1, 0x00b3, 0x00a4,
+/*0xb0*/
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+/*0xc0*/
+ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
+ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+/*0xd0*/
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x2565,
+ 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+/*0xe0*/
+ 0x03b1, 0x00df, 0x0393, 0x03c0, 0x2211, 0x03c3, 0x00b5, 0x03c4,
+ 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x00f8, 0x03b5, 0x2229,
+/*0xf0*/
+ 0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x2248, 0x0301,
+ 0x2219, 0x2219, 0x2027, 0x221a, 0x006e, 0x00b2, 0x25a0, 0x00a0
+ }
+};
+
+/******************************
+ * Legal (LG) Unicode mapping *
+ ******************************/
+static const pl_symbol_map_t map_1U_unicode = {
+ map_header(1, 'U', plgv_Unicode, 1, 0, 0, 0, 0, 0xc0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+ 0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x001e, 0x000f,
+/*0x10*/
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+ 0x0020, 0x0021, 0x2033, 0x0023, 0x0024, 0x0025, 0x0026, 0x2032,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x2017, 0x003d, 0x00a2, 0x003f,
+/*0x40*/
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x00ae, 0x005d, 0x00a9, 0x005f,
+/*0x60*/
+ 0x00b0, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x00a7, 0x00b6, 0x2022, 0x2122, 0x2592,
+/*0x80*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xb0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xc0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xd0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xe0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xf0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+
+/***************************************
+ * Windows 3.0 Latin 1 Unicode mapping *
+ ***************************************/
+/*
+ * This is identical to the ISO 8859/1 Latin 1 mapping, except that
+ * it has added characters in positions 0x91 - 0x92.
+ */
+static const pl_symbol_map_t map_9U_unicode = {
+ map_header(9, 'U', plgv_Unicode, 2, 0, 0, 0, 0, 0xcc, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
+/* 0x80 */
+ 0x20ac, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0x2018, 0x2019, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x203e,
+/* 0xb0 */
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+/* 0xc0 */
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+/* 0xd0 */
+ 0x0110, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+/* 0xe0 */
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+/* 0xf0 */
+ 0x0111, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+ }
+};
+
+/*********************************************
+ * Microsoft Publishing (PB) Unicode mapping *
+ *********************************************/
+static const pl_symbol_map_t map_6J_unicode = {
+ map_header(6, 'J', plgv_Unicode, 2, 0, 0, 0, 0, 0xc8, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x20*/
+ 0x0020, 0x00b9, 0x201d, 0x00b3, 0x2074, 0x2075, 0x2077, 0x2019,
+ 0x2079, 0x2070, 0x2078, 0x2020, 0x002c, 0x2013, 0x2026, 0x002f,
+/*0x30*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0x201e, 0x2021, 0xffff, 0xffff,
+/*0x40*/
+ 0x00b2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0x013d, 0x2014, 0x2013, 0x0152,
+/*0x50*/
+ 0xffff, 0xffff, 0x211e, 0x0160, 0x2122, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x0178, 0x017d, 0xffff, 0xffff, 0xffff, 0x2076, 0x2017,
+/*0x60*/
+ 0x2018, 0xffff, 0xffff, 0x2105, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0x2113, 0xffff, 0xffff, 0x0153,
+/*0x70*/
+ 0xffff, 0xffff, 0xffff, 0x0161, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0x017e, 0xffff, 0xffff, 0xffff, 0x201c, 0xffff,
+/*0x80*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x20a7, 0x0192,
+/*0xa0*/
+ 0xffff, 0x2032, 0x2033, 0x005e, 0x007E, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xfb01, 0xfb02, 0xfb00, 0xfb03, 0xfb04, 0x2039, 0x203a,
+/*0xb0*/
+ 0x00b0, 0x2219, 0x2022, 0xeffa, 0x25e6, 0x25cb, 0xeffd, 0x25aa,
+ 0x25a0, 0xeffb, 0x25ab, 0x25a1, 0xeffc, 0x2030, 0x25c6, 0x25c7,
+/*0xc0*/
+ 0xffff, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x02c9, 0x02c7, 0x02d9,
+ 0x00a8, 0xffff, 0x02da, 0x00b8, 0xffff, 0x2033, 0x02db, 0x02c7,
+/*0xd0*/
+ 0xffff, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x02c9, 0x02c7, 0x02d9,
+ 0x00a8, 0xffff, 0x02da, 0x00b8, 0xffff, 0x2033, 0x02db, 0x02c7,
+/*0xe0*/
+ 0x03a9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0132, 0x013f,
+ 0x0141, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0149,
+/*0xf0*/
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0131, 0x0133, 0x0140,
+ 0x0142, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+
+/**********************************
+ * PC-852 Latin 2 Unicode mapping *
+ **********************************/
+static const pl_symbol_map_t map_17U_unicode = {
+ map_header(17, 'U', plgv_Unicode, 2, 0, 0, 0, 0, 0xe4, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
+/* 0x10 */
+ 0x25ba, 0x25c4, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bc,
+/* 0x20 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/* 0x30 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/* 0x40 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/* 0x50 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/* 0x60 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/* 0x70 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+/* 0x80 */
+ 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x016f, 0x0107, 0x00e7,
+ 0x0142, 0x00eb, 0x0150, 0x0151, 0x00ee, 0x0179, 0x00c4, 0x0106,
+/* 0x90 */
+ 0x00c9, 0x0139, 0x013a, 0x00f4, 0x00f6, 0x013d, 0x013e, 0x015a,
+ 0x015b, 0x00d6, 0x00dc, 0x0164, 0x0165, 0x0141, 0x00d7, 0x010d,
+/* 0xa0 */
+ 0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x0104, 0x0105, 0x017d, 0x017e,
+ 0x0118, 0x0119, 0xffff, 0x017a, 0x010c, 0x015f, 0x00ab, 0x00bb,
+/*0xb0*/
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x011a,
+ 0x015e, 0x2563, 0x2551, 0x2557, 0x255d, 0x017b, 0x017c, 0x2510,
+/*0xc0*/
+ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x0102, 0x0103,
+ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4,
+/*0xd0*/
+ 0x0111, 0x0110, 0x010e, 0x00cb, 0x010f, 0x0147, 0x00cd, 0x00ce,
+ 0x011b, 0x2518, 0x250c, 0x2588, 0x2584, 0x0162, 0x016e, 0x2580,
+/*0xe0*/
+ 0x00d3, 0x00df, 0x00d4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161,
+ 0x0154, 0x00da, 0x0155, 0x0170, 0x00fd, 0x00dd, 0x0163, 0x00b4,
+/*0xf0*/
+ 0x00ad, 0x02dd, 0x02db, 0x02c7, 0x02d8, 0x00a7, 0x00f7, 0x00b8,
+ 0x00b0, 0x00a8, 0x00b7, 0x0171, 0x0158, 0x0159, 0x25aa, 0x00a0
+ }
+};
+
+
+/************************************
+ * PC-Turkish (PT) Unicode mapping *
+ ************************************/
+static const pl_symbol_map_t map_9T_unicode = {
+ map_header(9, 'T', plgv_Unicode, 2, 0, 0, 0, 0, 0xd0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0xffff, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+0x25d8, 0x25cb, 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c,
+/*0x10*/
+0x25ba, 0x25c4, 0x2195, 0x203c, 0x00b6, 0x00a7, 0x25ac, 0x21a8,
+0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194, 0x25b2, 0x25bC,
+/*0x20*/
+0xffff, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/*0x60*/
+0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+/*0x80*/
+0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x0131, 0x00c4, 0x00c5,
+/*0x90*/
+0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+0x0130, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x015e, 0x15f,
+/*0xa0*/
+0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x011e, 0x011f,
+0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+/*0xb0*/
+0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+/*0xc0*/
+0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
+0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+/*0xd0*/
+0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
+0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+/*0xe0*/
+0x03b1, 0x00df, 0x0393, 0x03c0, 0x2211, 0x03c3, 0x00b5, 0x03c4,
+0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x00f8, 0x03b5, 0x2229,
+/*0xf0*/
+0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
+0x00b0, 0x2219, 0x2219, 0x221a, 0x006e, 0x00b2, 0x25a0, 0x00a0
+ }
+};
+
+/*******************************************
+ * ISO 8859/2 Latin 2 (E2) Unicode mapping *
+ *******************************************/
+static const pl_symbol_map_t map_2N_unicode = {
+ map_header(2, 'N', plgv_Unicode, 1, 0, 0, 0, 0, 0xe0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/*0x60*/
+0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x02dc, 0x2592,
+/*0x80*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
+0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
+/*0xb0*/
+0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
+0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
+/*0xc0*/
+0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
+0x010c, 0x00c9, 0x0118, 0x00cb, 0x011A, 0x00cd, 0x00ce, 0x010e,
+/*0xd0*/
+0x00d0, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
+0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+/*0xe0*/
+0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
+0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+/*0xf0*/
+0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
+0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x00b7
+ }
+};
+
+/********************************************
+ * Windows 3.1 Latin 2 (WE) Unicode mapping *
+ ********************************************/
+static const pl_symbol_map_t map_9E_unicode = {
+ map_header(9, 'E', plgv_Unicode, 2, 0, 0, 0, 0, 0xe0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0013, /*urw 14 bad*/ 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/*0x60*/
+0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x07e/*0x023c*/, 0x2592/*0x0097*/,
+/*0x80*/
+0x20ac, 0xffff, 0x002c, 0xffff, 0x201e, 0x2026, 0x2020, 0x2021,
+0xffff, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179,
+/*0x90*/
+0xffff, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+0xffff, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a,
+/*0xa0*/
+0x00a0, 0x02c7, 0x02c6, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7,
+0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b,
+/*0xb0*/
+0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c,
+/*0xc0*/
+0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
+0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
+/*0xd0*/
+0x00d0, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
+0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+/*0xe0*/
+0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
+0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+/*0xf0*/
+0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
+0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x00b7,
+ }
+};
+
+/*******************************************
+ * ISO 8859/9 Latin 5 (E5) Unicode mapping *
+ *******************************************/
+static const pl_symbol_map_t map_5N_unicode = {
+ map_header(5, 'N', plgv_Unicode, 1, 0, 0, 0, 0, 0xd0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+/*0x60*/
+0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x02dc, 0x2592,
+/*0x80*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+0x00a8, 0x00a9, 0x0061, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+/*0xb0*/
+0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+0x00b8, 0x00b9, 0x2070, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+/*0xc0*/
+0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+/*0xd0*/
+0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
+/*0xe0*/
+0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+/*0xf0*/
+0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
+ }
+};
+
+/********************************************
+ * Windows 3.1 Latin 5 (WT) Unicode mapping *
+ ********************************************/
+static const pl_symbol_map_t map_5T_unicode = {
+ map_header(5, 'T', plgv_Unicode, 2, 0, 0, 0, 0, 0xd0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x02c6, 0x005f,
+/*0x60*/
+0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+/*0x70*/
+0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2592,
+/*0x80*/
+0x20ac, 0xffff, 0x002c, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xffff, 0xffff, 0xffff,
+ /*0x90*/
+0xffff, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xffff, 0xffff, 0x0178,
+/*0xa0*/
+0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+0x00a8, 0x00a9, 0x0061, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+/*0xb0*/
+0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+0x00b8, 0x00b9, 0x2070, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+/*0xc0*/
+0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+/*0xd0*/
+0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
+/*0xe0*/
+0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+/*0xf0*/
+0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
+ }
+};
+
+/*******************************
+ * Math-8 (M8) Unicode mapping *
+ *******************************/
+static const pl_symbol_map_t map_8M_unicode = {
+ map_header(8, 'M', plgv_Unicode, 1, 0, 0, 0, 4, 0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x221a, 0x2033, 0x00b0, 0x221e, 0x00f7, 0x221d, 0x2032,
+0x0028, 0x0029, 0x00d7, 0x002b, 0x002c, 0x2212, 0x002e, 0x2215,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x212f, 0xefec, 0x003c, 0x003d, 0x003e, 0x2243,
+/*0x40*/
+0x2234, 0x0041, 0x0042, 0x0393, 0x2206, 0x0045, 0x005a, 0x0048,
+0x0398, 0x0049, 0x004b, 0x039b, 0x004d, 0x004e, 0x039e, 0x004f,
+/*0x50*/
+0x03a0, 0x0050, 0x03a3, 0x0054, 0x03a5, 0x03a6, 0x0058, 0x03a8,
+0x03a9, 0x2207, 0x2202, 0x03c2, 0x2264, 0x2260, 0x2265, 0x005f,
+/*0x60*/
+0x2235, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+/*0x70*/
+0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8,
+0x03c9, 0x03d1, 0x03d5, 0x03d6, 0x2243, 0x2261, 0x2262, 0x2592,
+/*0x80*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+0xffff, 0x2191, 0x2192, 0x2193, 0x2190, 0x21d1, 0x21d2, 0x21d3,
+0x21d0, 0x2195, 0x2194, 0x21d5, 0x21d4, 0x21c4, 0x21c6, 0xefe9,
+/*0xb0*/
+0xefea, 0x2200, 0x2203, 0x22a4, 0x22a5, 0x222a, 0x2229, 0x2208,
+0x220b, 0x2209, 0x2282, 0x2283, 0x2284, 0x2285, 0x2286, 0x2287,
+/*0xc0*/
+0x2295, 0x2299, 0x2297, 0x2296, 0x2298, 0x2227, 0x2228, 0x22bb,
+0x00ac, 0x25e6, 0x2219, 0x2022, 0x25cf, 0x25cb, 0x2020, 0x2021,
+/*0xd0*/
+0x00c5, 0x22a3, 0x22a2, 0x221f, 0x220d, 0x222b, 0x222e, 0x2220,
+0x2205, 0x2135, 0x2136, 0x2137, 0x212d, 0x2111, 0x211c, 0x2128,
+/*0xe0*/
+0xefe7, 0xefe6, 0xefe3, 0xefe2, 0xefe1, 0x2320, 0xefd4, 0x2321,
+0xefd3, 0x2225, 0xefd2, 0xefd1, 0xefe8, 0xefcb, 0x002a, 0x2245,
+/*0xf0*/
+0xefe5, 0xefe4, 0xefe0, 0xefdf, 0xefde, 0xefdd, 0x2502, 0xefdc,
+0xefd0, 0xefcf, 0xefce, 0xefcd, 0xefcc, 0x2213, 0x00b1, 0xffff
+ }
+};
+
+/*******************************
+ * PI Font(PI) Unicode mapping *
+ *******************************/
+static const pl_symbol_map_t map_15U_unicode = {
+ map_header(15, 'U', plgv_Unicode, 1, 0, 0, 0, 4, 0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0xffff, 0x201e, 0x201a, 0x201c, 0x201d, 0x02bb, 0x02bc,
+0x2329, 0x232a, 0x2122, 0x2120, 0x00ae, 0x00a9, 0x0623, 0xffff,
+/*0x30*/
+0x02c9, 0x02d8, 0x02c7, 0x02d9, 0x2127, 0x2198, 0x2199, 0x2196,
+0x25b5, 0x25b9, 0x25bf, 0x25c3, 0x0633, 0x00a7, 0x0634, 0x00b6,
+/*0x40*/
+0x2237, 0x0636, 0xffff, 0xffff, 0xffff, 0xffff, 0x0637, 0xffff,
+0x210f, 0xffff, 0xffff, 0xffff, 0x2112, 0x2113, 0xffff, 0xffff,
+/*0x50*/
+0x0640, 0x2118, 0x211e, 0x2211, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0x301a, 0x2225, 0x301b, 0x2039, 0x203a,
+/*0x60*/
+0x250c, 0x2514, 0x256d, 0x2570, 0x2086, 0x251c, 0x2500, 0x0243,
+0x222a, 0x2229, 0x2553, 0x2559, 0x25a1, 0x25c7, 0xffff, 0xffff,
+/*0x70*/
+0x2510, 0x2518, 0x256e, 0x256f, 0x252c, 0x2524, 0x2534, 0x2223,
+0x0657, 0x0658, 0x2556, 0x255c, 0x25ad, 0x25c6, 0xffff, 0x0097,
+/*0x80*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xb0*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xc0*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xd0*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xe0*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xf0*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+
+/********************************
+ * PS Math (MS) Unicode mapping *
+ ********************************/
+static const pl_symbol_map_t map_5M_unicode = {
+ map_header(5, 'M', plgv_Unicode, 1, 0, 0, 0, 4, 0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220d,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x2212, 0x002e, 0x2215,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x2245, 0x0041, 0x0042, 0x0058, 0x2206, 0x0045, 0x03a6, 0x0393,
+0x0048, 0x0049, 0x03d1, 0x004b, 0x039b, 0x004d, 0x004e, 0x004f,
+/*0x50*/
+0x220f, 0x0398, 0x0050, 0x2211, 0x0054, 0x0059, 0x03c2, 0x03a9,
+0x039e, 0x03a8, 0x005a, 0x005b, 0x2234, 0x005d, 0x22a5, 0x005f,
+/*0x60*/
+0x00af, 0x03b1, 0x03b2, 0x03c7, 0x03b4, 0x03b5, 0x03c6, 0x03b3,
+0x03b7, 0x0131, 0x03d5, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf,
+/*0x70*/
+0x03c0, 0x03b8, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x0548, 0x03c9,
+0x03be, 0x03c8, 0x03b6, 0x007b, 0x007c, 0x007d, 0x007e, 0xffff,
+/*0x80*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+0xffff, 0x03a5, 0x2032, 0x2264, 0x2215, 0x221e, 0x0192, 0x2663,
+0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+/*0xb0*/
+0x00b0, 0x00b1, 0x2033, 0x2265, 0x00d7, 0x221d, 0x2202, 0x2022,
+0x00f7, 0x2260, 0x2261, 0x2243, 0x2026, 0x007c, 0x2014, 0x21b5,
+/*0xc0*/
+0x2135, 0x2111, 0x211c, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
+0x222a, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+/*0xd0*/
+0x2220, 0x2207, 0xefdb, 0xefda, 0xefd9, 0x220f, 0x221a, 0x002e,
+0x00ac, 0x2227, 0x2228, 0x21d4, 0x21d0, 0x21d1, 0x21d2, 0x21d3,
+/*0xe0*/
+0x25c7, 0x2329, 0xefd8, 0xefd7, 0xefd6, 0x2211, 0xefe3, 0xefdd,
+0xefe1, 0xefe7, 0x2502, 0xefe6, 0xefe3, 0xefe2, 0xefe1, 0xefdd,
+/*0xf0*/
+0x00a4, 0x232a, 0x222b, 0x2320, 0xefdd, 0x2321, 0xefe0, 0xefdd,
+0xefde, 0xefe5, 0x2502, 0xefe4, 0xefe0, 0xefdf, 0xefde, 0xffff
+ }
+};
+
+/************************************
+ * Symbol Font (AS) Unicode mapping *
+ ************************************/
+static const pl_symbol_map_t map_19M_unicode = {
+ map_header(19, 'M', plgv_Unicode, 1, 0, 0, 0, 4, 0, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/*0x00*/
+0x0000, 0x0002, 0x0001, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+/*0x10*/
+0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+/*0x20*/
+0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220d,
+0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x2212, 0x002e, 0x2215,
+/*0x30*/
+0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+/*0x40*/
+0x2245, 0x0391, 0x0392, 0x0058, 0x2206, 0x0395, 0x03a6, 0x0393,
+0x0397, 0x0399, 0x0546, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f,
+/*0x50*/
+0x220f, 0x0398, 0x03a1, 0x2211, 0x03a4, 0x0059, 0x03da, 0x03a9,
+0x039e, 0x03ab, 0x005a, 0x005b, 0x2234, 0x005d, 0x22a5, 0x208b,
+/*0x60*/
+0xffff, 0x03b1, 0x03b2, 0x03c7, 0x03b4, 0x0503, 0x03c6, 0x03b3,
+0x03b7, 0x03b9, 0x03d5, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf,
+/*0x70*/
+0x03c0, 0x03b8, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x0548, 0x03c9,
+0x03be, 0x03cb, 0x03b6, 0x007b, 0x007c, 0x007d, 0x007e, 0xffff,
+/*0x80*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0x90*/
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/*0xa0*/
+0xffff, 0x03d2, 0x2032, 0x2264, 0x2215, 0x221e, 0x00a3, 0x2663,
+0x2666, 0x2764, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+/*0xb0*/
+0x00b0, 0x00b1, 0x2133, 0x2265, 0x00d7, 0x221d, 0x2202, 0x2022,
+0x00f7, 0x2260, 0x2261, 0x2243, 0x2026, 0xffff, 0x2014, 0x21b5,
+/*0xc0*/
+0x2135, 0x0595, 0x211c, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
+0x222a, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+/*0xd0*/
+0x0606, 0x2207, 0x00ae, 0x00a9, 0x2122, 0x220f, 0x221a, 0x002e,
+0x00ac, 0x2227, 0x2228, 0x21d4, 0x21d0, 0x21d1, 0x21d2, 0x2103,
+/*0xe0*/
+0x25c7, 0x2329, 0x2093, 0x2063, 0x1105, 0x2211, 0x0600, 0x2503,
+0x0602, 0x2308, 0x2502, 0x230a, 0x0600, 0x0601, 0x0602, 0x2758,
+/*0xf0*/
+0xffff, 0x232a, 0x222b, 0x2320, 0x2503, 0x2321, 0x0610, 0x2503,
+0x0612, 0x2309, 0x2502, 0x230b, 0x0610, 0x0611, 0x0612, 0xffff
+ }
+};
+
+/***********************************
+ * Wingdings Font (L$) MSL mapping *
+ ***********************************/
+static const pl_symbol_map_t map_579L_msl = {
+ map_header(579, 'L', plgv_MSL, 2, 0, 0, 0, 1, 0, 0, 0, 0, PLGV_NO_MAPPING),
+ {
+/*00*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*10*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*20*/
+ffff, ffff, 2097, 2109, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*30*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, 2458, 2515,
+/*40*/
+ffff, 2313, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, 203, ffff, ffff, ffff, ffff, ffff,
+/*50*/
+ffff, 2013, ffff, ffff, 2464, ffff, 2076, ffff,
+2230, 2079, ffff, ffff, ffff, ffff, ffff, ffff,
+/*60*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, 209, 2116, 661, ffff,
+/*70*/
+ffff, 2250, 2308, ffff, 2433, 2491, 2089, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*80*/
+ffff, 2016, 2017, 2018, 2019, 2020, 2021, 2022,
+2023, 2024, 2015, ffff, 2000, 2031, 2002, 2003,
+/*90*/
+2004, 2061, 2005, 2009, 2007, 2008, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, 302, 331,
+/*a0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, 305,
+ffff, ffff, ffff, 2083, ffff, 2737, ffff, 2479,
+/*b0*/
+ffff, ffff, ffff, ffff, ffff, 2052, 2056, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*c0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*d0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, 2412, ffff, ffff, 2505,
+/*e0*/
+2237, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+2241, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*f0*/
+2469, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, 1108, 2027, 2010, ffff, ffff, ffff
+ }
+};
+
+/*****************************************
+ * PS ITC Zapf Dingbats (DS) MSL mapping *
+ *****************************************/
+static const pl_symbol_map_t map_10L_msl = {
+ map_header(10, 'L', plgv_MSL, 1, 0, 0, 0, 1, 0, 0, 0, 0, PLGV_NO_MAPPING),
+ {
+/*00*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*10*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*20*/
+ffff, 2109, 2096, 2120, 2497, 2498, 2315, 2458,
+2013, 2108, 2095, 2295, 2313, 2515, 2499, 2307,
+/*30*/
+2710, 2324, 2121, 2010, 2210, 2286, 2254, 2027,
+2077, 2444, 2054, 2488, 2456, 2044, 2076, 2476,
+/*40*/
+2230, 2411, 2014, 2472, 2478, 2502, 2448, 2011,
+2051, 2729, 2052, 2047, 2032, 2060, 2078, 2092,
+/*50*/
+2058, 2256, 2252, 2484, 2447, 2479, 2046, 2090,
+2240, 2739, 2452, 2279, 2483, 2430, 2290, 2451,
+/*60*/
+2460, 2288, 2490, 2258, 2464, 2492, 2432, 2260,
+2292, 2072, 2264, 2232, 2091, 2116, 2291, 2282,
+/*70*/
+2325, 2250, 2308, 2048, 2248, 2491, 2089, 2281,
+2480, 2486, 2454, 2100, 2113, 2501, 2517, ffff,
+/*80*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*90*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*a0*/
+ffff, 2500, 2428, 2410, 2414, 2213, 2317, 2300,
+2445, 2433, 2453, 2434, 2216, 217, 2218, 2219,
+/*b0*/
+2220, 2221, 2222, 2223, 2224, 2215, 2200, 2231,
+2202, 2203, 2204, 2261, 2205, 2209, 2207, 2208,
+/*c0*/
+2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023,
+2024, 2015, 2000, 2031, 2002, 2003, 2004, 2061,
+/*d0*/
+2005, 2009, 2007, 2008, 2306, 2042, 2043, 2075,
+2233, 2305, 2310, 2053, 2037, 2070, 2071, 2520,
+/*e0*/
+2504, 2001, 2267, 2326, 2235, 2055, 2087, 2041,
+2262, 2441, 2523, 2442, 2507, 2443, 2508, 2475,
+/*f0*/
+ffff, 2524, 2412, 2234, 2265, 2287, 2327, 2245,
+2105, 2309, 2285, 2253, 2242, 2104, 2212, 2003
+ }
+};
+
+/*************************************************
+ * ITC Zapf Dingbats series 100 (D1) MSL mapping *
+ *************************************************/
+static const pl_symbol_map_t map_11L_msl = {
+ map_header(11, 'L', plgv_MSL, 1, 0, 0, 0, 1, 0, 0, 0, 0, PLGV_NO_MAPPING),
+ {
+/*00*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*10*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*20*/
+ffff, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
+/*30*/
+2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022,
+2023, 2024, 2025, 2026, 2229, 2028, 2029, 2030,
+/*40*/
+2031, 2032, 2038, 2034, 2323, 2036, 2037, 2070,
+2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046,
+/*50*/
+2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054,
+2055, 2064, 2057, 2058, 2059, 2060, 2061, 2062,
+/*60*/
+2063, 2088, 2065, 2066, 2067, 2068, 2069, 2038,
+2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078,
+/*70*/
+2079, 2080, 2081, 2082, 2083, 2046, 2085, 2086,
+2087, 2056, 2089, 2090, 2091, 2092, 2093, ffff,
+/*80*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*90*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*a0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*b0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*c0*/
+ffff, 2094, 2095, 2096, 2097, 2098, 2099, 2110,
+2101, 2425, 2426, 2104, 2105, 2106, ffff, ffff,
+/*d0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*e0*/
+ffff, 2495, 2108, 2109, 2110, 2111, 2112, 2113,
+2114, 2115, 2116, 2117, 2118, 2119, ffff, ffff,
+/*f0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff
+ }
+};
+
+/*************************************************
+ * ITC Zapf Dingbats series 200 (D2) MSL mapping *
+ *************************************************/
+static const pl_symbol_map_t map_12L_msl = {
+ map_header(12, 'L', plgv_MSL, 1, 0, 0, 0, 1, 0, 0, 0, 0, PLGV_NO_MAPPING),
+ {
+/*00*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*10*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*20*/
+ffff, 2200, 2201, 2202, 2203, 2204, 2205, 2206,
+2207, 2208, 2209, 2210, 2211, 2212, 2213, 2214,
+/*30*/
+2215, 2216, 2217, 2218, 2219, 2220, 2221, 2222,
+2223, 2224, 2225, 2226, 2239, 2228, 2229, 2230,
+/*40*/
+2231, 2232, 2233, 2234, 2235, 2236, 2237, 2238,
+2273, 2240, 2241, 2242, 2243, 2244, 2245, 2246,
+/*50*/
+2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254,
+2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262,
+/*60*/
+2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270,
+2271, 2739, 2241, 2274, 2275, 2276, 2277, 2430,
+/*70*/
+2279, 2280, 2281, 2282, 2251, 2284, 2285, 2286,
+2287, 2288, 2289, 2290, 2291, 2292, 2293, ffff,
+/*80*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*90*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*a0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*b0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*c0*/
+ffff, 2294, 2295, 2296, 2297, 2298, 2299, 2300,
+2301, 2302, 2303, 2304, 2305, 2306, ffff, ffff,
+/*d0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*e0*/
+ffff, 2494, 2095, 2313, 2314, 2315, 2316, 2317,
+2318, 2319, 2320, 2321, 2322, 2271, ffff, ffff,
+/*f0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff
+ }
+};
+
+/*************************************************
+ * ITC Zapf Dingbats series 300 (D3) MSL mapping *
+ *************************************************/
+static const pl_symbol_map_t map_13L_msl = {
+ map_header(13, 'L', plgv_MSL, 1, 0, 0, 0, 1, 0, 0, 0, 0, PLGV_NO_MAPPING),
+ {
+/*00*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*10*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*20*/
+ffff, 2400, 2401, 2402, 2403, 2404, 2405, 2406,
+2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414,
+/*30*/
+2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422,
+2423, 2424, 2425, 2426, 2427, 2428, 2429, 2430,
+/*40*/
+2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438,
+2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446,
+/*50*/
+2477, 2488, 2499, 2450, 2451, 2452, 2453, 2454,
+2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462,
+/*60*/
+2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470,
+2471, 2427, 2473, 2474, 2475, 2476, 2477, 2478,
+/*70*/
+2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486,
+2487, 2488, 2457, 2490, 2491, 2492, 2493, ffff,
+/*80*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*90*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*a0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*b0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*c0*/
+ffff, 2494, 2107, 2496, 2497, 2498, 2499, 2500,
+2501, 2502, 2252, 2504, 2505, 2506, ffff, ffff,
+/*d0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+/*e0*/
+ffff, 2510, 2511, 2512, 2513, 2514, 2515, 2516,
+2517, 2518, 2519, 2520, 2521, 2522, ffff, ffff,
+/*f0*/
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff,
+ffff, ffff, ffff, ffff, ffff, ffff, ffff, ffff
+ }
+};
+
+/*************************************************************
+ * HP-GL/2 stick font extended character set Unicode mapping *
+ * (Note: this symbol set is not documented anywhere.) *
+ * Strange mapping is effectively: roman8(charcode - 0x80) *
+ *************************************************************/
+static const pl_symbol_map_t map_0E_unicode = {
+ map_header(0, 'E', plgv_Unicode, 0, 0, 0, 0, 0, 0x40, 0, 0, 0, PLGV_U2M_MAPPING),
+ {
+/* 0x00 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x10 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x20 */
+ 0x00a0, 0x00c0, 0x00c2, 0x00c8, 0x00ca, 0x00cb, 0x00ce, 0x00cf,
+ 0x00b4, 0x0060, 0x02c6, 0x00a8, 0x02dc, 0x00d9, 0x00db, 0x00a3,
+/* 0x30 */
+ 0x00af, 0x00dd, 0x00fd, 0x00b0, 0x00c7, 0x00e7, 0x00d1, 0x00f1,
+ 0x00a1, 0x00bf, 0x00a4, 0x00a3, 0x00a5, 0x00a7, 0x0192, 0x00a2,
+/* 0x40 */
+ 0x00e2, 0x00ea, 0x00f4, 0x00fb, 0x00e1, 0x00e9, 0x00f3, 0x00fa,
+ 0x00e0, 0x00e8, 0x00f2, 0x00f9, 0x00e4, 0x00eb, 0x00f6, 0x00fc,
+/* 0x50 */
+ 0x00c5, 0x00ee, 0x00d8, 0x00c6, 0x00e5, 0x00ed, 0x00f8, 0x00e6,
+ 0x00c4, 0x00ec, 0x00d6, 0x00dc, 0x00c9, 0x00ef, 0x00df, 0x00d4,
+/* 0x60 */
+ 0x00c1, 0x00c3, 0x00e3, 0x0110, 0x00f0, 0x00cd, 0x00cc, 0x00d3,
+ 0x00d2, 0x00d5, 0x00f5, 0x0160, 0x0161, 0x00da, 0x0178, 0x00ff,
+/* 0x70 */
+ 0x00de, 0x00fe, 0x00b7, 0x00b5, 0x00b6, 0x00be, 0x2212, 0x00bc,
+ 0x00bd, 0x00aa, 0x00ba, 0x00ab, 0x25a0, 0x00bb, 0x00b1, 0xffff,
+/* 0x80 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0x90 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xa0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xb0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xc0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xd0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xe0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+/* 0xf0 */
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+ }
+};
+
+/*
+ * Define the list of built-in symbol maps.
+ */
+const pl_symbol_map_t *pl_built_in_symbol_maps[] = {
+ &map_0U_unicode,
+ &map_1E_unicode,
+ &map_1F_unicode,
+ &map_1G_unicode,
+ &map_0I_unicode,
+ &map_0S_unicode,
+ &map_2S_unicode,
+ &map_0D_unicode,
+ &map_8U_unicode,
+ &map_7J_unicode,
+ &map_19U_unicode,
+ &map_0N_unicode,
+ &map_10U_unicode,
+ &map_12U_unicode,
+ &map_10J_unicode,
+ &map_12J_unicode,
+ &map_11U_unicode,
+ &map_1U_unicode,
+ &map_9U_unicode,
+ &map_6J_unicode,
+ &map_17U_unicode,
+ &map_9T_unicode,
+ &map_2N_unicode,
+ &map_9E_unicode,
+ &map_5N_unicode,
+ &map_5T_unicode,
+ &map_8M_unicode,
+ &map_15U_unicode,
+ &map_5M_unicode,
+ &map_19M_unicode,
+ &map_579L_msl,
+ &map_10L_msl,
+ &map_11L_msl,
+ &map_12L_msl,
+ &map_13L_msl,
+ &map_0E_unicode,
+ &map_9J_unicode,
+ 0 /* end marker */
+};
+
+const int pl_built_in_symbol_map_count =
+ countof(pl_built_in_symbol_maps) - 1;
+
+
+ulong
+pl_map_symbol(const pl_symbol_map_t *psm,
+ uint chr, bool is_resident_font, bool is_MSL,
+ bool is_590)
+{
+ uint first_code, last_code, code;
+
+ /*
+ * If there is no symbol map we assume the the character
+ * implicitly indexes the font. The symbol set 590 is not
+ * documented it appears to do implicit mapping as well.
+ */
+
+ if (psm == 0) {
+ if (is_resident_font && !is_590)
+ return chr + 0xf000;
+ else
+ return chr;
+ }
+
+ first_code = pl_get_uint16(psm->first_code);
+ last_code = pl_get_uint16(psm->last_code);
+ if ((chr < first_code) || (chr > last_code))
+ code = ((last_code <= 0xff) && (chr > 0xff) ? chr : 0xffff);
+ else
+ code = psm->codes[chr - first_code];
+ /* we do not provide many of the symbol sets in MSL format.
+ Instead we may use a corresponding unicode symbol set and
+ convert the resulting unicode value to msl. This will not
+ necessarily match HP. */
+ if (is_MSL && (code != 0xffff) &&
+ (pl_symbol_map_vocabulary(psm) == plgv_Unicode)) {
+#ifdef DEBUG
+ if ( gs_debug_c('=') ) {
+ dprintf3("[=] unicode to msl conversion: chr=%d, unicode=0x%x, msl code=%d\n",
+ chr, code, pl_map_Unicode_to_MSL(code, (psm->id[0] << 8) + psm->id[1]));
+ }
+#endif
+ return pl_map_Unicode_to_MSL(code, (psm->id[0] << 8) + psm->id[1]);
+ } else {
+ return code;
+ }
+
+}
diff --git a/pl/plsymbol.h b/pl/plsymbol.h
new file mode 100644
index 000000000..04ab736cf
--- /dev/null
+++ b/pl/plsymbol.h
@@ -0,0 +1,88 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plsymbol.h */
+/* PCL symbol set mapping definitions */
+
+#ifndef plsymbol_INCLUDED
+# define plsymbol_INCLUDED
+
+/*
+ * Define the glyph vocabularies -- glyph numbering systems that are the
+ * targets for symbol sets. Currently we only support Unicode and MSL,
+ * but we might add PostScript symbolic names or CIDs in the future.
+ *
+ * We use the same numbering as for the low 3 bits of the PCL character
+ * requirements.
+ */
+typedef enum {
+ plgv_MSL = 0,
+ plgv_Unicode = 1,
+ plgv_next
+} pl_glyph_vocabulary_t;
+
+#define pl_complement_to_vocab(complement)\
+ ((complement[7] & 7) == 6 ? plgv_Unicode : plgv_MSL)
+
+/* Define mapping types so that we do not have to implement both
+ * unicode and msl symbol tables. These definitions can be used with
+ * the mapping function defined in pl/plvocab.h to map to and from msl
+ * and unicode. There are 3 mutually exclusive possibilities: (1) a
+ * unicode symbol set that can be mapped to msl, (2) an msl symbol set
+ * that can be mapped to unicode and (3) neither (1) or (2).
+ */
+
+#define PLGV_M2U_MAPPING 1
+#define PLGV_U2M_MAPPING 2
+#define PLGV_NO_MAPPING 3
+/*
+ * The following structure is defined by PCL5. See Figure 10-1 on p. 10-5
+ * of the PCL5 Technical Reference Manual. Note that a symbol set may have
+ * two maps, one each for Unicode and MSL. A symbol map is uniquely iden-
+ * tified by its id and format.
+ */
+
+typedef struct pl_symbol_map_s {
+ byte header_size[2];
+ byte id[2];
+ byte format;
+ byte type;
+ byte first_code[2];
+ byte last_code[2];
+ byte character_requirements[8];
+ byte mapping_type;
+ /*
+ * Note that the codes are stored with native byte order.
+ * If necessary, we byte-swap them after downloading.
+ */
+ ushort codes[256]; /* may be more or less for downloaded maps */
+} pl_symbol_map_t;
+
+#define pl_symbol_map_vocabulary(map)\
+ ((pl_glyph_vocabulary_t)((map)->character_requirements[7] & 7))
+
+/*
+ * Define the built-in symbol set mappings. The list is terminated by
+ * a NULL.
+ */
+extern const pl_symbol_map_t *pl_built_in_symbol_maps[];
+extern const int pl_built_in_symbol_map_count;
+
+/* lookup symbol in symbol set. Resident fonts will index implicitly
+ if the symbol set in null. We cheat here and use a ulong instead
+ of gs_char to avoid pulling in all the gs_char graphics library
+ dependencies. */
+ulong pl_map_symbol(const pl_symbol_map_t *psm, uint chr, bool is_resident_font,
+ bool is_MSL, bool is_590);
+
+#endif /* plsymbol_INCLUDED */
diff --git a/pl/pltop.c b/pl/pltop.c
new file mode 100644
index 000000000..1202047d0
--- /dev/null
+++ b/pl/pltop.c
@@ -0,0 +1,225 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pltop.c */
+/* Top-level API for interpreters */
+
+#include "string_.h"
+#include "gdebug.h"
+#include "gsnogc.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsdevice.h"
+#include "pltop.h"
+
+
+/* Get implemtation's characteristics */
+const pl_interp_characteristics_t * /* always returns a descriptor */
+pl_characteristics(
+ const pl_interp_implementation_t *impl /* implementation of interpereter to alloc */
+)
+{
+ return impl->proc_characteristics(impl);
+}
+
+/* Do init of interp */
+int /* ret 0 ok, else -ve error code */
+pl_allocate_interp(
+ pl_interp_t **interp, /* RETURNS abstract interpreter struct */
+ const pl_interp_implementation_t *impl, /* implementation of interpereter to alloc */
+ gs_memory_t *mem /* allocator to allocate interp from */
+)
+{
+ int code = impl->proc_allocate_interp(interp, impl, mem);
+ if (code < 0)
+ return code;
+ (*interp)->implementation = impl;
+ return code;
+}
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+int /* ret 0 ok, else -ve error code */
+pl_allocate_interp_instance(
+ pl_interp_instance_t **instance, /* RETURNS instance struct */
+ pl_interp_t *interp, /* dummy interpreter */
+ gs_memory_t *mem /* allocator to allocate instance from */
+)
+{
+ pl_interp_instance_t *pli;
+ int code
+ = interp->implementation->proc_allocate_interp_instance(instance, interp, mem);
+ if (code < 0)
+ return code;
+ pli = *instance;
+ pli->interp = interp;
+
+ return code;
+}
+
+/* Set a client language into an interperter instance */
+int /* ret 0 ok, else -ve error code */
+pl_set_client_instance(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_interp_instance_t *client, /* client to set */
+ pl_interp_instance_clients_t which_client
+)
+{
+ return instance->interp->implementation->proc_set_client_instance
+ (instance, client, which_client);
+}
+
+/* Set an interpreter instance's pre-page action */
+int /* ret 0 ok, else -ve err */
+pl_set_pre_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute (rets 1 to abort w/o err) */
+ void *closure /* closure to call action with */
+)
+{
+ return instance->interp->implementation->proc_set_pre_page_action
+ (instance, action, closure);
+}
+
+/* Set an interpreter instance's post-page action */
+int /* ret 0 ok, else -ve err */
+pl_set_post_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute */
+ void *closure /* closure to call action with */
+)
+{
+ return instance->interp->implementation->proc_set_post_page_action
+ (instance, action, closure);
+}
+
+
+int /* ret 0 ok, else -ve err */
+pl_get_device_memory(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gs_memory_t **memory
+)
+{
+ return instance->interp->implementation->proc_get_device_memory(instance, memory);
+}
+
+/* Get and interpreter prefered device memory allocator if any */
+int /* ret 0 ok, else -ve error code */
+pl_set_device(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gx_device *device /* device to set (open or closed) */
+)
+{
+ return instance->interp->implementation->proc_set_device(instance, device);
+}
+
+/* Prepare interp instance for the next "job" */
+int /* ret 0 ok, else -ve error code */
+pl_init_job(
+ pl_interp_instance_t *instance /* interp instance to start job in */
+)
+{
+ return instance->interp->implementation->proc_init_job(instance);
+}
+
+/* Parse a cursor-full of data */
+int /* The parser reads data from the input
+ * buffer and returns either:
+ * >=0 - OK, more input is needed.
+ * e_ExitLanguage - A UEL or other return to the default parser was
+ * detected.
+ * other <0 value - an error was detected.
+ */
+pl_process(
+ pl_interp_instance_t *instance, /* interp instance to process data job in */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ return instance->interp->implementation->proc_process(instance, cursor);
+}
+
+/* Skip to end of job ret 1 if done, 0 ok but EOJ not found, else -ve error code */
+int
+pl_flush_to_eoj(
+ pl_interp_instance_t *instance, /* interp instance to flush for */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ return instance->interp->implementation->proc_flush_to_eoj(instance, cursor);
+}
+
+/* Parser action for end-of-file (also resets after unexpected EOF) */
+int /* ret 0 or +ve if ok, else -ve error code */
+pl_process_eof(
+ pl_interp_instance_t *instance /* interp instance to process data job in */
+)
+{
+ return instance->interp->implementation->proc_process_eof(instance);
+}
+
+/* Report any errors after running a job */
+int /* ret 0 ok, else -ve error code */
+pl_report_errors(pl_interp_instance_t *instance, /* interp instance to wrap up job in */
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+)
+{
+ return instance->interp->implementation->proc_report_errors
+ (instance, code, file_position, force_to_cout);
+}
+
+/* Wrap up interp instance after a "job" */
+int /* ret 0 ok, else -ve error code */
+pl_dnit_job(
+ pl_interp_instance_t *instance /* interp instance to wrap up job in */
+)
+{
+ if ( instance )
+ return instance->interp->implementation->proc_dnit_job(instance);
+ else
+ return 0;
+}
+
+/* Remove a device from an interperter instance */
+int /* ret 0 ok, else -ve error code */
+pl_remove_device(
+ pl_interp_instance_t *instance /* interp instance to use */
+)
+{
+ int code = instance->interp->implementation->proc_remove_device(instance);
+ return code;
+}
+
+/* Deallocate a interpreter instance */
+int /* ret 0 ok, else -ve error code */
+pl_deallocate_interp_instance(
+ pl_interp_instance_t *instance /* instance to dealloc */
+)
+{
+ int code
+ = instance->interp->implementation->proc_deallocate_interp_instance(instance);
+ return code;
+}
+
+/* Do static deinit of interpreter */
+int /* ret 0 ok, else -ve error code */
+pl_deallocate_interp(
+ pl_interp_t *interp /* interpreter to deallocate */
+)
+{
+ int code
+ = interp->implementation->proc_deallocate_interp(interp);
+ return code;
+}
+
diff --git a/pl/pltop.h b/pl/pltop.h
new file mode 100644
index 000000000..7795bc7b0
--- /dev/null
+++ b/pl/pltop.h
@@ -0,0 +1,189 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pltop.h */
+/* Interface to main API for interpreters */
+
+/* define this hack to allow xml parsing instead of PK zip XPS input.
+ */
+
+#ifndef pltop_INCLUDED
+# define pltop_INCLUDED
+
+#include "gsgc.h"
+#include "scommon.h"
+
+#ifndef gx_device_DEFINED
+# define gx_device_DEFINED
+typedef struct gx_device_s gx_device;
+#endif
+
+/*
+ * Generic interpreter data types which may be subclassed by specific interpereters
+ */
+typedef struct pl_interp_implementation_s pl_interp_implementation_t; /* fwd decl */
+typedef struct pl_interp_s {
+ const struct pl_interp_implementation_s *implementation; /* implementation of actual interp */
+} pl_interp_t;
+
+typedef struct pl_interp_instance_s {
+ pl_interp_t *interp; /* interpreter instance refers to */
+ vm_spaces spaces; /* spaces for GC */
+ char * pcl_personality;
+} pl_interp_instance_t;
+
+/* Param data types */
+typedef int (*pl_page_action_t)(pl_interp_instance_t *, void *);
+
+/*
+ * Implementation characteristics descriptor
+ */
+typedef struct pl_interp_characteristics_s {
+ const char* language; /* generic language should correspond with
+ HP documented PJL name */
+ const char* auto_sense_string; /* string used to detect language */
+ const char* manufacturer; /* manuf str */
+ const char* version; /* version str */
+ const char* build_date; /* build date str */
+ int min_input_size; /* min sizeof input buffer */
+} pl_interp_characteristics_t;
+
+/*
+ * The pl_interp_t and pl_interp_instance are intended to provide a generic
+ * front end for language interpreters, in tandem with a
+ * pl_interp_implementation_t. pl_interp_t and pl_interp_impmementation_t
+ * together are used to describe a particular implementation. An implementation
+ * can then generate one or more instances, which are more-or-less
+ * independent sessions.
+ *
+ * The pattern for a client using these objects is:
+ * match desired characteristics vs. pl_characteristics(&an_implementation);
+ * pl_allocate_interp(&interp, &an_implementation, ...);
+ * for (1 or more sessions)
+ * pl_allocate_interp_instance(&instance, interp, ...);
+ * pl_set_client_instance(instance, ...); // lang-specific client (e.g. PJL)
+ * pl_set_pre_page_action(instance, ...); // opt rtn called B4 each pageout
+ * pl_set_post_page_action(instance,...); // opt rtn called after pageout
+ * for (each device that needs output)
+ * pl_set_device(instance, device); //device is already open
+ * for (each print job)
+ * pl_init_job(instance)
+ * while (!end of job stream && no error)
+ * pl_process(instance, cursor);
+ * if (error || (end of input stream && pl_process didn't end normally yet))
+ * while (!pl_flush_to_eoj(instance, cursor))
+ * ; // positions cursor at eof or 1 past EOD marker
+ * if (end of input stream &&n pl_process didnt' end normally yet)
+ * pl_process_eof(instance); // will reset instance's parser state
+ * if (errors)
+ * pl_report_errors(instance, ...);
+ * pl_dnit_job(instance);
+ * pl_remove_device(instance); //device still open
+ * pl_deallocate_interp_instance(instance);
+ * pl_deallocte_interp(interp);
+ *
+ * Notice that this API allows you to have multiple instances, of multiple
+ * implementations, open at once, but some implementations may impose restrictions
+ * on the number of instances that may be open at one time (e.g. one).
+ */
+
+/*
+ * Define interp procedures: See comments in pltop.c for descriptions/ret vals
+ */
+const pl_interp_characteristics_t * pl_characteristics(const pl_interp_implementation_t *);
+typedef const pl_interp_characteristics_t * (*pl_interp_proc_characteristics_t)(const pl_interp_implementation_t *);
+
+int pl_allocate_interp(pl_interp_t **, const pl_interp_implementation_t *, gs_memory_t *);
+typedef int (*pl_interp_proc_allocate_interp_t)(pl_interp_t **, const pl_interp_implementation_t *, gs_memory_t *);
+
+int pl_allocate_interp_instance(pl_interp_instance_t **, pl_interp_t *, gs_memory_t *);
+typedef int (*pl_interp_proc_allocate_interp_instance_t)(pl_interp_instance_t **, pl_interp_t *, gs_memory_t *);
+
+/* clients that can be set into an interpreter's state */
+typedef enum {
+ /* needed to access the pcl interpreter in pxl (passthrough mode) */
+ PCL_CLIENT,
+ /* needed by all interpreters to query pjl state */
+ PJL_CLIENT
+} pl_interp_instance_clients_t;
+
+
+int pl_set_client_instance(pl_interp_instance_t *, pl_interp_instance_t *, pl_interp_instance_clients_t client);
+typedef int (*pl_interp_proc_set_client_instance_t)(pl_interp_instance_t *, pl_interp_instance_t *, pl_interp_instance_clients_t client);
+
+int pl_set_pre_page_action(pl_interp_instance_t *, pl_page_action_t, void *);
+typedef int (*pl_interp_proc_set_pre_page_action_t)(pl_interp_instance_t *, pl_page_action_t, void *);
+
+int pl_set_post_page_action(pl_interp_instance_t *, pl_page_action_t, void *);
+typedef int (*pl_interp_proc_set_post_page_action_t)(pl_interp_instance_t *, pl_page_action_t, void *);
+
+int pl_set_device(pl_interp_instance_t *, gx_device *);
+typedef int (*pl_interp_proc_set_device_t)(pl_interp_instance_t *, gx_device *);
+
+int pl_init_job(pl_interp_instance_t *);
+typedef int (*pl_interp_proc_init_job_t)(pl_interp_instance_t *);
+
+int pl_process(pl_interp_instance_t *, stream_cursor_read *);
+typedef int (*pl_interp_proc_process_t)(pl_interp_instance_t *, stream_cursor_read *);
+
+int pl_flush_to_eoj(pl_interp_instance_t *, stream_cursor_read *);
+typedef int (*pl_interp_proc_flush_to_eoj_t)(pl_interp_instance_t *, stream_cursor_read *);
+
+int pl_process_eof(pl_interp_instance_t *);
+typedef int (*pl_interp_proc_process_eof_t)(pl_interp_instance_t *);
+
+int pl_report_errors(pl_interp_instance_t *, int, long, bool);
+typedef int (*pl_interp_proc_report_errors_t)(pl_interp_instance_t *, int, long, bool);
+
+int pl_dnit_job(pl_interp_instance_t *);
+typedef int (*pl_interp_proc_dnit_job_t)(pl_interp_instance_t *);
+
+int pl_remove_device(pl_interp_instance_t *);
+typedef int (*pl_interp_proc_remove_device_t)(pl_interp_instance_t *);
+
+int pl_deallocate_interp_instance(pl_interp_instance_t *);
+typedef int (*pl_interp_proc_deallocate_interp_instance_t)(pl_interp_instance_t *);
+
+int pl_deallocate_interp(pl_interp_t *);
+typedef int (*pl_interp_proc_deallocate_interp_t)(pl_interp_t *);
+
+int pl_get_device_memory(pl_interp_instance_t *, gs_memory_t **);
+typedef int (*pl_interp_proc_get_device_memory_t)(pl_interp_instance_t *, gs_memory_t **);
+
+pl_interp_instance_t *get_interpreter_from_memory( const gs_memory_t *mem );
+
+/*
+ * Define a generic interpreter implementation
+ */
+struct pl_interp_implementation_s {
+ /* Procedure vector */
+ pl_interp_proc_characteristics_t proc_characteristics;
+ pl_interp_proc_allocate_interp_t proc_allocate_interp;
+ pl_interp_proc_allocate_interp_instance_t proc_allocate_interp_instance;
+ pl_interp_proc_set_client_instance_t proc_set_client_instance;
+ pl_interp_proc_set_pre_page_action_t proc_set_pre_page_action;
+ pl_interp_proc_set_post_page_action_t proc_set_post_page_action;
+ pl_interp_proc_set_device_t proc_set_device;
+ pl_interp_proc_init_job_t proc_init_job;
+ pl_interp_proc_process_t proc_process;
+ pl_interp_proc_flush_to_eoj_t proc_flush_to_eoj;
+ pl_interp_proc_process_eof_t proc_process_eof;
+ pl_interp_proc_report_errors_t proc_report_errors;
+ pl_interp_proc_dnit_job_t proc_dnit_job;
+ pl_interp_proc_remove_device_t proc_remove_device;
+ pl_interp_proc_deallocate_interp_instance_t proc_deallocate_interp_instance;
+ pl_interp_proc_deallocate_interp_t proc_deallocate_interp;
+ pl_interp_proc_get_device_memory_t proc_get_device_memory;
+};
+
+#endif /* pltop_INCLUDED */
diff --git a/pl/pltoputl.c b/pl/pltoputl.c
new file mode 100644
index 000000000..a2e62d010
--- /dev/null
+++ b/pl/pltoputl.c
@@ -0,0 +1,99 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+#include "string_.h"
+#include "gdebug.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "pltoputl.h"
+
+/* -------------- Read stream cursor operations ---------- */
+
+/* Initialize cursor */
+int /* returns 0 ok, else -ve error code */
+pl_top_cursor_init(
+ pl_top_cursor_t *cursor, /* cursor to init/open */
+ FILE *strm, /* open stream to read from */
+ byte *buffer, /* buffer to use for reading */
+ unsigned buffer_length /* length of *buffer */
+)
+{
+ int status;
+ cursor->strm = strm;
+ cursor->buffer = buffer;
+ cursor->buffer_length = buffer_length;
+ cursor->cursor.limit = cursor->cursor.ptr = buffer - 1;
+ cursor->status = 1; /* non-status */
+
+ status = pl_top_cursor_next(cursor);
+ return status < 0 ? status : 0; /* report errors, not EOF */
+}
+
+/* End of data condition. */
+static bool
+pl_cursor_EOD(pl_top_cursor_t *cursor)
+{
+
+ /* NB review history of the second predicate. */
+ return (cursor->status <= 0 && cursor->cursor.ptr <= cursor->buffer);
+}
+
+void
+pl_renew_cursor_status(pl_top_cursor_t *cursor)
+{
+ if (pl_cursor_EOD(cursor)) {
+ cursor->status = 1;
+ }
+}
+
+/* Refill from input */
+int /* rets 1 ok, else 0 EOF, -ve error */
+pl_top_cursor_next(
+ pl_top_cursor_t *cursor /* cursor to operate on */
+)
+{
+ int len;
+
+ /* Declare EOF even if chars left in buffer if no chars were consumed */
+ if (pl_cursor_EOD(cursor))
+ return cursor->status;
+
+ /* Copy any remaining bytes to head of buffer */
+ len = cursor->cursor.limit - cursor->cursor.ptr;
+ if (len > 0)
+ memmove(cursor->buffer, cursor->cursor.ptr + 1, len);
+ cursor->cursor.ptr = cursor->buffer - 1;
+ cursor->cursor.limit = cursor->buffer + (len - 1);
+
+ /* Top off rest of buffer by reading stream */
+ if (cursor->status > 0 && len < cursor->buffer_length) {
+ cursor->status = fread((byte *)(cursor->cursor.limit + 1),
+ 1, cursor->buffer_length - len,
+ cursor->strm);
+ if (cursor->status > 0)
+ cursor->cursor.limit += cursor->status;
+ }
+
+ /* Return success if there's anything in the buffer */
+ return cursor->cursor.limit == cursor->cursor.ptr ? cursor->status : 1;
+}
+
+/* Deinit a read cursor */
+void
+pl_top_cursor_dnit(
+ pl_top_cursor_t *cursor /* cursor to operate on */
+)
+{
+ return;
+}
diff --git a/pl/pltoputl.h b/pl/pltoputl.h
new file mode 100644
index 000000000..aeb90634e
--- /dev/null
+++ b/pl/pltoputl.h
@@ -0,0 +1,49 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pltoputl.h Useful utilities for use w/pltop.c interface */
+
+#ifndef pltoputl_INCLUDED
+# define pltoputl_INCLUDED
+
+#include "scommon.h"
+
+/* -------------- Read file cursor operations ---------- */
+/*
+ * Stream-driven reading cursor
+ */
+typedef struct pl_top_cursor_s {
+ stream_cursor_read cursor; /* cursor actually used to read */
+ FILE *strm; /* stream that data comes from */
+ unsigned char *buffer; /* buffer to use */
+ unsigned buffer_length; /* # bytes in buffer */
+ int status; /* if <=0, status to report to caller */
+} pl_top_cursor_t;
+
+/* Init a read cursor w/specified open stream */
+int pl_top_cursor_init(pl_top_cursor_t *cursor, FILE *strm, byte *buffer, unsigned bufferLength);
+
+/* Refill from input */
+int pl_top_cursor_next(pl_top_cursor_t *cursor);
+
+/* Close read cursor */
+int pl_top_cursor_close(pl_top_cursor_t *cursor);
+
+/* Deinit a read cursor */
+void pl_top_cursor_dnit(pl_top_cursor_t *cursor);
+
+/* renew a cursor if EOD condition has been set. This can happen if a
+ PDL does not consume any data even though data is avaiable */
+void pl_renew_cursor_status(pl_top_cursor_t *cursor);
+
+#endif /* pltoputl_INCLUDED */
diff --git a/pl/pluchar.c b/pl/pluchar.c
new file mode 100644
index 000000000..1191f1178
--- /dev/null
+++ b/pl/pluchar.c
@@ -0,0 +1,718 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plchar.c */
+/* PCL font handling library -- operations on individual characters */
+#include "math_.h"
+#include "memory_.h"
+#include "stdio_.h" /* for gdebug.h */
+#include "gdebug.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gschar.h"
+#include "gsimage.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gsbittab.h"
+#include "gxarith.h" /* for igcd */
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "plfont.h"
+#include "plvalue.h"
+#include "gscoord.h"
+#include "gsstate.h"
+#include "gxdevice.h"
+#include "gxdevmem.h"
+#include "gxpath.h"
+/* We really shouldn't need the following, but currently they are needed */
+/* for pgs->path and penum->log2_current_scale in pl_tt_build_char. */
+#include "gxfixed.h"
+#include "gxchar.h"
+#include "gxfcache.h"
+#include "gzstate.h"
+
+/* agfa includes */
+#undef true
+#undef false
+#undef frac_bits
+#include "cgconfig.h"
+#include "ufstport.h"
+#include "shareinc.h"
+#include "gxfapiu.h"
+
+
+/* ---------------- UFST utilities ---------------- */
+
+#define UFST_SCALE 16
+#define FXD_ONE (1L << UFST_SCALE) /* fixed point 1.0000 */
+
+static const pl_font_t * plfont_last; /* last selected font */
+static const gs_matrix pl_identmtx = { identity_matrix_body };
+
+extern IF_STATE if_state;
+extern PIF_STATE pIFS;
+/*
+ * Set up a generic FONTCONTEXT structure.
+ *
+ * NB: UFST automatically inverts the y-axis when generating a bitmap, so
+ * it is necessary to account for that change in this routine.
+ */
+void
+pl_init_fc(
+ const pl_font_t * plfont,
+ gs_state * pgs,
+ int need_outline,
+ FONTCONTEXT * pfc,
+ bool width_request)
+{
+ gs_font * pfont = plfont->pfont;
+
+ /* set the current tranformation matrix - EM's... if this is a
+ width request we don't necessarily have a current graphics
+ state... use identity for resolution and ctm */
+ gs_matrix mat;
+ floatp xres, yres;
+
+ if ( width_request ) {
+ gs_make_identity(&mat);
+ xres = yres = 1;
+ } else {
+ gs_currentmatrix(pgs, &mat);
+ xres = gs_currentdevice(pgs)->HWResolution[0];
+ yres = gs_currentdevice(pgs)->HWResolution[1];
+ }
+ pfc->font_id = 0;
+ pfc->xspot = F_ONE;
+ pfc->yspot = F_ONE;
+ /* symbol set id used for no symbol set mapping */
+ pfc->ssnum = 0x8000;
+ /* filled in if downloaded font and/or symbol set. */
+ pfc->font_hdr = NULL;
+ pfc->dl_ssnum = 0;
+ /* union selector for transformation type m0..m3 - pcl uses pt.
+ size */
+ pfc->fc_type = FC_MAT2_TYPE;
+ /* calculate point size, set size etc based on current CTM in EM's */
+ {
+ floatp hx = hypot(mat.xx, mat.xy);
+ floatp hy = hypot(mat.yx, mat.yy);
+ /* fixed point scaling */
+ floatp mscale = 1L << 16;
+ pfc->s.m2.matrix_scale = 16;
+ pfc->s.m2.point_size = (int)((hy * plfont->pts_per_inch / yres) + 0.5) * 8; /* 1/8ths */
+ pfc->s.m2.set_size = (int)((hx * plfont->pts_per_inch / xres) + 0.5) * 8;
+ pfc->s.m2.m[0] = mscale * mat.xx / hx;
+ pfc->s.m2.m[1] = mscale * -mat.xy / hx;
+ pfc->s.m2.m[2] = mscale * mat.yx / hy;
+ pfc->s.m2.m[3] = mscale * -mat.yy / hy;
+ pfc->s.m2.world_scale = 16;
+ pfc->s.m2.xworld_res = mscale * xres;
+ pfc->s.m2.yworld_res = mscale * yres;
+ }
+
+ if ( need_outline ) {
+ pfc->s.m2.m[1] = -pfc->s.m2.m[1];
+ pfc->s.m2.m[3] = -pfc->s.m2.m[3];
+ }
+
+ /* always use our own symbol set mapping */
+ pfc->ExtndFlags = EF_NOSYMSETMAP;
+ if (plfont->is_xl_format) {
+ pfc->ExtndFlags = EF_XLFONT_TYPE;
+ if ((pfont->WMode & 0x1) != 0) /* vertical substitution */
+ pfc->ExtndFlags |= EF_VERTSUBS_TYPE;
+ }
+ else if (plfont->scaling_technology == plfst_TrueType && plfont->large_sizes) {
+ pfc->ExtndFlags = EF_FORMAT16_TYPE | EF_GALLEYSEG_TYPE;
+ if ((pfont->WMode & 0x1) != 0) /* vertical substitution */
+ pfc->ExtndFlags |= EF_VERTSUBS_TYPE;
+ }
+ pfc->ExtndFlags |= EF_NOUSBOUNDBOX; /* UFST 5.0+ addition */
+
+ /* handle artificial emboldening */
+ if (plfont->bold_fraction && !need_outline) {
+ pfc->pcl6bold = 32768 * plfont->bold_fraction;
+ }
+ else
+ pfc->pcl6bold = 0;
+ /* set the format */
+ pfc->format = FC_PCL6_EMU | FC_INCHES_TYPE;
+ pfc->format |= (need_outline ? FC_LINEAR_TYPE : FC_BITMAP_TYPE);
+}
+
+/*
+ * Set the current UFST font (any type).
+ */
+static int
+pl_set_ufst_font(const pl_font_t * plfont, FONTCONTEXT * pfc)
+{
+ uint status = CGIFfont(FSA pfc);
+
+ if (status != 0)
+ dprintf1("CGIFfont error %d\n", status);
+ else
+ plfont_last = plfont; /* record this font for use in call-backs */
+ return status;
+}
+
+/*
+ * Set the current path from a character outline. This is more general than
+ * may be necessary, depending on how the UFST module is compiled.
+ */
+static int
+image_outline_char(
+ PIFOUTLINE pols,
+ const gs_matrix_fixed * pmat,
+ gx_path * ppath,
+ gs_font * pfont )
+{
+ UW16 il, numLoops = pols->ol.num_loops;
+ byte * pbase = (byte *)&pols->ol.loop;
+ int ishift = fixed_fraction_bits + pols->VLCpower;
+ fixed tx = pmat->tx_fixed, ty = pmat->ty_fixed;
+
+ for (il = 0; il < numLoops; il++) {
+ OUTLINE_LOOP * ploop = &pols->ol.loop[il];
+ uint numSegmts = ploop->num_segmts;
+ byte * pseg = pbase + ploop->segmt_offset;
+ PINTRVECTOR pcoord = (PINTRVECTOR)(pbase + ploop->coord_offset);
+ int code;
+
+ while (numSegmts-- > 0) {
+ int segtype = *pseg++;
+ int ip, npts;
+ gs_fixed_point pt[3];
+
+ if (segtype == 2 || segtype > 3)
+ return_error(gs_error_rangecheck);
+
+ npts = (segtype == 3 ? 3 : 1);
+ for (ip = 0; ip < npts; ip++, ++pcoord) {
+ pt[ip].x = (pcoord->x << ishift) + tx;
+ pt[ip].y = (pcoord->y << ishift) + ty;
+ }
+
+ switch (segtype) {
+
+ case 0: /* moveto */
+ code = gx_path_add_point(ppath, pt[0].x, pt[0].y);
+ break;
+
+ case 1: /* lineto */
+ code = gx_path_add_line(ppath, pt[0].x, pt[0].y);
+ break;
+
+ case 3: /* curveto */
+ code = gx_path_add_curve( ppath,
+ pt[0].x, pt[0].y,
+ pt[1].x, pt[1].y,
+ pt[2].x, pt[2].y );
+ }
+ if (code < 0)
+ return code;
+ }
+ if ((code = gx_path_close_subpath(ppath)) < 0)
+ return code;
+ }
+ return 0;
+}
+
+/*
+ * Get the widt from a UFST character (any type). The caller should have
+ * set the font type in advance.
+ */
+static int
+pl_ufst_char_width(
+ uint char_code,
+ const void * pgs,
+ gs_point * pwidth,
+ FONTCONTEXT * pfc )
+{
+
+ UW16 chIdloc = char_code;
+ UW16 fontWidth[2];
+ int status;
+ WIDTH_LIST_INPUT_ENTRY fcode;
+ if (pwidth != NULL)
+ pwidth->x = pwidth->y = 0;
+
+ CGIFchIdptr(FSA (VOID *)&chIdloc, NULL);
+ fcode.CharType.TT_unicode = char_code;
+ if ((status = CGIFwidth2(FSA &fcode, 1, 4, fontWidth)) != 0) {
+ dprintf1("CGIFwidth error %d\n", status);
+ return status;
+ }
+ if (fontWidth[0] == ERR_char_unavailable || fontWidth[1] == 0)
+ return 1;
+ else if (pwidth != NULL) {
+ floatp fontw = (floatp)fontWidth[0] / (floatp)fontWidth[1];
+ int code = gs_distance_transform(fontw, 0.0, &pl_identmtx, pwidth);
+
+ return code < 0 ? code : 0;
+ } else
+ return 0;
+}
+
+/*
+ * Generate a UFST character.
+ */
+static int
+pl_ufst_make_char(
+ gs_show_enum * penum,
+ gs_state * pgs,
+ gs_font * pfont,
+ gs_char chr,
+ FONTCONTEXT * pfc )
+{
+ gs_imager_state * pis = (gs_imager_state *)pgs;
+ MEM_HANDLE memhdl;
+ UW16 status, chIdloc = chr;
+ gs_matrix sv_ctm, tmp_ctm;
+ int wasValid;
+
+ /* ignore illegitimate characters */
+ if (chr == 0xffff)
+ return 0;
+
+ CGIFchIdptr(FSA (VOID *)&chIdloc, NULL);
+ if ( (status = CGIFchar_handle(FSA chr, &memhdl, 0)) != 0 &&
+ status != ERR_fixed_space ) {
+
+ /* if too large for a bitmap, try an outline */
+ if (status >= ERR_bm_gt_oron && status <= ERRdu_pix_range) {
+ pfc->format = (pfc->format & ~FC_BITMAP_TYPE) | FC_CUBIC_TYPE;
+ if ((status = CGIFfont(FSA pfc)) == 0) {
+ CGIFchIdptr(FSA (VOID *)&chIdloc, NULL);
+ status = CGIFchar_handle(FSA chr, &memhdl, 0);
+ }
+ }
+ if (status != 0) {
+ dprintf2("CGIFchar_handle error %d for char=0x%x\n", status, chr);
+ gs_setcharwidth(penum, pgs, 0.0, 0.0);
+ return 0; /* returning status causes the job to be aborted */
+ }
+ }
+
+ wasValid = pgs->char_tm_valid;
+ /* move to device space */
+ gs_currentmatrix(pgs, &sv_ctm);
+ gs_make_identity(&tmp_ctm);
+ tmp_ctm.tx = sv_ctm.tx;
+ tmp_ctm.ty = sv_ctm.ty;
+ gs_setmatrix(pgs, &tmp_ctm);
+ pgs->char_tm_valid = wasValid;
+
+ if (FC_ISBITMAP(pfc)) {
+ PIFBITMAP psbm = (PIFBITMAP)MEMptr(memhdl);
+ float wbox[6];
+ gs_image_t image;
+ gs_image_enum * ienum;
+ int code;
+ gs_point aw;
+
+ /* set up the cache device */
+ gs_distance_transform( (floatp)psbm->escapement / psbm->du_emx,
+ 0.0,
+ &sv_ctm,
+ &aw );
+
+ wbox[0] = aw.x;
+ wbox[1] = aw.y;
+ wbox[2] = psbm->xorigin / 16.0 + psbm->left_indent;
+ wbox[3] = -psbm->yorigin / 16.0 + psbm->top_indent;
+ wbox[4] = psbm->black_width + wbox[2];
+ wbox[5] = psbm->black_depth + wbox[3];
+
+ /* if (status == ERR_fixed_space)
+ * we are relying on ufst to
+ * send a zero sized image; we then cache the escapements of the space character
+ * psbm->bm = psbm->width = psbm->height = 0;
+ * note that the outline code can't be reached on ERR_fixed_space
+ */
+
+ if ((code = gs_setcachedevice(penum, pgs, wbox)) < 0) {
+ MEMfree(FSA CACHE_POOL, memhdl);
+ gs_setmatrix(pgs, &sv_ctm);
+ return code;
+ }
+
+ /* set up the image */
+ ienum = gs_image_enum_alloc(pgs->memory, "pl_ufst_make_char");
+ if (ienum == 0) {
+ MEMfree(FSA CACHE_POOL, memhdl);
+ gs_setmatrix(pgs, &sv_ctm);
+ return_error(gs_error_VMerror);
+ }
+ gs_image_t_init_mask(&image, true);
+ image.Width = psbm->width << 3;
+ image.Height = psbm->depth;
+ gs_make_identity(&image.ImageMatrix);
+ image.ImageMatrix.tx = -psbm->xorigin / 16.0;
+ image.ImageMatrix.ty = psbm->yorigin / 16.0;
+ image.adjust = true;
+ code = image_bitmap_char( ienum,
+ &image,
+ (byte *)psbm->bm,
+ psbm->width,
+ 0,
+ NULL,
+ pgs );
+ gs_free_object(pgs->memory, ienum, "pl_ufst_make_char");
+ MEMfree(FSA CACHE_POOL, memhdl);
+ gs_setmatrix(pgs, &sv_ctm);
+ return (code < 0 ? code : 0);
+
+ } else { /* outline */
+ PIFOUTLINE pols = (PIFOUTLINE)MEMptr(memhdl);
+ float scale = pow(2, pols->VLCpower);
+ float wbox[6];
+ int code;
+ gs_point aw;
+
+ /* set up the cache device */
+ gs_distance_transform( (floatp)pols->escapement / pols->du_emx,
+ 0.0,
+ &sv_ctm,
+ &aw );
+ wbox[0] = aw.x;
+ wbox[1] = aw.y;
+ wbox[2] = scale * pols->left;
+ wbox[3] = scale * pols->bottom;
+ wbox[4] = scale * pols->right;
+ wbox[5] = scale * pols->top;
+
+ if (status == ERR_fixed_space) {
+ MEMfree(FSA CACHE_POOL, memhdl);
+ code = gs_setcharwidth(penum, pgs, wbox[0], wbox[1]);
+ gs_setmatrix(pgs, &sv_ctm);
+ return code;
+ } else if ((code = gs_setcachedevice(penum, pgs, wbox)) < 0) {
+ MEMfree(FSA CACHE_POOL, memhdl);
+ gs_setmatrix(pgs, &sv_ctm);
+ return code;
+ }
+
+ code = image_outline_char(pols, &pis->ctm, pgs->path, pfont);
+ if (code >= 0) {
+ code = gs_fill(pgs);
+ }
+ MEMfree(FSA CACHE_POOL, memhdl);
+ gs_setmatrix(pgs, &sv_ctm);
+ return (code < 0 ? code : 0);
+ }
+}
+
+
+/* ---------------- TrueType font support ---------------- */
+
+/* Look up a character in the TrueType character-to-TT-glyph map. */
+/* Return a pointer to the glyph's slot (chr != gs_no_char) or where */
+/* it should be added (chr == gs_no_char). */
+static pl_tt_char_glyph_t *
+pl_tt_lookup_char(const pl_font_t *plfont, gs_glyph glyph)
+{ uint size = plfont->char_glyphs.size;
+ uint skip = plfont->char_glyphs.skip;
+ uint index = glyph % size;
+ pl_tt_char_glyph_t *ptcg;
+ pl_tt_char_glyph_t *result = 0;
+
+ while ( (ptcg = plfont->char_glyphs.table + index)->chr != gs_no_char ?
+ ptcg->chr != glyph : ptcg->glyph
+ )
+ { if ( ptcg->chr == gs_no_char )
+ result = ptcg;
+ index = (index >= skip ? index : index + size) - skip;
+ }
+ return (result ? result : ptcg);
+}
+
+/* Get a string from a TrueType font. */
+static int
+pl_tt_string_proc(gs_font_type42 *pfont, ulong offset, uint length,
+ const byte **pdata)
+{ pl_font_t *plfont = pfont->client_data;
+
+ *pdata = plfont->header + plfont->offsets.GT +
+ (plfont->large_sizes ? 6 : 4) + offset;
+ return 0;
+}
+
+/* Return the vertical substitute for a glyph, if it has one; */
+/* otherwise return gs_no_glyph. */
+static gs_glyph
+pl_font_vertical_glyph(gs_glyph glyph, const pl_font_t *plfont)
+{ long VT = plfont->offsets.VT;
+ const byte *vtseg;
+ uint i, len;
+
+ if ( VT < 0 )
+ return gs_no_glyph;
+ vtseg = plfont->header + VT;
+ if ( plfont->large_sizes )
+ len = pl_get_uint32(vtseg + 2),
+ i = 6;
+ else
+ len = pl_get_uint16(vtseg + 2),
+ i = 4;
+ len += i;
+ for ( ; i < len; i += 4 )
+ if ( glyph == pl_get_uint16(vtseg + i) )
+ return pl_get_uint16(vtseg + i + 2);
+ return gs_no_glyph;
+}
+#define access(base, length, vptr)\
+ (*pfont->data.string_proc)(pfont, (ulong)(base), length, &vptr)
+
+#ifndef gs_imager_state_DEFINED
+# define gs_imager_state_DEFINED
+typedef struct gs_imager_state_s gs_imager_state;
+#endif
+
+/* Opaque type for a path */
+#ifndef gx_path_DEFINED
+# define gx_path_DEFINED
+typedef struct gx_path_s gx_path;
+#endif
+
+/* ---------------- MicroType font support ---------------- */
+/*
+ * MicroType accepts unicode values a glyph identifiers, so no explicit
+ * encoding is necessary.
+ */
+static gs_glyph
+pl_mt_encode_char(gs_font * pfont, gs_char pchr, gs_glyph_space_t not_used)
+{
+ return (gs_glyph)pchr;
+}
+
+
+/*
+ * Set the current UFST font to be a MicroType font.
+ */
+static int
+pl_set_mt_font(
+ gs_state *pgs,
+ const pl_font_t * plfont,
+ int need_outline,
+ FONTCONTEXT * pfc )
+{
+ pl_init_fc(plfont, pgs, need_outline, pfc, /* width request iff */ pgs == NULL);
+ pfc->font_id = ((gs_font_base *)(plfont->pfont))->UID.id;
+#ifdef UFST_FROM_ROM
+ pfc->format |= FC_ROM_TYPE | FC_NOUSBOUNDBOX;
+#endif
+ pfc->format |= FC_FCO_TYPE;
+ return pl_set_ufst_font(plfont, pfc);
+}
+
+/* Render a MicroType character. */
+static int
+pl_mt_build_char(
+ gs_show_enum * penum,
+ gs_state * pgs,
+ gs_font * pfont,
+ gs_char chr,
+ gs_glyph glyph )
+{
+ const pl_font_t * plfont = (const pl_font_t *)pfont->client_data;
+ FONTCONTEXT fc;
+
+ if ( pl_set_mt_font( pgs,
+ plfont,
+ gs_show_in_charpath(penum),
+ &fc ) != 0 )
+ return 0;
+ return pl_ufst_make_char(penum, pgs, pfont, chr, &fc);
+}
+
+#define MAX_LIST_SIZE 100
+int list_size = 0;
+
+typedef struct pl_glyph_width_node_s pl_glyph_width_node_t;
+
+struct pl_glyph_width_node_s {
+ uint char_code;
+ uint font_id;
+ gs_point width;
+ pl_glyph_width_node_t *next;
+};
+
+pl_glyph_width_node_t *head = NULL;
+/* add at the front of the list */
+
+int
+pl_glyph_width_cache_node_add(gs_memory_t *mem, gs_id font_id, uint char_code, gs_point *pwidth)
+{
+ pl_glyph_width_node_t *node =
+ (pl_glyph_width_node_t *)gs_alloc_bytes(mem,
+ sizeof(pl_glyph_width_node_t),
+ "pl_glyph_width_cache_node_add");
+ if ( node == NULL )
+ return -1;
+ if ( head == NULL ) {
+ head = node;
+ head->next = NULL;
+ } else {
+ node->next = head;
+ head = node;
+ }
+
+ head->char_code = char_code;
+ head->font_id = font_id;
+ head->width = *pwidth;
+ list_size++;
+ return 0;
+}
+
+int
+pl_glyph_width_cache_node_search(gs_id font_id, uint char_code, gs_point *pwidth)
+{
+ pl_glyph_width_node_t *current = head;
+ while ( current ) {
+ if ( char_code == current->char_code && font_id == current->font_id ) {
+ *pwidth = current->width;
+ return 0;
+ }
+ current = current->next;
+ }
+ return -1;
+}
+
+void
+pl_glyph_width_list_remove(gs_memory_t *mem)
+{
+ pl_glyph_width_node_t *current = head;
+ while (current) {
+ pl_glyph_width_node_t *next = current->next;
+ gs_free_object(mem, current, "pl_glyph_width_list_remove");
+ current = next;
+ }
+ head = NULL;
+ list_size = 0;
+ return;
+}
+
+
+/* Get character existence and escapement for an MicroType font. */
+static int
+pl_mt_char_width(
+ const pl_font_t * plfont,
+ const void * pgs,
+ uint char_code,
+ gs_point * pwidth )
+{
+ FONTCONTEXT fc;
+ int code;
+ if ( list_size > MAX_LIST_SIZE )
+ pl_glyph_width_list_remove(plfont->pfont->memory);
+ code = pl_glyph_width_cache_node_search(plfont->pfont->id, char_code, pwidth);
+ if ( code < 0 ) /* not found */ {
+ /* FIXME inconsitant error code return values follow */
+ if (pl_set_mt_font(NULL /* graphics state */, plfont, false, &fc) != 0)
+ return 0;
+ code = pl_ufst_char_width(char_code, pgs, pwidth, &fc);
+ if ( code == 0 )
+ code = pl_glyph_width_cache_node_add(plfont->pfont->memory,
+ plfont->pfont->id,
+ char_code, pwidth);
+ }
+ return code;
+}
+
+static int
+pl_mt_char_metrics(const pl_font_t *plfont, const void *pgs, uint char_code, float metrics[4])
+{
+ gs_point width;
+ metrics[0] = metrics[1] = metrics[2] = metrics[3] = 0;
+ if ( 0 == pl_mt_char_width(plfont, pgs, char_code, &width) ) {
+ /* width is correct,
+ stefan foo: lsb is missing. */
+ metrics[2] = width.x;
+ /* metrics[0] = left_side_bearing;
+ */
+ }
+ return 0;
+}
+
+/*
+ * Callback from UFST to pass PCLEO IF character data starting with header.
+ *
+ * For TrueType fonts, the glyph table within a font is indexed by the glyph
+ * id., rather than the unicode. The char_glyphs table in the font maps the
+ * latter to the former.
+ */
+LPUB8 pl_PCLchId2ptr(FSP UW16 chId)
+{
+ const pl_font_t * plfont = plfont_last;
+
+ if (plfont_last == NULL)
+ return NULL; /* something wrong */
+
+ /* check for a TrueType font */
+ if (plfont->char_glyphs.table != NULL) {
+ pl_tt_char_glyph_t * ptcg = pl_tt_lookup_char(plfont, chId);
+
+ if (ptcg->chr == gs_no_char)
+ return NULL; /* something wrong */
+ chId = ptcg->glyph;
+ }
+ return (LPUB8)pl_font_lookup_glyph(plfont, chId)->data;
+}
+
+/*
+ * callback from UFST to pass PCLEO TT character data starting with header.
+ */
+LPUB8 pl_PCLglyphID2Ptr(FSP UW16 chId)
+{
+ if (plfont_last == NULL)
+ return NULL; /* something wrong */
+ else
+ return (LPUB8)(pl_font_lookup_glyph(plfont_last, chId)->data);
+}
+
+/*
+ * callback from UFST to pass PCLEO compound character data starting
+ * with header.
+ */
+LPUB8 pl_PCLEO_charptr(LPUB8 pfont_hdr, UW16 char_code)
+{
+ if (plfont_last == NULL || plfont_last->header != pfont_hdr) {
+ dprintf2("fontheader active=0x%x requested=0x%x\n",
+ (plfont_last == NULL ? 0 : plfont_last->header),
+ pfont_hdr );
+ return NULL; /* something wrong */
+ } else
+ return pl_PCLchId2ptr(FSA char_code);
+}
+
+void plu_set_callbacks()
+{
+ gx_set_UFST_Callbacks(pl_PCLEO_charptr, pl_PCLchId2ptr, pl_PCLglyphID2Ptr);
+ /* nothing */
+}
+
+void
+pl_mt_init_procs(gs_font_base *pfont)
+{ pfont->procs.encode_char = pl_mt_encode_char;
+ pfont->procs.build_char = pl_mt_build_char;
+#define plfont ((pl_font_t *)pfont->client_data)
+ plfont->char_width = pl_mt_char_width;
+ plfont->char_metrics = pl_mt_char_metrics;
+#undef plfont
+}
+
diff --git a/pl/plufont.c b/pl/plufont.c
new file mode 100644
index 000000000..e8591a20e
--- /dev/null
+++ b/pl/plufont.c
@@ -0,0 +1,113 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plfont.c */
+/* PCL font handling library -- operations on entire fonts */
+#include "memory_.h"
+#include "stdio_.h"
+#include "gdebug.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gschar.h"
+#include "gsutil.h"
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "plfont.h"
+#include "plvalue.h"
+
+/* agfa stuff */
+#undef true
+#undef false
+#undef frac_bits
+#include "cgconfig.h" /* this must be first */
+#include "ufstport.h" /* this must be second */
+#include "shareinc.h"
+#include "strmio.h"
+
+/* Structure descriptors */
+private_st_pl_font();
+
+/* Define accessors for unaligned, big-endian quantities. */
+#define u16(bptr) pl_get_uint16(bptr)
+#define s16(bptr) pl_get_int16(bptr)
+/**** ASSUME uint >= 32 BITS ****/
+#define u32(bptr) (uint)pl_get_uint32(bptr)
+
+extern void pl_init_fc(
+ const pl_font_t * plfont,
+ gs_state * pgs,
+ int need_outline,
+ FONTCONTEXT * pfc,
+ bool width_request);
+
+/* ---------------- Library callbacks ---------------- */
+
+/* Fill in AGFA MicroType font boilerplate. */
+void
+pl_fill_in_mt_font(gs_font_base *pfont, SW16 data, long unique_id)
+{ gs_make_identity(&pfont->FontMatrix);
+ pfont->FontType = ft_MicroType;
+ pfont->BitmapWidths = true;
+ pfont->ExactSize = fbit_use_outlines;
+ pfont->InBetweenSize = fbit_use_outlines;
+ pfont->TransformedChar = fbit_use_outlines;
+
+ pfont->FontBBox.p.x = pfont->FontBBox.p.y =
+ pfont->FontBBox.q.x = pfont->FontBBox.q.y = 0;
+ uid_set_UniqueID(&pfont->UID, unique_id | (data << 16));
+ pfont->encoding_index = 1; /****** WRONG ******/
+ pfont->nearest_encoding_index = 1; /****** WRONG ******/
+ pl_mt_init_procs(pfont);
+}
+
+/* Load a built-in AGFA MicroType font */
+int
+pl_load_mt_font(SW16 handle, gs_font_dir *pdir, gs_memory_t *mem,
+ long unique_id, pl_font_t **pplfont)
+{
+ gs_font_base *pfont = gs_alloc_struct(mem, gs_font_base,
+ &st_gs_font_base, "pl_mt_load_font(gs_font_base)");
+ pl_font_t *plfont = pl_alloc_font(mem, "pl_mt_load_font(pl_font_t)");
+ int code;
+
+ if ( pfont == 0 || plfont == 0 )
+ code = gs_note_error(gs_error_VMerror);
+ else
+ { /* Initialize general font boilerplate. */
+ code = pl_fill_in_font((gs_font *)pfont, plfont, pdir, mem, "illegal font");
+ if ( code >= 0 )
+ { /* Initialize MicroType font boilerplate. */
+ plfont->header = 0;
+ plfont->header_size = 0;
+ plfont->scaling_technology = plfst_MicroType;
+ plfont->font_type = plft_Unicode;
+ plfont->large_sizes = true;
+ plfont->is_xl_format = false;
+ plfont->allow_vertical_substitutes = false;
+ pl_fill_in_mt_font(pfont, handle, unique_id);
+ code = gs_definefont(pdir, (gs_font *)pfont);
+ }
+ }
+ if ( code < 0 )
+ { gs_free_object(mem, plfont, "pl_mt_load_font(pl_font_t)");
+ gs_free_object(mem, pfont, "pl_mt_load_font(gs_font_base)");
+ return code;
+ }
+ *pplfont = plfont;
+ return 0;
+}
diff --git a/pl/plulfont.c b/pl/plulfont.c
new file mode 100644
index 000000000..629a7e520
--- /dev/null
+++ b/pl/plulfont.c
@@ -0,0 +1,502 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plulfont.c */
+/* PCL5 font preloading */
+#include "stdio_.h"
+#include "string_.h"
+#include "gsmemory.h"
+#include "gstypes.h"
+#include "gp.h"
+#include "gpgetenv.h"
+#include "plfont.h"
+#include "pldict.h"
+#include "pllfont.h"
+#include "plftable.h"
+#include "plvalue.h"
+#include "gdebug.h"
+#include "gsstate.h"
+#include "gxfont.h"
+#include "uconfig.h"
+#undef true
+#undef false
+#undef frac_bits
+#include "cgconfig.h"
+#include "ufstport.h"
+#include "shareinc.h"
+#include "gxfapiu.h"
+
+
+/* the line printer font NB FIXME use a header file. */
+#include "plulp.c"
+/* global warning. ufst state structure passed to each ufst function */
+IF_STATE IFS;
+PIF_STATE pIFS = &IFS;
+
+
+/* GLOBAL Warning! NB fix me */
+/*
+ * fco and plugin handles which must be freed when the interpreter shuts down
+ */
+static SW16 fcHndlPlAry[16];
+static bool plugins_opened = false;
+
+/* NB fixme - we might as well require an environment variable for the
+ fco names and plugins, these change every UFST release */
+
+
+/* defaults for locations of font collection objects (fco's) and
+ plugins the root data directory. These are internally separated with
+ ':' but environment variable use the gp separator */
+#ifndef UFSTFONTDIR
+const char *UFSTFONTDIR="/usr/local/fontdata5.0/"; /* A bogus linux location */
+#endif
+
+/* default list of fcos and plugins - relative to UFSTFONTDIR */
+const char *UFSTFCOS="mtfonts/pclps2/mt3/pclp2_xj.fco:mtfonts/pcl45/mt3/wd____xh.fco";
+const char *UFSTPLUGINS="mtfonts/pcl45/mt3/plug__xi.fco";
+
+/* return a null terminated array of strings on the heap from
+ str0:str1:str:. Use gs separator */
+
+static
+char **build_strs(gs_memory_t *mem, char *str, char separator)
+{
+ int i;
+ char *start_path = str;
+ char *end_path = str;
+ char **list;
+
+ /* null str or 0 length string */
+ if (( str == NULL ) || ( str[0] == '\0' ))
+ return NULL;
+
+ for (i=0; ;i++) {
+ /* find next separator or NULL */
+ while( *end_path != (char)NULL && *end_path != separator )
+ end_path++;
+ /* reallocate the list that holds the string pointers */
+ if ( i == 0 )
+ /* first time */
+ list =
+ (char **)gs_alloc_bytes(mem,
+ ((i+1) + 1) /* terminating null */ * sizeof(char *),
+ "build_strs");
+ else
+ list = gs_resize_object(mem,
+ list,
+ ((i+1) + 1) /* terminating null */ * sizeof(char *),
+ "build_strs");
+ if ( list == NULL ) {
+ /* NB no fall back or freeing of memory already consumed */
+ dprintf("Fatal System Failure\n" );
+ return NULL;
+ }
+ /* terminate the list of strings */
+ list[i + 1] = (char *)NULL;
+ /* allocate space for the string */
+ list[i] = gs_alloc_bytes(mem,
+ end_path - start_path + 1 /* NULL term */,
+ "build_strs");
+
+ if ( list[i] == NULL ) {
+ /* NB no fall back or freeing of memory already consumed */
+ dprintf("Fatal System Failure\n" );
+ return NULL;
+ }
+
+ memcpy(list[i], start_path, end_path - start_path);
+ list[i][end_path - start_path] = (char)NULL;
+
+ if ( *end_path == (char)NULL )
+ break; /* done */
+ else { /* separator - continue */
+ start_path = end_path + 1;
+ end_path = start_path;
+ /* handle special case of separator ending the list */
+ if ( *end_path == '\0' )
+ break;
+ }
+ }
+ return list;
+}
+
+static void
+free_strs(gs_memory_t *mem, char **str_of_strs)
+{
+ int i;
+ for ( i = 0 ; str_of_strs[i]; i++ )
+ /* free string entry */
+ gs_free_object(mem, str_of_strs[i], "free_strs");
+ /* free container for freed strings */
+ gs_free_object(mem, str_of_strs, "free_strs");
+ return;
+
+}
+
+#define MAXPATHLEN 1024
+
+
+/* these are lists of fco's and plugins relative to the root directory
+ they can be set by an environment variable or defaults. */
+static char **
+pl_ufst_get_list(gs_memory_t *mem, char *key, char *defaultval)
+{
+ char pathname[MAXPATHLEN];
+ int pathlen = sizeof(pathname);
+
+ if ( gp_getenv(key, pathname, &pathlen) != 0 )
+ /* no env var use default */
+ return build_strs(mem, defaultval, ':');
+ else
+ return build_strs(mem, pathname, gp_file_name_list_separator);
+}
+
+void
+pl_ufst_root_dir(char *pathname, int pathlen)
+{
+ /* get the ufst root directory, check for an environment variable,
+ if not set return default */
+ if ( gp_getenv( "UFSTFONTDIR", pathname, &pathlen) != 0 )
+ strcpy(pathname, UFSTFONTDIR);
+ return;
+}
+
+/* check all table entries have a value in the font dictionary */
+#ifdef DEBUG
+void
+pl_check_fonts(pl_dict_t *pfontdict, bool use_unicode_names_for_keys)
+{
+ int j;
+ for ( j = 0; strlen(resident_table[j].full_font_name); j++ ) {
+ void *value;
+ /* lookup unicode key in the resident table */
+ if ( use_unicode_names_for_keys ) {
+ if ( !pl_dict_lookup(pfontdict,
+ resident_table[j].unicode_fontname,
+ sizeof(resident_table[j].unicode_fontname),
+ &value, true, NULL) /* return data ignored */ ) {
+ int i;
+ dprintf("Font with unicode key: ");
+ for (i = 0;
+ i < sizeof(resident_table[j].unicode_fontname)/sizeof(resident_table[j].unicode_fontname[0]);
+ i++) {
+ dprintf1("%c", (char)resident_table[j].unicode_fontname[i]);
+ }
+ dprintf1(" not available in font dictionary, resident table position: %d\n", j);
+ }
+ } else {
+ byte key[3];
+ key[2] = (byte)j;
+ key[0] = key[1] = 0;
+ if ( !pl_dict_lookup(pfontdict,
+ key,
+ sizeof(key),
+ &value, true, NULL) /* return data ignored */ )
+ dprintf2("%s not available in font dictionary, resident table position: %d\n",
+ resident_table[j].full_font_name, j);
+ }
+ }
+ return;
+}
+#endif
+
+int
+pl_load_built_in_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict,
+ gs_font_dir *pdir, int storage, bool use_unicode_names_for_keys)
+{
+ int i, k;
+ UW16 bSize, status = 0;
+ byte key[3];
+ UB8 pthnm[1024];
+ UB8 ufst_root_dir[1024];
+ char **fcos;
+ char **plugins;
+ /* don't load fonts more than once */
+ if (pl_dict_length(pfontdict, true) > 0)
+ return true;
+
+ pl_ufst_root_dir(ufst_root_dir, sizeof(ufst_root_dir));
+
+ status = gx_UFST_init(ufst_root_dir);
+
+ if (!plugins_opened) {
+
+ gx_UFST_close_static_fcos();
+ plugins = pl_ufst_get_list(mem, "UFSTPLUGINS", UFSTPLUGINS);
+ for (k = 0; plugins[k]; k++) {
+ strcpy((char *)pthnm, ufst_root_dir);
+ strcat((char *)pthnm, plugins[k]);
+ if ((status = gx_UFST_open_static_fco(pthnm, &fcHndlPlAry[k])) != 0) {
+ dprintf2("CGIFfco_Open error %d for %s\n", status, pthnm);
+ return FALSE;
+ }
+ if ((status = CGIFfco_Plugin(FSA fcHndlPlAry[k])) != 0) {
+ dprintf1("CGIFfco_Plugin error %d\n", status);
+ return FALSE;
+ }
+ }
+ free_strs(mem, plugins);
+ /* end of list */
+ fcHndlPlAry[k] = -1;
+ plugins_opened = true;
+ }
+ /* step on the callback expect FAPI todo the same on language switch */
+ plu_set_callbacks();
+
+ /*
+ * Open and install the various font collection objects.
+ *
+ * For each font collection object, step through the object until it is
+ * exhausted, placing any fonts found in the built_in_fonts dcitonary.
+ *
+ */
+ fcos = pl_ufst_get_list(mem, "UFSTFCOS", UFSTFCOS);
+ for (k = 0; fcos[k]; k++) {
+ SW16 fcoHandle;
+ /* build and open (get handle) for the k'th fco file name */
+ strcpy((char *)pthnm, ufst_root_dir);
+ strcat((char *)pthnm, fcos[k]);
+
+ fcoHandle = gx_UFST_find_fco_handle_by_name(pthnm);
+
+ if (fcoHandle == 0 &&
+ (status = gx_UFST_open_static_fco(pthnm, &fcoHandle)) != 0) {
+ dprintf2("CGIFfco_Open error %d for %s\n", status, pthnm);
+ continue;
+ }
+ /* enumerat the files in this fco */
+ for ( i = 0;
+ CGIFfco_Access(FSA pthnm, i, TFATRIB_KEY, &bSize, NULL) == 0;
+ i++, key[2] += 1 ) {
+ LPSB8 pBuffer = (LPSB8)gs_alloc_bytes( mem,
+ bSize,
+ "TTFONTINFO buffer" );
+
+ if (pBuffer == 0) {
+ dprintf1("VM error for built-in font %d", i);
+ continue;
+ }
+ status = CGIFfco_Access( FSA
+ pthnm,
+ i,
+ TFATRIB_KEY,
+ &bSize,
+ pBuffer );
+ if (status != 0)
+ dprintf1("CGIFfco_Access error %d\n", status);
+ else {
+ TTFONTINFOTYPE * pfDesc = (TTFONTINFOTYPE *)pBuffer;
+ LPSB8 pname = pBuffer + pfDesc->psname;
+ /* unfortunately agfa has 2 fonts named symbol. We
+ believe the font with internal number, NB, NB, NB */
+ LPSB8 symname = "SymbPS";
+ int j;
+ if ( pfDesc->pcltFontNumber == 24463 )
+ pname = symname;
+ for ( j = 0;
+ strlen(resident_table[j].full_font_name) &&
+ strcmp(resident_table[j].full_font_name, pname) != 0;
+ j++ )
+ ;
+ if ( strlen(resident_table[j].full_font_name) ) {
+ pl_font_t * plfont;
+ int err_cd = pl_load_mt_font(
+ fcoHandle,
+ pdir,
+ mem,
+ i,
+ &plfont );
+
+ if (err_cd != 0)
+ dprintf2("Error %d while loading font %s\n",
+ err_cd,
+ pname );
+ else {
+ uint pitch_cp = (pfDesc->spaceBand * 100.0)
+ / pfDesc->scaleFactor + 0.5;
+#ifdef DEBUG
+ if (gs_debug_c('=') )
+ dprintf2("Loading %s from fco %s\n", pname, fcos[k] );
+#endif
+ /* Record the differing points per inch value
+ for Intellifont derived fonts. */
+
+ if (pfDesc->scaleFactor == 8782) {
+ plfont->pts_per_inch = 72.307;
+ pitch_cp = (pfDesc->spaceBand * 100 * 72.0)
+ / (pfDesc->scaleFactor * 72.307) + 0.5;
+ }
+#ifdef DEBUG
+ if (gs_debug_c('=') )
+ dprintf3("scale factor=%d, pitch (cp)=%d per_inch_x100=%d\n", pfDesc->scaleFactor, pitch_cp, (uint)(720000.0/pitch_cp));
+#endif
+
+ if (resident_table[j].params.symbol_set != 0)
+ plfont->font_type = plft_8bit;
+
+ plfont->storage = storage;
+ plfont->data_are_permanent = false;
+ plfont->params = resident_table[j].params;
+
+ /*
+ * NB: though the TTFONTINFOTYPE structure has a
+ * pcltChComp field, it is not filled in by the UFST
+ * code (which just initializes it to 0). Hence, the
+ * hard-coded information in the resident font
+ * initialization structure is used.
+ */
+ memcpy( plfont->character_complement,
+ resident_table[j].character_complement,
+ 8 );
+
+ if ( use_unicode_names_for_keys )
+ pl_dict_put( pfontdict, resident_table[j].unicode_fontname, 32, plfont );
+ else {
+ key[2] = (byte)j;
+ key[0] = key[1] = 0;
+ pl_dict_put( pfontdict, key, sizeof(key), plfont );
+ }
+ }
+ } else {
+ ;
+#ifdef DEBUG
+ if (gs_debug_c('=') )
+ dprintf1("%s found in FCO but not used by PCL\n", pname);
+
+#endif
+ }
+
+ }
+
+ gs_free_object(mem, pBuffer, "TTFONTINFO buffer");
+ }
+ } /* end enumerate fco loop */
+ free_strs(mem, fcos);
+ /* finally add lineprinter NB return code ignored */
+ (void)pl_load_ufst_lineprinter(mem, pfontdict, pdir, storage, use_unicode_names_for_keys);
+#ifdef DEBUG
+ if (gs_debug_c('=') )
+ pl_check_fonts(pfontdict, use_unicode_names_for_keys);
+#endif
+ return TRUE;
+}
+
+int
+pl_load_ufst_lineprinter(gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir,
+ int storage, bool use_unicode_names_for_keys)
+{
+ const byte *header = pl_ulp_header;
+ const byte *char_data = pl_ulp_character_data;
+
+ pl_font_t *pplfont = pl_alloc_font(mem, "pl_load_ufst_lineprinter pplfont");
+ gs_font_base *pfont = gs_alloc_struct(mem, gs_font_base, &st_gs_font_base,
+ "pl_load_ufst_lineprinter pfont");
+ int code;
+
+ /* these shouldn't happen during system setup */
+ if (pplfont == 0 || pfont == 0)
+ return -1;
+ if (pl_fill_in_font(pfont, pplfont, pdir, mem, "lineprinter fonts") < 0)
+ return -1;
+
+ pl_fill_in_bitmap_font(pfont, gs_next_ids(mem, 1));
+
+ /* get lineprinter's parameters from the resident table and put
+ the font in the dictionary. */
+ {
+ int i = 0;
+ do i++; while (resident_table[i].params.typeface_family != 0);
+ pplfont->params = resident_table[i].params;
+ memcpy(pplfont->character_complement, resident_table[i].character_complement, 8);
+ /* make it msl */
+ pplfont->character_complement[7] |= 7;
+ if ( use_unicode_names_for_keys )
+ pl_dict_put(pfontdict, resident_table[i].unicode_fontname, 32, pplfont );
+ else {
+ byte key[3];
+ key[2] = (byte)i;
+ key[0] = key[1] = 0;
+ pl_dict_put(pfontdict, key, sizeof(key), pplfont);
+ }
+ }
+ pplfont->storage = storage; /* should be an internal font */
+ pplfont->data_are_permanent = true;
+ pplfont->header = (byte *)header;
+ pplfont->font_type = plft_MSL;
+ pplfont->scaling_technology = plfst_bitmap;
+ pplfont->is_xl_format = false;
+ pplfont->resolution.x = pplfont->resolution.y = 300;
+
+ code = pl_font_alloc_glyph_table(pplfont, 256, mem,
+ "pl_load_ufst_lineprinter pplfont (glyph table)");
+ if ( code < 0 )
+ return code;
+
+ while (1) {
+
+ uint width = pl_get_uint16(char_data + 12);
+ uint height = pl_get_uint16(char_data + 14);
+ uint ccode_plus_header_plus_data = 2 + 16 + (((width + 7) >> 3) * height);
+ int code = pl_font_add_glyph(pplfont, pl_get_uint16(char_data), char_data + 2);
+ if (code < 0)
+ /* shouldn't happen */
+ return -1;
+ /* calculate the offset of the next character code in the table */
+ char_data += ccode_plus_header_plus_data;
+
+ /* char code 0 is end of table */
+ if (pl_get_uint16(char_data) == 0)
+ break;
+ }
+ return gs_definefont(pdir, (gs_font *)pfont);
+}
+
+
+/*
+ * Close the font collection objects for the built-in fonts. This should be
+ * done whenever the built-in font dictionary is released.
+ */
+ void
+pl_close_built_in_fonts(pl_dict_t *builtinfonts)
+{
+ int i;
+
+ /* close fco's */
+ gx_UFST_close_static_fcos();
+
+ /* close plugins */
+ for ( i = 0; fcHndlPlAry[i] != -1; i++ ) {
+ CGIFfco_Close(FSA fcHndlPlAry[i]);
+ dprintf1("closing handle %d\n", fcHndlPlAry[i]);
+ }
+ gx_UFST_fini();
+}
+
+/* These are not implemented */
+
+/* load simm fonts given a path */
+ int
+pl_load_simm_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage)
+{
+ /* not implemented */
+ return 0;
+}
+
+/* load simm fonts given a path */
+ int
+pl_load_cartridge_fonts(const char *pathname, gs_memory_t *mem, pl_dict_t *pfontdict, gs_font_dir *pdir, int storage)
+{
+ /* not implemented */
+ return 0;
+}
diff --git a/pl/plvalue.c b/pl/plvalue.c
new file mode 100644
index 000000000..1b606e626
--- /dev/null
+++ b/pl/plvalue.c
@@ -0,0 +1,43 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plvalue.c */
+/* Accessors for big-endian multi-byte values */
+
+#include "std.h"
+#include "plvalue.h"
+
+#define get_uint16(bptr)\
+ (((bptr)[0] << 8) | (bptr)[1])
+#define get_int16(bptr)\
+ (((int)get_uint16(bptr) ^ 0x8000) - 0x8000)
+
+int
+pl_get_int16(const byte *bptr)
+{ return get_int16(bptr);
+}
+
+uint
+pl_get_uint16(const byte *bptr)
+{ return get_uint16(bptr);
+}
+
+long
+pl_get_int32(const byte *bptr)
+{ return ((long)get_int16(bptr) << 16) | get_uint16(bptr + 2);
+}
+
+ulong
+pl_get_uint32(const byte *bptr)
+{ return ((ulong)get_uint16(bptr) << 16) | get_uint16(bptr + 2);
+}
diff --git a/pl/plvalue.h b/pl/plvalue.h
new file mode 100644
index 000000000..393ca2d9e
--- /dev/null
+++ b/pl/plvalue.h
@@ -0,0 +1,25 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plvalue.h */
+/* Accessors for big-endian multi-byte values */
+
+#ifndef plvalue_INCLUDED
+# define plvalue_INCLUDED
+
+int pl_get_int16(const byte *bptr);
+uint pl_get_uint16(const byte *bptr);
+long pl_get_int32(const byte *bptr);
+ulong pl_get_uint32(const byte *bptr);
+
+#endif /* plvalue_INCLUDED */
diff --git a/pl/plvocab.c b/pl/plvocab.c
new file mode 100644
index 000000000..b52fbb250
--- /dev/null
+++ b/pl/plvocab.c
@@ -0,0 +1,798 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plvocab.c */
+/* Maps between glyph vocabularies */
+#include "stdpre.h"
+#include "plvocab.h"
+
+/* Define an entry in a glyph mapping table. */
+/* Glyph mapping tables are sorted by key. */
+typedef struct pl_glyph_mapping_s {
+ ushort key;
+ ushort value;
+} pl_glyph_mapping_t;
+
+/* Map from MSL to Unicode. Derived from the HP book of characters
+ and the HP comparison guide appendix D. */
+static const pl_glyph_mapping_t pl_map_m2u[] = {
+ {0, 0x0020}, /* space code */
+ {1, 0x0021}, /* exclamation mark */ /* u */
+ {2, 0x0022}, /* Neutral Double Quote */ /* u */
+ {3, 0x0023}, /* Number Sign */ /* u */
+ {4, 0x0024}, /* dollar sign */ /* u */
+ {5, 0x0025}, /* Per Cent Sign */ /* u */
+ {6, 0x0026}, /* ampersand */ /* u */
+ {8, 0x2019}, /* Single Close Quote (9) */ /* u */
+ {9, 0x0028}, /* Left Parenthesis */ /* u */
+ {10, 0x0029}, /* Right Parenthesis */ /* u */
+ {11, 0x002A}, /* asterisk */ /* u */
+ {12, 0x002B}, /* Plus Sign */ /* u */
+ {13, 0x002C}, /* Comma, Decimal Separator */ /* u */
+ {14, 0x002D}, /* Hyphen */ /* u */
+ {15, 0x002E}, /* period */ /* u */
+ {16, 0x002F}, /* Solidus, Slash */ /* u */
+ {17, 0x0030}, /* Numeral Zero */ /* u */
+ {18, 0x0031}, /* Numeral One */ /* u */
+ {19, 0x0032}, /* Numeral Two */ /* u */
+ {20, 0x0033}, /* Numeral Three */ /* u */
+ {21, 0x0034}, /* Numeral Four */ /* u */
+ {22, 0x0035}, /* Numeral Five */ /* u */
+ {23, 0x0036}, /* Numeral Six */ /* u */
+ {24, 0x0037}, /* Numeral Seven */ /* u */
+ {25, 0x0038}, /* Numeral Eight */ /* u */
+ {26, 0x0039}, /* Numeral Nine */ /* u */
+ {27, 0x003A}, /* colon */ /* u */
+ {28, 0x003B}, /* Semicolon */ /* u */
+ {29, 0x003C}, /* Less Than Sign */ /* u */
+ {30, 0x003D}, /* Equals Sign */ /* u */
+ {31, 0x003E}, /* Greater Than Sign */ /* u */
+ {32, 0x003F}, /* question mark */ /* u */
+ {33, 0x0040}, /* Commercial At Sign */ /* u */
+ {34, 0x0041}, /* Uppercase A */ /* u */
+ {35, 0x0042}, /* Uppercase B */ /* u */
+ {36, 0x0043}, /* Uppercase C */ /* u */
+ {37, 0x0044}, /* Uppercase D */ /* u */
+ {38, 0x0045}, /* Uppercase E */ /* u */
+ {39, 0x0046}, /* Uppercase F */ /* u */
+ {40, 0x0047}, /* Uppercase G */ /* u */
+ {41, 0x0048}, /* Uppercase H */ /* u */
+ {42, 0x0049}, /* Uppercase I */ /* u */
+ {43, 0x004A}, /* Uppercase J */ /* u */
+ {44, 0x004B}, /* Uppercase K */ /* u */
+ {45, 0x004C}, /* Uppercase L */ /* u */
+ {46, 0x004D}, /* Uppercase M */ /* u */
+ {47, 0x004E}, /* Uppercase N */ /* u */
+ {48, 0x004F}, /* Uppercase O */ /* u */
+ {49, 0x0050}, /* Uppercase P */ /* u */
+ {50, 0x0051}, /* Uppercase Q */ /* u */
+ {51, 0x0052}, /* Uppercase R */ /* u */
+ {52, 0x0053}, /* Uppercase S */ /* u */
+ {53, 0x0054}, /* Uppercase T */ /* u */
+ {54, 0x0055}, /* Uppercase U */ /* u */
+ {55, 0x0056}, /* Uppercase V */ /* u */
+ {56, 0x0057}, /* Uppercase W */ /* u */
+ {57, 0x0058}, /* Uppercase X */ /* u */
+ {58, 0x0059}, /* Uppercase Y */ /* u */
+ {59, 0x005A}, /* Uppercase Z */ /* u */
+ {60, 0x005B}, /* Left Bracket */ /* u */
+ {61, 0x005C}, /* Rev Solidus, Backslash */ /* u */
+ {62, 0x005D}, /* Right Bracket */ /* u */
+ {63, 0x005E}, /* ASCII Circumflex */ /* u */
+
+ {64, 0x005F}, /* Underline, Underscore */ /* u */
+ {66, 0x2018}, /* Single Open Quote (6) */ /* u */
+ {67, 0x0061}, /* Lowercase A */ /* u */
+ {68, 0x0062}, /* Lowercase B */ /* u */
+ {69, 0x0063}, /* Lowercase C */ /* u */
+ {70, 0x0064}, /* Lowercase D */ /* u */
+ {71, 0x0065}, /* Lowercase E */ /* u */
+ {72, 0x0066}, /* Lowercase F */ /* u */
+ {73, 0x0067}, /* Lowercase G */ /* u */
+ {74, 0x0068}, /* Lowercase H */ /* u */
+ {75, 0x0069}, /* Lowercase I */ /* u */
+ {76, 0x006A}, /* Lowercase J */ /* u */
+ {77, 0x006B}, /* Lowercase K */ /* u */
+ {78, 0x006C}, /* Lowercase L */ /* u */
+ {79, 0x006D}, /* Lowercase M */ /* u */
+ {80, 0x006E}, /* Lowercase N */ /* u */
+ {81, 0x006F}, /* Lowercase O */ /* u */
+ {82, 0x0070}, /* Lowercase P */ /* u */
+ {83, 0x0071}, /* Lowercase Q */ /* u */
+ {84, 0x0072}, /* Lowercase R */ /* u */
+ {85, 0x0073}, /* Lowercase S */ /* u */
+ {86, 0x0074}, /* Lowercase T */ /* u */
+ {87, 0x0075}, /* Lowercase U */ /* u */
+ {88, 0x0076}, /* Lowercase V */ /* u */
+ {89, 0x0077}, /* Lowercase W */ /* u */
+ {90, 0x0078}, /* Lowercase X */ /* u */
+ {91, 0x0079}, /* Lowercase Y */ /* u */
+ {92, 0x007A}, /* Lowercase Z */ /* u */
+ {93, 0x007B}, /* Left Brace */ /* u */
+ {94, 0x007C}, /* Long Vertical Mark */ /* u */
+ {95, 0x007D}, /* Right Brace */ /* u */
+ {96, 0x007E}, /* 1 Wavy Line Approx */ /* u */
+ {97, 0x2592}, /* Medium Shading */ /* u */
+ {99, 0x00C0}, /* Uppercase A Grave */ /* u */
+ {100, 0x00C2}, /* Uppercase A Circumflex */ /* u */
+ {101, 0x00C8}, /* Uppercase E Grave */ /* u */
+ {102, 0x00CA}, /* Uppercase E Circumflex */ /* u */
+ {103, 0x00CB}, /* Uppercase E Dieresis */ /* u */
+ {104, 0x00CE}, /* Uppercase I Circumflex */ /* u */
+ {105, 0x00CF}, /* Uppercase I Dieresis */ /* u */
+ {106, 0x00B4}, /* Lowercase Acute */ /* u */
+ {107, 0x0060}, /* Lowercase Grave */ /* u */
+ {108, 0x02C6}, /* Lowercase Circumflex *//* u */ /* ? 5E ? */
+ {109, 0x00A8}, /* Lowercase Dieresis */ /* u */
+ {110, 0x02DC}, /* Lowercase Tilde */ /* u */ /* ? 7E ? */
+ {111, 0x00D9}, /* Uppercase U Grave */ /* u */
+ {112, 0x00DB}, /* Uppercase U Circumflex */ /* u */
+ {113, 0x00AF}, /* Overline, Overscore */ /* u */
+ {114, 0x00DD}, /* Uppercase Y Acute */ /* u */
+ {115, 0x00FD}, /* Lowercase Y Acute */ /* u */
+ {116, 0x00B0}, /* Degree Sign */ /* u */
+ {117, 0x00C7}, /* Uppercase C Cedilla */ /* u */
+ {118, 0x00E7}, /* Lowercase C Cedilla */ /* u */
+ {119, 0x00D1}, /* Uppercase N tilde */ /* u */
+ {120, 0x00F1}, /* Lowercase N tilde */ /* u */
+ {121, 0x00A1}, /* Inverted Exclamation Mark */ /* u */
+ {122, 0x00BF}, /* Inverted Question Mark */ /* u */
+ {123, 0x00A4}, /* Currency Symbol */ /* u */
+ {124, 0x00A3}, /* Pound Sterling Sign */ /* u */
+ {125, 0x00A5}, /* Yen Sign */ /* u */
+ {126, 0x00A7}, /* Section Mark */ /* u */
+ {127, 0x0192}, /* Florin Sign */ /* u */
+ {128, 0x00A2}, /* Cent Sign */ /* u */
+ {129, 0x00E2}, /* Lowercase A Circumflex */ /* u */
+ {130, 0x00EA}, /* Lowercase E Circumflex */ /* u */
+ {131, 0x00F4}, /* Lowercase O Circumflex */ /* u */
+ {132, 0x00FB}, /* Lowercase U Circumflex */ /* u */
+ {133, 0x00E1}, /* Lowercase A Acute */ /* u */
+ {134, 0x00E9}, /* Lowercase E Acute */ /* u */
+ {135, 0x00F3}, /* Lowercase O Acute */ /* u */
+ {136, 0x00FA}, /* Lowercase U Acute */ /* u */
+ {137, 0x00E0}, /* Lowercase A Grave */ /* u */
+ {138, 0x00E8}, /* Lowercase E Grave */ /* u */
+ {139, 0x00F2}, /* Lowercase O Grave */ /* u */
+ {140, 0x00F9}, /* Lowercase U Grave */ /* u */
+ {141, 0x00E4}, /* Lowercase A Dieresis */ /* u */
+ {142, 0x00EB}, /* Lowercase E Dieresis */ /* u */
+ {143, 0x00F6}, /* Lowercase O Dieresis */ /* u */
+ {144, 0x00FC}, /* Lowercase U Dieresis */ /* u */
+ {145, 0x00C5}, /* Uppercase A Ring */ /* u */
+ {146, 0x00EE}, /* Lowercase I Circumflex */ /* u */
+ {147, 0x00D8}, /* Uppercase O Oblique */ /* u */
+ {148, 0x00C6}, /* Uppercase AE Diphthong */ /* u */
+ {149, 0x00E5}, /* Lowercase A Ring */ /* u */
+ {150, 0x00ED}, /* Lowercase I Acute */ /* u */
+ {151, 0x00F8}, /* Lowercase O Oblique */ /* u */
+ {152, 0x00E6}, /* Lowercase AE Diphthong */ /* u */
+ {153, 0x00C4}, /* Uppercase A Dieresis */ /* u */
+ {154, 0x00EC}, /* Lowercase I Grave */ /* u */
+ {155, 0x00D6}, /* Uppercase O Dieresis */ /* u */
+ {156, 0x00DC}, /* Uppercase U Dieresis */ /* u */
+ {157, 0x00C9}, /* Uppercase E Acute */ /* u */
+ {158, 0x00EF}, /* Lowercase I Dieresis */ /* u */
+ {159, 0x00DF}, /* Lowercase Es-zet Ligature */ /* u */
+ {160, 0x00D4}, /* Uppercase O Circumflex */ /* u */
+ {161, 0x00C1}, /* Uppercase A Acute */ /* u */
+ {162, 0x00C3}, /* Uppercase A Tilde */ /* u */
+ {163, 0x00E3}, /* Lowercase A Tilde */ /* u */
+ {164, 0x00D0}, /* Uppercase Eth, D-stroke *//* u */
+ {165, 0x00F0}, /* Lowercase Eth */ /* u */
+ {166, 0x00CD}, /* Uppercase I Acute */ /* u */
+ {167, 0x00CC}, /* Uppercase I Grave */ /* u */
+ {168, 0x00D3}, /* Uppercase O Acute */ /* u */
+ {169, 0x00D2}, /* Uppercase O Grave */ /* u */
+ {170, 0x00D5}, /* Uppercase O Tilde */ /* u */
+ {171, 0x00F5}, /* Lowercase O Tilde */ /* u */
+ {172, 0x0160}, /* Uppercase S Hacek */ /* u */
+ {173, 0x0161}, /* Lowercase S Hacek */ /* u */
+ {174, 0x00DA}, /* Uppercase U Acute */ /* u */
+ {175, 0x0178}, /* Uppercase Y Dieresis */ /* u */
+ {176, 0x00FF}, /* Lowercase Y Dieresis */ /* u */
+ {177, 0x00DE}, /* Uppercase Thorn */ /* u */
+ {178, 0x00FE}, /* Lowercase Thorn */ /* u */
+ {179, 0x00B7}, /* Lowercase Middle Dot */ /* u */
+ {180, 0x00B5}, /* Lowercase Mu, Micro */ /* u */
+ {181, 0x00B6}, /* Pilcrow, Paragraph */ /* u */
+ {182, 0x00BE}, /* Vulgar Fraction 3/4 */ /* u */
+ {183, 0x2212}, /* Minus Sign */ /* u */
+ {184, 0x00BC}, /* Vulgar Fraction 1/4 */ /* u */
+ {185, 0x00BD}, /* Vulgar Fraction 1/2 */ /* u */
+ {186, 0x00AA}, /* Female Ordinal */ /* u */
+ {187, 0x00BA}, /* Mail Ordinal */ /* u */
+ {188, 0x00AB}, /* Dbl lft point Ang Quote */ /* u */
+ {189, 0x25A0}, /* Medium Solid Box */
+ {190, 0x00BB}, /* Dbl rt point Ang Quote */ /* u */
+ {191, 0x00B1}, /* Plus Over Minus Sign */ /* u */
+ {192, 0x00A6}, /* Broken Vertical Mark */ /* u */
+ {193, 0x00A9}, /* Copyright Sign, Sup */ /* u */
+ {194, 0x00AC}, /* Not Sign */ /* u */
+ {195, 0x00AD}, /* Soft Hyphen */ /* u */
+ {196, 0x00AE}, /* Registered Sign, Sup */ /* u */
+ {197, 0x00B2}, /* Superior Numeral 2 */ /* u */
+ {198, 0x00B3}, /* Superior Numeral 3 */ /* u */
+ {199, 0x00B8}, /* Lowercase Cedilla */ /* u */
+ {200, 0x00B9}, /* Superior Numeral 1 */ /* u */
+ {201, 0x00D7}, /* Multiply Sign */ /* u */
+ {202, 0x00F7}, /* Divide Sign */ /* u */
+ {203, 0x263A}, /* Open Smiling Face */
+ {204, 0x263B}, /* Solid Smiling Face */
+ {205, 0x2665}, /* Solid Heart */
+ {206, 0x2666}, /* Solid Diamond */
+ {207, 0x2663}, /* Solid Club */
+ {208, 0x2660}, /* Solid Spade */
+ {209, 0x2022}, /* Medium Solid Bullet */ /* (PC), 0x25CF (other) */
+ {210, 0x25DB}, /* Large Solid Sq/Open Dot */
+ {211, 0x25CB}, /* Large Open Bullet */ /* (PC only) */
+ {212, 0x25D9}, /* Large Solid Sq/Open Ring */
+ {213, 0x2642}, /* Male Symbol */
+ {214, 0x2640}, /* Female Symbol */
+ {215, 0x266A}, /* Musical Note */
+ {216, 0x266B}, /* Pair of Musical Notes */
+ {217, 0x263C}, /* Compass, 8 Pointed Sun */
+ {218, 0x25BA}, /* Right Solid Arrowhead */
+ {219, 0x25C4}, /* Left Solid Arrowhead */
+ {220, 0x2195}, /* Up/Down Arrow */
+ {221, 0x203C}, /* Double Exclamation Mark */ /* u */
+ {222, 0x25AC}, /* Thick Horizontal Mark */
+ {223, 0x21A8}, /* Up/Down Arrow Baseline */
+ {224, 0x2191}, /* Up Arrow */
+ {225, 0x2193}, /* Down Arrow */
+ {226, 0x2192}, /* Right Arrow */
+ {227, 0x2190}, /* Left Arrow */
+ {228, 0x221F}, /* Tick Up at Left */
+ {229, 0x2194}, /* Left/Right Arrow */
+ {230, 0x25B2}, /* Up Solid Arrowhead */
+ {231, 0x25BC}, /* Down Solid Arrowhead */
+ {232, 0x20A7}, /* Pesetas */ /* u */
+ {233, 0x2310}, /* Tick Down at Left */ /* u */
+ {234, 0x2591}, /* Light Shading */
+ {235, 0x2593}, /* Dark Shading */
+ {236, 0x2502}, /* Vertical 1 */
+ {237, 0x2524}, /* Left 1 Vertical 1 */
+ {238, 0x2561}, /* Left 2 Vertical 1 */
+ {239, 0x2562}, /* Left 1 Vertical 2 */
+ {240, 0x2556}, /* Left 1 Down 2 */
+ {241, 0x2555}, /* Left 2 Down 1 */
+ {242, 0x2563}, /* Left 2 Verical 2 */
+ {243, 0x2551}, /* Vertical 2 */
+ {244, 0x2557}, /* Left 2 Down 2 */
+ {245, 0x255d}, /* Left 2 Up 2 */
+ {246, 0x255c}, /* Left 1 Up 2 */
+ {247, 0x255b}, /* Left 2 Up 1 */
+ {248, 0x2510}, /* Left 1 Down 1 */
+ {249, 0x2514}, /* Right 1 Up 1 */
+ {250, 0x2534}, /* Horizontal 1 Up 1 */
+ {251, 0x252c}, /* Horizontal 1 Down 1 */
+ {252, 0x251c}, /* Right 1 Vertical 1 */
+ {253, 0x2500}, /* Horizontal 1 */
+ {254, 0x253c}, /* Horizontal 1 Vertical 1 */
+ {255, 0x255e}, /* Right 2 Vertical 1 */
+ {256, 0x255f}, /* Right 1 Vertical 2 */
+ {257, 0x255a}, /* Right 2 Up 2 */
+ {258, 0x2554}, /* Right 2 Down 2 */
+ {259, 0x2569}, /* Horizontal 2 Up 2 */
+ {260, 0x2566}, /* Horizontal 2 Down 2 */
+ {261, 0x2560}, /* Right 2 Vertical 2 */
+ {262, 0x2550}, /* Horizontal 2 */
+ {263, 0x256c}, /* Horizontal 2 Vertical 2 */
+ {264, 0x2567}, /* Horizontal 2 Up 1 */
+ {265, 0x2568}, /* Horizontal 1 Up 2 */
+ {266, 0x2564}, /* Horizontal 2 Down 1 */
+ {267, 0x2565}, /* Horizontal 1 Down 2 */
+ {268, 0x2559}, /* Right 1 Up 2 */
+ {269, 0x2558}, /* Right 2 Up 1 */
+ {270, 0x2552}, /* Right 2 Down 1 */
+ {271, 0x2553}, /* Right 1 Down 2 */
+ {272, 0x256b}, /* Horizontal 1 Vertical 2 */
+ {273, 0x256a}, /* Horizontal 2 Vertical 1 */
+ {274, 0x2518}, /* Left 1 Up 1 */
+ {275, 0x250c}, /* Right 1 Down 1 */
+ {276, 0x2588}, /* Solid Full Rectangle */
+ {277, 0x2584}, /* Bottom 1/2 Solid Rectangle */
+ {278, 0x258c}, /* Left 1/2 Solid Rectangle */
+ {279, 0x2590}, /* Right 1/2 Solid Rectangle */
+ {280, 0x2580}, /* Top 1/2 Solid Rectangle */
+ {281, 0x03B1}, /* Lowercase Greek Alpha */ /* u */
+ {283, 0x0393}, /* Uppercase Greek Gamma */ /* u */
+ {284, 0x03C0}, /* Lowercase Greek Pi */ /* u */
+ {285, 0xFFFF}, /* Uppercase Greek Sigma */
+ {286, 0x03C3}, /* Lowercase Greek Sigma */ /* u */
+ {287, 0x03C4}, /* Lowercase Greek Tau */ /* u */
+ {288, 0x03A6}, /* Uppercase Greek Phi */ /* u */
+ {289, 0x0398}, /* Uppercase Greek Theta */ /* u */
+ {290, 0x2126}, /* Uppercase Omega, Ohms */ /* u */
+ {291, 0x03B4}, /* Lowercase Greek Delta */ /* u */
+ {292, 0x221E}, /* Infinity Sign */ /* u */
+ {293, 0x03C6}, /* Lowercase Greek Phi */ /* u */
+ {294, 0x03B5}, /* Lowercase Greek Epsilon */ /* u */
+ {295, 0x2229}, /* Set Intersection */ /* u */
+ {296, 0x2261}, /* Exactly Equals */ /* u */
+ {297, 0x2265}, /* Greater Than/Equal To */ /* u */
+ {298, 0x2264}, /* Less Than/Equal To */ /* u */
+ {299, 0x2320}, /* Top Segment Integral */
+ {300, 0x2321}, /* Bottom Segment Integral */
+ {301, 0x2248}, /* 2 Wavy Line Approx */ /* u */
+ {302, 0x2219}, /* Center Period */ /* u */
+ {303, 0x221A}, /* Radical Symbol */ /* u */
+ {305, 0x25A0}, /* Small Solid Box */ /* (PC), 0x25AA (other) */
+ {306, 0x013F}, /* Uppercase L Dot */ /* u */
+ {307, 0x0140}, /* Lowercase L-Dot */ /* u */
+ {308, 0x2113}, /* Litre Symbol */ /* u */
+ {309, 0x0149}, /* Lowercase Apostrophe-N */ /* u */
+ {310, 0x2032}, /* Prime */ /* u */
+ {311, 0x2033}, /* Double Prime */ /* u */
+ {312, 0x2020}, /* Dagger Symbol */ /* u */
+ {313, 0x2122}, /* Trademark Sign, Sup */ /* u */
+ {314, 0x2017}, /* Double Underline */
+ {315, 0x02C7}, /* Lowercase Hacek */ /* u */
+ {316, 0x02DA}, /* Lowercase Ring */ /* u */
+ {317, 0x02CA}, /* Uppercase Acute */
+ {318, 0x02CB}, /* Uppercase Grave */
+ {319, 0x02C6}, /* Uppercase Circumflex */
+ {320, 0x00A8}, /* Uppercase Dieresis */
+ {321, 0x02DC}, /* Uppercase Tilde */
+ {322, 0x02C7}, /* Uppercase Hacek */
+ {323, 0x02DA}, /* Uppercase Ring */
+ {324, 0x2215}, /* Vulgar Fraction Bar */ /* u */
+ {325, 0x2014}, /* Em Dash */ /* u */
+ {326, 0x2013}, /* En Dash */ /* u */
+ {327, 0x2021}, /* Double Dagger Symbol */ /* u */
+ {328, 0x0131}, /* Lowercase Undotted I */ /* u */
+ {329, 0x0027}, /* Neutral Single Quote */ /* u */
+ {330, 0x00B8}, /* Uppercase Cedilla */
+ {331, 0x2022}, /* Small Solid Bullet */ /* u */
+ {332, 0x207F}, /* Superior Lowercase N */ /* u */
+ {333, 0x2302}, /* Home Plate */
+ {335, 0x0138}, /* Lowercase Greenlandic Kra */ /* u */
+ {338, 0x0166}, /* Uppercase T-Stroke */ /* u */
+ {339, 0x0167}, /* Lowercase T-Stroke */ /* u */
+ {340, 0x014A}, /* Uppercase Eng */ /* u */
+ {341, 0x014B}, /* Lowercase Eng */ /* u */
+ {342, 0x0111}, /* Lowercase D-Stroke */ /* u */
+ {400, 0x0102}, /* Uppercase A Breve */ /* u */
+ {401, 0x0103}, /* Lowercase A Breve */ /* u */
+ {402, 0x0100}, /* Uppercase A Macron */ /* u */
+ {403, 0x0101}, /* Lowercase A Macron */ /* u */
+ {404, 0x0104}, /* Uppercase A Ogonek */ /* u */
+ {405, 0x0105}, /* Lowercase A Ogonek */ /* u */
+ {406, 0x0106}, /* Uppercase C Acute */ /* u */
+ {407, 0x0107}, /* Lowercase C Acute */ /* u */
+ {410, 0x010C}, /* Uppercase C Hacek */ /* u */
+ {411, 0x010D}, /* Lowercase C Hacek */ /* u */
+ {414, 0x010E}, /* Uppercase D Hacek */ /* u */
+ {415, 0x010F}, /* Lowercase D Hacek */ /* u */
+ {416, 0x011A}, /* Uppercase E Hacek */ /* u */
+ {417, 0x011B}, /* Lowercase E Hacek */ /* u */
+ {418, 0x0116}, /* Uppercase E Overdot */ /* u */
+ {419, 0x0117}, /* Lowercase E Overdot */ /* u */
+ {420, 0x0112}, /* Uppercase E Macron */ /* u */
+ {421, 0x0113}, /* Lowercase E Macron */ /* u */
+ {422, 0x0118}, /* Uppercase E Ogonek */ /* u */
+ {423, 0x0119}, /* Lowercase E Ogonek */ /* u */
+ {428, 0x0122}, /* Uppercase G Cedilla */ /* u */
+ {429, 0x0123}, /* Lowercase G Cedilla */ /* u */
+ {432, 0x012E}, /* Uppercase I Ogonek */ /* u */
+ {433, 0x012F}, /* Lowercase I Ogonek */ /* u */
+ {434, 0x012A}, /* Uppercase I Macron */ /* u */
+ {435, 0x012B}, /* Lowercase I Macron */ /* u */
+ {438, 0x0136}, /* Uppercase K Cedilla */ /* u */
+ {439, 0x0137}, /* Lowercase K Cedilla */ /* u */
+ {440, 0x0139}, /* Uppercase L Acute */ /* u */
+ {441, 0x013A}, /* Lowercase L Acute */ /* u */
+ {442, 0x013D}, /* Uppercase L Hacek */ /* u */
+ {443, 0x013E}, /* Lowercase L Hacek */ /* u */
+ {444, 0x013B}, /* Uppercase L Cedilla */ /* u */
+ {445, 0x013C}, /* Lowercase L Cedilla */ /* u */
+ {446, 0x0143}, /* Uppercase N Acute */ /* u */
+ {447, 0x0144}, /* Lowercase N Acute */ /* u */
+ {448, 0x0147}, /* Uppercase N Hacek */ /* u */
+ {449, 0x0148}, /* Lowercase N Hacek */ /* u */
+ {450, 0x0145}, /* Uppercase N Cedilla */ /* u */
+ {451, 0x0146}, /* Lowercase N Cedilla */ /* u */
+ {452, 0x0150}, /* Uppercase O Dbl Acute */ /* u */
+ {453, 0x0151}, /* Lowercase O Dbl Acute */ /* u */
+ {454, 0x014C}, /* Uppercase O Macron */ /* u */
+ {455, 0x014D}, /* Lowercase O Macron */ /* u */
+ {456, 0x0154}, /* Uppercase R Acute */ /* u */
+ {457, 0x0155}, /* Lowercase R Acute */ /* u */
+ {458, 0x0158}, /* Uppercase R Hacek */ /* u */
+ {459, 0x0159}, /* Lowercase R Hacek */ /* u */
+ {460, 0x0156}, /* Uppercase R Cedilla */ /* u */
+ {461, 0x0157}, /* Lowercase R Cedilla */ /* u */
+ {462, 0x015A}, /* Uppercase S Acute */ /* u */
+ {463, 0x015B}, /* Lowercase S Acute */ /* u */
+ {466, 0x0164}, /* Uppercase T Hacek */ /* u */
+ {467, 0x0165}, /* Lowercase T Hacek */ /* u */
+ {468, 0x0162}, /* Uppercase T Cedilla */ /* u */
+ {469, 0x0163}, /* Lowercase T Cedilla */ /* u */
+ {470, 0x0168}, /* Uppercase U Tilde */ /* u */
+ {471, 0x0169}, /* Lowercase U Tilde */ /* u */
+ {474, 0x0170}, /* Uppercase U Double Acute */ /* u */
+ {475, 0x0171}, /* Lowercase U Double Acute */ /* u */
+ {476, 0x016E}, /* Uppercase U Ring */ /* u */
+ {477, 0x016F}, /* Lowercase U Ring */ /* u */
+ {478, 0x016A}, /* Uppercase U Macron */ /* u */
+ {479, 0x016B}, /* Lowercase U Macron */ /* u */
+ {480, 0x0172}, /* Uppercase U Ogonek */ /* u */
+ {481, 0x0173}, /* Lowercase U Ogonek */ /* u */
+ {482, 0x0179}, /* Uppercase Z Acute */ /* u */
+ {483, 0x017A}, /* Lowercase Z Acute */ /* u */
+ {484, 0x017B}, /* Uppercase Z Overdot */ /* u */
+ {485, 0x017C}, /* Lowercase Z Overdot */ /* u */
+ {486, 0x0128}, /* Uppercase I Tilde */ /* u */
+ {487, 0x0129}, /* Lowercase I Tilde */ /* u */
+ {500, 0x221A}, /* Radical Segment */
+ {501, 0x221D}, /* Proportional To Symbol */
+ {502, 0x212F}, /* Lowercase Italic E */
+ {503, 0xFFFF}, /* Alternate LC Epsilon */
+ {504, 0x22C5}, /* Therefore */
+ {505, 0x0393}, /* Uppercase Greek Gamma */
+ {506, 0x2206}, /* Uppercase Greek Delta */ /* u */
+ {507, 0xFFFF}, /* Uppercase Greek Theta */
+ {508, 0xFFFF}, /* Uppercase Greek Lambda */
+ {509, 0xFFFF}, /* Uppercase Greek Xi */
+ {510, 0xFFFF}, /* Uppercase Greek Pi */
+ {511, 0xFFFF}, /* Uppercase Greek Sigma */
+
+ {512, 0x03a5}, /* Uppercase Greek Upsilon */
+ {513, 0xFFFF}, /* Uppercase Greek Phi */
+ {514, 0xFFFF}, /* Uppercase Greek Psi */
+ {515, 0xFFFF}, /* Uppercase Greek Omega */
+ {516, 0xFFFF}, /* Nabla Symbol */
+ {517, 0x2202}, /* Partial Diff Symbol */ /* u */
+ {518, 0xFFFF}, /* Terminal Symbol */
+ {519, 0x2260}, /* Not Equal To Symbol */ /* u */
+ {520, 0xFFFF}, /* Underline, Composite */
+ {521, 0xFFFF}, /* Because */
+ {522, 0x03B1}, /* Lowercase Greek Alpha */
+ {523, 0xFFFF}, /* Lowercase Greek Beta */
+ {524, 0xFFFF}, /* Lowercase Greek Gamma */
+ {525, 0x03B4}, /* Lowercase Greek Delta */
+ {526, 0x03B5}, /* Lowercase Greek Epsilon */
+ {527, 0xFFFF}, /* Lowercase Greek Zeta */
+ {528, 0xFFFF}, /* Lowercase Greek Eta */
+ {529, 0xFFFF}, /* Lowercase Greek Theta */
+ {530, 0xFFFF}, /* Lowercase Greek Iota */
+ {531, 0xFFFF}, /* Lowercase Greek Kappa */
+ {532, 0xFFFF}, /* Lowercase Greek Lambda */
+ {533, 0xFFFF}, /* Lowercase Greek Mu */
+ {534, 0xFFFF}, /* Lowercase Greek Nu */
+ {535, 0x03BE}, /* Lowercase Greek Xi */
+ {536, 0x03BF}, /* Lowercase Greek Omicron */
+ {537, 0x03C0}, /* Lowercase Greek Pi */ /* u */
+ {538, 0xFFFF}, /* Lowercase Greek Rho */
+ {539, 0x03C3}, /* Lowercase Greek Sigma */
+ {540, 0x03C4}, /* Lowercase Greek Tau */
+ {541, 0xFFFF}, /* Lowercase Greek Upsilon */
+ {542, 0x03C6}, /* Lowercase Greek Phi */
+ {543, 0xFFFF}, /* Lowercase Greek Chi */
+ {544, 0xFFFF}, /* Lowercase Greek Psi */
+ {545, 0xFFFF}, /* Lowercase Greek Omega */
+ {546, 0xFFFF}, /* Open LC Greek Theta */
+ {547, 0x03C6}, /* Open LC Greek Phi */
+ {548, 0xFFFF}, /* Alternate LC Pi */
+ {549, 0x2243}, /* Wavy/Straight Approx */
+ {550, 0x2262}, /* Not Exactly Equal To */
+ {551, 0xFFFF}, /* Up Arrow Dbl Stroke */
+ {552, 0x21D2}, /* Right Arrow Dbl Stroke */
+ {553, 0x21D3}, /* Down Arrow Dbl Stroke */
+ {554, 0x21D0}, /* Left Arrow Dbl Stroke */
+ {555, 0x21D5}, /* Up/Dn Arrow Dbl Stroke */
+ {556, 0x21D4}, /* Lft/Rt Arrow Dbl Stroke */
+ {557, 0x21C4}, /* Right Over Left Arrow */
+ {558, 0x21C6}, /* Left Over Right Arrow */
+ {559, 0xFFFF}, /* Vector Symbol */
+ {560, 0xFFFF}, /* Overline, Composite */
+ {561, 0x2200}, /* For All Symbol */
+ {562, 0xFFFF}, /* There Exists Symbol */
+ {563, 0xFFFF}, /* Top Symbol */
+ {564, 0xFFFF}, /* Bottom Symbol */
+ {565, 0x222A}, /* Set Union Symbol */
+ {566, 0x2208}, /* Element Of Symbol */
+ {567, 0x220B}, /* Contains Symbol */
+ {568, 0x2209}, /* Not Element Of Symbol */
+ {569, 0x2282}, /* Proper Subset Symbol */
+ {570, 0x2283}, /* Proper Superset Symbol */
+ {571, 0x2284}, /* Not Proper Subset Symbol */
+ {572, 0x2285}, /* Not Proper Superset Symbol */
+ {573, 0x2286}, /* Subset Symbol */
+ {574, 0x2287}, /* Superset Symbol */
+ {575, 0x2295}, /* Plus In Circle Symbol */
+ {576, 0x2299}, /* Dot In Circle */
+ {577, 0x2297}, /* Times In Circle */
+ {578, 0x2296}, /* Minus In Circle */
+ {579, 0x2298}, /* Slash In Circle */
+ {580, 0x2227}, /* Logical And Symbol */
+ {581, 0x2228}, /* Logical Or Symbol */
+ {582, 0x22BB}, /* Exclusive Or Symbol */
+ {583, 0xFFFF}, /* Funct. Composition Sym */
+ {584, 0xFFFF}, /* Large Open Circle */
+ {585, 0xFFFF}, /* Assertion Symbol */
+ {586, 0xFFFF}, /* Backwards Assertion Symbol */
+ {587, 0x222B}, /* Integral Symbol */ /* u */
+ {588, 0x222E}, /* Curvilinear Integral Sym */
+ {589, 0x2220}, /* Angle Symbol */
+ {590, 0x2205}, /* Empty Set Symbol */
+ {591, 0x05D0}, /* Hebrew Aleph */
+ {592, 0x05D1}, /* Hebrew Beth */
+ {593, 0xFFFF}, /* Hebrew Gimmel */
+ {594, 0xFFFF}, /* Fraktur C */
+ {595, 0xFFFF}, /* Fraktur I */
+ {596, 0xFFFF}, /* Fraktur R */
+ {597, 0xFFFF}, /* Fraktur Z */
+ {598, 0xFFFF}, /* Top Left Bracket */
+ {599, 0xFFFF}, /* Bottom Left Bracket */
+ {600, 0xFFFF}, /* Top Left Brace */
+ {601, 0xFFFF}, /* Middle Left Brace */
+ {602, 0xFFFF}, /* Bottom Left Brace */
+ {603, 0xFFFF}, /* Middle Curv. Integral */
+ {604, 0xFFFF}, /* Top Left Summation */
+ {605, 0x2016}, /* Dbl Verical Line, Comp */
+ {606, 0xFFFF}, /* Bottom Left Summation */
+ {607, 0xFFFF}, /* Bottom Diag. Summation */
+ {608, 0xFFFF}, /* Top Right Bracket */
+ {609, 0xFFFF}, /* Bottom Right Bracket */
+ {610, 0xFFFF}, /* Top Right Brace */
+ {611, 0xFFFF}, /* Middle Right Brace */
+ {612, 0xFFFF}, /* Bottom Right Brace */
+ {613, 0xFFFF}, /* Thick Vert Line, Comp */
+ {614, 0xFFFF}, /* Thin Vert Line, Comp */
+ {615, 0xFFFF}, /* Bottom Radical, Vert */
+ {616, 0xFFFF}, /* Top Right Summation */
+ {617, 0xFFFF}, /* Middle Summation */
+ {618, 0xFFFF}, /* Bottom Right Summation */
+ {619, 0xFFFF}, /* Top Diagonal Summation */
+ {620, 0xFFFF}, /* Minus Over Plus Sign */
+ {621, 0xFFFF}, /* Left Angle Bracket */
+ {622, 0xFFFF}, /* Right Angle Bracket */
+ {623, 0xFFFF}, /* Mask Symbol, Sup */
+ {624, 0x2245}, /* Wavy/2 Straight Approx */
+ {625, 0x2197}, /* 45 degree Arrow */
+ {626, 0x2198}, /* -45 degree Arrow */
+ {627, 0x2199}, /* -135 degree Arrow */
+ {628, 0x2196}, /* 135 degree Arrow */
+ {629, 0x2196}, /* Up Open Triangle */
+ {630, 0xFFFF}, /* Right Open Triangle */
+ {631, 0xFFFF}, /* Down Open Triangle */
+ {632, 0xFFFF}, /* Left Open Triangle */
+ {633, 0xFFFF}, /* Much Less Than Sign */
+ {634, 0xFFFF}, /* Much Greater Than Sign */
+ {635, 0x2237}, /* Proportional To Symbol */
+ {636, 0xFFFF}, /* Defined As Symbol */
+ {637, 0xFFFF}, /* LC Greek Digamma */
+ {638, 0x210F}, /* Plank's Constant/2 pi */
+ {639, 0x2112}, /* Laplace Transform Sym */
+ {640, 0xFFFF}, /* Power Set Symbol */
+ {641, 0x2118}, /* Weierstraussian Symbol */
+ {642, 0x2211}, /* Summation Symbol, Sigma */ /* u */
+ {643, 0xFFFF}, /* Left Double Bracket */
+ {644, 0xFFFF}, /* Middle Dbl Bracket */
+ {645, 0xFFFF}, /* Right Double Bracket */
+ {646, 0xFFFF}, /* Lft Top Round Corner */
+ {647, 0xFFFF}, /* Lft Bottom Round Corner */
+ {648, 0xFFFF}, /* Ext Lrg Union/Product */
+ {649, 0xFFFF}, /* Bottom Lrg Union */
+ {650, 0xFFFF}, /* Top Large Intersection */
+ {651, 0xFFFF}, /* Top Lft Dbl Bracket */
+ {652, 0xFFFF}, /* Bottom Lft Dbl Bracket */
+ {653, 0xFFFF}, /* Large Open Box */
+ {654, 0x25CA}, /* Open Diamond */
+ {655, 0xFFFF}, /* Rt Top Round Corner */
+ {656, 0xFFFF}, /* Rt Bottom Round Corner */
+ {657, 0xFFFF}, /* Bottom Lrg Bott Product */
+ {658, 0x220F}, /* Top Large Top Product */
+ {659, 0xFFFF}, /* Top Rt Dbl Bracket */
+ {660, 0xFFFF}, /* Bottom Rt Dbl Bracket */
+ {661, 0xFFFF}, /* Large Solid Box */
+ {662, 0xFFFF}, /* Solid Diamond */
+ {663, 0x220B}, /* Such That */
+ {664, 0x2217}, /* Math Asterisk Sign */
+ {665, 0xFFFF}, /* Horizontal Arrow Ext */
+ {666, 0xFFFF}, /* Dbl Horizontal Arrow Ext */
+ {667, 0xFFFF}, /* Complement of #617 */
+ {668, 0xFFFF}, /* Right Angle Symbol */
+ {1000, 0xFFFF}, /* Superior Numeral 0 */
+ {1001, 0xFFFF}, /* Superior Numeral 4 */
+ {1002, 0xFFFF}, /* Superior Numeral 5 */
+ {1003, 0xFFFF}, /* Superior Numeral 6 */
+ {1004, 0xFFFF}, /* Superior Numeral 7 */
+ {1005, 0xFFFF}, /* Superior Numeral 8 */
+ {1006, 0xFFFF}, /* Superior Numeral 9 */
+ {1017, 0x201C}, /* Double Open Quote (6) */ /* u */
+ {1018, 0x201D}, /* Double Close Quote (9) */ /* u */
+ {1019, 0x201E}, /* Dbl Baseline Quote (9) */ /* u */
+ {1020, 0x2003}, /* Em Space */
+ {1021, 0x2002}, /* En Space */
+ {1023, 0x2009}, /* Thin Space */
+ {1028, 0x2026}, /* Ellipsis */ /* u */
+ {1030, 0x02DB}, /* Uppercase Ogonek */
+ {1031, 0x017E}, /* Lowercase Z Hacek */ /* u */
+ {1034, 0xFFFF}, /* Signature Mark, Sup */
+ {1036, 0x211E}, /* Prescription Sign */
+ {1040, 0xF001}, /* Lowercase FI Ligature */ /* u */
+ {1041, 0xF002}, /* Lowercase FL Ligature */ /* u */
+ {1042, 0xFFFF}, /* Lowercase FF Ligature */
+ {1043, 0xFFFF}, /* Lowercase FFI Ligature */
+ {1044, 0xFFFF}, /* Lowercase ffl Ligature */
+ {1045, 0x02DD}, /* Uppercase Dbl Acute */
+ {1047, 0x0133}, /* Lowercase IJ Ligature */ /* u */
+ {1060, 0x2105}, /* Care Of Symbol */ /* u */
+ {1061, 0x011E}, /* Uppercase G Breve */ /* u */
+ {1062, 0x011F}, /* Lowercase G Breve */ /* u */
+ {1063, 0x015E}, /* Uppercase S Cedilla */ /* u */
+ {1064, 0x015F}, /* Lowercase S Cedilla */ /* u */
+ {1065, 0x0130}, /* Uppercase I Overdot */ /* u */
+ {1067, 0x201A}, /* Sngl Baseline Quote (9) */ /* u */
+ {1068, 0x2030}, /* Per Mill Sign */ /* u */
+ {1069, 0x20AC}, /* Euro Sign */
+ {1084, 0x02C9}, /* Lowercase Macron */ /* u */
+ {1085, 0xFFFF}, /* Uppercase Macron */
+ {1086, 0x02D8}, /* Lowercase Breve */ /* u */
+ {1087, 0xFFFF}, /* Uppercase Breve */
+ {1088, 0x02D9}, /* Lowercase Overdot */ /* u */
+ {1089, 0xFFFF}, /* Uppercase Overdot */
+ {1090, 0x0153}, /* Lowercase OE Ligature */ /* u */
+ {1091, 0x0152}, /* Uppercase OE Ligature */ /* u */
+ {1092, 0x2039}, /* Sngl lft point Ang Quote */ /* u */
+ {1093, 0x203A}, /* Sngl rt point Ang Quote */ /* u */
+ {1094, 0x25A1}, /* Medium Open Box */
+ {1095, 0x0141}, /* Uppercase L-Stroke */ /* u */
+ {1096, 0x0142}, /* Lowercase L-Stroke */ /* u */
+ {1097, 0x02DD}, /* Lowercase Dbl Acute */ /* u */
+ {1098, 0x02DB}, /* Lowercase Ogonek */ /* u */
+ {1099, 0x21B5}, /* Carriage Return Symbol */
+ {1100, 0xFFFF}, /* Registered, Full, Serif */
+ {1101, 0x00A9}, /* Copyright, Full, Serif */
+ {1102, 0xFFFF}, /* Trademark, Full, Serif */
+ {1103, 0xFFFF}, /* Registered, Full, Sans */
+ {1104, 0xFFFF}, /* Copyright, Full, Sans */
+ {1105, 0xFFFF}, /* Trademark, Full, Sans */
+ {1106, 0x017D}, /* Uppercase Z Hacek */ /* u */
+ {1107, 0x0132}, /* Uppercase IJ Ligature */ /* u */
+ {1108, 0x25AB}, /* Small Open Box */
+ {1109, 0x25E6}, /* Small Open Bullet */
+ {1110, 0x25CB}, /* Medium Open Bullet */
+ {1111, 0x25CF}, /* Large Solid Bullet */
+ {1112, 0xFFFF}, /* Visible Carriage Return */
+ {1113, 0xFFFF}, /* Visible Tab */
+ {1114, 0xFFFF}, /* Visible Space */
+ {1115, 0xFFFF}, /* Visible Soft Hyphen */
+ {1116, 0xFFFF}, /* Visible End-of-File */
+ {2010, 0x2713}, /* */
+ {2011, 0x2727}, /* */
+ {2014, 0x2722}, /* */
+ {2027, 0x2717}, /* */
+ {2030, 0x00A7}, /* */
+ {2032, 0x272C}, /* */
+ {2044, 0x271D}, /* */
+ {2046, 0x2734}, /* */
+ {2047, 0x272B}, /* */
+ {2048, 0x25B2}, /* */
+ {2050, 0x2020}, /* */
+ {2052, 0x272A}, /* */
+ {2058, 0x2730}, /* */
+ {2059, 0x25EF}, /* */
+ {2060, 0x272D}, /* */
+ {2064, 0x2606}, /* */
+ {2072, 0x2749}, /* */
+ {2076, 0x271E}, /* */
+ {2077, 0x2718}, /* */
+ {2078, 0x272E}, /* */
+ {2080, 0x2533}, /* */
+ {2083, 0x2605}, /* */
+ {2088, 0x2729}, /* */
+ {2090, 0x2737}, /* */
+ {2091, 0x25A0}, /* */
+ {2092, 0x272F}, /* */
+ {2096, 0x2702}, /* */
+ {2116, 0x274D}, /* */
+ {2120, 0x2703}, /* */
+ {2121, 0x2712}, /* */
+ {2210, 0x2714}, /* */
+ {2230, 0x2720}, /* */
+ {2232, 0x274B}, /* */
+ {2240, 0x2738}, /* */
+ {2248, 0x25BC}, /* */
+ {2249, 0x25D6}, /* */
+ {2250, 0x274F}, /* */
+ {2252, 0x2732}, /* */
+ {2256, 0x2731}, /* */
+ {2258, 0x2743}, /* */
+ {2259, 0x2610}, /* */
+ {2260, 0x2747}, /* */
+ {2263, 0x00A9}, /* */
+ {2264, 0x273B}, /* */
+ {2265, 0x27B4}, /* */
+ {2272, 0x2739}, /* */
+ {2279, 0x273B}, /* */
+ {2280, 0x25BD}, /* */
+ {2282, 0x2751}, /* */
+ {2283, 0x2733}, /* */
+ {2286, 0x2715}, /* */
+ {2287, 0x27B5}, /* */
+ {2288, 0x2741}, /* */
+ {2290, 0x273E}, /* */
+ {2292, 0x2748}, /* */
+ {2293, 0x00AE}, /* */
+ {2295, 0x261E}, /* */
+ {2307, 0x270F}, /* */
+ {2308, 0x2752}, /* */
+ {2312, 0x261B}, /* */
+ {2315, 0x2706}, /* */
+ {2324, 0x2711}, /* */
+ {2325, 0x2750}, /* */
+ {2327, 0x27B6}, /* */
+ {2411, 0x2721}, /* */
+ {2432, 0x2746}, /* */
+ {2436, 0x007B}, /* */
+ {2444, 0x2719}, /* */
+ {2448, 0x2726}, /* */
+ {2451, 0x273F}, /* */
+ {2452, 0x273A}, /* */
+ {2454, 0x275A}, /* */
+ {2460, 0x2740}, /* */
+ {2464, 0x2744}, /* */
+ {2468, 0x0079}, /* */
+ {2472, 0x2723}, /* */
+ {2476, 0x211F}, /* */
+ {2478, 0x2724}, /* */
+ {2479, 0x2735}, /* */
+ {2480, 0x2758}, /* */
+ {2483, 0x273C}, /* */
+ {2486, 0x2759}, /* */
+ {2488, 0x271B}, /* */
+ {2490, 0x2742}, /* */
+ {2492, 0x2745}, /* */
+ {2493, 0x0040}, /* */
+ {2497, 0x2704}, /* */
+ {2498, 0x260E}, /* */
+ {2499, 0x270E}, /* */
+ {2500, 0x2761}, /* */
+ {2502, 0x2725}, /* */
+ {2509, 0x2710}, /* */
+ {2513, 0x0023}, /* */
+ {2514, 0x260F}, /* */
+ {2515, 0x270D}, /* */
+ {3812, 0xF000}, /* UGL, not Unicode */
+ {65535, 0x0110}, /* Uppercase D-Stroke */ /* u */ /* undefined in MSL */
+ {65535, 0x20A3}, /* French Franc */ /* u */
+ {65535, 0x220F}, /* Product Symbol, Large Pi */ /* u */
+};
+#define pl_map_m2u_size countof(pl_map_m2u)
+
+/* Map a MSL glyph code to a Unicode character code. */
+/* Note that the symbol set is required, because some characters map */
+/* differently in different symbol sets. */
+uint
+pl_map_MSL_to_Unicode(uint msl, uint symbol_set)
+{ /* We should use binary search, but we don't. This is VERY SLOW. */
+ int i;
+ for ( i = 0; i < pl_map_m2u_size; ++i )
+ if ( pl_map_m2u[i].key == msl )
+ return pl_map_m2u[i].value;
+ return 0xffff;
+}
+
+/* Map a Unicode character code to a MSL glyph code similarly. */
+uint
+pl_map_Unicode_to_MSL(uint unicode, uint symbol_set)
+{ /* Search the entire MSL to Unicode map. This is VERY SLOW. */
+ int i;
+ for ( i = 0; i < pl_map_m2u_size; ++i )
+ if ( pl_map_m2u[i].value == unicode )
+ return pl_map_m2u[i].key;
+ return 0xffff;
+}
diff --git a/pl/plvocab.h b/pl/plvocab.h
new file mode 100644
index 000000000..487b13622
--- /dev/null
+++ b/pl/plvocab.h
@@ -0,0 +1,23 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* plvocab.h */
+/* Map between glyph vocabularies */
+
+/* Map a MSL glyph code to a Unicode character code. */
+/* Note that the symbol set is required, because some characters map */
+/* differently in different symbol sets. */
+uint pl_map_MSL_to_Unicode(uint msl, uint symbol_set);
+
+/* Map a Unicode character code to a MSL glyph code similarly. */
+uint pl_map_Unicode_to_MSL(uint unicode, uint symbol_set);
diff --git a/psi/psi.mak b/psi/psi.mak
new file mode 100644
index 000000000..6c4c5d56a
--- /dev/null
+++ b/psi/psi.mak
@@ -0,0 +1,53 @@
+# Copyright (C) 1996, 1997, 1998 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# makefile for PS Inteface (PSI) to Ghostscript PostScript.
+# Users of this makefile must define the following:
+# GLSRCDIR - the GS library source directory
+# GLGENDIR - the GS library generated file directory
+# PLSRCDIR - the PCL* support library source directory
+# PLOBJDIR - the PCL* support library object / executable directory
+# PSISRCDIR - the source directory
+# PSIGENDIR - the directory for source files generated during building
+# PSIOBJDIR - the object / executable directory
+# PSI_TOP_OBJ - object file to top-level interpreter API
+
+PLOBJ=$(PLOBJDIR)$(D)
+
+PSISRC=$(PSISRCDIR)$(D)
+PSIGEN=$(PSIGENDIR)$(D)
+PSIOBJ=$(PSIOBJDIR)$(D)
+PSIO_=$(O_)$(PSIOBJ)
+
+PSICCC=$(CC_) $(I_)$(PSISRCDIR)$(_I) $(I_)$(PSIGENDIR)$(_I) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(I_)$(GLGENDIR)$(_I) $(C_)
+
+# Define the name of this makefile.
+PSI_MAK=$(PSISRC)psi.mak
+
+psi.clean: psi.config-clean psi.clean-not-config-clean
+
+psi.clean-not-config-clean: clean_gs
+ $(RM_) $(PSIOBJ)*.$(OBJ)
+ $(RM_) $(PSIOBJ)devs.tr6
+
+# devices are still created in the current directory. Until that
+# is fixed we will have to remove them from both directories.
+psi.config-clean:
+ $(RM_) $(PSIOBJ)*.dev
+ $(RM_) *.dev
+
+################ PS Language Interface ################
+
+# Top-level API
+$(PSI_TOP_OBJ): $(PSISRC)psitop.c $(AK) $(stdio__h)\
+ $(string__h) $(gdebug_h) $(gp_h) $(gsdevice_h) $(gserrors_h) $(gsmemory_h)\
+ $(gsstate_h) $(gsstruct_h) $(gspaint_h) $(gstypes_h) $(gxalloc_h) $(gxstate_h)\
+ $(gsnogc_h) $(pltop_h) $(psitop_h) $(plparse_h)\
+ $(PSIGEN)pconf.h $(plfont_h) $(uconfig_h)
+ $(CP_) $(PSIGEN)pconf.h $(PSIGEN)pconfig.h
+ $(PSICCC) $(PSISRC)psitop.c $(O_)$(PSI_TOP_OBJ)
+
+$(PSIOBJ)psi.dev: $(PSI_MAK) $(ECHOGS_XE) $(PLOBJ)pl.dev $(PLOBJ)pjl.dev
+ $(SETMOD) $(PSIOBJ)psi $(PSI_TOP_OBJ)
+ $(ADDMOD) $(PSIOBJ)psi -include $(PLOBJ)pl $(PLOBJ)pjl
+
diff --git a/psi/psitop.c b/psi/psitop.c
new file mode 100755
index 000000000..e2d1a50f6
--- /dev/null
+++ b/psi/psitop.c
@@ -0,0 +1,619 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/* $Id$ */
+
+/* psitop.c */
+/* Top-level API implementation of PS Language Interface */
+
+#include "stdio_.h"
+#include "ghost.h"
+#include "imain.h"
+#include "imainarg.h"
+#include "iapi.h"
+#include "string_.h"
+#include "gdebug.h"
+#include "gp.h"
+#include "gserrors.h"
+#include "../gs/src/errors.h" /* FIXME: Microsoft seems to pull in <errors.h> */
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsmalloc.h"
+#include "gsstate.h" /* must precede gsdevice.h */
+#include "gxdevice.h" /* must precede gsdevice.h */
+#include "gsdevice.h"
+#include "icstate.h" /* for i_ctx_t */
+#include "iminst.h"
+#include "gsstruct.h" /* for gxalloc.h */
+#include "gspaint.h"
+#include "gxalloc.h"
+#include "gxstate.h"
+#include "plparse.h"
+#include "pltop.h"
+#include "gzstate.h"
+#include "uconfig.h" /* for UFSTFONTDIR */
+
+/* Forward decls */
+
+/************************************************************/
+/******** Language wrapper implementation (see pltop.h) *****/
+/************************************************************/
+
+/* Import operator procedures */
+extern int zflush(i_ctx_t *);
+
+/*
+ * PS interpreter instance: derived from pl_interp_instance_t
+ */
+typedef struct ps_interp_instance_s {
+ pl_interp_instance_t pl; /* common part: must be first */
+ gs_memory_t *plmemory; /* memory allocator to use with pl objects */
+ gs_main_instance *minst; /* PS interp main instance */
+ pl_page_action_t pre_page_action; /* action before page out */
+ void *pre_page_closure; /* closure to call pre_page_action with */
+ pl_page_action_t post_page_action; /* action before page out */
+ void *post_page_closure; /* closure to call post_page_action with */
+ bool fresh_job; /* true if we are starting a new job */
+ bool pdf_stream; /* current stream is pdf */
+ char pdf_file_name[gp_file_name_sizeof];
+ FILE * pdf_filep; /* temporary file for writing out pdf file */
+ ref job_save;
+} ps_interp_instance_t;
+
+/* Get implemtation's characteristics */
+const pl_interp_characteristics_t * /* always returns a descriptor */
+ps_impl_characteristics(
+ const pl_interp_implementation_t *impl /* implementation of interpereter to alloc */
+)
+{
+ /* version and build date are not currently used */
+#define PSVERSION NULL
+#define PSBUILDDATE NULL
+ static const pl_interp_characteristics_t ps_characteristics = {
+ "POSTSCRIPT",
+ /* NOTE - we don't look for %! because we want to recognize pdf as well */
+ "%",
+ "Artifex",
+ PSVERSION,
+ PSBUILDDATE,
+ 1 /* minimum input size to PostScript */
+ };
+#undef PSVERSION
+#undef PSBUILDDATE
+
+ return &ps_characteristics;
+}
+
+
+/* Don't need to do anything to PS interpreter */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_allocate_interp(
+ pl_interp_t **interp, /* RETURNS abstract interpreter struct */
+ const pl_interp_implementation_t *impl, /* implementation of interpereter to alloc */
+ gs_memory_t *mem /* allocator to allocate interp from */
+)
+{
+
+ static pl_interp_t pi; /* there's only one interpreter */
+ /* There's only one PS interp, so return the static */
+ *interp = &pi;
+ return 0; /* success */
+}
+
+/* defaults for locations of font collection objects (fco's) and
+ plugins the root data directory. These are internally separated with
+ ':' but environment variable use the gp separator */
+#ifndef UFSTFONTDIR
+ /* not using UFST */
+# define UFSTFONTDIR ""
+#endif
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_allocate_interp_instance(
+ pl_interp_instance_t **instance, /* RETURNS instance struct */
+ pl_interp_t *interp, /* dummy interpreter */
+ gs_memory_t *mem /* allocator to allocate instance from */
+)
+{
+#ifdef DEBUG_WITH_EXPERIMENTAL_GSOPTIONS_FILE
+# define MAX_ARGS 40
+#else
+# define MAX_ARGS /* unspecified */
+#endif
+ int code = 0, exit_code;
+ const char *argv[MAX_ARGS] = {
+ "",
+ "-dNOPAUSE",
+#ifndef DEBUG
+ "-dQUIET",
+#else
+ "-dOSTACKPRINT", // NB: debuggging postscript Needs to be removed.
+ "-dESTACKPRINT", // NB: debuggging postscript Needs to be removed.
+#endif
+ "-dJOBSERVER",
+ "-sUFST_PlugIn=" UFSTFONTDIR "mtfonts/pcl45/mt3/plug__xi.fco",
+ "-sFCOfontfile=" UFSTFONTDIR "mtfonts/pclps2/mt3/pclp2_xj.fco",
+ "-sFCOfontfile2=" UFSTFONTDIR "mtfonts/pcl45/mt3/wd____xh.fco",
+ "-sFAPIfontmap=FCOfontmap-PCLPS2",
+ "-sFAPIconfig=FAPIconfig-FCO",
+ 0
+ };
+#ifndef DEBUG
+ int argc = 9;
+#else
+ int argc = 10;
+#endif
+#ifdef DEBUG_WITH_EXPERIMENTAL_GSOPTIONS_FILE
+ char argbuf[1024];
+#endif
+# undef MAX_ARGS
+
+ ps_interp_instance_t *psi /****** SHOULD HAVE A STRUCT DESCRIPTOR ******/
+ = (ps_interp_instance_t *)
+ gs_alloc_bytes( mem,
+ sizeof(ps_interp_instance_t),
+ "ps_allocate_interp_instance(ps_interp_instance_t)"
+ );
+
+
+ /* If allocation error, deallocate & return */
+ if (!psi) {
+ return gs_error_VMerror;
+ }
+ /* Initialize for pl_main_universe_dnit/pl_deallocate_interp_instance
+ in case of gs_main_init_with_args returns with error code. */
+ psi->pl.interp = interp;
+ /* Setup pointer to mem used by PostScript */
+ psi->plmemory = mem;
+ psi->minst = gs_main_alloc_instance(mem);
+
+#ifdef DEBUG_WITH_EXPERIMENTAL_GSOPTIONS_FILE
+ { /* Fetch more GS arguments (debug purposes only).
+ Pulling debugging arguments from a file allows easy additions
+ of postscript arguments to a debug system, it is not recommended for
+ production systems since some options will conflict with commandline
+ arguments in unpleasant ways.
+ */
+ FILE *f = fopen("gsoptions", "rb"); /* Sorry we handle
+ the current directory only.
+ Assuming it always fails with no crash
+ in a real embedded system. */
+
+ if (f != NULL) {
+ int i;
+ int l = fread(argbuf, 1, sizeof(argbuf) - 1, f);
+
+ if (l >= sizeof(argbuf) - 1)
+ errprintf("The gsoptions file is too big. Truncated to the buffer length %d.\n", l - 1);
+ if (l > 0) {
+ argbuf[l] = 0;
+ if (argbuf[0] && argbuf[0] != '\r' && argbuf[0] != '\n') /* Silently skip empty lines. */
+ argv[argc++] = argbuf;
+ for (i = 0; i < l; i++)
+ if (argbuf[i] == '\r' || argbuf[i] == '\n') {
+ argbuf[i] = 0;
+ if (argbuf[i + 1] == 0 || argbuf[i + 1] == '\r' || argbuf[i + 1] == '\n')
+ continue; /* Silently skip empty lines. */
+ if (argc >= count_of(argv)) {
+ errprintf("The gsoptions file contains too many options. "
+ "Truncated to the buffer length %d.\n", argc);
+ break;
+ }
+ argv[argc++] = argbuf + i + 1;
+ }
+ }
+ fclose(f);
+ }
+ }
+#endif
+
+ *instance = (pl_interp_instance_t *)psi;
+ code = gs_main_init_with_args(psi->minst, argc, (char**)argv);
+ if (code<0)
+ return code;
+
+ /* General init of PS interp instance */
+
+ if ((code = gs_main_run_string_begin(psi->minst, 0, &exit_code, &psi->minst->error_object)) < 0)
+ return exit_code;
+
+ /* inialize fresh job to false so that we can check for a pdf
+ file next job. */
+ psi->fresh_job = true;
+ /* default is a postscript stream */
+ psi->pdf_stream = false;
+
+ /* Return success */
+ return 0;
+}
+
+/* NB this pointer should be placed in the ps instance */
+
+/* Set a client language into an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_set_client_instance(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_interp_instance_t *client, /* client to set */
+ pl_interp_instance_clients_t which_client
+)
+{
+ return 0;
+}
+
+/* Set an interpreter instance's pre-page action */
+static int /* ret 0 ok, else -ve err */
+ps_impl_set_pre_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute (rets 1 to abort w/o err) */
+ void *closure /* closure to call action with */
+)
+{
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ psi->pre_page_action = action;
+ psi->pre_page_closure = closure;
+ return 0;
+}
+
+/* Set an interpreter instance's post-page action */
+static int /* ret 0 ok, else -ve err */
+ps_impl_set_post_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute */
+ void *closure /* closure to call action with */
+)
+{
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ psi->post_page_action = action;
+ psi->post_page_closure = closure;
+ return 0;
+}
+
+/* Set a device into an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_set_device(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gx_device *device /* device to set (open or closed) */
+)
+{
+ int code = 0;
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ gs_state *pgs = psi->minst->i_ctx_p->pgs;
+
+ /* Set the device into the gstate */
+ code = gs_setdevice_no_erase(pgs, device);
+ if (code >= 0 )
+ code = gs_erasepage(pgs);
+ return code;
+}
+
+/* fetch the gs_memory_t ptr so that the device and ps use the same
+ * garbage collection aware a memory
+ */
+static int
+ps_impl_get_device_memory(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gs_memory_t **pmem)
+{
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ gs_dual_memory_t *dmem = &psi->minst->i_ctx_p->memory;
+ gs_ref_memory_t *mem = dmem->spaces.memories.named.global;
+
+ *pmem = mem->stable_memory;
+ /* Lock against alloc_restore_all to release the device when called from gsapi_exit : */
+ ((gs_ref_memory_t *)mem)->num_contexts++;
+ return 0;
+}
+
+gs_main_instance *ps_impl_get_minst( const gs_memory_t *mem )
+{
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)get_interpreter_from_memory(mem);
+ return psi->minst;
+}
+
+/* Prepare interp instance for the next "job" */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_init_job(
+ pl_interp_instance_t *instance /* interp instance to start job in */
+)
+{
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ static const char *buf = "\004"; /* use ^D to start a new encapsulated job */
+ int exit_code;
+
+ /* starting a new job */
+ psi->fresh_job = true;
+ gsapi_run_string_continue(psi->plmemory->gs_lib_ctx, buf, strlen(buf), 0, &exit_code); /* ^D */
+ return 0;
+}
+
+/* Parse a buffer full of data */
+static int /* ret 0 or +ve if ok, else -ve error code */
+ps_impl_process(
+ pl_interp_instance_t *instance, /* interp instance to process data job in */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ int code, exit_code;
+ uint avail = cursor->limit - cursor->ptr;
+ /* if we are at the beginning of a job check for pdf and set
+ appropriate state variables to process either a pdf or ps
+ job */
+ if ( psi->fresh_job ) {
+ const char pdf_idstr[] = "%PDF-1.";
+ /* do we have enough data? */
+ const uint pdf_idstr_len = strlen(pdf_idstr);
+ if ( avail < pdf_idstr_len )
+ /* more data. NB update ptr ?? */
+ return 0;
+ else
+ /* compare beginning of stream with pdf id */
+ if ( !strncmp(pdf_idstr, cursor->ptr + 1, pdf_idstr_len) ) {
+ char fmode[4];
+ /* open the temporary pdf file. If the file open
+ fails PDF fails and we allow the job to be sent
+ to postscript and generate an error. It turns
+ out this is easier than restoring the state and
+ returning */
+ strcpy(fmode, "w+");
+ strcat(fmode, gp_fmode_binary_suffix);
+ psi->pdf_filep = gp_open_scratch_file(gp_scratch_file_name_prefix,
+ psi->pdf_file_name, fmode);
+ if ( psi->pdf_filep == NULL )
+ psi->pdf_stream = false;
+ else
+ psi->pdf_stream = true;
+ }
+ else
+ psi->pdf_stream = false;
+ /* we only check for pdf at the beginning of the job */
+ psi->fresh_job = false;
+ }
+
+ /* for a pdf stream we append to the open pdf file but for
+ postscript we hand it directly to the ps interpreter. PDF
+ files are processed subsequently, at end job time */
+ code = 0;
+ if ( psi->pdf_stream ) {
+ uint bytes_written = fwrite((cursor->ptr + 1), 1, avail, psi->pdf_filep);
+ if ( bytes_written != avail )
+ code = gs_error_invalidfileaccess;
+ } else {
+ /* Send the buffer to Ghostscript */
+ code = gsapi_run_string_continue(psi->plmemory->gs_lib_ctx, (const char *)(cursor->ptr + 1),
+ avail, 0, &exit_code);
+ /* needs more input this is not an error */
+ if ( code == e_NeedInput )
+ code = 0;
+ /* error - I guess it gets "exit code" - nonsense */
+ if ( code < 0 )
+ code = exit_code;
+ }
+ /* update the cursor */
+ cursor->ptr += avail;
+ /* flush stdout on error. */
+ if (code < 0)
+ zflush(psi->minst->i_ctx_p);
+ /* return the exit code */
+ return code;
+}
+
+/* Skip to end of job ret 1 if done, 0 ok but EOJ not found, else -ve error code */
+static int
+ps_impl_flush_to_eoj(
+ pl_interp_instance_t *instance, /* interp instance to flush for */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ const byte *p = cursor->ptr;
+ const byte *rlimit = cursor->limit;
+
+ /* Skip to, but leave UEL in buffer for PJL to find later */
+ for (; p < rlimit; ++p)
+ if (p[1] == '\033') {
+ uint avail = rlimit - p;
+
+ if (memcmp(p + 1, "\033%-12345X", min(avail, 9)))
+ continue;
+ if (avail < 9)
+ break;
+ cursor->ptr = p;
+ return 1; /* found eoj */
+ }
+ cursor->ptr = p;
+ return 0; /* need more */
+}
+
+/* Parser action for end-of-file */
+static int /* ret 0 or +ve if ok, else -ve error code */
+ps_impl_process_eof(
+ pl_interp_instance_t *instance /* interp instance to process data job in */
+)
+{
+ int code = 0;
+
+ return code;
+}
+
+/* Report any errors after running a job */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_report_errors(pl_interp_instance_t *instance, /* interp instance to wrap up job in */
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+)
+{
+ /* ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ */
+ return code;
+}
+
+/* Wrap up interp instance after a "job" */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_dnit_job(
+ pl_interp_instance_t *instance /* interp instance to wrap up job in */
+)
+{
+ int code = 0;
+ int exit_code = 0;
+ static const char *buf = "\n.endjob\n"; /* restore to initial state, non-encapsualted */
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+
+ /* take care of a stored pdf file */
+ if ( psi->pdf_stream ) {
+ /* gp_file_name_sizeof + 7 is
+ * max filename size + space + (run) + new line + null
+ */
+ byte buf[gp_file_name_sizeof + 7];
+ /* at this point we have finished writing the spooled pdf file
+ and we need to close it */
+ fclose(psi->pdf_filep);
+ /* run the temporary pdf spool file */
+ sprintf(buf, "(%s) run\n", psi->pdf_file_name);
+ /* Send the buffer to Ghostscript */
+ code = gsapi_run_string_continue(psi->plmemory->gs_lib_ctx, buf, strlen(buf), 0, &exit_code);
+
+ /* indicate we are done with the pdf stream */
+ psi->pdf_stream = false;
+ unlink(psi->pdf_file_name);
+ /* handle errors... normally job deinit failures are
+ considered fatal but pdf runs the spooled job when the job
+ is deinitialized so handle error processing here and return code is always 0. */
+ if (( code < 0) && (code != e_NeedInput)) {
+ errprintf("PDF interpreter exited with exit code %d\n", exit_code);
+ errprintf("Flushing to EOJ\n");
+ }
+ code = 0;
+ }
+
+ /* We use string_end to send an EOF in case the job was reading in a loop */
+ gsapi_run_string_end(psi->plmemory->gs_lib_ctx, 0, &exit_code); /* sends EOF to PS process */
+ gsapi_run_string_begin(psi->plmemory->gs_lib_ctx, 0, &exit_code); /* prepare to send .endjob */
+ gsapi_run_string_continue(psi->plmemory->gs_lib_ctx, buf, strlen(buf), 0, &exit_code); /* .endjob */
+ /* Note the above will restore to the server save level and will not be encapsulated */
+
+ /* Flush stdout. */
+ zflush(psi->minst->i_ctx_p);
+
+ return 0;
+}
+
+/* Remove a device from an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_remove_device(
+ pl_interp_instance_t *instance /* interp instance to use */
+)
+{
+ /* Assuming the interpreter's stack contains a single graphic state.
+ Otherwise this procedure is not effective.
+ The Postscript job server logic must provide that.
+ */
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ gs_state *pgs = psi->minst->i_ctx_p->pgs;
+ int code = gs_nulldevice(pgs);
+
+ if ( code < 0 )
+ dprintf1("error code %d installing nulldevice, continuing\n", code );
+ return 0;
+}
+
+/* Deallocate a interpreter instance */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_deallocate_interp_instance(
+ pl_interp_instance_t *instance /* instance to dealloc */
+)
+{
+ int code = 0, exit_code;
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ gs_memory_t *mem = psi->plmemory;
+
+ /* do total dnit of interp state */
+ code = gsapi_run_string_end(mem->gs_lib_ctx, 0, &exit_code);
+
+ gsapi_exit(psi->minst);
+
+ gs_free_object(mem, psi, "ps_impl_deallocate_interp_instance(ps_interp_instance_t)");
+
+ return (code < 0) ? exit_code : 0;
+}
+
+/* Do static deinit of PS interpreter */
+static int /* ret 0 ok, else -ve error code */
+ps_impl_deallocate_interp(
+ pl_interp_t *interp /* interpreter to deallocate */
+)
+{
+ /* nothing to do */
+ return 0;
+}
+
+/*
+ * End-of-page called back by PS
+ */
+int
+ps_end_page_top(const gs_memory_t *mem, int num_copies, bool flush)
+{
+ pl_interp_instance_t *instance = get_interpreter_from_memory(mem);
+ ps_interp_instance_t *psi = (ps_interp_instance_t *)instance;
+ int code = 0;
+
+ if (psi == 0)
+ return 0;
+
+ /* do pre-page action */
+ if (psi->pre_page_action) {
+ code = psi->pre_page_action(instance, psi->pre_page_closure);
+ if (code < 0)
+ return code;
+ if (code != 0)
+ return 0; /* code > 0 means abort w/no error */
+ }
+
+ /* output the page */
+ code = gs_output_page(psi->minst->i_ctx_p->pgs, num_copies, flush);
+ if (code < 0)
+ return code;
+
+ /* Flush stdout. */
+ zflush(psi->minst->i_ctx_p);
+
+ /* do post-page action */
+ if (psi->post_page_action) {
+ code = psi->post_page_action(instance, psi->post_page_closure);
+ if (code < 0)
+ return code;
+ }
+
+ return 0;
+}
+
+/* Parser implementation descriptor */
+const pl_interp_implementation_t ps_implementation = {
+ ps_impl_characteristics,
+ ps_impl_allocate_interp,
+ ps_impl_allocate_interp_instance,
+ ps_impl_set_client_instance,
+ ps_impl_set_pre_page_action,
+ ps_impl_set_post_page_action,
+ ps_impl_set_device,
+ ps_impl_init_job,
+ ps_impl_process,
+ ps_impl_flush_to_eoj,
+ ps_impl_process_eof,
+ ps_impl_report_errors,
+ ps_impl_dnit_job,
+ ps_impl_remove_device,
+ ps_impl_deallocate_interp_instance,
+ ps_impl_deallocate_interp,
+ ps_impl_get_device_memory,
+};
+
diff --git a/pxl/pxasm.bat b/pxl/pxasm.bat
new file mode 100644
index 000000000..4c50ffb8c
--- /dev/null
+++ b/pxl/pxasm.bat
@@ -0,0 +1 @@
+@..\gs386 -I.. -q -dNODISPLAY -sOutputFile=%2 pxasm.ps %1 -c quit \ No newline at end of file
diff --git a/pxl/pxasm.ps b/pxl/pxasm.ps
new file mode 100644
index 000000000..8c8e73450
--- /dev/null
+++ b/pxl/pxasm.ps
@@ -0,0 +1,192 @@
+%!
+% Copyright (C) 1996, 1997 Aladdin Enterprises. All rights reserved.
+% Unauthorized use, copying, and/or distribution prohibited.
+
+% Assemble a PCL XL "program". The syntax is designed to minimize the size
+% of the assembler, not for the convenience of users.
+
+/big_endian false def
+big_endian { 1 } { 2 } ifelse setobjectformat
+
+/pxdict 1000 dict def
+pxdict begin
+
+/libfile % <filename> libfile <file>
+ { findlibfile
+ { exch pop }
+ { print ( not found!\n) print flush stop }
+ ifelse
+ } bind def
+
+% Define output utility procedures.
+/.out /OutputFile where { pop OutputFile } { (%stdout) } ifelse (w) file def
+/.w { //.out exch write } bind def
+/.w1 { 255 and //.out exch write } bind def
+/.w2 { dup -8 bitshift big_endian not { exch } if .w1 .w1 } bind def
+/.w4 { dup -16 bitshift big_endian not { exch } if .w2 .w2 } bind def
+/.wr % <real> .wr -
+ { cvr =string /NullEncode filter dup 3 -1 roll 0 writeobject
+ dup flushfile closefile
+ .out =string 8 4 getinterval writestring
+ }
+bind def
+/.ws { .out exch writestring } bind def
+
+% Define the attributes.
+/.asmattr { 16#f8 .w .w } bind def
+/.defattr { /.asmattr cvx 2 packedarray cvx def } bind def
+(gdevpxat.h) libfile
+ { dup =string readline pop (typedef) anchorsearch { pop pop exit } if pop
+ } loop
+0
+ { 1 index =string readline not { pop exit } if
+ ( pxa) anchorsearch
+ { pop ( = ) search
+ { exch pop exch (,) search pop exch pop exch pop cvi
+ 3 -1 roll pop exch
+ }
+ { (,) search pop exch pop exch pop
+ }
+ ifelse
+ (@) exch concatstrings 1 index .defattr
+ 1 add
+ }
+ { pop
+ }
+ ifelse
+ }
+loop pop closefile
+
+% Define the enumerated values.
+/.defenum { /b cvx 2 packedarray cvx def } bind def
+(gdevpxen.h) libfile
+0
+ { 1 index =string readline not { pop exit } if
+ (,) search { exch pop exch pop } if
+ dup ( e) anchorsearch
+ { pop pop token pop exch
+ % Stack: file value name rest
+ token
+ { % The token must be an '='.
+ pop token pop exch pop 3 -1 roll pop exch
+ }
+ if
+ % Stack: file value name
+ 1 index .defenum 1 add
+ }
+ { pop pop
+ }
+ ifelse
+ }
+loop pop closefile
+
+% Define the operators.
+/.asmop /.w load def
+/.defop { /.asmop cvx 2 packedarray cvx def } bind def
+(gdevpxop.h) libfile
+ { dup =string readline pop (typedef) anchorsearch { pop pop exit } if pop
+ } loop
+0
+ { 1 index =string readline not { pop exit } if
+ ( pxt) anchorsearch
+ { pop
+ (, pxt) search pop exch pop 2 index .defop
+ (, pxt) search pop exch pop 2 index 1 add .defop
+ (, pxt) search pop exch pop 2 index 2 add .defop
+ (,) search { exch pop exch pop } if 1 index 3 add .defop
+ 4 add
+ }
+ { pop
+ }
+ ifelse
+ }
+loop pop closefile
+
+% Define syntactic elements for numbers, points, and boxes.
+/b { 16#c0 .w .w1 } def
+/us { 16#c1 .w .w2 } def
+/ul { 16#c2 .w .w4 } def
+/ss { 16#c3 .w .w2 } def
+/sl { 16#c4 .w .w4 } def
+/r { 16#c5 .w .wr } def
+/.xy { .w 3 -1 roll 1 index exec exec } bind def
+/bp { {.w1} 16#d0 .xy } def
+/usp { {.w2} 16#d1 .xy } def
+/ulp { {.w4} 16#d2 .xy } def
+/ssp { {.w2} 16#d3 .xy } def
+/slp { {.w4} 16#d4 .xy } def
+/rp { {.wr} 16#d5 .xy } def
+/.box { .w 5 1 roll 4 packedarray exch forall } bind def
+/bq { {.w1} 16#e0 .box } def
+/usq { {.w2} 16#e1 .box } def
+/ulq { {.w4} 16#e2 .box } def
+/ssq { {.w2} 16#e3 .box } def
+/slq { {.w4} 16#e4 .box } def
+/rq { {.wr} 16#e5 .box } def
+
+% Define syntactic elements for arrays.
+/.array { .w 1 index length dup 255 gt { us } { b } ifelse forall } bind def
+/ba { {.w1} 16#c8 .array } def
+/usa { {.w2} 16#c9 .array } def
+/ula { {.w4} 16#ca .array } def
+/ssa { {.w2} 16#cb .array } def
+/sla { {.w4} 16#cc .array } def
+/ra { {.wr} 16#cd .array } def
+
+% Define other syntactic elements.
+/c { .w } def % single character
+/s { .ws } def % string
+
+% Define tokens that allow us to assemble the output from tracing.
+/next { currentfile token pop } bind def
+/next2 { next next } def
+/next4 { next next next next } def
+/skip { next pop } bind def
+/pos= { skip } def
+/tag= { skip } def
+/ESC { (\033%-12345X) s } def
+% Scalars
+/_ubyte { next b } def
+/_uint16 { next us } def
+/_uint32 { next ul } def
+/_sint16 { next ss } def
+/_sint32 { next sl } def
+/_real32 { next r } def
+% Points
+/_ubyte_xy { next2 bp } def
+/_uint16_xy { next2 usp } def
+/_uint32_xy { next2 ulp } def
+/_sint16_xy { next2 ssp } def
+/_sint32_xy { next2 slp } def
+/_real32_xy { next2 rp } def
+% Boxes
+/_ubyte_box { next4 bq } def
+/_uint16_box { next4 usq } def
+/_uint32_box { next4 ulq } def
+/_sint16_box { next4 ssq } def
+/_sint32_box { next4 slq } def
+/_real32_box { next4 rq } def
+% Data and arrays
+/data,
+ { next pop next dup 255 le { 16#fb .w .w } { 16#fa .w .w4 } ifelse
+ } def
+/data: { next s } def
+/nextarray { skip skip skip skip next } def
+/_ubyte_array { nextarray ba } def
+/_uint16_array { nextarray usa } def
+/_uint32_array { nextarray ula } def
+/_sint16_array { nextarray ssa } def
+/_sint32_array { nextarray sla } def
+/_real32_array { nextarray ra } def
+/_ubyte_array... { } def
+/_uint16_array... { } def
+/_uint32_array... { } def
+/_sint16_array... { } def
+/_sint32_array... { } def
+/_real32_array... { } def
+
+% Write a header that pacifies H-P printers.
+(\033%-12345X@PJL ENTER LANGUAGE = PCLXL\n\) HP-PCL XL;1;1\n) .ws
+
+% Now just execute the source as a PostScript program.
+% The assembled code will be written to stdout.
diff --git a/pxl/pxattr.h b/pxl/pxattr.h
new file mode 100644
index 000000000..f16e4734d
--- /dev/null
+++ b/pxl/pxattr.h
@@ -0,0 +1,19 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxattr.h */
+/* Attribute ID definitions for PCL XL parser */
+
+/* The contents of this file have been moved to the graphics library, */
+/* so they can be used in the PCL XL driver. */
+#include "gdevpxat.h"
diff --git a/pxl/pxbfont.c b/pxl/pxbfont.c
new file mode 100644
index 000000000..d48664542
--- /dev/null
+++ b/pxl/pxbfont.c
@@ -0,0 +1,2057 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+#include "stdpre.h"
+#include "pxbfont.h"
+
+const byte px_bitmap_font_char_data[] = {
+ 34 /* " */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 23, 0, 14, 0, 92,
+1,252,254,
+1,252,254,
+0,248,124,
+0,248,124,
+0,248,124,
+0,248,124,
+0,248,124,
+0,248,124,
+0,248,124,
+0,248,124,
+0,112,56,
+0,112,56,
+0,112,56,
+0,112,56,
+ 40 /* ( */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 23, 0, 36, 0, 92,
+0,0,6,
+0,0,14,
+0,0,12,
+0,0,28,
+0,0,56,
+0,0,56,
+0,0,112,
+0,0,112,
+0,0,112,
+0,0,224,
+0,0,224,
+0,0,224,
+0,0,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,1,192,
+0,0,192,
+0,0,224,
+0,0,224,
+0,0,224,
+0,0,112,
+0,0,112,
+0,0,48,
+0,0,56,
+0,0,56,
+0,0,28,
+0,0,12,
+0,0,14,
+0,0,6,
+ 41 /* ) */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 16, 0, 36, 0, 64,
+1,128,
+0,192,
+0,224,
+0,96,
+0,112,
+0,48,
+0,56,
+0,24,
+0,28,
+0,28,
+0,14,
+0,14,
+0,14,
+0,6,
+0,7,
+0,7,
+0,7,
+0,7,
+0,7,
+0,7,
+0,7,
+0,7,
+0,6,
+0,14,
+0,14,
+0,12,
+0,28,
+0,28,
+0,24,
+0,56,
+0,48,
+0,112,
+0,96,
+0,224,
+0,192,
+1,128,
+ 45 /* - */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 15, 0, 26, 0, 2, 0, 104,
+15,255,255,192,
+15,255,255,192,
+ 47 /* / */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 33, 0, 24, 0, 37, 0, 96,
+0,0,3,
+0,0,3,
+0,0,7,
+0,0,6,
+0,0,14,
+0,0,12,
+0,0,28,
+0,0,24,
+0,0,56,
+0,0,48,
+0,0,48,
+0,0,96,
+0,0,96,
+0,0,192,
+0,0,192,
+0,1,128,
+0,1,128,
+0,3,128,
+0,3,0,
+0,7,0,
+0,6,0,
+0,14,0,
+0,12,0,
+0,28,0,
+0,24,0,
+0,24,0,
+0,48,0,
+0,48,0,
+0,96,0,
+0,96,0,
+0,192,0,
+0,192,0,
+1,128,0,
+1,128,0,
+3,128,0,
+3,0,0,
+3,0,0,
+ 48 /* 0 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 24, 0, 32, 0, 96,
+0,15,192,
+0,63,240,
+0,120,120,
+0,96,24,
+0,192,12,
+1,192,14,
+1,128,6,
+1,128,6,
+1,128,6,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+1,128,6,
+1,128,6,
+1,128,6,
+0,192,14,
+0,192,12,
+0,96,24,
+0,120,120,
+0,31,224,
+0,15,192,
+ 49 /* 1 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 24, 0, 30, 0, 96,
+0,7,0,
+0,127,0,
+3,251,0,
+3,195,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+3,255,255,
+3,255,255,
+ 50 /* 2 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 24, 0, 31, 0, 96,
+0,15,128,
+0,127,240,
+0,240,120,
+1,192,28,
+3,128,14,
+3,0,6,
+7,0,3,
+6,0,3,
+0,0,3,
+0,0,3,
+0,0,3,
+0,0,6,
+0,0,14,
+0,0,28,
+0,0,56,
+0,0,112,
+0,0,224,
+0,1,192,
+0,3,128,
+0,7,0,
+0,14,0,
+0,28,0,
+0,56,0,
+0,112,0,
+0,224,0,
+1,192,0,
+3,128,3,
+7,0,3,
+12,0,3,
+15,255,255,
+15,255,255,
+ 51 /* 3 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 25, 0, 32, 0, 100,
+0,15,192,0,
+0,127,240,0,
+0,240,60,0,
+1,192,14,0,
+3,128,6,0,
+1,0,7,0,
+0,0,3,0,
+0,0,3,0,
+0,0,3,0,
+0,0,3,0,
+0,0,6,0,
+0,0,14,0,
+0,0,28,0,
+0,7,248,0,
+0,7,224,0,
+0,1,240,0,
+0,0,28,0,
+0,0,14,0,
+0,0,7,0,
+0,0,3,0,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,3,0,
+0,0,3,0,
+6,0,6,0,
+7,128,14,0,
+1,224,124,0,
+0,127,240,0,
+0,31,192,0,
+ 52 /* 4 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 24, 0, 30, 0, 96,
+0,0,248,
+0,0,248,
+0,1,152,
+0,1,152,
+0,3,24,
+0,7,24,
+0,6,24,
+0,12,24,
+0,12,24,
+0,24,24,
+0,56,24,
+0,48,24,
+0,112,24,
+0,96,24,
+0,192,24,
+1,192,24,
+1,128,24,
+3,128,24,
+3,0,24,
+6,0,24,
+7,255,255,
+7,255,255,
+0,0,24,
+0,0,24,
+0,0,24,
+0,0,24,
+0,0,24,
+0,0,24,
+0,3,255,
+0,3,255,
+ 53 /* 5 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 25, 0, 31, 0, 100,
+1,255,254,0,
+1,255,254,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,135,224,0,
+1,191,248,0,
+1,248,60,0,
+1,192,14,0,
+0,0,7,0,
+0,0,3,0,
+0,0,3,0,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,3,128,
+0,0,3,0,
+6,0,7,0,
+7,0,6,0,
+3,192,28,0,
+1,240,56,0,
+0,127,240,0,
+0,15,192,0,
+ 54 /* 6 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 25, 0, 32, 0, 100,
+0,0,63,0,
+0,1,255,128,
+0,3,193,128,
+0,15,0,0,
+0,28,0,0,
+0,56,0,0,
+0,48,0,0,
+0,112,0,0,
+0,96,0,0,
+0,192,0,0,
+0,192,0,0,
+0,192,0,0,
+1,128,0,0,
+1,131,240,0,
+1,143,252,0,
+1,158,30,0,
+1,184,6,0,
+1,176,3,0,
+1,224,3,0,
+1,192,1,128,
+1,192,1,128,
+1,128,1,128,
+0,128,1,128,
+0,192,1,128,
+0,192,1,128,
+0,96,3,128,
+0,96,3,0,
+0,48,7,0,
+0,56,6,0,
+0,28,28,0,
+0,15,248,0,
+0,3,240,0,
+ 55 /* 7 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 24, 0, 30, 0, 96,
+7,255,255,
+7,255,255,
+6,0,3,
+6,0,3,
+6,0,7,
+0,0,6,
+0,0,6,
+0,0,14,
+0,0,12,
+0,0,12,
+0,0,12,
+0,0,24,
+0,0,24,
+0,0,24,
+0,0,48,
+0,0,48,
+0,0,48,
+0,0,96,
+0,0,96,
+0,0,96,
+0,0,192,
+0,0,192,
+0,0,192,
+0,1,128,
+0,1,128,
+0,1,128,
+0,3,128,
+0,3,0,
+0,3,0,
+0,3,0,
+ 56 /* 8 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 24, 0, 32, 0, 96,
+0,15,192,
+0,63,240,
+0,112,56,
+0,192,12,
+1,128,6,
+1,128,6,
+1,0,2,
+3,0,3,
+3,0,3,
+3,0,3,
+1,0,2,
+1,128,6,
+0,192,12,
+0,240,56,
+0,63,240,
+0,31,224,
+0,112,56,
+0,224,28,
+1,192,14,
+1,128,6,
+1,0,2,
+3,0,3,
+3,0,3,
+3,0,3,
+3,0,3,
+1,0,2,
+1,128,6,
+1,192,14,
+0,224,28,
+0,112,56,
+0,63,240,
+0,15,192,
+ 57 /* 9 */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 26, 0, 32, 0, 104,
+0,7,192,0,
+0,31,240,0,
+0,56,56,0,
+0,112,12,0,
+0,224,6,0,
+0,192,7,0,
+1,192,3,0,
+1,128,3,128,
+1,128,1,128,
+1,128,1,128,
+1,128,1,192,
+1,128,3,192,
+1,128,3,192,
+0,192,6,192,
+0,224,14,192,
+0,96,28,192,
+0,56,120,192,
+0,31,240,192,
+0,15,192,192,
+0,0,1,128,
+0,0,1,128,
+0,0,3,128,
+0,0,3,0,
+0,0,7,0,
+0,0,6,0,
+0,0,14,0,
+0,0,28,0,
+0,0,56,0,
+0,0,240,0,
+1,131,192,0,
+1,255,128,0,
+0,124,0,0,
+ 58 /* : */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 19, 0, 22, 0, 76,
+0,7,128,
+0,15,192,
+0,31,224,
+0,31,224,
+0,31,224,
+0,15,192,
+0,7,128,
+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,7,128,
+0,15,192,
+0,31,224,
+0,31,224,
+0,31,224,
+0,15,192,
+0,7,128,
+ 59 /* ; */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 17, 0, 28, 0, 68,
+0,15,0,
+0,31,128,
+0,63,128,
+0,63,128,
+0,63,128,
+0,31,128,
+0,14,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,63,128,
+0,63,0,
+0,63,0,
+0,62,0,
+0,126,0,
+0,124,0,
+0,124,0,
+0,248,0,
+0,240,0,
+0,240,0,
+0,224,0,
+1,224,0,
+1,192,0,
+1,192,0,
+ 63 /* ? */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 29, 0, 24, 0, 30, 0, 96,
+0,15,224,
+0,127,248,
+1,240,60,
+1,192,14,
+1,128,6,
+1,128,3,
+1,128,3,
+0,0,3,
+0,0,3,
+0,0,3,
+0,0,7,
+0,0,14,
+0,0,28,
+0,0,56,
+0,0,240,
+0,3,192,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,15,192,
+0,15,192,
+0,15,224,
+0,15,192,
+0,7,128,
+ 65 /* A */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 29, 0, 28, 0, 116,
+7,255,128,0,
+7,255,128,0,
+0,13,128,0,
+0,12,192,0,
+0,24,192,0,
+0,24,224,0,
+0,24,96,0,
+0,48,96,0,
+0,48,112,0,
+0,48,48,0,
+0,96,48,0,
+0,96,24,0,
+0,224,24,0,
+0,192,28,0,
+0,192,12,0,
+1,128,12,0,
+1,128,14,0,
+1,255,254,0,
+3,255,255,0,
+3,0,3,0,
+7,0,3,0,
+6,0,3,128,
+6,0,1,128,
+12,0,1,128,
+12,0,0,192,
+12,0,0,192,
+127,192,31,248,
+127,224,31,248,
+ 66 /* B */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 27, 0, 28, 0, 108,
+63,255,240,0,
+63,255,252,0,
+3,0,30,0,
+3,0,7,0,
+3,0,3,0,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,3,0,
+3,0,7,0,
+3,0,30,0,
+3,255,252,0,
+3,255,252,0,
+3,0,31,0,
+3,0,3,128,
+3,0,1,192,
+3,0,0,192,
+3,0,0,96,
+3,0,0,96,
+3,0,0,96,
+3,0,0,96,
+3,0,0,96,
+3,0,0,192,
+3,0,1,192,
+3,0,7,128,
+63,255,255,0,
+63,255,252,0,
+ 67 /* C */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 29, 0, 27, 0, 30, 0, 108,
+0,15,224,0,
+0,63,248,192,
+0,240,62,192,
+1,192,7,192,
+3,128,3,192,
+7,0,1,192,
+6,0,0,192,
+12,0,0,192,
+12,0,0,192,
+12,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+12,0,0,0,
+12,0,0,0,
+14,0,0,0,
+6,0,0,96,
+3,0,0,192,
+1,128,1,192,
+0,224,7,128,
+0,120,30,0,
+0,63,252,0,
+0,7,224,0,
+ 68 /* D */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 26, 0, 28, 0, 104,
+63,255,192,0,
+63,255,240,0,
+6,0,56,0,
+6,0,14,0,
+6,0,6,0,
+6,0,3,0,
+6,0,3,128,
+6,0,1,128,
+6,0,1,128,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,0,192,
+6,0,1,128,
+6,0,1,128,
+6,0,3,128,
+6,0,7,0,
+6,0,6,0,
+6,0,28,0,
+6,0,120,0,
+63,255,240,0,
+63,255,192,0,
+ 69 /* E */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 26, 0, 28, 0, 104,
+63,255,255,128,
+63,255,255,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,0,0,
+3,0,192,0,
+3,0,192,0,
+3,0,192,0,
+3,255,192,0,
+3,255,192,0,
+3,0,192,0,
+3,0,192,0,
+3,0,192,0,
+3,0,192,0,
+3,0,0,0,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+63,255,255,192,
+63,255,255,192,
+ 70 /* F */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 26, 0, 28, 0, 104,
+63,255,255,192,
+63,255,255,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,192,
+3,0,0,0,
+3,0,192,0,
+3,0,192,0,
+3,0,192,0,
+3,255,192,0,
+3,255,192,0,
+3,0,192,0,
+3,0,192,0,
+3,0,192,0,
+3,0,192,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+63,255,128,0,
+63,255,128,0,
+ 71 /* G */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 29, 0, 28, 0, 30, 0, 112,
+0,15,224,0,
+0,63,252,192,
+0,248,30,192,
+1,224,3,192,
+3,128,1,192,
+7,0,0,192,
+6,0,0,192,
+14,0,0,192,
+12,0,0,0,
+12,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,0,0,
+24,0,255,240,
+24,0,255,240,
+24,0,0,192,
+28,0,0,192,
+12,0,0,192,
+12,0,0,192,
+6,0,0,192,
+7,0,0,192,
+3,128,0,192,
+1,192,1,192,
+0,248,15,128,
+0,63,254,0,
+0,7,240,0,
+ 72 /* H */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 27, 0, 28, 0, 108,
+15,240,63,192,
+15,240,63,192,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,255,255,0,
+3,255,255,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+31,240,63,224,
+31,240,63,224,
+ 73 /* I */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 24, 0, 28, 0, 96,
+3,255,255,
+3,255,255,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+0,3,0,
+3,255,255,
+3,255,255,
+ 74 /* J */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 29, 0, 29, 0, 116,
+0,15,255,248,
+0,15,255,248,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+12,0,6,0,
+12,0,6,0,
+12,0,6,0,
+12,0,6,0,
+12,0,6,0,
+12,0,6,0,
+12,0,14,0,
+12,0,12,0,
+14,0,28,0,
+7,128,56,0,
+1,224,240,0,
+0,255,224,0,
+0,63,128,0,
+ 75 /* K */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 28, 0, 28, 0, 112,
+63,248,31,224,
+63,248,31,224,
+3,0,3,128,
+3,0,6,0,
+3,0,28,0,
+3,0,56,0,
+3,0,112,0,
+3,0,224,0,
+3,1,192,0,
+3,3,128,0,
+3,14,0,0,
+3,28,0,0,
+3,63,0,0,
+3,119,128,0,
+3,225,192,0,
+3,192,224,0,
+3,128,112,0,
+3,0,56,0,
+3,0,24,0,
+3,0,28,0,
+3,0,12,0,
+3,0,14,0,
+3,0,6,0,
+3,0,6,0,
+3,0,3,0,
+3,0,3,0,
+63,248,3,240,
+63,248,1,240,
+ 76 /* L */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 27, 0, 28, 0, 108,
+31,255,128,0,
+31,255,128,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,0,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+0,96,0,96,
+31,255,255,224,
+31,255,255,224,
+ 77 /* M */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 29, 0, 28, 0, 116,
+127,0,1,248,
+127,0,3,248,
+15,0,3,96,
+13,128,6,96,
+13,128,6,96,
+12,192,14,96,
+12,192,12,96,
+12,96,12,96,
+12,96,24,96,
+12,112,24,96,
+12,48,48,96,
+12,56,48,96,
+12,24,96,96,
+12,24,96,96,
+12,12,224,96,
+12,12,192,96,
+12,7,192,96,
+12,7,128,96,
+12,3,128,96,
+12,3,0,96,
+12,0,0,96,
+12,0,0,96,
+12,0,0,96,
+12,0,0,96,
+12,0,0,96,
+12,0,0,96,
+127,224,15,248,
+127,224,15,248,
+ 78 /* N */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 28, 0, 28, 0, 112,
+127,0,63,240,
+127,128,63,240,
+7,128,1,128,
+7,192,1,128,
+6,192,1,128,
+6,96,1,128,
+6,112,1,128,
+6,48,1,128,
+6,56,1,128,
+6,28,1,128,
+6,12,1,128,
+6,14,1,128,
+6,6,1,128,
+6,3,1,128,
+6,3,129,128,
+6,1,129,128,
+6,1,193,128,
+6,0,193,128,
+6,0,97,128,
+6,0,113,128,
+6,0,49,128,
+6,0,57,128,
+6,0,25,128,
+6,0,13,128,
+6,0,15,128,
+6,0,7,128,
+63,240,3,128,
+63,240,3,128,
+ 79 /* O */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 29, 0, 27, 0, 30, 0, 108,
+0,15,192,0,
+0,63,240,0,
+0,240,60,0,
+1,192,14,0,
+3,128,7,0,
+3,0,3,0,
+6,0,1,128,
+6,0,1,128,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+6,0,1,128,
+6,0,1,128,
+3,0,3,0,
+3,128,7,0,
+1,192,14,0,
+0,240,60,0,
+0,63,240,0,
+0,15,192,0,
+ 80 /* P */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 25, 0, 28, 0, 100,
+63,255,224,0,
+63,255,248,0,
+3,0,28,0,
+3,0,14,0,
+3,0,3,0,
+3,0,3,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,3,128,
+3,0,3,0,
+3,0,14,0,
+3,0,60,0,
+3,255,248,0,
+3,255,224,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+63,255,0,0,
+63,255,0,0,
+ 81 /* Q */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 29, 0, 27, 0, 35, 0, 108,
+0,15,192,0,
+0,63,240,0,
+0,240,60,0,
+1,192,14,0,
+3,128,7,0,
+3,0,3,0,
+6,0,1,128,
+6,0,1,128,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+6,0,1,128,
+6,0,1,128,
+3,0,3,0,
+3,128,7,0,
+1,224,30,0,
+0,248,124,0,
+0,63,240,0,
+0,15,128,0,
+0,28,0,0,
+0,63,192,96,
+0,255,248,224,
+1,248,63,192,
+0,128,15,0,
+ 82 /* R */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 29, 0, 28, 0, 116,
+63,255,224,0,
+63,255,248,0,
+3,0,30,0,
+3,0,6,0,
+3,0,3,0,
+3,0,3,128,
+3,0,1,128,
+3,0,1,128,
+3,0,1,128,
+3,0,3,128,
+3,0,3,0,
+3,0,15,0,
+3,0,62,0,
+3,255,248,0,
+3,255,224,0,
+3,0,224,0,
+3,0,112,0,
+3,0,56,0,
+3,0,28,0,
+3,0,14,0,
+3,0,6,0,
+3,0,7,0,
+3,0,3,0,
+3,0,1,128,
+3,0,1,192,
+3,0,0,192,
+63,248,0,248,
+63,248,0,120,
+ 83 /* S */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 29, 0, 25, 0, 30, 0, 100,
+0,15,192,0,
+0,63,243,0,
+0,240,59,0,
+1,192,15,0,
+1,128,7,0,
+3,128,7,0,
+3,0,3,0,
+3,0,3,0,
+3,0,1,0,
+3,0,0,0,
+3,128,0,0,
+1,192,0,0,
+0,224,0,0,
+0,126,0,0,
+0,31,240,0,
+0,1,252,0,
+0,0,14,0,
+0,0,7,0,
+0,0,3,128,
+0,0,1,128,
+0,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+7,0,3,0,
+7,128,7,0,
+7,192,14,0,
+6,240,60,0,
+6,63,248,0,
+0,15,224,0,
+ 84 /* T */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 26, 0, 28, 0, 104,
+15,255,255,192,
+15,255,255,192,
+12,3,0,192,
+12,3,0,192,
+12,3,0,192,
+12,3,0,192,
+12,3,0,192,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,255,252,0,
+0,255,252,0,
+ 85 /* U */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 28, 0, 29, 0, 112,
+63,240,63,240,
+63,240,63,240,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+3,0,3,0,
+3,0,3,0,
+1,128,6,0,
+1,192,14,0,
+0,240,60,0,
+0,63,240,0,
+0,15,192,0,
+ 86 /* V */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 29, 0, 28, 0, 116,
+127,224,31,248,
+127,192,15,248,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+6,0,1,128,
+6,0,1,128,
+7,0,3,0,
+3,0,3,0,
+3,0,3,0,
+1,128,6,0,
+1,128,6,0,
+1,192,12,0,
+0,192,12,0,
+0,192,12,0,
+0,96,24,0,
+0,96,24,0,
+0,112,48,0,
+0,48,48,0,
+0,48,48,0,
+0,56,96,0,
+0,24,96,0,
+0,24,192,0,
+0,12,192,0,
+0,12,192,0,
+0,15,128,0,
+0,7,128,0,
+0,7,0,0,
+ 87 /* W */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 29, 0, 28, 0, 116,
+127,224,31,248,
+127,224,31,248,
+24,0,0,96,
+24,0,0,96,
+24,0,0,96,
+12,0,0,64,
+12,7,128,192,
+12,7,128,192,
+12,7,128,192,
+12,7,192,192,
+12,12,192,192,
+12,12,192,192,
+12,12,192,192,
+14,24,96,192,
+6,24,97,128,
+6,24,97,128,
+6,24,113,128,
+6,48,49,128,
+6,48,49,128,
+6,48,49,128,
+6,96,25,128,
+6,96,25,128,
+7,96,27,0,
+3,96,27,0,
+3,192,15,0,
+3,192,15,0,
+3,192,15,0,
+3,128,15,0,
+ 88 /* X */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 28, 0, 28, 0, 112,
+31,224,31,224,
+31,224,31,224,
+7,0,3,128,
+3,0,7,0,
+1,128,6,0,
+1,192,12,0,
+0,224,28,0,
+0,112,56,0,
+0,48,48,0,
+0,56,96,0,
+0,28,224,0,
+0,15,192,0,
+0,7,128,0,
+0,3,0,0,
+0,7,128,0,
+0,15,192,0,
+0,28,192,0,
+0,24,96,0,
+0,48,112,0,
+0,112,56,0,
+0,224,28,0,
+0,192,12,0,
+1,128,14,0,
+3,128,7,0,
+7,0,3,128,
+6,0,1,128,
+63,224,31,240,
+63,224,31,240,
+ 89 /* Y */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 27, 0, 28, 0, 108,
+31,224,31,224,
+31,224,31,224,
+7,0,3,128,
+3,128,3,0,
+1,128,6,0,
+1,192,14,0,
+0,224,12,0,
+0,96,24,0,
+0,112,56,0,
+0,56,48,0,
+0,24,96,0,
+0,28,224,0,
+0,14,192,0,
+0,7,128,0,
+0,7,128,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,255,252,0,
+0,255,254,0,
+ 90 /* Z */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 25, 0, 28, 0, 100,
+3,255,255,0,
+3,255,255,0,
+3,0,7,0,
+3,0,6,0,
+3,0,12,0,
+3,0,28,0,
+3,0,56,0,
+3,0,48,0,
+3,0,96,0,
+0,0,224,0,
+0,0,192,0,
+0,1,128,0,
+0,3,128,0,
+0,7,0,0,
+0,6,0,0,
+0,12,0,0,
+0,28,0,0,
+0,24,0,0,
+0,48,1,128,
+0,112,1,128,
+0,224,1,128,
+0,192,1,128,
+1,128,1,128,
+3,128,1,128,
+3,0,1,128,
+6,0,1,128,
+7,255,255,128,
+7,255,255,128,
+ 95 /* _ */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 252, 0, 31, 0, 2, 0, 124,
+255,255,255,254,
+255,255,255,254,
+ 97 /* a */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 27, 0, 23, 0, 108,
+0,15,192,0,
+0,255,240,0,
+3,248,120,0,
+3,192,28,0,
+0,0,14,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,0,6,0,
+0,63,230,0,
+1,255,254,0,
+3,224,30,0,
+7,128,6,0,
+14,0,6,0,
+14,0,6,0,
+12,0,6,0,
+12,0,6,0,
+12,0,14,0,
+14,0,62,0,
+14,0,118,0,
+7,131,231,224,
+3,255,135,224,
+0,254,0,0,
+ 98 /* b */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 27, 0, 31, 0, 108,
+126,0,0,0,
+126,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,7,224,0,
+6,31,252,0,
+6,56,30,0,
+6,96,7,0,
+6,192,3,128,
+7,128,1,128,
+7,0,0,192,
+7,0,0,192,
+7,0,0,224,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+7,0,0,192,
+7,0,0,192,
+7,128,1,128,
+6,192,3,128,
+6,96,7,0,
+126,56,30,0,
+126,31,252,0,
+0,7,224,0,
+ 99 /* c */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 27, 0, 23, 0, 108,
+0,15,224,0,
+0,63,252,192,
+0,248,62,192,
+1,224,7,192,
+3,128,3,192,
+3,0,1,192,
+7,0,0,192,
+6,0,0,192,
+14,0,0,128,
+12,0,0,0,
+12,0,0,0,
+12,0,0,0,
+12,0,0,0,
+12,0,0,0,
+14,0,0,0,
+14,0,0,0,
+6,0,0,0,
+7,0,0,224,
+3,128,1,224,
+1,192,7,192,
+0,248,31,0,
+0,127,252,0,
+0,31,240,0,
+ 100 /* d */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 29, 0, 31, 0, 116,
+0,0,31,128,
+0,0,31,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,31,129,128,
+0,127,225,128,
+1,224,113,128,
+3,128,25,128,
+7,0,13,128,
+6,0,7,128,
+12,0,3,128,
+12,0,3,128,
+28,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+12,0,3,128,
+12,0,3,128,
+6,0,7,128,
+7,0,13,128,
+3,128,25,128,
+1,224,113,248,
+0,127,225,248,
+0,31,128,0,
+ 101 /* e */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 26, 0, 23, 0, 104,
+0,31,192,0,
+0,127,240,0,
+1,240,124,0,
+3,192,30,0,
+7,0,7,0,
+6,0,3,0,
+14,0,3,128,
+12,0,1,128,
+28,0,1,192,
+24,0,0,192,
+31,255,255,192,
+31,255,255,192,
+24,0,0,0,
+28,0,0,0,
+12,0,0,0,
+12,0,0,0,
+14,0,0,0,
+7,0,0,0,
+3,128,1,192,
+3,192,7,192,
+0,240,63,0,
+0,127,252,0,
+0,31,240,0,
+ 102 /* f */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 27, 0, 30, 0, 108,
+0,0,255,128,
+0,3,255,224,
+0,7,0,0,
+0,6,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+3,255,255,0,
+3,255,255,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+0,12,0,0,
+7,255,255,0,
+7,255,255,0,
+ 103 /* g */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 28, 0, 31, 0, 112,
+0,63,0,0,
+0,255,195,240,
+1,224,243,240,
+3,128,59,0,
+7,0,27,0,
+14,0,15,0,
+12,0,7,0,
+12,0,7,0,
+24,0,3,0,
+24,0,3,0,
+24,0,3,0,
+24,0,3,0,
+24,0,3,0,
+24,0,3,0,
+12,0,7,0,
+12,0,7,0,
+6,0,15,0,
+7,0,27,0,
+1,224,115,0,
+0,255,227,0,
+0,63,131,0,
+0,0,3,0,
+0,0,3,0,
+0,0,3,0,
+0,0,3,0,
+0,0,3,0,
+0,0,6,0,
+0,0,14,0,
+0,0,60,0,
+0,127,248,0,
+0,127,224,0,
+ 104 /* h */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 27, 0, 30, 0, 108,
+63,0,0,0,
+63,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,0,0,0,
+3,7,224,0,
+3,31,248,0,
+3,56,60,0,
+3,112,14,0,
+3,224,6,0,
+3,192,7,0,
+3,128,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+31,240,63,224,
+31,240,63,224,
+ 105 /* i */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 25, 0, 31, 0, 100,
+0,6,0,0,
+0,6,0,0,
+0,6,0,0,
+0,6,0,0,
+0,6,0,0,
+0,0,0,0,
+0,0,0,0,
+0,0,0,0,
+0,0,0,0,
+0,0,0,0,
+1,255,0,0,
+1,255,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+7,255,255,128,
+7,255,255,128,
+ 106 /* j */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 31, 0, 23, 0, 40, 0, 92,
+0,0,48,
+0,0,48,
+0,0,48,
+0,0,48,
+0,0,48,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,0,0,
+0,255,254,
+0,255,254,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,6,
+0,0,12,
+0,0,28,
+0,0,56,
+0,255,240,
+1,255,192,
+ 107 /* k */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 27, 0, 30, 0, 108,
+31,128,0,0,
+31,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,255,0,
+1,128,255,128,
+1,128,112,0,
+1,128,224,0,
+1,129,192,0,
+1,131,128,0,
+1,135,0,0,
+1,158,0,0,
+1,184,0,0,
+1,252,0,0,
+1,238,0,0,
+1,199,0,0,
+1,131,128,0,
+1,129,192,0,
+1,128,224,0,
+1,128,112,0,
+1,128,56,0,
+1,128,28,0,
+1,128,14,0,
+31,128,63,224,
+31,128,63,224,
+ 108 /* l */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 30, 0, 25, 0, 30, 0, 100,
+1,255,0,0,
+1,255,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+0,3,0,0,
+7,255,255,128,
+7,255,255,128,
+ 109 /* m */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 30, 0, 22, 0, 120,
+0,48,15,0,
+124,252,63,128,
+125,198,113,192,
+15,3,224,224,
+15,1,192,96,
+14,1,192,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+12,1,128,96,
+127,1,224,124,
+127,1,224,124,
+ 110 /* n */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 27, 0, 22, 0, 108,
+0,1,128,0,
+31,15,240,0,
+31,60,60,0,
+3,112,14,0,
+3,224,6,0,
+3,192,7,0,
+3,128,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+31,240,31,224,
+31,240,31,224,
+ 111 /* o */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 26, 0, 23, 0, 104,
+0,31,224,0,
+0,127,248,0,
+0,240,124,0,
+1,192,14,0,
+3,128,7,0,
+7,0,3,128,
+7,0,3,128,
+6,0,1,128,
+14,0,1,192,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+14,0,1,192,
+14,0,1,192,
+6,0,1,128,
+7,0,3,128,
+3,128,7,0,
+1,192,14,0,
+0,240,60,0,
+0,127,248,0,
+0,31,224,0,
+ 112 /* p */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 27, 0, 31, 0, 108,
+30,7,224,0,
+126,31,252,0,
+126,120,30,0,
+6,224,7,0,
+7,192,3,128,
+7,128,1,192,
+7,0,0,192,
+7,0,0,192,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+6,0,0,96,
+7,0,0,192,
+7,128,0,192,
+7,128,1,128,
+7,224,7,128,
+6,248,31,0,
+6,63,252,0,
+6,15,240,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+6,0,0,0,
+127,248,0,0,
+127,248,0,0,
+ 113 /* q */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 29, 0, 31, 0, 116,
+0,31,128,0,
+0,127,225,248,
+1,224,121,248,
+3,128,29,128,
+7,0,13,128,
+14,0,7,128,
+12,0,3,128,
+12,0,3,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+24,0,1,128,
+12,0,3,128,
+14,0,3,128,
+6,0,7,128,
+3,128,29,128,
+1,224,121,128,
+0,255,241,128,
+0,63,193,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,1,128,
+0,0,127,248,
+0,0,127,248,
+ 114 /* r */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 27, 0, 22, 0, 108,
+0,16,31,0,
+7,240,63,128,
+7,240,241,192,
+0,49,192,224,
+0,51,128,96,
+0,55,0,0,
+0,62,0,0,
+0,60,0,0,
+0,56,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+0,48,0,0,
+15,255,254,0,
+15,255,254,0,
+ 115 /* s */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 22, 0, 25, 0, 23, 0, 100,
+0,31,192,0,
+0,127,243,0,
+0,240,63,0,
+1,192,15,0,
+3,128,7,0,
+3,0,7,0,
+3,0,3,0,
+3,128,0,0,
+1,192,0,0,
+0,254,0,0,
+0,127,240,0,
+0,7,252,0,
+0,0,31,0,
+0,0,7,0,
+0,0,3,128,
+6,0,1,128,
+6,0,1,128,
+6,0,1,128,
+7,0,3,128,
+7,128,15,0,
+7,240,62,0,
+6,127,252,0,
+0,31,224,0,
+ 116 /* t */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 28, 0, 25, 0, 29, 0, 100,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+63,255,248,0,
+63,255,252,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,128,0,0,
+1,192,0,0,
+0,192,3,128,
+0,240,31,0,
+0,63,252,0,
+0,15,224,0,
+ 117 /* u */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 27, 0, 22, 0, 108,
+63,0,127,0,
+63,0,127,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,3,0,
+3,0,7,0,
+3,128,15,0,
+1,128,59,0,
+1,224,243,224,
+0,127,195,224,
+0,31,0,0,
+ 118 /* v */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 28, 0, 21, 0, 112,
+63,240,63,240,
+63,240,63,240,
+6,0,1,128,
+3,0,3,0,
+3,0,3,0,
+3,128,7,0,
+1,128,6,0,
+1,192,6,0,
+0,192,12,0,
+0,192,12,0,
+0,96,24,0,
+0,96,24,0,
+0,48,56,0,
+0,48,48,0,
+0,56,48,0,
+0,24,96,0,
+0,28,96,0,
+0,12,192,0,
+0,12,192,0,
+0,7,128,0,
+0,7,128,0,
+ 119 /* w */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 28, 0, 21, 0, 112,
+63,192,15,240,
+63,192,15,240,
+12,0,0,192,
+12,0,0,192,
+12,0,0,192,
+6,3,1,128,
+6,7,129,128,
+6,7,129,128,
+6,7,129,128,
+6,14,193,128,
+3,12,195,0,
+3,12,195,0,
+3,24,99,0,
+3,24,99,0,
+1,152,102,0,
+1,176,54,0,
+1,176,54,0,
+1,176,54,0,
+1,224,30,0,
+0,224,28,0,
+0,224,28,0,
+ 120 /* x */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 27, 0, 21, 0, 108,
+15,240,63,192,
+15,240,63,192,
+3,128,7,0,
+1,192,14,0,
+0,224,28,0,
+0,112,56,0,
+0,56,112,0,
+0,28,224,0,
+0,15,192,0,
+0,7,128,0,
+0,7,128,0,
+0,15,192,0,
+0,28,224,0,
+0,56,112,0,
+0,112,56,0,
+0,224,28,0,
+1,192,14,0,
+3,128,7,0,
+7,0,3,128,
+31,240,63,224,
+31,240,63,224,
+ 121 /* y */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 27, 0, 30, 0, 108,
+31,224,31,224,
+31,224,31,224,
+6,0,1,128,
+7,0,1,128,
+3,0,3,0,
+3,128,3,0,
+1,128,6,0,
+1,192,6,0,
+0,192,12,0,
+0,224,12,0,
+0,96,24,0,
+0,112,24,0,
+0,48,48,0,
+0,56,48,0,
+0,24,96,0,
+0,28,96,0,
+0,12,192,0,
+0,14,192,0,
+0,7,128,0,
+0,7,128,0,
+0,3,0,0,
+0,3,0,0,
+0,6,0,0,
+0,6,0,0,
+0,12,0,0,
+0,12,0,0,
+0,24,0,0,
+0,24,0,0,
+31,255,128,0,
+31,255,128,0,
+ 122 /* z */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 21, 0, 24, 0, 21, 0, 96,
+3,255,254,
+3,255,254,
+3,0,14,
+3,0,28,
+3,0,56,
+3,0,48,
+0,0,112,
+0,0,224,
+0,1,192,
+0,3,128,
+0,7,0,
+0,14,0,
+0,28,0,
+0,24,0,
+0,56,0,
+0,112,3,
+0,224,3,
+1,192,3,
+3,128,3,
+3,255,255,
+3,255,255,
+ 32 /* */, 4, 0, 14, 1, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 64,
+ 0
+};
+
+const int px_bitmap_font_point_size = 24;
+const int px_bitmap_font_resolution = 150;
+const byte px_bitmap_font_header[] = {
+ 0, 0, 0, 14, 254, 0, 0, 72,
+ 'B', 'R', 0, 0, 0, 4,
+ 0, 150, 0, 150,
+ 0xff, 0xff, 0, 0, 0, 0
+};
+const uint px_bitmap_font_header_size = sizeof(px_bitmap_font_header);
diff --git a/pxl/pxbfont.h b/pxl/pxbfont.h
new file mode 100644
index 000000000..2bcd2cf34
--- /dev/null
+++ b/pxl/pxbfont.h
@@ -0,0 +1,26 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxbfont.h */
+/* Interface to PCL XL built-in bitmap font */
+
+/*
+ * This bitmap font is included in the interpreter solely for the
+ * purpose of producing error pages.
+ */
+
+extern const int px_bitmap_font_point_size;
+extern const int px_bitmap_font_resolution;
+extern const byte px_bitmap_font_header[];
+extern const uint px_bitmap_font_header_size;
+extern const byte px_bitmap_font_char_data[];
diff --git a/pxl/pxbfont.ps b/pxl/pxbfont.ps
new file mode 100644
index 000000000..c2f0ee075
--- /dev/null
+++ b/pxl/pxbfont.ps
@@ -0,0 +1,124 @@
+%!
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+% Unauthorized use, copying, and/or distribution prohibited.
+
+% Construct the bitmap font used for printing the error page.
+
+% /usr/bin/gs -I/usr/lib/ghostscript -q -dNODISPLAY pxbfont.ps >pxbfont.c
+
+
+% Put space last so we can fake the width.
+
+/Chars
+ ("\(\)-/0123456789:;?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz )
+def
+/Res 150 def
+/Face /Courier def
+/Points 24 def
+
+% Write the copyright notice.
+(/* Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+ */
+
+#include "stdpre.h"
+#include "pxbfont.h"
+) print
+
+% Create the character bitmaps.
+(
+const byte px_bitmap_font_char_data[] = {
+) print
+/Asc 0 def
+/Desc 0 def
+/Base Res 1 add 2 idiv def
+/Sc Res 72 div def
+% Round up the device width so there won't be trailing garbage bits
+% when we read out the character bitmaps.
+/ID [Sc 0 0 Sc neg 0 Res]
+ Res dup neg 7 and add Res <ff 00> makeimagedevice def
+nulldevice ID setdevice
+/Row Res 7 add 8 idiv string def
+/ZRow Row length string def
+Face Points selectfont
+/print16
+ { dup 8 bitshift 255 and =only (, ) print 255 and =only
+ } def
+Chars
+ { 1 string dup 0 4 -1 roll put /Ch exch def
+ erasepage 0 36 moveto Ch show
+ 0 Res
+ % Remove blank lines at bottom.
+ { 2 copy eq { exit } if
+ dup 1 sub ID exch Row copyscanlines ZRow ne { exit } if
+ 1 sub
+ }
+ loop
+ % Remove blank lines at top.
+ { 2 copy eq { exit } if
+ 1 index ID exch Row copyscanlines ZRow ne { exit } if
+ exch 1 add exch
+ }
+ loop
+ % Determine the character width.
+ /B 0 def
+ /W 0 def
+ 2 copy 1 sub 1 exch
+ { ID exch Row copyscanlines pop
+ Row length 1 sub -1 W
+ { Row 1 index get dup 0 ne
+ { 1 index W eq { B or } if /B exch def /W exch def exit
+ }
+ if pop pop
+ }
+ for
+ }
+ for
+ /WB W 8 mul 8 add B 16#100 or % might be an empty character
+ { dup 1 and 0 ne { pop exit } if
+ exch 1 sub exch -1 bitshift
+ }
+ loop
+ dup 0 eq { pop Asc 2 idiv } if def % fake width of empty characters
+ 2 copy eq { pop pop Base dup } if % empty character
+ /Asc Asc Base 4 index sub max def
+ /Desc Desc 2 index Base sub max def
+ % Write the character code.
+ (\t) print Ch 0 get =only ( /* ) print Ch =only ( */, ) print
+ % Write the character header.
+ % We use the PCL5 format, rather than the PCL XL format,
+ % so that we can represent the inter-character spacing.
+ (4, 0, 14, 1, 0, 0, 0, 0, ) =only
+ Base 2 index sub print16 (, ) print
+ WB print16 (, ) print
+ 2 copy exch sub print16 (, ) print
+ WB 4 mul print16 (,) =
+ % Write the bits.
+ 1 sub 1 exch
+ { ID exch Row copyscanlines 0 W 1 add getinterval
+ { =only (,) print
+ } forall () =
+ }
+ for
+ }
+forall
+(\t0
+};
+) print
+
+% Create the font header.
+(
+const int px_bitmap_font_point_size = ) print Points =only (;
+const int px_bitmap_font_resolution = ) print Res =only (;
+) print
+(const byte px_bitmap_font_header[] = {
+ 0, 0, 0, 14, 254, 0, 0, ) print Chars length =only (,
+ 'B', 'R', 0, 0, 0, 4,
+ 0, ) print Res =only (, 0, ) print Res =only (,
+ 0xff, 0xff, 0, 0, 0, 0
+};
+const uint px_bitmap_font_header_size = sizeof(px_bitmap_font_header);
+) print
+
+% All done.
+flush quit
diff --git a/pxl/pxcet.txt b/pxl/pxcet.txt
new file mode 100644
index 000000000..45998e1b2
--- /dev/null
+++ b/pxl/pxcet.txt
@@ -0,0 +1,235 @@
+
+ Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+
+This document presents the results of Aladdin's investigation of
+discrepancies between the Genoa LaserJet 5 PCL6 Command-Level Emulation
+Test, the published PCL XL Feature Reference Protocol Class 1.1
+specification, and the behavior of the H-P LaserJet 6MP printer.
+
+ Report on Genoa LaserJet 5 PCL6 CET and LaserJet 6MP
+
+Introduction
+============
+
+In the course of validating our PCL XL interpreter using the Genoa LaserJet
+5 PCL6 Command-Level Emulation Test (CET), we observed a number of
+discrepancies that, after careful investigation, we concluded were due to
+problems in the CET and/or the printer firmware. In this document, we
+present these in detail.
+
+This document should be read in conjunction with our separate report on
+discrepancies between the specification and the firmware independent of the
+Genoa tests.
+
+Changes in a given revision of this document are marked with the revision
+number in [brackets]. Revision history:
+ first issued December 12, 1996
+ rev. [1] December 13, 1996
+ rev. [2] December 19, 1996
+ rev. [3] January 1, 1997
+ rev. [4] January 17, 1997
+ rev. [5] January 29, 1997
+
+Command emulation tests
+=======================
+
+c101
+----
+
+On the pages that include both a UnitsOfMeasure command setting different
+units for the X and Y axes and a PageScale command, text scaling appears to
+be affected only by one of these and not the other. (We didn't analyze the
+output carefully enough to determine which one.) This affects pages 16
+through 19 of c101. This is apparently caused by a LJ5 firmware bug that
+has been corrected in the LJ6MP: the 6MP agrees with our reading of the
+specification.
+
+This bug affects other tests as well; we have tried to note every instance
+of it below.
+
+c102
+----
+
+The bug noted under c101 also affects page 4 of c102.
+
+c302
+----
+
+The bug noted under c101 also affects pages 3 and 6 of c302.
+
+c306
+----
+
+[5] On page 8 of c306, the patterns with an origin of -32767 in X or Y are
+apparently incorrect: they appear as though the origin were +32767.
+
+Specifying a NewDestinationSize for a raster pattern in the SetBrushSource
+or SetPenSource command apparently changes the destination size permanently,
+or at least for a subsequent SetBrush/PenSource command that doesn't specify
+a NewDestinationSize. Page 43 of c306 tests for this explicitly, and the
+LJ5 fails the test. This apparent firmware bug has [not] been fixed in the
+LJ6MP.
+
+c307
+----
+
+The bug affecting page 43 of c306 also affects page 44 of c307.
+
+[1] c308
+--------
+
+[1] The text on page 23 says that "Printing a bitmap font at an angle
+produces an error." However, no error occurs. By experiment, we have
+determined that rotating the *page* causes bitmaps to rotate appropriately,
+but setting the character angle, scale, or shear factor to a non-default
+value causes an IllegalFontData error.
+
+[2] c319
+--------
+
+The "PenWidth_UI = 600" shape on page 37 is actually created from a
+lower-case 'e' in the Arial font, so it may appear different depending on
+the details of the font and the rasterizer.
+
+[1] c321
+--------
+
+[1] It appears that if the current clip mode is even/odd, SetClipIntersect
+with an exterior clip region disregards the previous clip path and does the
+equivalent of SetClipReplace. The first, and simplest, example of this is
+the upper right figure on page 3: the "intersection" clip region is simply
+the exterior of the two lightly-drawn rectangles, with no relationship to
+the darker-drawn rectangle which is the original clipping region. This bug
+shows up in the Genoa printouts and has also been observed on the LJ6MP.
+
+[1] This bug also affects many other pages in this test.
+
+[2] c330
+--------
+
+On the last page of this test, a partial 'B' should appear in portrait
+orientation to the left of the partial 'A'. The input data read as follows
+(slightly abridged):
+
+ 0 6600 usp @PageOrigin SetPageOrigin
+ 90 ss @PageAngle SetPageRotation
+ PushGS
+ -2300 1900 ssp @PageOrigin SetPageOrigin
+ 2.23 1.1 rp @PageScale SetPageScale
+ (Courier Bd) ba @FontName 1000 us @CharSize
+ 629 us @SymbolSet SetFont
+ 0 b @NullBrush SetBrushSource
+ NewPath
+ 1500 0 3500 1200 usq @BoundingBox
+ 2100 0 ssp @StartPoint
+ 2600 0 ssp @EndPoint
+ PiePath PaintPath
+ 0 b @ClipRegion SetClipReplace
+ <79 7b 7d> ba @RGBColor SetBrushSource
+ 2500 900 ssp @PageOrigin SetPageOrigin
+ 0 0 usp @Point SetCursor
+ -180 ss @PageAngle SetPageRotation
+ (A) ba @TextData Text
+ SetPageDefaultCTM
+ 2100 3600 usp @Point SetCursor
+ (B) ba @TextData Text
+
+Even when we modified the test data to paint an entire page of 'B' at this
+point, no characters appeared. We assume this results from a firmware bug,
+but we have no theories as to its nature.
+
+[4] c333
+--------
+
+In the "Effect on CharAngle" and "Effect on CharShear" lines of page 16, the
+character appears to be scaled by the page scale before being rotated by the
+character angle or sheared, rather than vice versa. We believe this is a
+firmware bug because we verified, by testing all 125 possible sequences of 3
+operations chosen from the set {SetCharAngle, SetCharScale, SetCharShear,
+SetPageRotation, SetPageScale}, that the character transformations uniformly
+occur before the page transformations.
+
+The bug noted under c101 also affects pages 18 through 20 of c333.
+
+Error emulation tests
+=====================
+
+[2] e120
+--------
+
+The H-P implementation apparently supports only the little-endian binary
+binding: [3] an "unavailable binding" error occurs when the file attempts to
+start an input stream with big-endian binding. Furthermore, there is an
+apparent data error in the subsequent big-endian data: at byte position 101
+in the big-endian section (counting the first byte of PCL XL data after the
+stream header as byte 0), the length of the font name "Courier" is
+incorrectly coded as (16,0) (little-endian) rather than (0,16) (big-endian).
+The resulting 4096-byte count causes the entire remainder of the file to be
+interpreted as a data stream; since this exceeds the length of the file, the
+test terminates.
+
+ Report on HP-PCL XL 2 0 protocol generated for
+ Laserjet 8000 with device reference Color Laserjet
+ 4600
+ ==================================================
+
+C305.BIN page 13. An undefined error code 0x15 is reported for
+operator 20 (SetBrushSource) on the 4600. The color laserjet
+apparently cannot use the referenced pattern. We print page 13
+without an error.
+
+
+ Report on HP-PCL XL 3.0 4600
+ ============================
+
+
+C318.BIN page 33: On the HP 4600 the 4th patterned box has a filled
+black area. On the artifex interpreter the black area is the same as
+the other patterned boxes. This is certainly a bug in the HP
+firmware. The black area in each patterned box is a rectangle edged
+with a dashed line stroke. The rectangle is then filled with the null
+brush which should produce no output. However for raster operations
+0, 17, 68, 85, 136, 153, 204, 221, 250, 255 it appears the null brush
+is "locked out" and the previous pattern (in this case the fill for
+the patterned box) is used. We don't think it worthwhile to emulate
+this bug.
+
+C420.BIN page 9 and C703 page 1. Rectangles' color incorrect. In the
+current architecture the result of combining image (source) and
+pattern (texture) may not work correctly using the default
+"UseCIEColor" mode. To print these rectangles correctly run the
+interpreter with -J"@PJL SET USECIECOLOR=OFF" as a workaround.
+
+C705.BIN page 36. Extra blank page. We assume this is a bug in the HP
+firmware. In full page passthrough mode the blank page is suppressed,
+but extracting the relevant embedded pcl produces a blank page on the
+Color Laserjet.
+
+C705.BIN page 19. Passthrough missing wedges. We think this is a bug
+in the Color Laserjet 4600 firmware. Full page passthrough is used to
+send a partially initialized hpgl/2 job to the pcl interpreter.
+Without any commands to indicate gl/2 should reset the color space
+(IN, DF) gl/2 will use the color space in the graphics state. In
+order to print this job correctly it would be necessary to have
+different initialization routines for gl/2 depending on whether it was
+invoked from pcl or pclxl. We do not think this is desirable nor is
+it what HP intended.
+
+C705.BIN page 3. Merge control problem in passthrough mode. This
+problem is a PCL5C problem and is not related to PCLXL. The HP 4600
+produces incorrect results for MC mode 1 for some colors. Below is a
+simple example. Using the default palette the blue (pen 5 0x0000ff)
+is used to fill a simple rectangle. Pen 6 (magenta 0xff00ff) is used
+to paint a box above the blue box. The default raster operation with
+Merge Control 1 is 168 which (after simplification) "and's" the
+current paint value with the destination's value. The predicted paint
+value for the second box is 0xff00ff & 0x0000ff = 0x0000ff (blue).
+The HP produces magenta and the artifex interpreter the expected blue.
+
+example (quoted printable)
+
+=1BE=1B%1BIN;SP1;PA150,4900;SD3,12;IP150,4900,4075,9750;SC0,100,0,100;P=
+A5,90;SP5;MC1;SP5;PA20,25;RA40,45;FT;LT6;SP6;PA23,28;RA37,42=1B%1B=1BE=
+
+
diff --git a/pxl/pxdict.h b/pxl/pxdict.h
new file mode 100644
index 000000000..0eeb1cec7
--- /dev/null
+++ b/pxl/pxdict.h
@@ -0,0 +1,75 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxdict.h */
+/* Dictionary interface for PCL XL parser */
+/* Requires gsmemory.h */
+
+#ifndef pxdict_INCLUDED
+# define pxdict_INCLUDED
+
+#include "pxvalue.h"
+#include "pldict.h"
+
+/*
+ * We use dictionaries to catalog 3 kinds of entities: fonts, user-defined
+ * streams, and raster patterns. (For raster patterns, each level of
+ * persistence has a separate dictionary.) The keys are strings (byte or
+ * uint16).
+ */
+
+typedef pl_dict_value_free_proc_t px_dict_value_free_proc;
+#ifndef px_dict_entry_DEFINED
+# define px_dict_entry_DEFINED
+typedef pl_dict_entry_t px_dict_entry_t;
+#endif
+typedef pl_dict_t px_dict_t;
+#define st_px_dict st_pl_dict
+#define st_px_dict_max_ptrs st_pl_dict_max_ptrs
+
+/* Get the data and size of a byte or uint16 string. */
+#define key_data(key)\
+ ((key)->value.array.data)
+#define key_size(key)\
+ ((key)->value.array.size * value_size(key))
+
+/* Initialize a dictionary. */
+#define px_dict_init(pdict, memory, free_proc)\
+ pl_dict_init(pdict, memory, free_proc)\
+
+/*
+ * Look up an entry in a dictionary. Return true and set *pvalue if found.
+ */
+#define px_dict_find(pdict, key, pvalue)\
+ pl_dict_find(pdict, key_data(key), key_size(key), pvalue)
+
+/*
+ * Add an entry to a dictionary. Return 1 if it replaces an existing entry.
+ * Return -1 if we couldn't allocate memory.
+ */
+#define px_dict_put(pdict, key, value)\
+ pl_dict_put(pdict, key_data(key), key_size(key), value)
+
+/*
+ * Remove an entry from a dictionary. Return true if the entry was present.
+ */
+#define px_dict_undef(pdict, key)\
+ pl_dict_undef(pdict, key_data(key), key_size(key))
+
+/*
+ * Release a dictionary by freeing all keys, values, and other storage.
+ */
+#define px_dict_release(pdict)\
+ pl_dict_release(pdict)\
+
+#endif /* pxdict_INCLUDED */
diff --git a/pxl/pxdiff.txt b/pxl/pxdiff.txt
new file mode 100644
index 000000000..2a8d86804
--- /dev/null
+++ b/pxl/pxdiff.txt
@@ -0,0 +1,315 @@
+
+ Copyright (C) 1996, 1997 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+
+This document presents known discrepancies between Aladdin's PCL XL
+interpreter and the output of the Genoa LaserJet 5 PCL6 FTS and CET.
+
+ Discrepancies from Genoa LaserJet 5 PCL6 Output
+
+Introduction
+============
+
+This document presents discrepancies between our interpreter and the output
+of individual Genoa tests due to any of the following:
+
+ A) Residual problems in our code.
+
+ B) Differences in halftone screen.
+
+ C) Differences in TrueType font rasterizer.
+
+ D) Different implementation choices that we believe will be fully
+ acceptable to customers.
+
+ E) [2] Implementation shortcuts that are visible to customers but
+ that are too much work to change unless we receive an explicit
+ request to do so.
+
+ F) Likely H-P firmware bugs.
+
+We will fix category (A) to the best of our ability in the initial product
+code release, with some additional fixes likely to be required in later
+releases. [4] We will fix category (B) when we have been able to analyze
+the H-P screen in complete detail, which we have not yet been able to do.
+We do not plan to do anything about (C) or (D). We are willing to discuss
+items in (E) individually.
+
+Some discrepancies are inevitable given that our interpreter is designed to
+meet the following not always consistent specifications:
+
+ 1) The published "PCL XL Feature Reference Protocol Class 1.1"
+ document from Hewlett-Packard.
+
+ 2) The printed output provided by Genoa with their LaserJet 5
+ PCL6 test suites.
+
+[4] 3) The printed output we obtained from a LaserJet 6MP.
+
+ 4) In a few cases, primarily where #1 is silent or ambiguous
+ or where #1 and #2 disagree, our best guess as to H-P's
+ intentions.
+
+In general, when we could find an interpretation of the H-P document that
+was consistent with the Genoa output, we have followed it in our
+implementation, even if that interpretation is not the most obvious one.
+[4] In the few cases of discrepancies between the LJ5 and the LJ6MP, we have
+followed the latter, since in all such cases the 6MP agrees with our
+understanding of the specification.
+
+Changes in a given revision of this document are marked with the revision
+number in [brackets]. Revision history:
+ first issued January 1, 1997
+ rev. [1] January 11, 1997
+ rev. [2] January 15, 1997
+ rev. [3] January 23, 1997
+ rev. [4] February 9, 1997
+
+Code problems
+=============
+
+Page shifting
+-------------
+
+We do not currently handle discrepancies between the printer's (0,0) point
+and the physical page corner correctly. For example, when printing to the
+LaserJet 4/5/6, all pages are shifted down and to the right by approximately
+1/4". (This should not affect OEM customers.)
+
+Memory management
+-----------------
+
+If an error occurs in the middle of downloading an object like a font or a
+pattern, the current code does not free the partially-built structure.
+
+We have not attempted to exhaustively test graceful recovery from
+out-of-memory conditions; it is likely that such conditions may, at least
+under some circumstances, require reinitializing the interpreter. [4] The
+interpreter does not store any state in global variables, so simply
+releasing all memory acquired by the interpreter and reinitializing the
+interpreter is always safe.
+
+Miscellaneous
+-------------
+
+Our current implementation of pseudo-bold characters requires a large amount
+of buffer space, which causes a memory overflow error on the following
+files:
+ CET c309
+
+[4] Our current implementation of elliptical arcs has a slight rounding
+inaccuracy that produces an inappropriate visible hairline in 4 of the 5
+images in the rightmost column of the bottom half of
+ CET c404 p. 25
+This inaccuracy may affect other CET pages where the closing lines of two
+chords whose bounding boxes have different aspect ratios are supposed to
+coincide.
+
+[4] In our current implementation, reading back the clipping path as the
+current path may produce a path that covers a region as much as 1 pixel
+larger all the way around as the original path that was specified for
+clipping. This produces an inappropriate hairline border around the objects
+in image 02 of
+ FTS t324
+
+Halftone screen
+===============
+
+We have not yet been able to duplicate the behavior of H-P's carefully
+designed halftone screen, which produces striking and unusual effects when
+ORing together different source and paint gray shades using RasterOp. Many
+of the Genoa tests do this, even though this is not something that we expect
+to occur frequently (or perhaps at all) in application output.
+Unfortunately, the visible effects are not subtle (they arise from something
+similar to Moire' patterns). We can't give an exhaustive list of the test
+pages that this affects, since many pages on many tests do this. [4] One
+unobvious result of this is that certain objects simply disappear: for
+example, some gray-shaded rectangles in
+ CET c420 pp. 5-14
+
+TrueType rasterizer
+===================
+
+Our current TrueType font rasterizer is not of production quality: it
+disregards the hinting instructions and does not handle correctly multi-part
+characters where one part is offset with respect to another. This causes
+many differences in the output, mostly minor. We plan to offer a
+commercial-quality rasterizer at some time in the future; however, our PCL
+XL interpreter is an OEM product for which our customers are expected to
+provide their own rasterizers.
+
+Implementation choices
+======================
+
+Range of coordinates
+--------------------
+
+Our interpreter uses a fixed-point representation for device coordinates (20
+bits of integer, 12 bits of fraction) and keeps all coordinates in this
+form, including the cursor position. Thus, any operation that sends the
+cursor outside this range will cause an InternalOverflow error. At 600 dpi,
+this corresponds to positioning the cursor more than about 72 feet outside
+the page. A number of the CET files do this, to exercise the full range of
+possible parameter values. We recognize this is a limitation, but we do not
+currently intend to do anything about it, since it is extremely unlikely to
+cause problems in practice. The files on which this causes an error are:
+ CET c309, c310
+
+Line Printer font implementation
+--------------------------------
+
+Our interpreter implements the Line Printer fonts as aliases for Courier,
+unlike the H-P printers which apparently implement them using bitmaps. As a
+result, attempting to scale, rotate, or shear them does not produce an error
+in our implementation. This causes an output difference in:
+ CET e104
+
+Graphics state storage management
+---------------------------------
+
+Our interpreter allocates graphics states from the main storage pool, rather
+than imposing a fixed limit on the number of PushGS levels. As a result,
+our implementation does not report an error, even though the H-P printer
+produces one, in:
+ CET e112
+
+Downloaded font checking
+------------------------
+
+Our interpreter defers almost all of its checking of downloaded font headers
+until it receives the EndFontHeader command. Because of this, many of the
+errors associated with font downloading occur on an EndFontHeader instead of
+a ReadFontHeader, at a slightly later position in the file. This affects
+the output from:
+ CET e114
+Also, our implementation does not produce the very first error from this
+file (the "InternalError 0x50").
+
+Byte order support
+------------------
+
+The H-P implementation apparently supports only the little-endian binary
+binding; our interpreter supports both big- and little-endian binary
+bindings. The only file that tests this is:
+ CET e120
+Because our interpreter supports both bindings, this file should produce at
+least one fewer error than the H-P printers. However, there is an error in
+the file itself: at byte position 101 in the big-endian section (counting
+the first byte of PCL XL data after the stream header as byte 0), the length
+of the font name "Courier" is incorrectly coded as (16,0) (little-endian)
+rather than (0,16) (big-endian). The resulting 4096-byte count causes the
+entire remainder of the file to be interpreted as a data stream; since this
+exceeds the length of the file, the test terminates.
+
+[2] Implementation shortcuts
+============================
+
+[1] Negative dash pattern elements
+----------------------------------
+
+SetLineDash allows negative dash pattern elements, but the H-P documentation
+gives no clue about what these are supposed to do. The H-P printers
+apparently interpret it as drawing a line backwards in the current direction
+(which may extend outside the original subpath) with no visible caps; a dash
+pattern with a negative total length crashed the LJ 6MP firmware so badly
+the printer had to be power cycled! We have chosen to take a different
+approach: we compensate for negative elements by propagating them to
+adjacent positive ones. This doesn't produce quite the same output as the
+H-P printers do (segments drawn in the reverse direction do have caps, and
+if the line is shorter than one complete cycle of the pattern, some parts of
+the line may be stroked that the H-P printers skip), but this is such an
+obscure feature that we don't think it's worth the trouble to emulate
+exactly. The difference affects:
+ CET c318
+
+Rounding
+--------
+
+On the page:
+ FTS t421 p. 4
+our implementation shows faint vertical "seams" on the two left-hand
+patterns in image 09. While the Genoa output doesn't have a seam, a test we
+made using H-P's default halftone does show a seam. We conclude that our
+implementation and H-P's both have some rounding sensitivities, and they
+simply happen to show up on slightly different input values. [2] Matching
+H-P's implementation at this level of detail would be extremely onerous.
+
+[3] A similar seam occurs in the lower image on the page:
+ CET c422 p. 38
+
+[4] For a similar reason, in image 06 of
+ FTS t315 p. 2
+our implementation does not produce either bevels or miters. The reason is
+that the line join point coincides exactly with the end of an "ink off" dash
+segment: H-P's implementation has a rounding inaccuracy that causes it to
+produce a vertical hairline as the last segment of the horizontal line
+(which is drawn in the -X direction), and then join this hairline with the
+first segment of the diagonal line.
+
+H-P firmware bugs
+=================
+
+[4] Except for the instances mentioned here, our implementation emulates
+behavior of the H-P printers that we have stated elsewhere we believe result
+from firmware bugs.
+
+Changing destination size of raster patterns is permanent
+---------------------------------------------------------
+
+Specifying a NewDestinationSize for a raster pattern in the SetBrushSource
+or SetPenSource command apparently changes the destination size permanently,
+or at least for a subsequent SetBrush/PenSource command that doesn't specify
+a NewDestinationSize. This is tested explicitly (and the H-P printers fail
+the test) in:
+ CET c306 p. 43, c307 p. 44
+
+Mysterious missing character
+----------------------------
+
+In:
+ CET c330 last page
+a partial 'B' should appear in portrait orientation to the left of the
+partial 'A'. The input data read as follows (slightly abridged):
+
+ 0 6600 usp @PageOrigin SetPageOrigin
+ 90 ss @PageAngle SetPageRotation
+ PushGS
+ -2300 1900 ssp @PageOrigin SetPageOrigin
+ 2.23 1.1 rp @PageScale SetPageScale
+ (Courier Bd) ba @FontName 1000 us @CharSize
+ 629 us @SymbolSet SetFont
+ 0 b @NullBrush SetBrushSource
+ NewPath
+ 1500 0 3500 1200 usq @BoundingBox
+ 2100 0 ssp @StartPoint
+ 2600 0 ssp @EndPoint
+ PiePath PaintPath
+ 0 b @ClipRegion SetClipReplace
+ <79 7b 7d> ba @RGBColor SetBrushSource
+ 2500 900 ssp @PageOrigin SetPageOrigin
+ 0 0 usp @Point SetCursor
+ -180 ss @PageAngle SetPageRotation
+ (A) ba @TextData Text
+ SetPageDefaultCTM
+ 2100 3600 usp @Point SetCursor
+ (B) ba @TextData Text
+
+Even when we modified the test data to paint an entire page of 'B' at this
+point, no characters appeared. We assume this results from a firmware bug,
+but we have no theories as to its nature.
+
+[2] Characters transformed in wrong order
+-----------------------------------------
+
+In
+ CET c333 p. 16
+in the "Effect on CharAngle" and "Effect on CharShear" lines, the character
+appears to be scaled by the page scale before being rotated by the character
+angle or sheared, rather than vice versa. We believe this is a firmware bug
+because we verified, by testing all 125 possible sequences of 3 operations
+chosen from the set {SetCharAngle, SetCharScale, SetCharShear,
+SetPageRotation, SetPageScale}, that the character transformations uniformly
+occur before the page transformations. (We have identified two other
+firmware bugs relating to character transformations, one of which is present
+in the LJ5 but not the LJ6MP: see our separate report on the CET for
+details.)
diff --git a/pxl/pxenum.h b/pxl/pxenum.h
new file mode 100644
index 000000000..496d9e431
--- /dev/null
+++ b/pxl/pxenum.h
@@ -0,0 +1,19 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxenum.h */
+/* Enumerated attribute value definitions for PCL XL parser */
+
+/* The contents of this file have been moved to the graphics library, */
+/* so they can be used in the PCL XL driver. */
+#include "gdevpxen.h"
diff --git a/pxl/pxerrors.c b/pxl/pxerrors.c
new file mode 100644
index 000000000..68f4b4d7d
--- /dev/null
+++ b/pxl/pxerrors.c
@@ -0,0 +1,311 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxerrors.c */
+/* PCL XL error reporting */
+
+#include "memory_.h"
+#include "stdio_.h" /* for sprintf */
+#include "string_.h"
+#include "gsmemory.h"
+#include "gstypes.h" /* for gsmatrix.h */
+#include "gsccode.h" /* for gxfont.h */
+#include "gsmatrix.h" /* for gsfont.h */
+#include "gsstate.h" /* for gsfont.h, gspath.h */
+#include "gspaint.h" /* for gs_erasepage */
+#include "gscoord.h"
+#include "gspath.h"
+#include "gsutil.h"
+#include "gxfixed.h" /* for gxchar.h */
+#include "gxchar.h"
+#include "gxfont.h"
+#include "scommon.h" /* for pxparse.h */
+#include "pxbfont.h"
+#include "pxerrors.h"
+#include "pxparse.h"
+#include "pxptable.h" /* for px_operator_names */
+#include "pxstate.h"
+#include "pxfont.h"
+
+/* Imported operators */
+px_operator_proc(pxEndPage);
+px_operator_proc(pxSetPageDefaultCTM);
+
+/* ---------------- Initialization ---------------- */
+
+/* Create the error page font, and preallocate other structures so that */
+/* printing an error message never needs to allocate storage. */
+int
+pxerrors_init(px_state_t *pxs)
+{ px_font_t *pxfont = pl_alloc_font(pxs->memory, "error_page_font");
+ gs_show_enum *penum = gs_show_enum_alloc(pxs->memory, pxs->pgs,
+ "error_page_show_enum");
+ int code;
+
+ if ( pxfont == 0 || penum == 0 )
+ code = gs_note_error(errorInsufficientMemory);
+ else
+ { pxfont->storage = pxfsInternal;
+ pxfont->font_type = plft_Unicode; /* as good as any */
+ pxfont->data_are_permanent = true;
+ code =
+ px_define_font(pxfont, (byte *)px_bitmap_font_header,
+ px_bitmap_font_header_size,
+ gs_next_ids(pxs->memory, 1),
+ pxs);
+ { const byte *cdata = px_bitmap_font_char_data;
+ while ( *cdata && code >= 0 )
+ { code = pl_font_add_glyph(pxfont, *cdata, cdata + 1);
+ ++cdata;
+ cdata = cdata + 16 +
+ ((uint16at(cdata + 10, true) + 7) >> 3) *
+ uint16at(cdata + 12, true);
+ }
+ }
+ }
+ if ( code < 0 )
+ { gs_free_object(pxs->memory, penum, "pxs->error_page_show_enum");
+ gs_free_object(pxs->memory, pxfont, "pxs->error_page_font");
+ return code;
+ }
+ pxs->error_page_font = pxfont;
+ pxs->error_page_show_enum = penum;
+ return 0;
+}
+
+/* ---------------- Procedures ---------------- */
+
+/* Record a warning. */
+/* Return 1 if the warning table overflowed. */
+/* If save_all is false, only remember the last warning with the same */
+/* first word as this one. */
+int
+px_record_warning(const char *message, bool save_all, px_state_t *pxs)
+{ uint end = pxs->warning_length;
+ char *str = pxs->warnings + end;
+ char *word_end = strchr(message, ' ');
+
+ if ( end + strlen(message) + 1 > px_max_warning_message )
+ return 1;
+ if ( !save_all && word_end )
+ { /* Delete any existing message of the same type. */
+ /* (There is at most one.) */
+ uint word_len = word_end - message;
+ char *next = pxs->warnings;
+ uint len1;
+
+ for ( ; next != str; next += len1 )
+ { len1 = strlen(next) + 1;
+ if ( len1 > word_len && !strncmp(next, message, word_len) )
+ { /* Delete the old message. */
+ memmove(next, next + len1, str - (next + len1));
+ str -= len1;
+ break;
+ }
+ }
+ }
+ strcpy(str, message);
+ pxs->warning_length = str + strlen(str) + 1 - pxs->warnings;
+ return 0;
+}
+
+/* Generate a line of an error message starting at internal position N; */
+/* return an updated value of N. When done, return -1. */
+int
+px_error_message_line(char message[px_max_error_line+1], int N,
+ const char *subsystem, int code, const px_parser_state_t *st,
+ const px_state_t *pxs)
+{ if ( N == 0 )
+ { strcpy(message, "PCL XL error\n");
+ return 1;
+ }
+ if ( code == errorWarningsReported )
+ { /*
+ * Generate a line of warnings.
+ * 1 = first line, otherwise N = position in warnings buffer.
+ */
+ switch ( N )
+ {
+ case 1:
+ N = 0;
+ /* falls through */
+ default:
+ if ( N == pxs->warning_length )
+ return -1;
+ { const char *str = pxs->warnings + N;
+ uint len = strlen(str);
+ uint warn_len;
+
+ strcpy(message, " Warning: ");
+ warn_len = strlen(message) + 1;
+ if ( len > px_max_error_line - warn_len )
+ { strncat(message, str, px_max_error_line - warn_len);
+ message[px_max_error_line - 1] = 0;
+ }
+ else
+ strcat(message, str);
+ strcat(message, "\n");
+ return N + len + 1;
+ }
+ }
+ }
+ else
+ { /* Generate the N'th line of an error message. */
+ char *end;
+ switch ( N )
+ {
+ case 1:
+ sprintf(message, " Subsystem: %s\n", subsystem);
+ break;
+ case 2:
+ strcpy(message, " Error: ");
+ { char *end = message + strlen(message);
+ if ( pxs->error_line[0] )
+ { /* Ignore the error code, use the error line. */
+ int len = strlen(pxs->error_line);
+ int max_len = px_max_error_line - 2 - strlen(message);
+
+ if ( len <= max_len )
+ strcpy(end, pxs->error_line);
+ else
+ { strncpy(end, pxs->error_line, max_len);
+ message[px_max_error_line - 1] = 0;
+ }
+ strcat(end, "\n");
+ }
+ else if ( code >= px_error_first && code < px_error_next )
+ sprintf(end, "%s\n",
+ px_error_names[code - px_error_first]);
+ else
+ sprintf(end, "Internal error 0x%x\n", code);
+ }
+ break;
+ case 3:
+ { int last_operator = st->last_operator;
+ const char *oname;
+
+ strcpy(message, " Operator: ");
+ end = message + strlen(message);
+ if ( last_operator >= 0x40 && last_operator < 0xc0 &&
+ (oname = px_operator_names[last_operator - 0x40]) != 0
+ )
+ sprintf(end, "%s\n", oname);
+ else
+ sprintf(end, "0x%02x\n", last_operator);
+ }
+ break;
+ case 4:
+ strcpy(message, " Position: ");
+ end = message + strlen(message);
+ if ( st->parent_operator_count )
+ sprintf(end, "%ld;%ld\n", st->parent_operator_count,
+ st->operator_count);
+ else
+ sprintf(end, "%ld\n", st->operator_count);
+ break;
+ default:
+ return -1;
+ }
+ return N + 1;
+ }
+}
+
+/* Begin an error page. Return the initial Y value. */
+int
+px_begin_error_page(px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+
+ if ( pxs->have_page )
+ { px_args_t args;
+ args.pv[0] = 0;
+ pxEndPage(&args, pxs);
+ }
+ gs_initgraphics(pgs);
+ gs_erasepage(pgs);
+ /* Don't call pxSetPageDefaultCTM -- we don't want rotation or */
+ /* unusual Units of Measure -- but do invert the Y axis. */
+ /*pxSetPageDefaultCTM(NULL, pxs);*/
+ {
+ gs_point pt;
+ gs_font *pfont = pxs->error_page_font->pfont;
+ px_get_default_media_size(pxs, &pt);
+ gs_translate(pgs, 0.0, pt.y);
+ gs_scale(pgs, 1.0, -1.0);
+ gs_setfont(pgs, pfont);
+ pfont->FontMatrix = pfont->orig_FontMatrix;
+ return 90;
+ }
+}
+
+/* Print a message on an error page. */
+/* Return the updated Y value. */
+int
+px_error_page_show(const char *message, int ytop, px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+ int y = ytop;
+ const char *m = message;
+ const char *p;
+ gs_show_enum *penum = pxs->error_page_show_enum;
+ /* Normalize for a 10-point font. */
+#define point_size 10.0
+ double scale = 72.0 / px_bitmap_font_resolution *
+ point_size / px_bitmap_font_point_size;
+ int code = 0;
+
+ /* Peel off the next line and display it. */
+ for ( p = m; ; m = ++p )
+ { while ( *p != 0 && *p != '\n' )
+ ++p;
+ gs_moveto(pgs, 36.0, y);
+ gs_scale(pgs, scale, scale);
+ code = gs_show_n_init(penum, pgs, m, p - m);
+ if ( code >= 0 )
+ { code = gs_show_next(penum);
+ if ( code > 0 )
+ code = gs_note_error(errorBadFontData); /* shouldn't happen! */
+ }
+ if ( code < 0 )
+ gs_show_enum_release(penum, NULL);
+ gs_scale(pgs, 1 / scale, 1 / scale);
+ y += point_size * 8 / 5;
+ if ( !*p || !p[1] )
+ break;
+ }
+ return (code < 0 ? code : y);
+}
+
+/* Reset the warning table. */
+void
+px_reset_errors(px_state_t *pxs)
+{ pxs->error_line[0] = 0;
+ pxs->warning_length = 0;
+}
+
+/* ---------------- Error names ---------------- */
+
+#undef pxerrors_INCLUDED
+#define INCLUDE_ERROR_NAMES
+#include "pxerrors.h"
+#undef INCLUDE_ERROR_NAMES
diff --git a/pxl/pxerrors.h b/pxl/pxerrors.h
new file mode 100644
index 000000000..5da6f4a58
--- /dev/null
+++ b/pxl/pxerrors.h
@@ -0,0 +1,170 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxerrors.h */
+/* Error code definitions for PCL XL parser */
+
+#ifndef pxerrors_INCLUDED
+# define pxerrors_INCLUDED
+
+/* ---------------- Procedural interface ---------------- */
+
+#ifndef px_parser_state_t_DEFINED
+# define px_parser_state_t_DEFINED
+typedef struct px_parser_state_s px_parser_state_t;
+#endif
+
+#ifndef px_state_DEFINED
+# define px_state_DEFINED
+typedef struct px_state_s px_state_t;
+#endif
+
+/* Record a warning. */
+/* Return 1 if the warning table overflowed. */
+/* If save_all is false, only remember the last warning with the same */
+/* first word as this one. */
+int px_record_warning(const char *message, bool save_all, px_state_t *pxs);
+
+/* Generate a line of an error message starting at internal position N; */
+/* return an updated value of N. When done, return -1. */
+#define px_max_error_line 120
+int px_error_message_line(char message[px_max_error_line+1], int N,
+ const char *subsystem, int code, const px_parser_state_t *st,
+ const px_state_t *pxs);
+
+/* Begin an error page. Return the initial Y value. */
+int px_begin_error_page(px_state_t *pxs);
+
+/* Print a message on an error page. */
+/* Return the updated Y value. */
+int px_error_page_show(const char *message, int ytop, px_state_t *pxs);
+
+/* Reset the warning table. */
+void px_reset_errors(px_state_t *pxs);
+
+/* ---------------- Error name table ---------------- */
+
+/*
+ * The following peculiar structure allows us to include this file wherever
+ * error code definitions are needed, and use the same file to generate the
+ * table of error names by setting INCLUDE_ERROR_NAMES.
+ */
+
+#undef _e_ /* in case we're including this file twice */
+
+# ifdef INCLUDE_ERROR_NAMES
+
+const char *px_error_names[] = {
+# define _e_(code, name) name,
+
+# else /* !INCLUDE_ERROR_NAMES */
+
+extern const char *px_error_names[];
+#define px_error_first -1000
+# define _e_(code,name) code,
+typedef enum {
+
+# endif /* (!)INCLUDE_ERROR_NAMES */
+
+ _e_(errorIllegalOperatorSequence = px_error_first, "IllegalOperatorSequence")
+ _e_(errorIllegalTag, "IllegalTag")
+ _e_(errorInsufficientMemory, "InsufficientMemory")
+ _e_(errorInternalOverflow, "InternalOverflow")
+
+ _e_(errorIllegalArraySize, "IllegalArraySize")
+ _e_(errorIllegalAttribute, "IllegalAttribute")
+ _e_(errorIllegalAttributeCombination, "IllegalAttributeCombination")
+ _e_(errorIllegalAttributeDataType, "IllegalAttributeDataType")
+ _e_(errorIllegalAttributeValue, "IllegalAttributeValue")
+ _e_(errorMissingAttribute, "MissingAttribute")
+
+ _e_(errorCurrentCursorUndefined, "CurrentCursorUndefined")
+
+ _e_(errorNoCurrentFont, "NoCurrentFont")
+ _e_(errorBadFontData, "BadFontData")
+
+ _e_(errorDataSourceNotOpen, "DataSourceNotOpen")
+ _e_(errorExtraData, "ExtraData")
+ _e_(errorIllegalDataLength, "IllegalDataLength")
+ _e_(errorIllegalDataValue, "IllegalDataValue")
+ _e_(errorMissingData, "MissingData")
+
+ _e_(errorCannotReplaceCharacter, "CannotReplaceCharacter")
+ _e_(errorFontUndefined, "FontUndefined")
+
+ _e_(errorFontNameAlreadyExists, "FontNameAlreadyExists")
+
+ _e_(errorImagePaletteMismatch, "ImagePaletteMismatch")
+ _e_(errorMissingPalette, "MissingPalette")
+
+ _e_(errorIllegalMediaSize, "IllegalMediaSize")
+ _e_(errorIllegalMediaSource, "IllegalMediaSource")
+ _e_(errorIllegalOrientation, "IllegalOrientation")
+
+ _e_(errorStreamUndefined, "StreamUndefined")
+ _e_(errorStreamNestingFull, "StreamNestingFull")
+
+ _e_(errorDataSourceNotClosed, "DataSourceNotClosed")
+
+ _e_(errorMaxGSLevelsExceeded, "MaxGSLevelsExceeded")
+
+ _e_(errorFSTMismatch, "FSTMismatch")
+ _e_(errorUnsupportedCharacterClass, "UnsupportedCharacterClass")
+ _e_(errorUnsupportedCharacterFormat, "UnsupportedCharacterFormat")
+ _e_(errorIllegalCharacterData, "IllegalCharacterData")
+
+ _e_(errorIllegalFontData, "IllegalFontData")
+ _e_(errorIllegalFontHeaderFields, "IllegalFontHeaderFields")
+ _e_(errorIllegalNullSegmentSize, "IllegalNullSegmentSize")
+ _e_(errorIllegalFontSegment, "IllegalFontSegment")
+ _e_(errorMissingRequiredSegment, "MissingRequiredSegment")
+ _e_(errorIllegalGlobalTrueTypeSegment, "IllegalGlobalTrueTypeSegment")
+ _e_(errorIllegalGalleyCharacterSegment, "IllegalGalleyCharacterSegment")
+ _e_(errorIllegalVerticalTxSegment, "IllegalVerticalTxSegment")
+ _e_(errorIllegalBitmapResolutionSegment, "IllegalBitmapResolutionSegment")
+
+ _e_(errorUndefinedFontNotRemoved, "UndefinedFontNotRemoved")
+ _e_(errorInternalFontNotRemoved, "InternalFontNotRemoved")
+ _e_(errorMassStorageFontNotRemoved, "MassStorageFontNotRemoved")
+
+ _e_(errorColorSpaceMismatch, "ColorSpaceMismatch")
+ _e_(errorRasterPatternUndefined, "RasterPatternUndefined")
+
+ _e_(errorClipModeMismatch, "ClipModeMismatch")
+
+ _e_(errorFontUndefinedNoSubstituteFound, "FontUndefinedNoSubstituteFound")
+ _e_(errorSymbolSetRemapUndefined, "SymbolSetRemapUndefined")
+
+ _e_(errorUnsupportedBinding, "UnsupportedBinding")
+ _e_(errorUnsupportedClassName, "UnsupportedClassName")
+ _e_(errorUnsupportedProtocol, "UnsupportedProtocol")
+ _e_(errorIllegalStreamHeader, "IllegalStreamHeader")
+
+ /* We define a special "error" that EndSession returns */
+ /* to indicate that there were warnings to report. */
+
+ _e_(errorWarningsReported, "WarningsReported")
+
+# ifdef INCLUDE_ERROR_NAMES
+
+ 0
+};
+
+# else /* !INCLUDE_ERROR_NAMES */
+
+ px_error_next
+} px_error_t;
+
+# endif /* (!)INCLUDE_ERROR_NAMES */
+
+#endif /* pxerrors_INCLUDED */
diff --git a/pxl/pxffont.c b/pxl/pxffont.c
new file mode 100644
index 000000000..9ea78cfd8
--- /dev/null
+++ b/pxl/pxffont.c
@@ -0,0 +1,185 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxffont.c */
+/* PCL XL font-finding procedures */
+
+#include "string_.h"
+#include "gx.h"
+#include "gschar.h"
+#include "gsmatrix.h" /* for gsfont.h */
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxfont.h"
+#include "pjtop.h"
+
+/* ---------------- Operator utilities ---------------- */
+
+#if ARCH_IS_BIG_ENDIAN
+# define pxd_native_byte_order pxd_big_endian
+#else
+# define pxd_native_byte_order 0
+#endif
+
+/* Widen and/or byte-swap a font name to Unicode if needed. */
+/* The argument is a ubyte or uint16 array; the result is a uint16 array */
+/* with the elements in native byte order. */
+/* We don't deal with mappings: we just widen 8-bit to 16-bit characters */
+/* and hope for the best.... */
+static int
+px_widen_font_name(px_value_t *pfnv, px_state_t *pxs)
+{ uint type = pfnv->type;
+
+ if ( (type & (pxd_uint16 | pxd_big_endian)) ==
+ (pxd_uint16 | pxd_native_byte_order)
+ )
+ return 0; /* already in correct format */
+ { byte *old_data = (byte *)pfnv->value.array.data; /* break const */
+ uint size = pfnv->value.array.size;
+ char16 *new_data;
+ uint i;
+
+ if ( type & pxd_on_heap )
+ old_data = (byte *)
+ (new_data =
+ (char16 *)gs_resize_object(pxs->memory, old_data,
+ size * 2, "px_widen_font_name"));
+ else
+ new_data =
+ (char16 *)gs_alloc_byte_array(pxs->memory, size, sizeof(char16),
+ "px_widen_font_name");
+ if ( new_data == 0 )
+ return_error(errorInsufficientMemory);
+ for ( i = size; i; )
+ { --i;
+ new_data[i] =
+ (type & pxd_ubyte ? old_data[i] :
+ uint16at(old_data + i * 2, type & pxd_big_endian));
+ }
+ pfnv->value.array.data = (byte *)new_data;
+ }
+ pfnv->type = (type & ~(pxd_ubyte | pxd_big_endian)) |
+ (pxd_uint16 | pxd_native_byte_order | pxd_on_heap);
+ return 0;
+}
+
+/** It seems that PXL has 10 different names for the lineprinter font
+ * one for each of the font symbol set pairs in pcl.
+ * this maps all PXL lineprinter requests to the 0N version
+ * saves ram/rom not storing 10 different versions.
+ */
+
+static int
+px_lineprinter_font_alias_name(px_value_t *pfnv, px_state_t *pxs)
+{
+ /* NB:coupling: depends on this being the first LinePrinter font in plftable.c */
+ static const unsigned short linePrinter[16] =
+ {'L','i','n','e',' ','P','r','i','n','t','e','r',' ',' ','0','N'};
+ unsigned short *ptr = (unsigned short *)&pfnv->value.array.data[0];
+ uint i;
+
+ if ( pfnv->value.array.size != 16 )
+ return 0;
+ for( i = 0; i < 12; i++) {
+ if ( ptr[i] != linePrinter[i] )
+ return 0; /* no match */
+ }
+ for( i = 12; i < 16; i++)
+ ptr[i] = linePrinter[i]; /* front matched now make it identical */
+ return 0;
+}
+
+/* ---------------- Operator implementations ---------------- */
+
+/* Look up a font name and return an existing font. */
+/* This procedure may widen and/or byte-swap the font name. */
+/* If this font is supposed to be built in but no .TTF file is available, */
+/* or if loading the font fails, return >= 0 and store 0 in *ppxfont. */
+int
+px_find_existing_font(px_value_t *pfnv, px_font_t **ppxfont,
+ px_state_t *pxs)
+{ int code;
+ void *pxfont;
+
+ /* Normalize the font name to Unicode. */
+ code = px_widen_font_name(pfnv, pxs);
+ if ( code < 0 )
+ return code;
+
+ /* Do pxl font aliasing */
+ code = px_lineprinter_font_alias_name(pfnv, pxs);
+ if ( code < 0 )
+ return code;
+
+ if ( px_dict_find(&pxs->font_dict, pfnv, &pxfont) ) {
+ /* Make sure this isn't a partially defined font */
+ if ( ((px_font_t *)pxfont)->pfont )
+ *ppxfont = pxfont;
+ else {
+ /* in the process of being downloaded. */
+ dprintf("font is being downloaded???\n");
+ return -1;
+ }
+ } else if ( px_dict_find(&pxs->builtin_font_dict, pfnv, &pxfont) )
+ if ( ((px_font_t *)pxfont)->pfont )
+ *ppxfont = pxfont;
+ else {
+ dprintf("corrupt pxl builtin font\n");
+ return -1;
+ }
+ else
+ return -1; /* font not found or corrupt builtin font */
+
+ return 0;
+}
+
+/* Look up a font name and return a font, possibly with substitution. */
+/* This procedure implements most of the SetFont operator. */
+/* This procedure may widen and/or byte-swap the font name. */
+int
+px_find_font(px_value_t *pfnv, uint symbol_set, px_font_t **ppxfont,
+ px_state_t *pxs)
+{
+
+ int code;
+ /* Check if we know the font already. */
+ /* Note that px_find_existing_font normalizes the font name. */
+ code = px_find_existing_font(pfnv, ppxfont, pxs);
+ /* substitute for missing builtin font */
+
+ if (code < 0) {
+ px_value_t default_font_value;
+ /* the documentation states the default font chosen here
+ is device dependent */
+ const char *default_font = "Courier ";
+ char message[px_max_error_line + 1];
+ default_font_value.type = pxd_ubyte | pxd_array;
+ default_font_value.value.array.data = default_font;
+ default_font_value.value.array.size = strlen(default_font);
+ code = px_find_existing_font(&default_font_value, ppxfont, pxs);
+ /* shouldn't fail */
+ if ( code < 0 )
+ return code;
+ message[0] = (char)NULL;
+ px_concat_font_name(message, px_max_error_line, &default_font_value);
+ strcat(message, "substituted for ");
+ px_concat_font_name(message, px_max_error_line, pfnv);
+ code = px_record_warning(message, false, pxs);
+ }
+ if ( code >= 0 )
+ return pl_load_resident_font_data_from_file(pxs->memory, *ppxfont);
+ else
+ return code;
+}
diff --git a/pxl/pxfont.c b/pxl/pxfont.c
new file mode 100644
index 000000000..2efaad104
--- /dev/null
+++ b/pxl/pxfont.c
@@ -0,0 +1,733 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxfont.c */
+/* PCL XL font operators */
+
+#include "math_.h"
+#include "stdio_.h"
+#include "string_.h"
+#include "gdebug.h"
+#include "plvalue.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxfont.h"
+#include "gserrors.h"
+#include "gsstruct.h"
+#include "gschar.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gsimage.h"
+#include "gsutil.h" /* for string_match */
+#include "gxfont.h"
+#include "gxfont42.h"
+#include "gxfixed.h"
+#include "gxchar.h"
+#include "gxpath.h"
+#include "gzstate.h"
+
+/* ---------------- Initialization ---------------- */
+
+int
+pxfont_init(px_state_t *pxs)
+{ /* Allocate the font directory now. */
+ pxs->font_dir = gs_font_dir_alloc(pxs->memory);
+ if ( pxs->font_dir == 0 )
+ return_error(errorInsufficientMemory);
+ return 0;
+}
+
+/* ---------------- Operator utilities ---------------- */
+
+/* Compute the symbol map from the font and symbol set. */
+static void
+set_symbol_map(px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ px_font_t *pxfont = pxgs->base_font;
+ uint symbol_set = pxgs->symbol_set;
+
+ if ( ( symbol_set == pxfont->params.symbol_set ) ||
+ ( symbol_set == 590 ) )
+ { /* Exact match, no mapping required. */
+ pxgs->symbol_map = 0;
+ }
+ else if ( pl_font_is_bound(pxfont) )
+ { /****** CAN'T REMAP YET ******/
+ pxgs->symbol_map = 0;
+ }
+ else
+ { /* See if we know about the requested symbol set. */
+ /****** ASSUME UNICODE ******/
+ const pl_symbol_map_t **ppsm = pl_built_in_symbol_maps;
+
+ while ( *ppsm != 0 && pl_get_uint16((*ppsm)->id) != symbol_set )
+ ++ppsm;
+ /* If we didn't find it, default to Roman-8. */
+ pxgs->symbol_map = (*ppsm ? *ppsm : pl_built_in_symbol_maps[0]);
+ }
+}
+
+static int
+px_set_char_matrix(px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ px_font_t *pxfont = pxgs->base_font;
+ gs_matrix mat;
+
+ if ( pxfont == 0 )
+ return_error(errorNoCurrentFont);
+ if ( pxfont->scaling_technology == plfst_bitmap )
+ { /*
+ * Bitmaps don't scale, shear, or rotate; however, we have to
+ * scale them to make the resolution match that of the device.
+ * Note that we disregard the character size, and, in px_text,
+ * all but the translation and orientation components of the
+ * CTM.
+ */
+ if ( pxgs->char_angle != 0 ||
+ pxgs->char_shear.x != 0 || pxgs->char_shear.y != 0 ||
+ pxgs->char_scale.x != 1 || pxgs->char_scale.y != 1
+ )
+ return_error(errorIllegalFontData);
+
+ /* remove negative scale component */
+ gs_make_scaling( pxs->units_per_measure.x / pxfont->resolution.x,
+ pxs->units_per_measure.y / pxfont->resolution.y,
+ &mat );
+
+ /*
+ * Rotate the bitmap to undo the effect of its built-in
+ * orientation.
+ */
+ gs_matrix_rotate(&mat,
+ 90.0 * pxfont->header[1],
+ &mat);
+ }
+ else
+ { float char_size = pxgs->char_size;
+ int i;
+
+ gs_make_identity(&mat);
+ /* H-P and Microsoft have Y coordinates running opposite ways. */
+ gs_matrix_scale(&mat, char_size, -char_size, &mat);
+ /* Apply the character transformations in the reverse order. */
+ for ( i = 0; i < 3; ++i )
+ switch ( pxgs->char_transforms[i] )
+ {
+ case pxct_rotate:
+ if ( pxgs->char_angle != 0 )
+ gs_matrix_rotate(&mat,
+ pxgs->char_angle,
+ &mat);
+ break;
+ case pxct_shear:
+ if ( pxgs->char_shear.x != 0 || pxgs->char_shear.y != 0 )
+ { gs_matrix smat;
+ gs_make_identity(&smat);
+ smat.yx = pxgs->char_shear.x;
+ smat.xy = pxgs->char_shear.y;
+ gs_matrix_multiply(&smat, &mat, &mat);
+ }
+ break;
+ case pxct_scale:
+ if ( pxgs->char_scale.x != 1 || pxgs->char_scale.y != 1 )
+ gs_matrix_scale(&mat, pxgs->char_scale.x,
+ pxgs->char_scale.y, &mat);
+ break;
+ }
+ }
+ pxgs->char_matrix = mat;
+ pxgs->char_matrix_set = true;
+ return 0;
+}
+
+/* ---------------- Operator implementations ---------------- */
+
+/* Define a font. The caller must fill in pxfont->storage and ->font_type. */
+/* This procedure implements FontHeader loading; it is exported for */
+/* initializing the error page font. */
+int
+px_define_font(px_font_t *pxfont, byte *header, ulong size, gs_id id, px_state_t *pxs)
+{ gs_memory_t *mem = pxs->memory;
+ uint num_chars;
+
+ /* Check for a valid font. */
+ if ( size < 8 /* header */ + 6 /* 1 required segment */ +
+ 6 /* NULL segment */
+ )
+ return_error(errorIllegalFontData);
+ if ( header[0] != 0 /* format */ ||
+ header[5] != 0 /* variety */
+ )
+ return_error(errorIllegalFontHeaderFields);
+
+ pxfont->header = (byte *)header; /* remove const cast */
+ pxfont->header_size = size;
+ { static const pl_font_offset_errors_t errors = {
+ errorIllegalFontData,
+ errorIllegalFontSegment,
+ errorIllegalFontHeaderFields,
+ errorIllegalNullSegmentSize,
+ errorMissingRequiredSegment,
+ errorIllegalGlobalTrueTypeSegment,
+ errorIllegalGalleyCharacterSegment,
+ errorIllegalVerticalTxSegment,
+ errorIllegalBitmapResolutionSegment
+ };
+ int code = pl_font_scan_segments(mem, pxfont, 4, 8, size, true, &errors);
+
+ if ( code < 0 )
+ return code;
+ }
+ num_chars = pl_get_uint16(header + 6);
+ /* Allocate the character table. */
+ { /* Some fonts ask for unreasonably large tables.... */
+ int code = pl_font_alloc_glyph_table(pxfont, min(num_chars, 300),
+ mem, "px_define_font(glyphs)");
+ if ( code < 0 )
+ return code;
+ }
+ /* Now construct a gs_font. */
+ if ( pxfont->scaling_technology == plfst_bitmap )
+ { /* Bitmap font. */
+ gs_font_base *pfont =
+ gs_alloc_struct(mem, gs_font_base, &st_gs_font_base,
+ "px_define_font(gs_font_base)");
+ int code;
+
+ if ( pfont == 0 )
+ return_error(errorInsufficientMemory);
+ code = px_fill_in_font((gs_font *)pfont, pxfont, pxs);
+ if ( code < 0 )
+ return code;
+ pl_fill_in_bitmap_font(pfont, id);
+ }
+ else
+ { /* TrueType font. */
+ gs_font_type42 *pfont =
+ gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42,
+ "px_define_font(gs_font_type42)");
+ int code;
+
+ if ( pfont == 0 )
+ return_error(errorInsufficientMemory);
+ /* Some fonts ask for unreasonably large tables.... */
+ code = pl_tt_alloc_char_glyphs(pxfont, min(num_chars, 300), mem,
+ "px_define_font(char_glyphs)");
+ if ( code < 0 )
+ return code;
+ code = px_fill_in_font((gs_font *)pfont, pxfont, pxs);
+ if ( code < 0 )
+ return code;
+ pl_fill_in_tt_font(pfont, NULL, id);
+ }
+ pxfont->params.symbol_set = pl_get_uint16(header + 2);
+
+ if ( header[4] == plfst_TrueType ) {
+ pxfont->is_xl_format = true;
+ pl_prepend_xl_dummy_header(mem, &header);
+ pxfont->header = header;
+ pxfont->header_size = gs_object_size(mem, header);
+ } else {
+ pxfont->is_xl_format = false;
+ }
+
+ return gs_definefont(pxs->font_dir, pxfont->pfont);
+}
+
+/* Concatenate a widened (16-bit) font name onto an error message string. */
+void
+px_concat_font_name(char *message, uint max_message, const px_value_t *pfnv)
+{ char *mptr = message + strlen(message);
+ uint fnsize = pfnv->value.array.size;
+ uint i;
+
+ /*
+ **** We truncate 16-bit font name chars to 8 bits
+ **** for the message.
+ */
+ for ( i = 0; i < fnsize && mptr - message < max_message; ++mptr, ++i )
+ if ( (*mptr = (byte)integer_elt(pfnv, i)) < 32 )
+ *mptr = '?';
+ *mptr = 0;
+}
+
+/** Convert pxl text arguments into an array of gs_chars
+ * caller must allocate the correct size array pchar and free it later
+ */
+static void
+px_str_to_gschars( px_args_t *par, px_state_t *pxs, gs_char *pchr, bool is_MSL)
+{
+ const px_value_t *pstr = par->pv[0];
+ const unsigned char *str = (const unsigned char *)pstr->value.array.data;
+ uint len = pstr->value.array.size;
+ int i;
+ gs_char chr;
+ const pl_symbol_map_t *psm = pxs->pxgs->symbol_map;
+ uint symbol_set = pxs->pxgs->symbol_set;
+ for (i=0; i < len; i++) {
+ if (pstr->type & pxd_ubyte) {
+ chr = str[i];
+ } else {
+ chr = uint16at(&str[i << 1], (pstr->type & pxd_big_endian));
+ }
+ pchr[i] = pl_map_symbol(psm, chr,
+ pxs->pxgs->base_font->storage == pxfsInternal,
+ is_MSL,
+ symbol_set == 590);
+ }
+}
+
+/* startup for the processing text */
+static int
+px_text_setup(gs_state * pgs, const gs_char * str, uint size,
+ const float *x_widths, const float *y_widths,
+ uint widths_size, gs_memory_t * mem, gs_text_enum_t ** ppte,
+ bool to_path, bool can_cache)
+{
+ gs_text_params_t text;
+ int code;
+
+ text.operation = TEXT_FROM_CHARS | TEXT_REPLACE_WIDTHS | TEXT_RETURN_WIDTH;
+ if (to_path)
+ text.operation |= TEXT_DO_TRUE_CHARPATH;
+ else
+ text.operation |= TEXT_DO_DRAW;
+ text.data.chars = str;
+ text.size = size;
+ text.x_widths = x_widths;
+ text.y_widths = y_widths;
+ text.widths_size = widths_size;
+ code = gs_text_begin(pgs, &text, mem, ppte);
+ if (!can_cache) {
+ /* NB breaks API, needs a better solution. */
+ gs_show_enum *penum = (gs_show_enum *)*ppte;
+ penum->can_cache = -1;
+ }
+ return code;
+}
+
+/* Paint text or add it to the path. */
+/* This procedure implements the Text and TextPath operators. */
+/* Attributes: pxaTextData, pxaXSpacingData, pxaYSpacingData. */
+
+int
+px_text(px_args_t *par, px_state_t *pxs, bool to_path)
+{
+ gs_memory_t *mem = pxs->memory;
+ gs_state *pgs = pxs->pgs;
+ px_gstate_t *pxgs = pxs->pxgs;
+ gs_text_enum_t *penum;
+ const px_value_t *pstr = par->pv[0];
+ uint len = pstr->value.array.size;
+ const px_value_t *pxdata = par->pv[1];
+ const px_value_t *pydata = par->pv[2];
+ gs_font *pfont = gs_currentfont(pgs);
+ int code = 0;
+ gs_char *pchr = 0;
+ pl_font_t *plfont;
+ gs_matrix save_ctm;
+
+ if ( pfont == 0 )
+ return_error(errorNoCurrentFont);
+
+ plfont = (pl_font_t *)pfont->client_data;
+ if ( (pxdata != 0 && pxdata->value.array.size != len) ||
+ (pydata != 0 && pydata->value.array.size != len)
+ )
+ return_error(errorIllegalArraySize);
+ if ( !pxgs->base_font )
+ return_error(errorNoCurrentFont);
+ if ( !pxgs->char_matrix_set ) {
+ gs_matrix *cm = &pxgs->char_matrix;
+ float det;
+ code = px_set_char_matrix(pxs);
+ if ( code < 0 )
+ return code;
+ /* check for a singular matrix - this does not generate an
+ interpreter error on hp. Casts prevent double precision
+ temporary variables, as in gsmatrix.c. */
+ det = (float)(cm->xx * cm->yy) - (float)(cm->xy * cm->yx);
+ if ( det == 0 )
+ return 0;
+ }
+
+ /* set the character matrix in the graphics state */
+ gs_setcharmatrix(pgs, &pxgs->char_matrix);
+ /* The character matrix is not visible to devices. High level
+ devices get character scaling information from the font's
+ matrix (FontMatrix). */
+ gs_matrix_multiply(&pxgs->char_matrix, &pfont->orig_FontMatrix,
+ &pfont->FontMatrix);
+ /* we don't need to consider the vertical mess for resident fonts */
+ if (plfont->storage != pxfsDownLoaded) {
+ pfont->WMode = 0; /* horizontal */
+ plfont->allow_vertical_substitutes = false;
+ } else { /* downloaded */
+ pfont->WMode = pxgs->writing_mode;
+ /* allow vertical substitutes for non-bitmap characters if requested. */
+ if ( pxgs->char_sub_mode == eVerticalSubstitution &&
+ plfont->scaling_technology != plfst_bitmap )
+ plfont->allow_vertical_substitutes = true;
+ else
+ plfont->allow_vertical_substitutes = false;
+ }
+
+ /* set bold fraction - charpaths are not algorithmically boldened */
+ if (to_path == false )
+ plfont->bold_fraction = pxgs->char_bold_value;
+
+ pchr = (gs_char *)gs_alloc_byte_array(mem, len, sizeof(gs_char),
+ "px_text gs_char[]");
+ if (pchr == 0)
+ return_error(errorInsufficientMemory);
+ px_str_to_gschars(par, pxs, pchr,
+ pl_complement_to_vocab(plfont->character_complement) == plgv_MSL);
+
+ {
+ uint i;
+ float *fxvals = 0;
+ float *fyvals = 0;
+
+ if ( len > 0 ) {
+ fxvals = (float *)gs_alloc_byte_array(mem, len+1, sizeof(float), "px_text fxvals");
+ fyvals = (float *)gs_alloc_byte_array(mem, len+1, sizeof(float) * 2, "px_text fyals");
+ if ( fxvals == 0 || fyvals == 0 )
+ return_error(errorInsufficientMemory);
+ }
+ for ( i = 0; i < len; i++ ) {
+ fxvals[i] = pxdata ? real_elt(pxdata, i) : 0.0;
+ fyvals[i] = pydata ? real_elt(pydata, i) : 0.0;
+ }
+
+ code = px_text_setup(pgs, pchr, len, fxvals, fyvals,
+ len, mem, &penum, to_path,
+ pxgs->char_bold_value == 0);
+
+ if ( code >= 0 ) {
+ code = gs_text_process(penum);
+ gs_text_release(penum, "pxtext");
+ }
+ if ( fxvals )
+ gs_free_object( mem, fxvals, "px_text fvals" );
+ if ( fyvals )
+ gs_free_object( mem, fyvals, "py_text fvals" );
+ }
+
+ gs_free_object( mem, pchr, "px_text gs_char" );
+ return (code == gs_error_invalidfont ?
+ gs_note_error(errorBadFontData) : code);
+}
+
+
+/* ---------------- Operators ---------------- */
+
+const byte apxSetFont[] = {
+ pxaFontName, pxaCharSize, pxaSymbolSet, 0, 0
+};
+int
+pxSetFont(px_args_t *par, px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ px_font_t *pxfont;
+ px_value_t *pfnv = par->pv[0];
+ uint symbol_set = par->pv[2]->value.i;
+ int code = px_find_font(pfnv, symbol_set, &pxfont, pxs);
+
+ if ( code < 0 )
+ { switch ( code )
+ {
+ case errorFontUndefined:
+ strcpy(pxs->error_line, "FontUndefined - ");
+ goto undef;
+ case errorFontUndefinedNoSubstituteFound:
+ strcpy(pxs->error_line, "FontUndefinedNoSubstituteFound - ");
+undef: px_concat_font_name(pxs->error_line, px_max_error_line, pfnv);
+ break;
+ case errorSymbolSetRemapUndefined:
+ strcpy(pxs->error_line, "SymbolSetRemapUndefined - ");
+ px_concat_font_name(pxs->error_line, px_max_error_line, pfnv);
+ { char setstr[26]; /* 64-bit value plus message */
+ sprintf(setstr, " : %d", symbol_set);
+ strncat(pxs->error_line, setstr,
+ px_max_error_line - strlen(pxs->error_line));
+ pxs->error_line[px_max_error_line] = 0;
+ }
+ break;
+ }
+ return code;
+ }
+ code = gs_setfont(pxs->pgs, pxfont->pfont);
+ if ( code < 0 )
+ return code;
+ pxgs->char_size = real_value(par->pv[1], 0);
+ pxgs->symbol_set = symbol_set;
+ pxgs->base_font = pxfont;
+ set_symbol_map(pxs);
+ pxgs->char_matrix_set = false;
+ return 0;
+}
+
+const byte apxBeginFontHeader[] = {
+ pxaFontName, pxaFontFormat, 0, 0};
+int
+pxBeginFontHeader(px_args_t *par, px_state_t *pxs)
+{ px_value_t *pfnv = par->pv[0];
+ gs_memory_t *mem = pxs->memory;
+ px_font_t *pxfont;
+ int code = px_find_existing_font(pfnv, &pxfont, pxs);
+
+ if ( code >= 0 )
+ { strcpy(pxs->error_line, "FontNameAlreadyExists - ");
+ px_concat_font_name(pxs->error_line, px_max_error_line, pfnv);
+ return_error(errorFontNameAlreadyExists);
+ }
+ /* Make a partially filled-in dictionary entry. */
+ pxfont = pl_alloc_font(mem, "pxBeginFontHeader(pxfont)");
+ if ( pxfont == 0 )
+ return_error(errorInsufficientMemory);
+ pxfont->storage = pxfsDownLoaded;
+ pxfont->data_are_permanent = false;
+ code = px_dict_put(&pxs->font_dict, par->pv[0], pxfont);
+ if ( code < 0 )
+ { gs_free_object(mem, pxfont, "pxBeginFontHeader(pxfont)");
+ return code;
+ }
+ pxs->download_font = pxfont;
+ pxs->download_bytes.data = 0;
+ pxs->download_bytes.size = 0;
+ return 0;
+}
+
+const byte apxReadFontHeader[] = {
+ pxaFontHeaderLength, 0, 0
+};
+int
+pxReadFontHeader(px_args_t *par, px_state_t *pxs)
+{ ulong len = par->pv[0]->value.i;
+ ulong left = len - par->source.position;
+ int code = pxNeedData;
+
+ if ( left > 0 )
+ { ulong pos;
+ if ( par->source.position == 0 )
+ { /* (Re-)allocate the downloaded data. */
+ void *new_data;
+
+ if ( par->source.available == 0 )
+ return code;
+ new_data =
+ (pxs->download_bytes.size == 0 ?
+ gs_alloc_bytes(pxs->memory, len, "pxReadFontHeader") :
+ gs_resize_object(pxs->memory, pxs->download_bytes.data,
+ pxs->download_bytes.size + len,
+ "pxReadFontHeader"));
+ if ( new_data == 0 )
+ return_error(errorInsufficientMemory);
+ pxs->download_bytes.data = new_data;
+ pxs->download_bytes.size += len;
+ }
+ if ( left > par->source.available )
+ left = par->source.available;
+ else
+ code = 0;
+ pos = pxs->download_bytes.size - len + par->source.position;
+ memcpy(pxs->download_bytes.data + pos, par->source.data, left);
+ par->source.position += left;
+ par->source.data += left;
+ par->source.available -= left;
+ if ( pos < 8 && pos + left >= 8 )
+ { /* Check the font header fields now. */
+ const byte *data = pxs->download_bytes.data;
+ if ( data[0] | data[5] )
+ return_error(errorIllegalFontHeaderFields);
+ switch ( data[4] )
+ {
+ case plfst_TrueType:
+ if ( data[1] )
+ return_error(errorIllegalFontHeaderFields);
+ break;
+ case plfst_bitmap:
+ if ( data[1] & ~3 )
+ return_error(errorIllegalFontHeaderFields);
+ break;
+ default:
+ return_error(errorIllegalFontHeaderFields);
+ }
+ }
+ }
+ return code;
+}
+
+const byte apxEndFontHeader[] = {0, 0};
+int
+pxEndFontHeader(px_args_t *par, px_state_t *pxs)
+{ px_font_t *pxfont = pxs->download_font;
+ int code = px_define_font(pxfont, pxs->download_bytes.data,
+ (ulong)pxs->download_bytes.size,
+ gs_next_ids(pxs->memory, 1), pxs);
+
+ /****** HOW TO DETERMINE FONT TYPE? ******/
+ pxfont->font_type = plft_16bit;
+ /* Clear pointers for GC */
+ pxs->download_font = 0;
+ pxs->download_bytes.data = 0;
+ return code;
+}
+
+const byte apxBeginChar[] = {
+ pxaFontName, 0, 0
+};
+int
+pxBeginChar(px_args_t *par, px_state_t *pxs)
+{ px_value_t *pfnv = par->pv[0];
+ px_font_t *pxfont;
+ int code = px_find_existing_font(pfnv, &pxfont, pxs);
+
+ if ( code >= 0 && pxfont == 0 )
+ code = gs_note_error(errorFontUndefined);
+ if ( code < 0 )
+ { if ( code == errorFontUndefined )
+ { strcpy(pxs->error_line, "FontUndefined - ");
+ px_concat_font_name(pxs->error_line, px_max_error_line, pfnv);
+ }
+ return code;
+ }
+ if ( pxfont->storage != pxfsDownLoaded )
+ return_error(errorCannotReplaceCharacter);
+ pxs->download_font = pxfont;
+ return 0;
+}
+
+const byte apxReadChar[] = {
+ pxaCharCode, pxaCharDataSize, 0, 0
+};
+int
+pxReadChar(px_args_t *par, px_state_t *pxs)
+{ uint char_code = par->pv[0]->value.i;
+ uint size = par->pv[1]->value.i;
+ uint pos = par->source.position;
+
+ if ( pos == 0 )
+ { /* We're starting a character definition. */
+ byte *def;
+
+ if ( size < 2 )
+ return_error(errorIllegalCharacterData);
+ if ( par->source.available == 0 )
+ return pxNeedData;
+ def = gs_alloc_bytes(pxs->memory, size, "pxReadChar");
+ if ( def == 0 )
+ return_error(errorInsufficientMemory);
+ pxs->download_bytes.data = def;
+ pxs->download_bytes.size = size;
+ }
+ while ( pos < size )
+ { uint copy = min(par->source.available, size - pos);
+
+ if ( copy == 0 )
+ return pxNeedData;
+ memcpy(pxs->download_bytes.data + pos, par->source.data, copy);
+ par->source.data += copy;
+ par->source.available -= copy;
+ par->source.position = pos += copy;
+ }
+ /* We have the complete character. */
+ /* Do error checks before installing. */
+ {
+ /* const byte *header = pxs->download_font->header;
+ see NB just below */
+ const byte *data = pxs->download_bytes.data;
+ int code = 0;
+
+ switch ( data[0] )
+ {
+ case 0: /* bitmap */
+ if ( false /* NB FIXME header[4] != plfst_bitmap */)
+ code = gs_note_error(errorFSTMismatch);
+ else if ( data[1] != 0 )
+ code = gs_note_error(errorUnsupportedCharacterClass);
+ else if ( size < 10 ||
+ size != 10 + ((pl_get_uint16(data + 6) + 7) >> 3) *
+ pl_get_uint16(data + 8)
+ )
+ code = gs_note_error(errorIllegalCharacterData);
+ break;
+ case 1: /* TrueType outline */
+ if ( false /* NB FIXME header[4] != plfst_TrueType */ )
+ code = gs_note_error(errorFSTMismatch);
+ else if ( data[1] != 0 && data[1] != 1 && data[1] != 2 )
+ code = gs_note_error(errorUnsupportedCharacterClass);
+ else if ( size < 6 || size != 2 + pl_get_uint16(data + 2) )
+ code = gs_note_error(errorIllegalCharacterData);
+ break;
+ default:
+ code = gs_note_error(errorUnsupportedCharacterFormat);
+ }
+ if ( code >= 0 )
+ { code = pl_font_add_glyph(pxs->download_font, char_code, (byte *)data); /* const cast */
+ if ( code < 0 )
+ code = gs_note_error(errorInternalOverflow);
+ }
+ if ( code < 0 )
+ gs_free_object(pxs->memory, pxs->download_bytes.data,
+ "pxReadChar");
+ pxs->download_bytes.data = 0;
+ return code;
+ }
+}
+
+const byte apxEndChar[] = {0, 0};
+int
+pxEndChar(px_args_t *par, px_state_t *pxs)
+{ return 0;
+}
+
+const byte apxRemoveFont[] = {
+ pxaFontName, 0, 0
+};
+int
+pxRemoveFont(px_args_t *par, px_state_t *pxs)
+{ px_value_t *pfnv = par->pv[0];
+ px_font_t *pxfont;
+ int code = px_find_existing_font(pfnv, &pxfont, pxs);
+ const char *error = 0;
+
+ if ( code < 0 )
+ error = "UndefinedFontNotRemoved - ";
+ else if ( pxfont == 0 ) /* built-in font, assume internal */
+ error = "InternalFontNotRemoved - ";
+ else
+ switch ( pxfont->storage )
+ {
+ case pxfsInternal:
+ error = "InternalFontNotRemoved - ";
+ break;
+ case pxfsMassStorage:
+ error = "MassStorageFontNotRemoved - ";
+ break;
+ default: /* downloaded */
+ ;
+ }
+ if ( error )
+ { /* Construct a warning message including the font name. */
+ char message[px_max_error_line + 1];
+
+ strcpy(message, error);
+ px_concat_font_name(message, px_max_error_line, pfnv);
+ code = px_record_warning(message, false, pxs);
+ }
+ /****** WHAT IF THIS IS THE CURRENT FONT? ******/
+ px_dict_undef(&pxs->font_dict, par->pv[0]);
+ return 0;
+}
diff --git a/pxl/pxfont.h b/pxl/pxfont.h
new file mode 100644
index 000000000..79e2be0ce
--- /dev/null
+++ b/pxl/pxfont.h
@@ -0,0 +1,89 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxfont.h */
+/* Interface to PCL XL utilities */
+
+#ifndef pxfont_INCLUDED
+# define pxfont_INCLUDED
+
+/* Rename types. */
+#ifdef px_font_t_DEFINED
+# define pl_font_t_DEFINED
+#endif
+#define pl_font_s px_font_s
+#define pl_font_t px_font_t
+#include "plfont.h"
+#define px_font_t_DEFINED
+
+/*
+ * This file provides a layer of specialization and renaming around
+ * the font handling library.
+ *
+ * We store all font names as Unicode strings. Each element of a font
+ * name is a char16 (a 16-bit unsigned value in native byte order).
+ */
+
+/* Define storage locations for fonts. */
+typedef enum {
+ pxfsDownLoaded,
+ pxfsInternal,
+ pxfsMassStorage
+} px_font_storage_t;
+
+/* Fill in generic font boilerplate. */
+#define px_fill_in_font(pfont, pxfont, pxs)\
+ pl_fill_in_font(pfont, pxfont, pxs->font_dir, pxs->memory, "nameless_font")
+
+/*
+ * Define a font. The caller must fill in pxfont->storage and ->font_type.
+ */
+int px_define_font(px_font_t *pxfont, byte *header, ulong size,
+ gs_id id, px_state_t *pxs);
+
+/*
+ * Look up a font name and return the base font. This procedure implements
+ * most of the SetFont operator. Note that this procedure will widen and/or
+ * byte-swap the font name if necessary.
+ */
+int px_find_font(px_value_t *pfnv, uint symbol_set, px_font_t **ppxfont,
+ px_state_t *pxs);
+
+/* Look up a font name and return an existing font. */
+/* This procedure may widen and/or byte-swap the font name. */
+/* If this font is supposed to be built in but no .TTF file is available, */
+/* return >= 0 and store 0 in *ppxfont. */
+int px_find_existing_font(px_value_t *pfnv, px_font_t **ppxfont,
+ px_state_t *pxs);
+
+/*
+ * Concatenate a widened (16-bit) font name onto an error message string.
+ */
+void px_concat_font_name(char *message, uint max_message,
+ const px_value_t *pfnv);
+
+/*
+ * Paint text or add it to the path.
+ * This procedure implements the Text and TextPath operators.
+ */
+int px_text(px_args_t *par, px_state_t *pxs, bool to_path);
+
+/*
+ * Free a font. This is the freeing procedure in the font dictionary.
+ * We have to define the name without parameters so that we can use it
+ * as a procedure constant.
+ */
+/*#define px_free_font(mem, pxf, cname) pl_free_font(mem, pxf, cname)*/
+#define px_free_font pl_free_font
+
+#endif /* pxfont_INCLUDED */
diff --git a/pxl/pxfts.txt b/pxl/pxfts.txt
new file mode 100644
index 000000000..b765e7b04
--- /dev/null
+++ b/pxl/pxfts.txt
@@ -0,0 +1,177 @@
+
+ Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+
+ Report on Genoa PCL6 FTS and LaserJet 6MP
+
+This document presents the results of Aladdin's investigation of
+discrepancies between the Genoa PCL6 Functional Test Suite, the published
+PCL XL Feature Reference Protocol Class 1.1 specification, and the behavior
+of the H-P LaserJet 6MP printer.
+
+ Report on Genoa PCL6 FTS and LaserJet 6MP
+
+Introduction
+============
+
+In the course of validating our PCL XL interpreter using the Genoa PCL6
+Functional Test Suite (FTS), we observed a number of discrepancies that,
+after careful investigation, we concluded were due to problems in the FTS
+and/or the printer firmware. In this document, we present these in detail.
+
+This document should be read in conjunction with our separate report on
+discrepancies between the specification and the firmware independent of the
+Genoa FTS.
+
+Changes in a given revision of this document are marked with the revision
+number in [brackets]. Revision history:
+ first issued December 6, 1996
+ rev. [1] December 22, 1996
+ rev. [2] February 6, 1997
+
+General
+=======
+
+We noticed that in many places, the input data contain an extra PopGS that
+doesn't have a matching PushGS. The published specification says that this
+is invalid (i.e., the existence of a PushGS is part of the precondition for
+PopGS). Apparently the printer ignores the extra PopGS.
+
+Individual tests
+================
+
+[2] t101 - BeginSession
+-----------------------
+
+On pages 2 and 3, in the LJ5 printouts, the characters are not distorted
+(stretched vertically on page 2, compressed vertically on page 3) to match
+the non-uniform UnitsPerMeasure. This is a bug in the LJ5 firmware that has
+been corrected in the LJ 6MP.
+
+t305 - SetColorSpace
+--------------------
+
+The two lower rectangles in image 03 are stroked with gray, and are not
+painted. The comment on this image says "The 2nd and 3rd rectangles should
+be stroked and painted with black color." [1] See the entry for
+SetColorSpace in the discrepancies report.
+
+t310 - SetCharShear
+
+On page 1 panel 1 the character shear setting results in font scaling
+factors thar are zero. The Artifex interpreter produces no result,
+the HP 4600 produces a thin one pixel line for the character. We do
+not attempt to emulate this.
+
+
+t314 - SetFillMode
+------------------
+
+The lower figure in all 3 images, ostensibly drawn with the non-zero winding
+number rule, is clearly not drawn with this rule. [1] See the discussion of
+clipping and of SetClipIntersect in the discrepancies report.
+
+
+t321 - SetClipIntersect
+-----------------------
+
+In the lower figure of image 01, the dark lines stop at the edges of an
+invisible rectangle rather than extending all the way to the ellipse. This
+is consistent with the interpretation of SetClipIntersect documented in the
+discrepancies report, but not with the published specification.
+
+t322 - SetClipRectangle
+-----------------------
+
+In image 03, the rectangle border is a medium gray. However, the input data
+are as follows:
+
+ NewPath
+ 200 @GrayLevel SetBrushSource
+ 120 @GrayLevel SetPenSource
+ 40 @PenWidth SetPenWidth
+ 0 @ClipRegion [1200 400 2000 2200] @BoundingBox SetClipRectangle
+ [1200 400 2000 2200] @BoundingBox Rectangle
+ 20 @GrayLevel SetPenSource
+ 0 2925 @Point SetCursor
+ 2400 0 @EndPoint LinePath
+ PaintPath
+
+The Rectangle operator is supposed to leave the path set to a rectangle, so
+the final PaintPath should paint both the rectangle and the line a very dark
+gray; however, as noted in the discrepancies report, Rectangle actually
+clears the path.
+
+t325 - SetClipMode
+------------------
+
+The middle figure of image 03 is a solid disk. However, the input data are
+as follows:
+
+ 0 @GrayLevel SetBrushSource
+ [300 300 4500 2625] @BoundingBox Rectangle
+ PushGS
+ 0 @ClipMode SetClipMode
+ [1800 2325 3000 3525] @BoundingBox EllipsePath
+ [2100 2625 2700 3225] @BoundingBox EllipsePath
+ 0 @ClipRegion SetClipReplace
+ 0 @GrayLevel SetBrushSource
+ [300 2250 4500 3600] @BoundingBox Rectangle
+
+Again, if Rectangle left the path set as documented, this would draw (part
+of) the rectangle as well as the disk.
+
+[2] t329 - SetHalftoneMethod
+----------------------------
+
+The DitherOrigin of the halftone is incorrectly set relative to the origin
+of the default (rotated) user coordinate system rather than to the current
+user coordinate system. This causes the patterns to be shifted slightly
+relative to the Genoa printout. For a test example, see our separate report
+on firmware discrepancies.
+
+t409 - Ellipse
+--------------
+
+Image 04 is light gray. However, it should actually be painted with an
+outer stripe of light gray and an inner strip of dark gray:
+
+ 1 @ColorSpace SetColorSpace
+ 255 @GrayLevel SetBrushSource
+ 180 @GrayLevel SetPenSource
+ 160 @PenWidth SetPenWidth
+ [300 300 2100 800] @BoundingBox RectanglePath % no-op
+ [300 1100 2100 1600] @BoundingBox Ellipse
+ 60 @GrayLevel SetPenSource
+ 60 @PenWidth SetPenWidth
+ PaintPath
+
+The Ellipse command should leave the path set, and the final PaintPath
+should erase the interior of the ellipse (including the inner half of the
+lighter stripe) and then repaint the annulus with the darker color with the
+narrower pen. This is the same problem as in t322 and t325.
+
+t413 - Pie
+----------
+
+Image 05 shows the same problem as noted under t409.
+
+t415 - Rectangle
+----------------
+
+Image 02 shows the same problem as noted under t322 and t325.
+
+t202.bin (Protocol 2.0 fts)
+---------------------------
+
+Panel 01 and others show incorrect spacing when rendering downloaded
+TrueType fonts. This only happens with the AGFA scaler and resolutions
+lower than printer resolutions.
+
+t422.bin (Protocol 2.0 fts)
+---------------------------
+
+A raster pattern of height 1 results in a 0 area pattern which
+produces an error. The error only happens if the device resolution is
+less than 300 dpi.
+
diff --git a/pxl/pxgstate.c b/pxl/pxgstate.c
new file mode 100644
index 000000000..f4296fef8
--- /dev/null
+++ b/pxl/pxgstate.c
@@ -0,0 +1,1112 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxgstate.c */
+/* PCL XL graphics state operators */
+
+#include "math_.h"
+#include "memory_.h"
+#include "stdio_.h" /* std.h + NULL */
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxparse.h"
+#include "gdebug.h"
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gxcspace.h" /* must precede gscolor2.h */
+#include "gscie.h"
+#include "gsimage.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsrop.h"
+#include "gxpath.h"
+#include "gzstate.h"
+#include "gscolor2.h"
+#include "plsrgb.h"
+
+/*
+ * There is an apparent bug in the LJ5 and LJ6MP firmware that causes
+ * SetClipIntersect with even/odd mode and exterior region to behave the
+ * same as SetClipReplace. To emulate this bug, uncomment the following
+ * #define.
+ */
+#define CLIP_INTERSECT_EXTERIOR_REPLACES
+/*
+ * H-P printers apparently have a maximum dash pattern length of 20.
+ * Our library doesn't impose a limit, but we may as well emulate the
+ * H-P limit here for error checking and Genoa test compatibility.
+ */
+#define MAX_DASH_ELEMENTS 20
+
+/* Imported operators */
+px_operator_proc(pxRectanglePath);
+/* Forward references */
+px_operator_proc(pxSetClipIntersect);
+
+
+/* Imported color space types */
+extern const gs_color_space_type gs_color_space_type_Indexed; /* gscolor2.c */
+extern const gs_color_space_type gs_color_space_type_Pattern; /* gspcolor.c */
+
+/* Define 'client procedures' for copying the PCL XL state. */
+/* We export the reference count adjustment procedures for the sake of */
+/* the state setting code in pxink.c. */
+void
+px_paint_rc_adjust(px_paint_t *ppt, int delta, gs_memory_t *mem)
+{ if ( ppt->type == pxpPattern )
+ { /*
+ * There is no public API for adjusting the reference count of a
+ * gs_client_color, and even the private API requires having a
+ * color space available. We'll need to fix this properly
+ * sooner or later, but for the moment, fake it.
+ */
+ gs_color_space cspace;
+
+ /*
+ * Even though this is a colored Pattern, and hence does have a
+ * base space, we set has_base_space to false to prevent the
+ * adjust_color_count procedure from trying to call the
+ * adjustment procedures for the base space.
+ */
+ cspace.type = &gs_color_space_type_Pattern;
+ cspace.params.pattern.has_base_space = false;
+ (*cspace.type->adjust_color_count)(&ppt->value.pattern.color,
+ &cspace, delta);
+ rc_adjust_only(ppt->value.pattern.pattern, delta,
+ "px_paint_rc_adjust");
+ }
+}
+void
+px_gstate_rc_adjust(px_gstate_t *pxgs, int delta, gs_memory_t *mem)
+{ px_paint_rc_adjust(&pxgs->pen, delta, mem);
+ px_paint_rc_adjust(&pxgs->brush, delta, mem);
+}
+static void *
+px_gstate_client_alloc(gs_memory_t *mem)
+{
+ px_gstate_t *pxgs =
+ (px_gstate_t *)gs_alloc_bytes(mem,
+ sizeof(px_gstate_t),
+ "px_gstate_alloc");
+
+ if ( pxgs == 0 )
+ return 0;
+ /* Initialize reference-counted pointers and other pointers */
+ /* needed to establish invariants. */
+ pxgs->memory = mem;
+ pxgs->halftone.thresholds.data = 0;
+ pxgs->halftone.thresholds.size = 0;
+ pxgs->dither_matrix.data = 0;
+ pxgs->dither_matrix.size = 0;
+ pxgs->brush.type = pxpNull;
+ pxgs->pen.type = pxpNull;
+ px_dict_init(&pxgs->temp_pattern_dict, mem, px_free_pattern);
+ return pxgs;
+}
+static int
+px_gstate_client_copy_for(void *to, void *from, gs_state_copy_reason_t reason)
+{
+#define pxfrom ((px_gstate_t *)from)
+#define pxto ((px_gstate_t *)to)
+ px_gstate_rc_adjust(pxfrom, 1, pxfrom->memory);
+ px_gstate_rc_adjust(pxto, -1, pxto->memory);
+ /*
+ * In the context of the PCL XL code, this routine may be called for
+ * gsave, grestore, or gstate (copying the gstate for makepattern
+ * or Pattern rendering). See gxstate.h for details of the 'from'
+ * and 'to' arguments for each of these cases.
+ *
+ * We have some structures that belong to the individual gstates for
+ * storage management purposes. Currently these are:
+ * dither_matrix, temp_pattern_dict
+ * px_gstate_client_alloc initializes them to an empty state.
+ * For gsave and gstate, the new current gstate or copied gstate
+ * respectively should have the empty structure. For grestore,
+ * we want to swap the structures, because we will then free the
+ * saved gstate (and release the structure that was in the current
+ * gstate before the grestore).
+ *
+ * halftone.thresholds is a different special case. We need to
+ * copy it for gsave and gstate, and free it on grestore.
+ */
+ { gs_string tmat;
+ gs_string thtt;
+ pl_dict_t tdict;
+ gs_string *phtt;
+
+ tmat = pxto->dither_matrix;
+ thtt = pxto->halftone.thresholds;
+ tdict = pxto->temp_pattern_dict;
+ *pxto = *pxfrom;
+ switch ( reason )
+ {
+ case copy_for_gstate:
+ /* Just put back the (empty) 'to' structures. */
+ pxto->dither_matrix = tmat;
+ pxto->temp_pattern_dict = tdict;
+ phtt = &pxto->halftone.thresholds;
+ goto copy;
+ case copy_for_gsave:
+ /* Swap the structures, but set the parent of the new */
+ /* (empty) dictionary to the old one. */
+ pxfrom->dither_matrix = tmat;
+ pxfrom->temp_pattern_dict = tdict;
+ pl_dict_set_parent(&pxfrom->temp_pattern_dict,
+ &pxto->temp_pattern_dict);
+ phtt = &pxfrom->halftone.thresholds;
+copy: if ( phtt->data )
+ { byte *str = gs_alloc_string(pxfrom->memory, phtt->size,
+ "px_gstate_client_copy(thresholds)");
+ if ( str == 0 )
+ return_error(errorInsufficientMemory);
+ memcpy(str, phtt->data, phtt->size);
+ phtt->data = str;
+ }
+ break;
+ default: /* copy_for_grestore */
+ /* Swap the structures. */
+ pxfrom->dither_matrix = tmat;
+ pxfrom->halftone.thresholds = thtt;
+ pxfrom->temp_pattern_dict = tdict;
+ }
+ }
+ return 0;
+#undef pxfrom
+#undef pxto
+}
+static void
+px_gstate_client_free(void *old, gs_memory_t *mem)
+{ px_gstate_t *pxgs = old;
+
+ px_dict_release(&pxgs->temp_pattern_dict);
+ if ( pxgs->halftone.thresholds.data )
+ gs_free_string(mem, (byte *)pxgs->halftone.thresholds.data,
+ pxgs->halftone.thresholds.size,
+ "px_gstate_free(halftone.thresholds)");
+ if ( pxgs->dither_matrix.data )
+ gs_free_string(mem, (byte *)pxgs->dither_matrix.data,
+ pxgs->dither_matrix.size,
+ "px_gstate_free(dither_matrix)");
+ px_gstate_rc_adjust(old, -1, mem);
+ gs_free_object(mem, old, "px_gstate_free");
+}
+static const gs_state_client_procs px_gstate_procs = {
+ px_gstate_client_alloc,
+ 0, /* copy -- superseded by copy_for */
+ px_gstate_client_free,
+ px_gstate_client_copy_for
+};
+
+/* ---------------- Initialization ---------------- */
+
+/* Allocate a px_gstate_t. */
+px_gstate_t *
+px_gstate_alloc(gs_memory_t *mem)
+{ px_gstate_t *pxgs = px_gstate_client_alloc(mem);
+
+ if ( pxgs == 0 )
+ return 0;
+ pxgs->stack_depth = 0;
+ px_gstate_init(pxgs, NULL);
+ return pxgs;
+}
+
+/* Initialize a px_gstate_t. */
+void
+px_gstate_init(px_gstate_t *pxgs, gs_state *pgs)
+{ pxgs->halftone.method = eDeviceBest;
+ pxgs->halftone.set = false;
+ pxgs->halftone.origin.x = pxgs->halftone.origin.y = 0;
+ /* halftone.thresholds was initialized at alloc time */
+ px_gstate_reset(pxgs);
+ if ( pgs )
+ gs_state_set_client(pgs, pxgs, &px_gstate_procs, false);
+}
+
+/* Initialize the graphics state for a page. */
+/* Note that this takes a px_state_t, not a px_gstate_t. */
+int
+px_initgraphics(px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+
+ px_gstate_reset(pxs->pxgs);
+ gs_initgraphics(pgs);
+
+ /* PCL XL uses the center-of-pixel rule. */
+ gs_setfilladjust(pgs, 0.0, 0.0);
+
+ { gs_point inch;
+ float dpi;
+
+ gs_dtransform(pgs, 72.0, 0.0, &inch);
+ dpi = fabs(inch.x) + fabs(inch.y);
+
+ /* Stroke adjustment leads to anomalies at high resolutions. */
+ if ( dpi >= 150 )
+ gs_setstrokeadjust(pgs, false);
+
+ /* We need the H-P interpretation of zero-length lines */
+ /* and of using bevel joins for the segments of flattened curves. */
+ gs_setdotlength(pgs, 72.0 / 300, true);
+ gs_setcurvejoin(pgs, gs_join_bevel);
+ }
+ /* we always clamp coordinates hp does not seem to report
+ limit checks in paths */
+ gs_setlimitclamp(pgs, true);
+ return 0;
+}
+
+/* Reset a px_gstate_t, initially or at the beginning of a page. */
+void
+px_gstate_reset(px_gstate_t *pxgs)
+{ pxgs->brush.type = pxpGray;
+ pxgs->brush.value.gray = 0;
+ pxgs->char_angle = 0;
+ pxgs->char_bold_value = 0;
+ pxgs->char_scale.x = pxgs->char_scale.y = 1;
+ pxgs->char_shear.x = pxgs->char_shear.y = 0;
+ /* The order of transforms is arbitrary, */
+ /* because the transforms are all no-ops. */
+ pxgs->char_transforms[0] = pxct_rotate;
+ pxgs->char_transforms[1] = pxct_shear;
+ pxgs->char_transforms[2] = pxct_scale;
+ pxgs->char_sub_mode = eNoSubstitution;
+ pxgs->clip_mode = eNonZeroWinding;
+ pxgs->color_space = eRGB;
+ pxgs->palette.size = 0;
+ pxgs->palette.data = 0;
+ pxgs->palette_is_shared = false;
+ pxgs->base_font = 0;
+ /* halftone_method was set above. */
+ pxgs->fill_mode = eNonZeroWinding;
+ pxgs->dashed = false;
+ pxgs->pen.type = pxpGray;
+ pxgs->pen.value.gray = 0;
+ /* temp_pattern_dict was set at allocation time. */
+ gs_make_identity(&pxgs->text_ctm);
+ pxgs->char_matrix_set = false;
+ pxgs->symbol_map = 0;
+ pxgs->writing_mode = eHorizontal;
+}
+
+/* initial clip region note, we don't use gs_initclip() because we
+ give special handling for the XL 1/6" border */
+int
+px_initclip(px_state_t *pxs)
+{
+ return gx_clip_to_rectangle(pxs->pgs, &pxs->pxgs->initial_clip_rect);
+}
+
+static bool
+px_is_currentcolor_pattern(const gs_state *pgs)
+{
+ return (gs_color_space_num_components(gs_currentcolorspace(pgs)) < 1);
+}
+
+/* Set up the color space information for a bitmap image or pattern. */
+int
+px_image_color_space(gs_image_t *pim,
+ const px_bitmap_params_t *params, const gs_string *palette,
+ const gs_state *pgs)
+{
+
+ int depth = params->depth;
+ gs_color_space *pbase_pcs = NULL;
+ gs_color_space *pcs = NULL;
+ bool cie_space = false;
+ int code = 0;
+ switch ( params->color_space ) {
+ case eGray:
+ pbase_pcs = gs_cspace_new_DeviceGray(pgs->memory);
+ break;
+ case eRGB:
+ pbase_pcs = gs_cspace_new_DeviceRGB(pgs->memory);
+ break;
+ case eSRGB:
+ case eCRGB:
+ if ( pl_cspace_init_SRGB(&pbase_pcs, pgs) < 0 )
+ /* should not happen */
+ return_error(errorInsufficientMemory);
+ cie_space = true;
+ break;
+ default:
+ return_error(errorIllegalAttributeValue);
+ }
+ if (pbase_pcs == NULL)
+ return_error(errorInsufficientMemory);
+
+ if ( params->indexed ) {
+ pcs = gs_cspace_alloc(pgs->memory, &gs_color_space_type_Indexed);
+ if ( pcs == NULL ) {
+ /* free the base space also */
+ rc_decrement(pbase_pcs, "px_image_color_space");
+ return_error(errorInsufficientMemory);
+ }
+ pcs->base_space = pbase_pcs;
+ pcs->params.indexed.hival = (1 << depth) - 1;
+ pcs->params.indexed.lookup.table.data = palette->data;
+ pcs->params.indexed.lookup.table.size = palette->size;
+ pcs->params.indexed.use_proc = 0;
+ } else {
+ pcs = pbase_pcs;
+ }
+ gs_image_t_init(pim, pcs);
+ pim->ColorSpace = pcs;
+ pim->BitsPerComponent = depth;
+ if ( params->indexed )
+ pim->Decode[1] = (1 << depth) - 1;
+ /* NB - this needs investigation */
+ if (cie_space && !px_is_currentcolor_pattern(pgs)) {
+ code = pl_setSRGBcolor((gs_state *)pgs, 0.0, 0.0, 0.0);
+ }
+ return code;
+}
+
+/* Check the setting of the clipping region. */
+#define check_clip_region(par, pxs)\
+ if ( par->pv[0]->value.i == eExterior && pxs->pxgs->clip_mode != eEvenOdd )\
+ return_error(errorClipModeMismatch)
+
+/* Record the most recent character transformation. */
+static void
+add_char_transform(px_gstate_t *pxgs, px_char_transform_t trans)
+{ /* Promote this transformation to the head of the list. */
+ if ( pxgs->char_transforms[2] == trans )
+ pxgs->char_transforms[2] = pxgs->char_transforms[1],
+ pxgs->char_transforms[1] = pxgs->char_transforms[0];
+ else if ( pxgs->char_transforms[1] == trans )
+ pxgs->char_transforms[1] = pxgs->char_transforms[0];
+ pxgs->char_transforms[0] = trans;
+ pxgs->char_matrix_set = false;
+}
+
+/* ---------------- Operators ---------------- */
+
+const byte apxPopGS[] = {0, 0};
+int
+pxPopGS(px_args_t *par, px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+ px_gstate_t *pxgs = pxs->pxgs;
+ int code;
+
+ /*
+ * Even though the H-P documentation says that a PopGS with an
+ * empty stack is illegal, the implementations apparently simply
+ * do nothing in this case.
+ */
+ if ( pxgs->stack_depth == 0 )
+ return 0;
+ if ( pxgs->palette.data && !pxgs->palette_is_shared ) {
+ gs_free_string(pxs->memory, (byte *)pxgs->palette.data,
+ pxgs->palette.size, "pxPopGS(palette)");
+ pxgs->palette.data = 0;
+ }
+ px_purge_pattern_cache(pxs, eTempPattern);
+ code = gs_grestore(pgs);
+ pxs->pxgs = gs_state_client_data(pgs);
+ return code;
+}
+
+const byte apxPushGS[] = {0, 0};
+int
+pxPushGS(px_args_t *par, px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+ int code = gs_gsave(pgs);
+ px_gstate_t *pxgs;
+
+ if ( code < 0 )
+ return code;
+ pxgs = pxs->pxgs = gs_state_client_data(pgs);
+ if ( pxgs->palette.data )
+ pxgs->palette_is_shared = true;
+ ++(pxgs->stack_depth);
+ return code;
+}
+
+/* To restore the interpreters to default state we assemble the
+ following pxl commands and execute them as a stream.
+
+ubyte 2 ColorSpace
+SetColorSpace
+
+ubyte_array [ uint16 3
+0000 00 00 00 ...
+] RGBColor
+SetBrushSource
+
+uint16 0 CharAngle
+SetCharAngle
+
+SetPageDefaultCTM
+ubyte_array [ uint16 3
+0000 00 00 00 ...
+
+] RGBColor
+SetPenSource
+
+ubyte 1 PenWidth
+SetPenWidth
+
+ubyte 0 TxMode
+SetSourceTxMode
+
+ubyte 0 TxMode
+SetPatternTxMode
+
+ubyte 252 ROP3
+SetROP
+
+ubyte 0 LineCapStyle
+SetLineCap
+
+ubyte 0 SolidLine
+SetLineDash
+
+ubyte 0 LineJoinStyle
+SetLineJoin
+
+uint16 10 MiterLength
+SetMiterLimit
+
+real32_xy 1.000000 1.000000 CharScale
+SetCharScale
+
+real32_xy 0.000000 0.000000 CharShear
+SetCharShear
+
+ubyte 0 DeviceMatrix
+SetHalftoneMethod
+
+ubyte 0 ClipMode
+SetClipMode
+
+SetClipToPage
+
+NewPath
+
+ubyte 0 FillMode
+SetFillMode
+
+*/
+
+/* assembled (little endian) stream */
+static const byte pxSetDefaultGSstr[] = {
+ 192,2,248,3,106,200,193,3,0,0,0,0,248,11,99,193,
+ 0,0,248,161,100,116,200,193,3,0,0,0,0,248,11,121,192,1,248,75,122,192,
+ 0,248,45,124,192,0,248,45,120,192,252,248,44,123,192,0,248,71,113,192,
+ 0,248,78,112,192,0,248,72,114,193,10,0,248,73,115,213,0,0,128,63,0,0,128,63,
+ 248,164,101,213,0,0,0,0,0,0,0,0,248,165,102,192,0,248,33,109,192,0,248,
+ 84,127,105,133,192,0,248,70,110
+};
+
+
+const byte apxSetDefaultGS[] = {0, 0};
+int
+pxSetDefaultGS(px_args_t *par, px_state_t *pxs)
+{
+ px_parser_state_t *pst = par->parser;
+ px_parser_state_t st;
+ stream_cursor_read r;
+ int code;
+
+ st.memory = pxs->memory;
+ px_process_init(&st, false /* big_endian */);
+
+ st.macro_state = pst->macro_state | ptsExecStream;
+ r.ptr = pxSetDefaultGSstr - 1;
+ r.limit = r.ptr + sizeof(pxSetDefaultGSstr);
+
+ /* we don't expect this to fail */
+ code = px_process(&st, pxs, &r);
+
+ pst->macro_state = st.macro_state & ~ptsExecStream;
+ return code;
+}
+
+const byte apxSetClipReplace[] = {
+ pxaClipRegion, 0, 0
+};
+int
+pxSetClipReplace(px_args_t *par, px_state_t *pxs)
+{ int code;
+
+ check_clip_region(par, pxs);
+ if ( (code = px_initclip(pxs)) < 0 )
+ return code;
+ return pxSetClipIntersect(par, pxs);
+}
+
+const byte apxSetCharAngle[] = {
+ pxaCharAngle, 0, 0
+};
+int
+pxSetCharAngle(px_args_t *par, px_state_t *pxs)
+{ real angle = real_value(par->pv[0], 0);
+ px_gstate_t *pxgs = pxs->pxgs;
+
+ if ( angle != pxgs->char_angle ||
+ pxgs->char_transforms[0] != pxct_rotate
+ )
+ { pxgs->char_angle = angle;
+ add_char_transform(pxgs, pxct_rotate);
+ }
+ return 0;
+}
+
+/* confusion in the 3.0 spec - this argument identifier WritingMode
+ 173 is now being used by SelectPCLFont */
+const byte apxSetCharAttributes[] = {
+ pxaWritingMode, 0, 0
+};
+int
+pxSetCharAttributes(px_args_t *par, px_state_t *pxs)
+{
+ pxeWritingMode_t arg = par->pv[0]->value.i;
+ if ( arg != pxs->pxgs->writing_mode ) {
+ pxs->pxgs->writing_mode = arg;
+ px_purge_character_cache(pxs);
+ }
+ return 0;
+}
+
+const byte apxSetCharScale[] = {
+ pxaCharScale, 0, 0
+};
+int
+pxSetCharScale(px_args_t *par, px_state_t *pxs)
+{ real x_scale = real_value(par->pv[0], 0);
+ real y_scale = real_value(par->pv[0], 1);
+ px_gstate_t *pxgs = pxs->pxgs;
+
+ if ( x_scale != pxgs->char_scale.x || y_scale != pxgs->char_scale.y ||
+ pxgs->char_transforms[0] != pxct_scale
+ )
+ { pxgs->char_scale.x = x_scale;
+ pxgs->char_scale.y = y_scale;
+ add_char_transform(pxgs, pxct_scale);
+ }
+ return 0;
+}
+
+const byte apxSetCharShear[] = {
+ pxaCharShear, 0, 0
+};
+int
+pxSetCharShear(px_args_t *par, px_state_t *pxs)
+{ real x_shear = real_value(par->pv[0], 0);
+ real y_shear = real_value(par->pv[0], 1);
+ px_gstate_t *pxgs = pxs->pxgs;
+
+ if ( x_shear != pxgs->char_shear.x || y_shear != pxgs->char_shear.y ||
+ pxgs->char_transforms[0] != pxct_shear
+ )
+ { pxgs->char_shear.x = x_shear;
+ pxgs->char_shear.y = y_shear;
+ add_char_transform(pxgs, pxct_shear);
+ }
+ return 0;
+}
+
+const byte apxSetClipIntersect[] = {
+ pxaClipRegion, 0, 0
+};
+int
+pxSetClipIntersect(px_args_t *par, px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+ pxeClipRegion_t clip_region = par->pv[0]->value.i;
+ int code;
+
+ check_clip_region(par, pxs);
+ /*
+ * The discussion of ClipMode and ClipRegion in the published
+ * specification is confused and incorrect. Based on testing with
+ * the LaserJet 6MP, we believe that ClipMode works just like
+ * PostScript clip and eoclip, and that ClipRegion applies only to
+ * the *current* path (i.e., support for "outside clipping" in the
+ * library is unnecessary). If we had only known....
+ */
+#if 0
+ gs_setclipoutside(pgs, false);
+#endif
+ if ( clip_region == eExterior )
+ { /*
+ * We know clip_mode is eEvenOdd, so we can complement the
+ * region defined by the current path by just adding a
+ * rectangle that encloses the entire page.
+ */
+ gs_rect bbox;
+
+ code = gs_gsave(pgs);
+ if ( code < 0 )
+ return code;
+ px_initclip(pxs);
+ if ( (code = gs_clippath(pgs)) < 0 ||
+ (code = gs_pathbbox(pgs, &bbox)) < 0
+ )
+ DO_NOTHING;
+ gs_grestore(pgs);
+ if ( code < 0 ||
+ (code = gs_rectappend(pgs, &bbox, 1)) < 0
+ )
+ return code;
+#ifdef CLIP_INTERSECT_EXTERIOR_REPLACES
+ px_initclip(pxs);
+#endif
+ }
+ code =
+ (pxs->pxgs->clip_mode == eEvenOdd ? gs_eoclip(pgs) : gs_clip(pgs));
+ if ( code < 0 )
+ return code;
+#if 0
+ gs_setclipoutside(pgs, clip_region == eExterior);
+#endif
+ return gs_newpath(pgs);
+}
+
+const byte apxSetClipRectangle[] = {
+ pxaClipRegion, pxaBoundingBox, 0, 0
+};
+int
+pxSetClipRectangle(px_args_t *par, px_state_t *pxs)
+{ px_args_t args;
+ gs_state *pgs = pxs->pgs;
+ int code;
+
+ check_clip_region(par, pxs);
+ gs_newpath(pgs);
+ args.pv[0] = par->pv[1];
+ if ( (code = pxRectanglePath(&args, pxs)) < 0 )
+ return code;
+ return pxSetClipReplace(par, pxs);
+}
+
+const byte apxSetClipToPage[] = {0, 0};
+int
+pxSetClipToPage(px_args_t *par, px_state_t *pxs)
+{ gs_newpath(pxs->pgs);
+ return px_initclip(pxs);
+}
+
+const byte apxSetCursor[] = {
+ pxaPoint, 0, 0
+};
+int
+pxSetCursor(px_args_t *par, px_state_t *pxs)
+{ return gs_moveto(pxs->pgs, real_value(par->pv[0], 0),
+ real_value(par->pv[0], 1));
+}
+
+const byte apxSetCursorRel[] = {
+ pxaPoint, 0, 0
+};
+int
+pxSetCursorRel(px_args_t *par, px_state_t *pxs)
+{ return gs_rmoveto(pxs->pgs, real_value(par->pv[0], 0),
+ real_value(par->pv[0], 1));;
+}
+
+/* SetHalftoneMethod is in pxink.c */
+
+const byte apxSetFillMode[] = {
+ pxaFillMode, 0, 0
+};
+int
+pxSetFillMode(px_args_t *par, px_state_t *pxs)
+{ pxs->pxgs->fill_mode = par->pv[0]->value.i;
+ return 0;
+}
+
+/* SetFont is in pxfont.c */
+
+const byte apxSetLineDash[] = {
+ 0, pxaLineDashStyle, pxaDashOffset, pxaSolidLine, 0
+};
+int
+pxSetLineDash(px_args_t *par, px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ gs_state *pgs = pxs->pgs;
+
+ if ( par->pv[0] )
+ { float pattern[MAX_DASH_ELEMENTS * 2];
+ uint size = par->pv[0]->value.array.size;
+ real offset = (par->pv[1] ? real_value(par->pv[1], 0) : 0.0);
+ int code;
+
+ if ( par->pv[2] )
+ return_error(errorIllegalAttributeCombination);
+ if ( size > MAX_DASH_ELEMENTS )
+ return_error(errorIllegalArraySize);
+
+ /*
+ * The H-P documentation gives no clue about what a negative
+ * dash pattern element is supposed to do. The H-P printers
+ * apparently interpret it as drawing a line backwards in the
+ * current direction (which may extend outside the original
+ * subpath) with the caps inside the line instead of outside; a
+ * dash pattern with a negative total length crashes the LJ 6MP
+ * firmware so badly the printer has to be power cycled! We
+ * take a different approach here: we compensate for negative
+ * elements by propagating them to adjacent positive ones. This
+ * doesn't produce quite the same output as the H-P printers do,
+ * but this is such an obscure feature that we don't think it's
+ * worth the trouble to emulate exactly.
+ */
+ { uint orig_size = size;
+ int i;
+
+ /* Acquire the pattern, duplicating it if the length is odd. */
+ if ( size & 1 )
+ size <<= 1;
+ for ( i = 0; i < size; ++i )
+ pattern[i] = real_elt(par->pv[0], i % orig_size);
+ /* Get rid of negative draws. */
+ if ( pattern[0] < 0 )
+ offset -= pattern[0],
+ pattern[size - 1] += pattern[0],
+ pattern[1] += pattern[0],
+ pattern[0] = -pattern[0];
+ for ( i = 2; i < size; i += 2 )
+ if ( pattern[i] < 0 )
+ pattern[i - 1] += pattern[i],
+ pattern[i + 1] += pattern[i],
+ pattern[i] = -pattern[i];
+ /*
+ * Now propagate negative skips iteratively. Since each step
+ * decreases either the remaining total of negative skips or
+ * the total number of pattern elements, the process is
+ * guaranteed to terminate.
+ */
+elim: for ( i = 0; i < size; i += 2 )
+ { float draw = pattern[i], skip = pattern[i + 1];
+ int inext, iprev;
+ float next, prev;
+
+ if ( skip > 0 )
+ continue;
+ if ( size == 2 ) /* => i == 0 */
+ { if ( (pattern[0] = draw + skip) <= 0 )
+ pattern[0] = -pattern[0];
+ pattern[1] = 0;
+ break;
+ }
+ inext = (i == size - 2 ? 0 : i + 2);
+ next = pattern[inext];
+ /*
+ * Consider the sequence D, -S, E, where D and E are draws
+ * and -S is a negative skip. If S <= D, replace the 3
+ * elements with D - S + E.
+ */
+ if ( draw + skip >= 0 )
+ { next += draw + skip;
+ goto shrink;
+ }
+ /*
+ * Otherwise, let T be the skip preceding D. Replace T
+ * with T + D - S. If S > E, replace D, -S, E with E, S -
+ * (D + E), D; otherwise, replace D, -S, E with E. In
+ * both cases, net progress has occurred.
+ */
+ iprev = (i == 0 ? size - 1 : i - 1);
+ prev = pattern[iprev];
+ pattern[iprev] = prev + draw + skip;
+ if ( -skip > next )
+ { pattern[i] = next;
+ pattern[i + 1] = -(skip + draw + next);
+ pattern[i + 2] = draw;
+ goto elim;
+ }
+shrink: if ( inext == 0 )
+ { offset += next - pattern[0];
+ pattern[0] = next;
+ }
+ else
+ { pattern[i] = next;
+ memmove(&pattern[i + 1], &pattern[i + 3],
+ (size - (i + 3)) * sizeof(pattern[0]));
+ }
+ size -= 2;
+ goto elim;
+ }
+ }
+ code = gs_setdash(pgs, pattern, size, offset);
+ if ( code < 0 )
+ return code;
+ /* patterns with 0 total skip length are treated as solid
+ line pattern on the LJ6 */
+ {
+ bool skips_have_length = false;
+ int i;
+ for ( i = 0; i < size; i += 2 )
+ if ( pattern[i + 1] != 0 ) {
+ skips_have_length = true;
+ break;
+ }
+ if ( skips_have_length == false ) {
+ pxgs->dashed = false;
+ return gs_setdash(pgs, NULL, 0, 0.0);
+ }
+ pxgs->dashed = (size != 0);
+ }
+ gs_currentmatrix(pgs, &pxgs->dash_matrix);
+ return 0;
+ }
+ else if ( par->pv[2] )
+ { if ( par->pv[1] )
+ return_error(errorIllegalAttributeCombination);
+ pxgs->dashed = false;
+ return gs_setdash(pgs, NULL, 0, 0.0);
+ }
+ else
+ return_error(errorMissingAttribute);
+}
+
+const byte apxSetLineCap[] = {
+ pxaLineCapStyle, 0, 0
+};
+int
+pxSetLineCap(px_args_t *par, px_state_t *pxs)
+{ static const gs_line_cap cap_map[] = pxeLineCap_to_library;
+ return gs_setlinecap(pxs->pgs, cap_map[par->pv[0]->value.i]);
+}
+
+const byte apxBeginUserDefinedLineCap[] = { 0, 0 };
+int
+pxBeginUserDefinedLineCap(px_args_t *par, px_state_t *pxs)
+{
+
+ dprintf("undocumented\n" );
+ return 0;
+}
+
+
+const byte apxEndUserDefinedLineCap[] = { 0, 0 };
+int
+pxEndUserDefinedLineCap(px_args_t *par, px_state_t *pxs)
+{
+
+ dprintf("undocumented\n" );
+ return 0;
+}
+
+const byte apxSetLineJoin[] = {
+ pxaLineJoinStyle, 0, 0
+};
+int
+pxSetLineJoin(px_args_t *par, px_state_t *pxs)
+{ static const gs_line_join join_map[] = pxeLineJoin_to_library;
+ return gs_setlinejoin(pxs->pgs, join_map[par->pv[0]->value.i]);
+}
+
+const byte apxSetMiterLimit[] = {
+ pxaMiterLength, 0, 0
+};
+int
+pxSetMiterLimit(px_args_t *par, px_state_t *pxs)
+{ float limit = real_value(par->pv[0], 0);
+
+ if ( limit == 0 )
+ { /*
+ * H-P printers interpret this to mean use the default value
+ * of 10, even though nothing in the documentation says or
+ * implies this.
+ */
+ limit = 10;
+ }
+ else
+ { /* PCL XL, but not the library, allows limit values <1. */
+ if ( limit < 1 ) limit = 1;
+ }
+ return gs_setmiterlimit(pxs->pgs, limit);
+}
+
+const byte apxSetPageDefaultCTM[] = {0, 0};
+int
+pxSetPageDefaultCTM(px_args_t *par, px_state_t *pxs)
+{ gs_make_identity(&pxs->pxgs->text_ctm);
+ return gs_setmatrix(pxs->pgs, &pxs->initial_matrix);
+}
+
+const byte apxSetPageOrigin[] = {
+ pxaPageOrigin, 0, 0
+};
+int
+pxSetPageOrigin(px_args_t *par, px_state_t *pxs)
+{ return gs_translate(pxs->pgs, real_value(par->pv[0], 0),
+ real_value(par->pv[0], 1));
+}
+
+const byte apxSetPageRotation[] = {
+ pxaPageAngle, 0, 0
+};
+int
+pxSetPageRotation(px_args_t *par, px_state_t *pxs)
+{ /* Since the Y coordinate of user space is inverted, */
+ /* we must negate rotation angles. */
+ real angle = -real_value(par->pv[0], 0);
+ int code = gs_rotate(pxs->pgs, angle);
+
+ if ( code < 0 )
+ return code;
+ /* Post-multiply the text CTM by the rotation matrix. */
+ { gs_matrix rmat;
+ px_gstate_t *pxgs = pxs->pxgs;
+
+ gs_make_rotation(angle, &rmat);
+ gs_matrix_multiply(&pxgs->text_ctm, &rmat, &pxgs->text_ctm);
+ }
+ return 0;
+}
+
+const byte apxSetPageScale[] = {
+ 0, pxaPageScale, pxaMeasure, pxaUnitsPerMeasure, 0
+};
+
+int
+pxSetPageScale(px_args_t *par, px_state_t *pxs)
+{
+ int code;
+ real sx = 1;
+ real sy = 1;
+ static const real units_conversion_table[3][3] = {
+ { 1, 25.4, 254 }, /* in -> in, mill, 1/10 mill */
+ { 0.0394, 1, 10 }, /* mill -> in, mill, 1/10 mill */
+ { 0.00394, .1, 1 } /* 1/10 mill -> in, mill, 1/10 mill */
+ };
+
+ /* measuure and units of measure. Actually session user units
+ divided by new user unit, bizarre. */
+ if ( par->pv[1] && par->pv[2] ) {
+ /* new user measure */
+ real nux = real_value(par->pv[2], 0);
+ real nuy = real_value(par->pv[2], 1);
+ if ( nux != 0 && nuy != 0 ) {
+ /* new measure */
+ pxeMeasure_t mt = par->pv[1]->value.i;
+ /* convert to session units */
+ real factor = units_conversion_table[mt][pxs->measure];
+ real sux = nux * factor;
+ real suy = nuy * factor;
+ sx = pxs->units_per_measure.x / sux;
+ sy = pxs->units_per_measure.y / suy;
+ /* check for overflow. NB we should do a better job here */
+ if ( fabs(sx) > 1000.0 ) {
+ dprintf2("warning probable overflow avoided for scaling factors %f %f\n",
+ sx, sy );
+ sx = sy = 1;
+ }
+ }
+ } else if ( par->pv[0] ) { /* page scale */
+ sx = real_value(par->pv[0], 0);
+ sy = real_value(par->pv[0], 1);
+ }
+ code = gs_scale(pxs->pgs, sx, sy);
+ if ( code < 0 )
+ return code;
+ /* Post-multiply the text CTM by the scale matrix. */
+ {
+ gs_matrix smat;
+ px_gstate_t *pxgs = pxs->pxgs;
+ gs_make_scaling(sx, sy, &smat);
+ gs_matrix_multiply(&pxgs->text_ctm, &smat, &pxgs->text_ctm);
+ }
+ return 0;
+}
+
+const byte apxSetPaintTxMode[] = {
+ pxaTxMode, 0, 0
+};
+int
+pxSetPaintTxMode(px_args_t *par, px_state_t *pxs)
+{ gs_settexturetransparent(pxs->pgs, par->pv[0]->value.i == eTransparent);
+ return 0;
+}
+
+const byte apxSetPenWidth[] = {
+ pxaPenWidth, 0, 0
+};
+int
+pxSetPenWidth(px_args_t *par, px_state_t *pxs)
+{ return gs_setlinewidth(pxs->pgs, real_value(par->pv[0], 0));
+}
+
+const byte apxSetROP[] = {
+ pxaROP3, 0, 0
+};
+int
+pxSetROP(px_args_t *par, px_state_t *pxs)
+{ gs_setrasterop(pxs->pgs, (gs_rop3_t)(par->pv[0]->value.i));
+ return 0;
+}
+
+const byte apxSetSourceTxMode[] = {
+ pxaTxMode, 0, 0
+};
+int
+pxSetSourceTxMode(px_args_t *par, px_state_t *pxs)
+{ gs_setsourcetransparent(pxs->pgs, par->pv[0]->value.i == eTransparent);
+ return 0;
+}
+
+const byte apxSetCharBoldValue[] = {
+ pxaCharBoldValue, 0, 0
+};
+int
+pxSetCharBoldValue(px_args_t *par, px_state_t *pxs)
+{
+ float arg = real_value(par->pv[0], 0);
+ pxs->pxgs->char_bold_value = arg;
+ return 0;
+}
+
+const byte apxSetClipMode[] = {
+ pxaClipMode, 0, 0
+};
+int
+pxSetClipMode(px_args_t *par, px_state_t *pxs)
+{ pxs->pxgs->clip_mode = par->pv[0]->value.i;
+ return 0;
+}
+
+const byte apxSetPathToClip[] = {0, 0};
+int
+pxSetPathToClip(px_args_t *par, px_state_t *pxs)
+{ return gs_clippath(pxs->pgs);
+}
+
+const byte apxSetCharSubMode[] = {
+ pxaCharSubModeArray, 0, 0
+};
+int
+pxSetCharSubMode(px_args_t *par, px_state_t *pxs)
+{ /*
+ * It isn't clear from the documentation why the attribute is an
+ * array rather than just a Boolean, but we have to assume there
+ * is some reason for this.
+ */
+ const px_value_t *psubs = par->pv[0];
+ pxeCharSubModeArray_t arg;
+
+ if ( psubs->value.array.size != 1 ||
+ psubs->value.array.data[0] >= pxeCharSubModeArray_next
+ )
+ return_error(errorIllegalAttributeValue);
+ arg = psubs->value.array.data[0];
+ if (pxs->pxgs->char_sub_mode != arg) {
+ pxs->pxgs->char_sub_mode = arg;
+ px_purge_character_cache(pxs);
+ }
+ return 0;
+}
diff --git a/pxl/pxgstate.h b/pxl/pxgstate.h
new file mode 100644
index 000000000..197798f69
--- /dev/null
+++ b/pxl/pxgstate.h
@@ -0,0 +1,208 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxgstate.h */
+/* Graphics state extension for PCL XL interpreter */
+
+#ifndef pxgstate_INCLUDED
+# define pxgstate_INCLUDED
+
+#include "gsccolor.h" /* for gs_client_color */
+#include "gsmatrix.h" /* must precede gsiparam.h */
+#include "gsiparam.h" /* for px_image_color_space */
+#include "gsrefct.h"
+#include "gxbitmap.h"
+#include "gxfixed.h"
+#include "plsymbol.h"
+#include "pxdict.h"
+#include "pxenum.h"
+
+/* Define an abstract type for the PostScript graphics state. */
+#ifndef gs_state_DEFINED
+# define gs_state_DEFINED
+typedef struct gs_state_s gs_state;
+#endif
+
+/* Define an abstract type for a font. */
+#ifndef px_font_t_DEFINED
+# define px_font_t_DEFINED
+typedef struct px_font_s px_font_t;
+#endif
+
+/* Define the type of the PCL XL state. */
+#ifndef px_state_DEFINED
+# define px_state_DEFINED
+typedef struct px_state_s px_state_t;
+#endif
+
+/* Define the parameters for a downloaded bitmap (image or raster pattern). */
+typedef struct px_bitmap_params_s {
+ uint width, height;
+ int depth;
+ pxeColorSpace_t color_space;
+ bool indexed;
+ real dest_width, dest_height;
+} px_bitmap_params_t;
+
+/* Define the structure for downloaded raster patterns. */
+typedef struct px_pattern_s {
+ rc_header rc; /* counts refs from gstates, dicts */
+ /* Original parameters */
+ px_bitmap_params_t params;
+ gs_string palette; /* copy of palette if indexed color */
+ byte *data; /* raster data */
+ /* Internal values */
+ gx_bitmap_id id; /* PCL XL ID * #persistence + persistence */
+} px_pattern_t;
+#define private_st_px_pattern() /* in pximage.c */\
+ gs_private_st_composite(st_px_pattern, px_pattern_t, "px_pattern_t",\
+ px_pattern_enum_ptrs, px_pattern_reloc_ptrs);
+/* Define the freeing procedure for patterns in a dictionary. */
+void px_free_pattern(gs_memory_t *, void *, client_name_t);
+/* Purge the pattern cache up to a given persistence level. */
+void px_purge_pattern_cache(px_state_t *, pxePatternPersistence_t);
+/* purge font cache - all characters */
+void px_purge_character_cache(px_state_t *pxs);
+
+/* Define a structure for a brush or pen. These only exist */
+/* within a px_gstate_t; they are never allocated separately. */
+typedef enum {
+ pxpNull,
+ pxpGray,
+ pxpRGB,
+ pxpSRGB,
+ pxpPattern
+} px_paint_type_t;
+typedef struct px_paint_s {
+ px_paint_type_t type;
+ union pv_ {
+ float gray;
+ float rgb[3];
+ struct p_ {
+ px_pattern_t *pattern;
+ gs_client_color color;
+ } pattern;
+ } value;
+} px_paint_t;
+#define private_st_px_paint() /* in pxgstate.c */\
+ gs_private_st_composite(st_px_paint, px_paint_t, "px_paint_t",\
+ px_paint_enum_ptrs, px_paint_reloc_ptrs)
+#define st_px_paint_max_ptrs (st_client_color_max_ptrs + 1)
+
+/* Define the types of character transformation, for remembering the order */
+/* in which to apply them. */
+typedef enum {
+ pxct_rotate = 0,
+ pxct_shear,
+ pxct_scale
+} px_char_transform_t;
+
+/* Define the PCL XL extension of the PostScript graphics state. */
+typedef struct px_gstate_s {
+ gs_memory_t *memory;
+ /* Since this is what the 'client data' of the gs_state points to, */
+ /* we need a pointer back to the px_state_t. */
+ px_state_t *pxs;
+ /* State information */
+ px_paint_t brush;
+ float char_angle;
+ float char_bold_value;
+ gs_point char_scale;
+ gs_point char_shear;
+ /*
+ * The strange H-P rules for character rotation, scaling, and
+ * shearing require us to keep track of the order in which they should
+ * be applied when we finally construct the text matrix.
+ * This array is always a permutation of the 3 possible values.
+ */
+ px_char_transform_t char_transforms[3];
+ pxeCharSubModeArray_t char_sub_mode;
+ pxeWritingMode_t writing_mode;
+ pxeClipMode_t clip_mode;
+ pxeColorSpace_t color_space;
+ gs_const_string palette;
+ bool palette_is_shared; /* with next higher gstate */
+ float char_size;
+ uint symbol_set;
+ px_font_t *base_font; /* 0 if no font set */
+ struct ht_ {
+ pxeDitherMatrix_t method;
+ bool set; /* true if we have done gs_sethalftone */
+ /* with these parameters */
+ uint width;
+ uint height;
+ gs_point origin;
+ gs_string thresholds;
+ } halftone;
+ gs_string dither_matrix; /* dither matrix downloaded at this level */
+ pxeFillMode_t fill_mode;
+ bool dashed;
+ gs_matrix dash_matrix;
+ px_paint_t pen;
+ /* Pattern dictionary */
+ px_dict_t temp_pattern_dict;
+ /* Cached values */
+ gs_matrix text_ctm; /* scale/rotate transformations applied in */
+ /* the reverse order */
+ gs_matrix char_matrix; /* char_size+angle+scale+shear */
+ bool char_matrix_set;
+ int stack_depth; /* # of unmatched PushGS */
+ const pl_symbol_map_t *symbol_map; /* symbol mapping */
+ gs_fixed_rect initial_clip_rect; /* the intersection of hardware
+ margins and the infamous PCL 1/6"
+ border */
+} px_gstate_t;
+#define private_st_px_gstate() /* in pxgstate.c */\
+ gs_private_st_composite(st_px_gstate, px_gstate_t, "px_gstate_t",\
+ px_gstate_enum_ptrs, px_gstate_reloc_ptrs)
+#define px_gstate_do_ptrs(m)\
+ m(0,pxs) m(1,base_font)
+#define px_gstate_num_ptrs 2
+#define px_gstate_do_string_ptrs(m)\
+ m(0,halftone.thresholds) m(1,dither_matrix)
+#define px_gstate_num_string_ptrs 2
+
+/* Allocate a px_gstate_t. */
+px_gstate_t *px_gstate_alloc(gs_memory_t *);
+
+/* Initialize a px_gstate_t. */
+void px_gstate_init(px_gstate_t *, gs_state *);
+
+/* Initialize the graphics state for a page. */
+/* Note that this takes a px_state_t, not a px_gstate_t. */
+int px_initgraphics(px_state_t *);
+
+/* initialize the clipping region */
+int px_initclip(px_state_t *pxs);
+
+/* Reset a px_gstate_t, initially or at the beginning of a page. */
+void px_gstate_reset(px_gstate_t *);
+
+/* Set up the color space information for a bitmap image or pattern. */
+int px_image_color_space(gs_image_t *pim,
+ const px_bitmap_params_t *params,
+ const gs_string *palette,
+ const gs_state *pgs);
+
+/* Set the color in the graphics state to the pen or brush. */
+int px_set_paint(const px_paint_t *ppt, px_state_t *pxs);
+
+/* Set the halftone in the graphics state to the most recently selected one. */
+int px_set_halftone(px_state_t *pxs);
+
+/* Adjust the paint reference counts in the graphics state. */
+/* These are exported by pxgstate.c for pxink.c. */
+void px_paint_rc_adjust(px_paint_t *ppt, int delta, gs_memory_t *mem);
+void px_gstate_rc_adjust(px_gstate_t *pxgs, int delta, gs_memory_t *mem);
+
+#endif /* pxstate_INCLUDED */
diff --git a/pxl/pximage.c b/pxl/pximage.c
new file mode 100644
index 000000000..b854a0b45
--- /dev/null
+++ b/pxl/pximage.c
@@ -0,0 +1,962 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pximage.c */
+/* PCL XL bitmap painting operators */
+
+#include "std.h"
+#include "string_.h"
+#include "pxerrors.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "gdebug.h"
+#include "gsrop.h"
+#include "gsrefct.h"
+#include "gsstruct.h"
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gsimage.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsuid.h" /* for gxpcolor.h */
+#include "gsutil.h"
+#include "gxbitmap.h"
+#include "gxcspace.h"
+#include "gxdevice.h" /* for gxpcolor.h */
+#include "gxcolor2.h"
+#include "gxdcolor.h"
+#include "gxpcolor.h"
+#include "scommon.h"
+#include "strimpl.h"
+#include "srlx.h"
+#include "pldraw.h"
+#include "plsrgb.h"
+#include "jpeglib_.h" /* for jpeg filter */
+#include "sdct.h"
+#include "sjpeg.h"
+
+/* Define the "freeing" procedure for patterns in a dictionary. */
+void
+px_free_pattern(gs_memory_t *mem, void *vptr, client_name_t cname)
+{ px_pattern_t *pattern = vptr;
+ rc_decrement(pattern, cname);
+}
+/* Define the real freeing procedure for patterns. */
+static void
+rc_free_px_pattern(gs_memory_t *mem, void *vptr, client_name_t cname)
+{ px_pattern_t *pattern = vptr;
+
+ gs_free_string(mem, (void *)pattern->palette.data, pattern->palette.size,
+ cname);
+ gs_free_object(mem, pattern->data, cname);
+ gs_free_object(mem, pattern, cname);
+}
+/* Define the purging procedure for the Pattern cache. */
+/* The proc_data points to a pxePatternPersistence_t that specifies */
+/* the maximum persistence level to purge. */
+static bool
+px_pattern_purge_proc(gx_color_tile *ctile, void *proc_data)
+{ return ctile->uid.id % pxePatternPersistence_next <=
+ *(pxePatternPersistence_t *)proc_data;
+}
+void
+px_purge_pattern_cache(px_state_t *pxs, pxePatternPersistence_t max_persist)
+{ gx_pattern_cache_winnow(gstate_pattern_cache(pxs->pgs),
+ px_pattern_purge_proc,
+ (void *)&max_persist);
+}
+
+
+/* pxl delta row decompression state machine states */
+typedef enum {
+ next_is_bytecount,
+ partial_bytecount,
+ next_is_cmd,
+ partial_offset,
+ partial_cnt
+} deltarow_parse_state_t;
+
+/* pxl delta row decompression state storage */
+typedef struct deltarow_state_s {
+ deltarow_parse_state_t state;
+ uint row_byte_count;
+ uint short_cnt;
+ uint short_offset;
+ byte *seedrow;
+ uint rowwritten;
+} deltarow_state_t;
+
+/* Define the structure for enumerating a bitmap being downloaded. */
+typedef struct px_bitmap_enum_s {
+ gs_memory_t *mem; /* used only for the jpeg filter */
+ uint data_per_row; /* ditto minus possible trailing padding */
+ bool initialized;
+ pxeCompressMode_t compress_type;
+ stream_RLD_state rld_stream_state; /* decompressor states */
+ stream_DCT_state dct_stream_state;
+ jpeg_decompress_data jdd;
+ deltarow_state_t deltarow_state;
+} px_bitmap_enum_t;
+
+/* Define our image enumerator. */
+#ifndef px_image_enum_DEFINED
+# define px_image_enum_DEFINED
+typedef struct px_image_enum_s px_image_enum_t;
+#endif
+struct px_image_enum_s {
+ gs_image_t image;
+ byte *row; /* buffer for one row of data */
+ uint raster;
+ void *info; /* state structure for driver */
+ px_bitmap_enum_t benum;
+};
+gs_private_st_suffix_add2(st_px_image_enum, px_image_enum_t, "px_image_enum_t",
+ px_image_enum_enum_ptrs, px_image_enum_reloc_ptrs, st_color_space,
+ image.ColorSpace, row);
+
+/* ---------------- Utilities ---------------- */
+
+/* Extract the parameters for reading a bitmap image or raster pattern. */
+/* Attributes: pxaColorMapping, pxaColorDepth, pxaSourceWidth, */
+/* pxaSourceHeight, pxaDestinationSize. */
+static int
+begin_bitmap(px_bitmap_params_t *params, px_bitmap_enum_t *benum,
+ const px_args_t *par, const px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ int depth = "\001\004\010"[par->pv[1]->value.i];
+ int num_components = (pxgs->color_space == eGray ? 1 : 3);
+
+ params->width = par->pv[2]->value.i;
+ params->height = par->pv[3]->value.i;
+ params->depth = depth;
+ params->color_space = pxgs->color_space;
+ if ( par->pv[0]->value.i == eIndexedPixel )
+ { if ( pxgs->palette.data == 0 )
+ return_error(errorMissingPalette);
+ if ( pxgs->palette.size != (1 << depth) * num_components )
+ return_error( errorImagePaletteMismatch);
+ params->indexed = true;
+ num_components = 1;
+ }
+ else
+ params->indexed = false;
+ params->dest_width = real_value(par->pv[4], 0);
+ params->dest_height = real_value(par->pv[4], 1);
+ benum->data_per_row =
+ round_up(params->width * params->depth * num_components, 8) >> 3;
+ benum->mem = pxs->memory;
+ benum->initialized = false;
+ return 0;
+}
+
+static int
+stream_error(stream_state * st, const char *str)
+{
+ dprintf1("pxl stream error %s\n", str );
+ return 0;
+}
+
+
+static int
+read_jpeg_bitmap_data(px_bitmap_enum_t *benum, byte **pdata, px_args_t *par)
+{
+ uint data_per_row = benum->data_per_row; /* jpeg doesn't pad */
+ uint avail = par->source.available;
+ uint end_pos = data_per_row * par->pv[1]->value.i;
+ uint pos_in_row = par->source.position % data_per_row;
+ const byte *data = par->source.data;
+ stream_DCT_state *ss = (&benum->dct_stream_state);
+ stream_cursor_read r;
+ stream_cursor_write w;
+ uint used;
+
+ /* consumed all of the data */
+ if ( par->source.position >= end_pos ) {
+ /* shutdown jpeg filter if necessary */
+ if (benum->initialized)
+ gs_jpeg_destroy((&benum->dct_stream_state));
+ return 0;
+ }
+
+ if ( !benum->initialized ) {
+ jpeg_decompress_data *jddp = &(benum->jdd);
+ /* use the graphics library support for DCT streams */
+ ss->memory = benum->mem;
+ s_DCTD_template.set_defaults((stream_state *)ss);
+ ss->report_error = stream_error;
+ ss->data.decompress = jddp;
+ /* set now for allocation */
+ jddp->memory = ss->jpeg_memory = benum->mem;
+ /* set this early for safe error exit */
+ jddp->scanline_buffer = NULL;
+ if ( gs_jpeg_create_decompress(ss) < 0 )
+ return_error(errorInsufficientMemory);
+ (*s_DCTD_template.init)((stream_state *)ss);
+ jddp->template = s_DCTD_template;
+ benum->initialized = true;
+ }
+ r.ptr = data - 1;
+ r.limit = r.ptr + avail;
+ if ( pos_in_row < data_per_row ) {
+ /* Read more of the current row. */
+ byte *data = *pdata;
+
+ w.ptr = data + pos_in_row - 1;
+ w.limit = data + data_per_row - 1;
+ (*s_DCTD_template.process)((stream_state *)ss, &r, &w, false);
+ used = w.ptr + 1 - data - pos_in_row;
+ pos_in_row += used;
+ par->source.position += used;
+ }
+ used = r.ptr + 1 - data;
+ par->source.data = r.ptr + 1;
+ par->source.available = avail - used;
+ return (pos_in_row < data_per_row ? pxNeedData : 1);
+}
+
+static int
+read_uncompressed_bitmap_data(px_bitmap_enum_t *benum, byte **pdata, px_args_t *par)
+{
+ int code;
+ uint avail = par->source.available;
+ uint data_per_row = benum->data_per_row;
+ uint pad = 4; /* default padding */
+ const byte *data = par->source.data;
+ uint pos_in_row, data_per_row_padded, used;
+
+ /* overrided default padding */
+ if ( par->pv[3] )
+ pad = par->pv[3]->value.i;
+
+ data_per_row_padded = round_up(data_per_row, pad);
+ pos_in_row = par->source.position % data_per_row_padded;
+
+ /* consumed all of the data */
+ if ( par->source.position >= data_per_row_padded * par->pv[1]->value.i )
+ return 0;
+
+ if ( avail >= data_per_row_padded && pos_in_row == 0 ) {
+ /* Use the data directly from the input buffer. */
+ *pdata = (byte *)data;
+ used = data_per_row_padded;
+ code = 1;
+ } else {
+ used = min(avail, data_per_row_padded - pos_in_row);
+ if ( pos_in_row < data_per_row )
+ memcpy(*pdata + pos_in_row, data,
+ min(used, data_per_row - pos_in_row));
+ code = (pos_in_row + used < data_per_row_padded ?
+ pxNeedData : 1);
+ }
+ par->source.position += used;
+ par->source.data = data + used;
+ par->source.available = avail - used;
+ return code;
+}
+
+static int
+read_rle_bitmap_data(px_bitmap_enum_t *benum, byte **pdata, px_args_t *par)
+{
+ stream_RLD_state *ss = (&benum->rld_stream_state);
+ uint avail = par->source.available;
+ const byte *data = par->source.data;
+ uint pad = 4;
+ stream_cursor_read r;
+ stream_cursor_write w;
+ uint pos_in_row, data_per_row, data_per_row_padded, used;
+
+ /* overrided default padding */
+ if ( par->pv[3] )
+ pad = par->pv[3]->value.i;
+ data_per_row = benum->data_per_row;
+ data_per_row_padded = round_up(benum->data_per_row, pad);
+ pos_in_row = par->source.position % data_per_row_padded;
+
+ /* consumed all of the data */
+ if ( par->source.position >= data_per_row_padded * par->pv[1]->value.i )
+ return 0;
+
+ if ( !benum->initialized ) {
+ ss->EndOfData = false;
+ s_RLD_init_inline(ss);
+ benum->initialized = true;
+ }
+ r.ptr = data - 1;
+ r.limit = r.ptr + avail;
+ if ( pos_in_row < data_per_row ) {
+ /* Read more of the current row. */
+ byte *data = *pdata;
+
+ w.ptr = data + pos_in_row - 1;
+ w.limit = data + data_per_row - 1;
+ (*s_RLD_template.process)((stream_state *)ss, &r, &w, false);
+ used = w.ptr + 1 - data - pos_in_row;
+ pos_in_row += used;
+ par->source.position += used;
+ }
+ if ( pos_in_row >= data_per_row && pos_in_row < data_per_row_padded )
+ { /* We've read all the real data; skip the padding. */
+ byte pad[3]; /* maximum padding per row */
+
+ w.ptr = pad - 1;
+ w.limit = w.ptr + data_per_row_padded - pos_in_row;
+ (*s_RLD_template.process)((stream_state *)ss, &r, &w, false);
+ used = w.ptr + 1 - pad;
+ pos_in_row += used;
+ par->source.position += used;
+ }
+
+ used = r.ptr + 1 - data;
+ par->source.data = r.ptr + 1;
+ par->source.available = avail - used;
+ return (pos_in_row < data_per_row_padded ? pxNeedData : 1);
+}
+
+/** PCL XL delta row decompression
+ *
+ * delta row Algorithm:
+ *
+ * Seed Row is initialized with zeros.
+ *
+ * lsb,msb row byte count
+ * delta row data
+ * repeat for each row
+ *
+ * if row byte count is zero duplicate previous row
+ * if row byte count doesn't fill row duplicate remainder and end the row (undocumented)
+ *
+ * delta row data: command byte, optional extra offset bytes, delta raster snippit
+ * command byte 7-5 delta raster length: 4-0 offset
+ *
+ * offset = bits 4-0;
+ * if offset == 31 then do { add next byte } repeat while next byte was 0xFF
+ * example offset = 31 + 255 + 255 + 255 + 4
+ *
+ * delta length = bits 5-7 + 1; range 1 to 8 bytes.
+ *
+ * output raster is:
+ * last position + offset; "copies" old data
+ * copy delta length bytes from input to output
+ *
+ * Internal Algorithm:
+ *
+ * No row padding is used.
+ * State is need since available data can be short at any time.
+ * read = *pin++; // out of data? save state, return eNeedData
+ *
+ * deltarow.state maintains state between requests for more data
+ * state : description
+ * -> next state
+ * ---------------------------------------
+ * next_is_bytecount : lsb of row bytecount
+ * -> partial_bytecount
+ * partial_bytecount : msb of row bytecount
+ * -> next_is_cmd
+ * next_is_cmd : 1 byte cmd contains cnt and partial offset
+ * -> partial_offset or partial_cnt
+ * partial_offset : accumulates extra offset bytes, moves output by offset
+ * -> partial_offset or partial_cnt
+ * partial_cnt : copies cnt bytes one at a time from input
+ * -> partial_cnt or next_is_cmd or (next_bytecount && end_of_row)
+ *
+ * RETURN values:
+ * 0 == end of image // end of row returns, next call returns end of image.
+ * 1 == end of row
+ * eNeedData == on need more input
+ */
+static int
+read_deltarow_bitmap_data(px_bitmap_enum_t *benum, byte **pdata, px_args_t *par)
+{
+ deltarow_state_t *deltarow = &benum->deltarow_state;
+ uint avail = par->source.available;
+ const byte *pin = par->source.data;
+ byte *pout = *pdata + par->source.position % benum->data_per_row;
+ const byte *pout_start = pout;
+ bool end_of_row = false;
+
+ if ( benum->initialized && deltarow->rowwritten == par->pv[1]->value.i ) {
+ deltarow->rowwritten = 0;
+ return 0;
+ }
+
+ /* initialize at begin of image */
+ if ( !benum->initialized ) {
+ /* zero seed row */
+ deltarow->seedrow = gs_alloc_bytes(benum->mem, benum->data_per_row, "read_deltarow_bitmap_data");
+ memset(deltarow->seedrow, 0, benum->data_per_row);
+ deltarow->row_byte_count = 0;
+ deltarow->short_cnt = 0;
+ deltarow->short_offset = 0;
+ deltarow->state = next_is_bytecount;
+ deltarow->rowwritten = 0;
+ benum->initialized = true;
+ }
+
+ if (deltarow->row_byte_count == 0) {
+ memcpy(*pdata, deltarow->seedrow, benum->data_per_row);
+ }
+
+ /* one byte at a time until end of input or end of row */
+ while (avail && !end_of_row) {
+ switch ( deltarow->state ) {
+
+ case next_is_bytecount:{
+ deltarow->short_cnt = *pin++;
+ --avail;
+ deltarow->state = partial_bytecount;
+ break;
+ }
+
+ case partial_bytecount: {
+ deltarow->row_byte_count = deltarow->short_cnt + ((*pin++) << 8 );
+ --avail;
+
+ if ( deltarow->row_byte_count == 0 ) {
+ /* duplicate the row */
+ deltarow->state = next_is_bytecount;
+ end_of_row = true;
+ }
+ else
+ deltarow->state = next_is_cmd;
+ break;
+ }
+
+ case next_is_cmd: {
+ uint val = *pin++;
+
+ --avail;
+ deltarow->row_byte_count--;
+ deltarow->short_cnt = (val >> 5) + 1; /* 1 to 8 new bytes to copy */
+ deltarow->short_offset = val & 0x1f; /* num to retain from last row, skip */
+ if (deltarow->short_offset == 0x1f)
+ deltarow->state = partial_offset; /* accumulate more offset */
+ else {
+ pout += deltarow->short_offset; /* skip keeps old data in row */
+ deltarow->state = partial_cnt; /* done with offset do count */
+ }
+ break;
+ }
+
+ case partial_offset: {
+ uint offset = *pin++;
+ avail--;
+ deltarow->row_byte_count--;
+
+ deltarow->short_offset += offset;
+
+ if (offset == 0xff)
+ deltarow->state = partial_offset; /* 0x1f + ff ff ff ff ff + 1 */
+ else {
+ pout += deltarow->short_offset; /* skip keeps old data in row */
+ deltarow->state = partial_cnt; /* done with offset do count */
+ }
+ break;
+ }
+
+ case partial_cnt: {
+ *pout++ = *pin++; /* copy new data into row */
+ avail--;
+ deltarow->row_byte_count--;
+ deltarow->short_cnt--;
+
+ if (deltarow->row_byte_count == 0) {
+ end_of_row = true;
+ deltarow->state = next_is_bytecount;
+ }
+ else if (deltarow->short_cnt == 0)
+ deltarow->state = next_is_cmd;
+ /* else more bytes to copy */
+ break;
+ }
+
+ } /* end switch */
+ } /* end of while */
+
+
+ par->source.available -= pin - par->source.data; /* subract comressed data used */
+ par->source.data = pin; /* new compressed data position */
+
+ if (end_of_row) {
+ /* uncompressed raster position */
+ par->source.position =
+ (par->source.position / benum->data_per_row + 1) * benum->data_per_row;
+ deltarow->rowwritten++;
+ memcpy(deltarow->seedrow, *pdata, benum->data_per_row);
+ return 1;
+ }
+ par->source.position += pout - pout_start; /* amount of raster written */
+ return pxNeedData; /* not end of row so request more data */
+}
+
+/*
+ * Read a (possibly partial) row of bitmap data. This is most of the
+ * implementation of ReadImage and ReadRastPattern. We use source.position
+ * to track the uncompressed input byte position within the current block.
+ * Return 0 if we've processed all the data in the block, 1 if we have a
+ * complete scan line, pxNeedData for an incomplete scan line, or <0 for
+ * an error condition. *pdata must point to a scan line buffer; this
+ * routine may reset it to point into the input buffer (if a complete
+ * scan line is available).
+ * Attributes: pxaStartLine (ignored), pxaBlockHeight, pxaCompressMode.
+ */
+static int
+read_bitmap(px_bitmap_enum_t *benum, byte **pdata, px_args_t *par)
+{
+ benum->compress_type = par->pv[2]->value.i;
+ switch( benum->compress_type ) {
+ case eRLECompression:
+ return read_rle_bitmap_data(benum, pdata, par);
+ case eJPEGCompression:
+ return read_jpeg_bitmap_data(benum, pdata, par);
+ case eDeltaRowCompression:
+ return read_deltarow_bitmap_data(benum, pdata, par);
+ case eNoCompression:
+ return read_uncompressed_bitmap_data(benum, pdata, par);
+ default:
+ break;
+ }
+ return -1;
+}
+
+
+/* ---------------- Image operators ---------------- */
+
+const byte apxBeginImage[] = {
+ pxaColorMapping, pxaColorDepth, pxaSourceWidth, pxaSourceHeight,
+ pxaDestinationSize, 0, 0
+};
+int
+pxBeginImage(px_args_t *par, px_state_t *pxs)
+{ gs_point origin;
+ px_bitmap_params_t params;
+ px_bitmap_enum_t benum;
+ gs_state *pgs = pxs->pgs;
+ px_gstate_t *pxgs = pxs->pxgs;
+ px_image_enum_t *pxenum;
+ int code;
+
+ if ( gs_currentpoint(pgs, &origin) < 0 )
+ return_error(errorCurrentCursorUndefined);
+ /*
+ * If the current logical operation doesn't involve the texture,
+ * don't set a null brush, which would cause the image not to
+ * appear.
+ */
+ if ( pxs->pxgs->brush.type == pxpNull &&
+ !rop3_uses_T(gs_currentrasterop(pgs))
+ ) {
+ if ( pxs->useciecolor )
+ code = pl_setSRGBcolor(pgs, 0.0, 0.0, 0.0);
+ else
+ code = gs_setgray(pgs, 0.0);
+ }
+ else
+ code = px_set_paint(&pxgs->brush, pxs);
+ if ( code < 0 )
+ return code;
+ /*
+ * Make sure the proper halftone is current.
+ */
+ code = px_set_halftone(pxs);
+ if ( code < 0 )
+ return code;
+ code = begin_bitmap(&params, &benum, par, pxs);
+ if ( code < 0 )
+ return code;
+ pxenum =
+ gs_alloc_struct(pxs->memory, px_image_enum_t,
+ &st_px_image_enum, "setup_bitmap(pxenum)");
+
+ if ( pxenum == 0 )
+ return_error(errorInsufficientMemory);
+ {
+ pxenum->raster = round_up(benum.data_per_row, align_bitmap_mod);
+ pxenum->row = gs_alloc_byte_array(pxs->memory, 1, pxenum->raster,
+ "pxReadImage(row)");
+ if ( pxenum->row == 0 )
+ code = gs_note_error(errorInsufficientMemory);
+ else
+ code = px_image_color_space(&pxenum->image, &params, (const gs_string *)&pxgs->palette, pgs);
+ }
+ if ( code < 0 )
+ { gs_free_object(pxs->memory, pxenum->row, "pxReadImage(row)");
+ gs_free_object(pxs->memory, pxenum, "pxReadImage(pxenum)");
+ return code;
+ }
+ /* Set up the image parameters. */
+ pxenum->image.Width = params.width;
+ pxenum->image.Height = params.height;
+ { gs_matrix imat, dmat;
+ /* We need the cast because height is unsigned. */
+ /* We also need to account for the upside-down H-P */
+ /* coordinate system. */
+ gs_make_scaling(params.width, params.height, &imat);
+ gs_make_translation(origin.x, origin.y, &dmat);
+ gs_matrix_scale(&dmat, params.dest_width, params.dest_height,
+ &dmat);
+ /* The ImageMatrix is dmat' * imat. */
+ gs_matrix_invert(&dmat, &dmat);
+ gs_matrix_multiply(&dmat, &imat, &pxenum->image.ImageMatrix);
+ }
+ pxenum->image.CombineWithColor = true;
+ code = pl_begin_image(pgs, &pxenum->image, &pxenum->info);
+ if ( code < 0 )
+ { gs_free_object(pxs->memory, pxenum->row, "pxReadImage(row)");
+ gs_free_object(pxs->memory, pxenum, "pxBeginImage(pxenum)");
+ return code;
+ }
+ pxenum->benum = benum;
+ pxs->image_enum = pxenum;
+ return 0;
+}
+
+const byte apxReadImage[] = {
+ pxaStartLine, pxaBlockHeight, pxaCompressMode, 0, pxaPadBytesMultiple, pxaBlockByteLength, 0
+};
+
+int
+pxReadImage(px_args_t *par, px_state_t *pxs)
+{
+ px_image_enum_t *pxenum = pxs->image_enum;
+ gx_device *dev = gs_currentdevice(pxs->pgs);
+
+ if ( par->pv[1]->value.i == 0 )
+ return 0; /* no data */
+ /* Make a quick check for the first call, when no data is available. */
+ if ( par->source.available == 0 )
+ return pxNeedData;
+ for ( ; ; ) {
+ byte *data = pxenum->row;
+ int code = read_bitmap(&pxenum->benum, &data, par);
+ if ( code != 1 )
+ return code;
+ code = (*dev_proc(dev, image_data))
+ (dev, pxenum->info, (const byte **)&data,
+ 0, pxenum->benum.data_per_row, 1);
+ if ( code < 0 )
+ return code;
+ pxs->have_page = true;
+ }
+}
+
+const byte apxEndImage[] = {0, 0};
+int
+pxEndImage(px_args_t *par, px_state_t *pxs)
+{
+ gx_device *dev = gs_currentdevice(pxs->pgs);
+ px_image_enum_t *pxenum = pxs->image_enum;
+ px_bitmap_enum_t *pbenum = &pxenum->benum;
+ (*dev_proc(dev, end_image))(dev, pxenum->info, true);
+ gs_free_object(pxs->memory, pxenum->row, "pxEndImage(row)");
+ if ( pbenum->compress_type == eDeltaRowCompression )
+ gs_free_object(pbenum->mem, pbenum->deltarow_state.seedrow, "pxEndImage(seedrow)");
+ if ( pxenum->image.ColorSpace )
+ rc_decrement(pxenum->image.ColorSpace, "pxEndImage(image.ColorSpace)");
+ gs_free_object(pxs->memory, pxenum, "pxEndImage(pxenum)");
+ pxs->image_enum = 0;
+ return 0;
+}
+
+/* ---------------- Raster pattern operators ---------------- */
+
+/* Define the enumerator for downloading raster patterns. */
+#ifndef px_pattern_enum_DEFINED
+# define px_pattern_enum_DEFINED
+typedef struct px_pattern_enum_s px_pattern_enum_t;
+#endif
+struct px_pattern_enum_s {
+ px_bitmap_enum_t benum;
+ int32_t pattern_id;
+ pxePatternPersistence_t persistence;
+ px_pattern_t *pattern;
+};
+gs_private_st_ptrs1(st_px_pattern_enum, px_pattern_enum_t,
+ "px_pattern_enum_t", pattern_enum_enum_ptrs, pattern_enum_reloc_ptrs,
+ pattern);
+
+const byte apxBeginRastPattern[] = {
+ pxaColorMapping, pxaColorDepth, pxaSourceWidth, pxaSourceHeight,
+ pxaDestinationSize, pxaPatternDefineID, pxaPatternPersistence, 0, 0
+};
+int
+pxBeginRastPattern(px_args_t *par, px_state_t *pxs)
+{ gs_memory_t *mem = pxs->memory;
+ px_bitmap_params_t params;
+ px_pattern_t *pattern;
+ px_pattern_enum_t *pxenum;
+ px_bitmap_enum_t benum;
+ byte *data;
+ uint psize;
+ byte *pdata;
+ int code = begin_bitmap(&params, &benum, par, pxs);
+ static const gs_memory_struct_type_t st_px_pattern =
+ {sizeof(px_pattern_t), "", 0, 0, 0, 0, 0};
+
+ if ( code < 0 )
+ return code;
+ rc_alloc_struct_1(pattern, px_pattern_t, &st_px_pattern, mem,
+ return_error(errorInsufficientMemory),
+ "raster pattern");
+ pattern->rc.free = rc_free_px_pattern;
+ data = gs_alloc_byte_array(mem, params.height, benum.data_per_row,
+ "raster pattern data");
+ if ( params.indexed )
+ { psize = pxs->pxgs->palette.size;
+ pdata = gs_alloc_string(mem, psize, "raster pattern palette");
+ if ( pdata != 0 )
+ memcpy(pdata, pxs->pxgs->palette.data, psize);
+ }
+ else
+ { psize = 0;
+ pdata = 0;
+ }
+ pxenum = gs_alloc_struct(mem, px_pattern_enum_t, &st_px_pattern_enum,
+ "raster pattern enum");
+ if ( data == 0 || (params.indexed && pdata == 0) || pxenum == 0 )
+ { gs_free_object(mem, pxenum, "raster pattern enum");
+ gs_free_string(mem, pdata, psize, "raster pattern palette");
+ gs_free_object(mem, data, "raster pattern data");
+ gs_free_object(mem, pattern, "raster pattern");
+ return_error(errorInsufficientMemory);
+ }
+ pxenum->benum = benum;
+ pxenum->pattern_id = par->pv[5]->value.i;
+ pxenum->persistence = par->pv[6]->value.i;
+ pattern->params = params;
+ pattern->palette.data = pdata;
+ pattern->palette.size = psize;
+ pattern->data = data;
+ pattern->id = gs_next_ids(mem, 1);
+ pxenum->pattern = pattern;
+ pxs->pattern_enum = pxenum;
+ return 0;
+}
+
+const byte apxReadRastPattern[] = {
+ pxaStartLine, pxaBlockHeight, pxaCompressMode, 0, pxaPadBytesMultiple, pxaBlockByteLength, 0
+};
+
+int
+pxReadRastPattern(px_args_t *par, px_state_t *pxs)
+{ px_pattern_enum_t *pxenum = pxs->pattern_enum;
+ int code;
+ uint input_per_row = round_up(pxenum->benum.data_per_row, 4);
+ if ( par->pv[3] )
+ input_per_row = round_up(pxenum->benum.data_per_row, par->pv[3]->value.i);
+ /* Make a quick check for the first call, when no data is available. */
+ if ( par->source.available == 0 && par->pv[1]->value.i != 0 )
+ return pxNeedData;
+ /* emulate hp bug */
+ if ( par->pv[2]->value.i == eDeltaRowCompression )
+ input_per_row = pxenum->benum.data_per_row;
+
+ for ( ; ; )
+ {
+ byte *data = pxenum->pattern->data +
+ (par->pv[0]->value.i +
+ par->source.position / input_per_row)
+ * pxenum->benum.data_per_row;
+ byte *rdata = data;
+
+ code = read_bitmap(&pxenum->benum, &rdata, par);
+ if ( code != 1 )
+ break;
+ if ( rdata != data )
+ memcpy(data, rdata, pxenum->benum.data_per_row);
+ }
+ return code;
+}
+
+const byte apxEndRastPattern[] = {0, 0};
+int
+pxEndRastPattern(px_args_t *par, px_state_t *pxs)
+{ px_pattern_enum_t *pxenum = pxs->pattern_enum;
+ /* We extract the key and value from the pattern_enum structure */
+ /* and then free the structure, to encourage LIFO allocation. */
+ px_pattern_t *pattern = pxenum->pattern;
+ int32_t id = pxenum->pattern_id;
+ px_value_t key;
+ px_dict_t *pdict;
+
+ switch ( pxenum->persistence )
+ {
+ case eTempPattern:
+ pdict = &pxs->pxgs->temp_pattern_dict;
+ break;
+ case ePagePattern:
+ pdict = &pxs->page_pattern_dict;
+ break;
+ case eSessionPattern:
+ pdict = &pxs->session_pattern_dict;
+ break;
+ default: /* can't happen */
+ return_error(errorIllegalAttributeValue);
+ }
+ key.type = pxd_array | pxd_ubyte;
+ key.value.array.data = (byte *)&id;
+ key.value.array.size = sizeof(id);
+ gs_free_object(pxs->memory, pxenum, "pxEndRastPattern(pxenum)");
+ return px_dict_put(pdict, &key, pattern);
+}
+
+/* ---------------- Scan line operators ---------------- */
+
+const byte apxBeginScan[] = {0, 0};
+int
+pxBeginScan(px_args_t *par, px_state_t *pxs)
+{ int code = px_set_paint(&pxs->pxgs->brush, pxs);
+
+ if ( code < 0 )
+ return code;
+ /* We may as well reset the path now instead of at the end. */
+ return gs_newpath(pxs->pgs);
+}
+
+const byte apxEndScan[] = {0, 0};
+int
+pxEndScan(px_args_t *par, px_state_t *pxs)
+{ return 0;
+}
+
+const byte apxScanLineRel[] = {
+ 0, pxaNumberOfScanLines, 0
+};
+int
+pxScanLineRel(px_args_t *par, px_state_t *pxs)
+{ /*
+ * In order to keep the number of intermediate states down to a
+ * reasonable number, we require enough data to be present to be
+ * able to read the control information for each line, or an entire
+ * x-pair. Initially, source.position is zero. As soon as we have
+ * read the X/YStart type byte, we change it to:
+ * (X/YStart type) << 28 + (x-pair type << 24) +
+ * (# of full or partial scan lines left to process) + 1
+ * We use the separate variable source.count to keep track of
+ * the number of x-pairs left in the scan line.
+ */
+ gs_state *pgs = pxs->pgs;
+ bool big_endian = pxs->data_source_big_endian;
+ const byte *data = par->source.data;
+ pxeDataType_t
+ xystart_type = (par->source.position >> 28) & 0xf,
+ xpair_type = (par->source.position >> 24) & 0xf;
+ int code = 0;
+ int rcount;
+ gs_rect rlist[20]; /* 20 is arbitrary */
+
+ /* Check for initial state. */
+ if ( par->source.position == 0 )
+ { /* Read XStart/YStart data type. */
+ if ( par->source.available < 1 )
+ return pxNeedData;
+ xystart_type = data[0];
+ if ( xystart_type != eSInt16 )
+ return_error(errorIllegalDataValue);
+ par->source.position =
+ ((ulong)xystart_type << 28) +
+ (par->pv[0] ? par->pv[0]->value.i : 1) + 1;
+ par->source.data = data += 1;
+ par->source.available -= 1;
+ par->source.count = 0;
+ }
+ for ( rcount = 0; ; )
+ {
+
+ /* Check for start of scan line. */
+ if ( par->source.count == 0 )
+ { int ystart;
+
+ if ( (par->source.position & 0xffffff) == 1 )
+ { code = 0;
+ break;
+ }
+ /* Read XStart and YStart values. */
+ /* We know that eSInt16 is the only possible data type. */
+ if ( par->source.available < 7 )
+ { code = pxNeedData;
+ break;
+ }
+ pxs->scan_point.x = sint16at(data, big_endian);
+ ystart = sint16at(data + 2, big_endian);
+ pxs->scan_point.y0 = ystart - 0.5;
+ pxs->scan_point.y1 = ystart + 0.5;
+ par->source.count = uint16at(data + 4, big_endian);
+ if ( par->source.count == 0 )
+ { code = gs_note_error(errorIllegalDataValue);
+ break;
+ }
+ xpair_type = data[6];
+ par->source.position =
+ (par->source.position & 0xf0ffffff) +
+ ((ulong)xpair_type << 24);
+ par->source.data = data += 7;
+ par->source.available -= 7;
+ }
+ /* Read and process one x-pair. */
+ { uint x0, x1;
+ uint used;
+
+ switch ( xpair_type )
+ {
+ case eUByte:
+ if ( par->source.available < 2 )
+ { code = pxNeedData;
+ goto out; /* 2-level break */
+ }
+ x0 = data[0];
+ x1 = data[1];
+ used = 2;
+ break;
+ case eUInt16:
+ if ( par->source.available < 4 )
+ { code = pxNeedData;
+ goto out; /* 2-level break */
+ }
+ x0 = uint16at(data, big_endian);
+ x1 = uint16at(data + 2, big_endian);
+ used = 4;
+ break;
+ default:
+ code = gs_note_error(errorIllegalDataValue);
+ goto out; /* 2-level break; */
+ }
+ if ( rcount == countof(rlist) )
+ { code = gs_rectfill(pgs, rlist, rcount);
+ rcount = 0;
+ pxs->have_page = true;
+ if ( code < 0 )
+ break;
+ }
+ { gs_rect *pr = &rlist[rcount++];
+
+ pr->p.x = pxs->scan_point.x += x0;
+ pr->p.y = pxs->scan_point.y0;
+ pr->q.x = pxs->scan_point.x += x1;
+ pr->q.y = pxs->scan_point.y1;
+ }
+ par->source.data = data += used;
+ par->source.available -= used;
+ }
+ if ( !--(par->source.count) )
+ --(par->source.position);
+ }
+out:
+ if ( rcount > 0 && code >= 0 )
+ { int rcode = gs_rectfill(pgs, rlist, rcount);
+ pxs->have_page = true;
+ if ( rcode < 0 )
+ code = rcode;
+ }
+ return code;
+}
diff --git a/pxl/pximpl.c b/pxl/pximpl.c
new file mode 100644
index 000000000..8bcddb065
--- /dev/null
+++ b/pxl/pximpl.c
@@ -0,0 +1,30 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pximpl.c */
+/* pl_interp_implementation descriptor for PCL XL */
+
+#include "memory_.h"
+#include "scommon.h"
+#include "gxdevice.h"
+#include "pltop.h"
+
+extern const pl_interp_implementation_t pxl_implementation;
+
+/* Zero-terminated list of pointers to implementations */
+pl_interp_implementation_t const * const pdl_implementation[] = {
+ &pxl_implementation,
+ 0
+};
+
+
diff --git a/pxl/pxink.c b/pxl/pxink.c
new file mode 100644
index 000000000..1d23beecb
--- /dev/null
+++ b/pxl/pxink.c
@@ -0,0 +1,854 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxink.c */
+/* PCL XL ink setting operators */
+
+#include "math_.h"
+#include "stdio_.h" /* for NULL */
+#include "memory_.h"
+#include "gdebug.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "gxarith.h"
+#include "gsstate.h"
+#include "gxcspace.h" /* must precede gscolor2.h */
+#include "gscolor2.h"
+#include "gscoord.h"
+#include "gsimage.h"
+#include "gscie.h"
+#include "gscrd.h"
+#include "gspath.h"
+#include "gxdevice.h"
+#include "gxht.h"
+#include "gxstate.h"
+#include "plsrgb.h"
+#include "plht.h"
+
+/*
+ * Contrary to the documentation, SetColorSpace apparently doesn't set the
+ * brush or pen to black. To produce this behavior, uncomment the
+ * following #define.
+ */
+#define SET_COLOR_SPACE_NO_SET_BLACK
+
+/* ---------------- Utilities ---------------- */
+
+/* ------ Halftones ------ */
+
+/* Define a transfer function without gamma correction. */
+static float
+identity_transfer(floatp tint, const gx_transfer_map *ignore_map)
+{ return tint;
+}
+
+/* Set the default halftone screen. */
+static const byte order16x16[256] = {
+#if 0
+ /*
+ * The following is a standard 16x16 ordered dither, except that
+ * the very last pass goes in the order (0,1,2,3) rather than
+ * (0,3,1,2). This leads to excessive cancellation when the source
+ * and paint halftones interact, but it's better than the standard
+ * order, which has inadequate cancellation.
+ *
+ * This matrix is generated by the following call:
+ * [ <00 88 08 80> <00 44 04 40> <00 22 02 20> <00 01 10 11> ]
+ * { } makedither
+ */
+ 0,64,32,96,8,72,40,104,2,66,34,98,10,74,42,106,
+ 128,192,160,224,136,200,168,232,130,194,162,226,138,202,170,234,
+ 48,112,16,80,56,120,24,88,50,114,18,82,58,122,26,90,
+ 176,240,144,208,184,248,152,216,178,242,146,210,186,250,154,218,
+ 12,76,44,108,4,68,36,100,14,78,46,110,6,70,38,102,
+ 140,204,172,236,132,196,164,228,142,206,174,238,134,198,166,230,
+ 60,124,28,92,52,116,20,84,62,126,30,94,54,118,22,86,
+ 188,252,156,220,180,244,148,212,190,254,158,222,182,246,150,214,
+ 3,67,35,99,11,75,43,107,1,65,33,97,9,73,41,105,
+ 131,195,163,227,139,203,171,235,129,193,161,225,137,201,169,233,
+ 51,115,19,83,59,123,27,91,49,113,17,81,57,121,25,89,
+ 179,243,147,211,187,251,155,219,177,241,145,209,185,249,153,217,
+ 15,79,47,111,7,71,39,103,13,77,45,109,5,69,37,101,
+ 143,207,175,239,135,199,167,231,141,205,173,237,133,197,165,229,
+ 63,127,31,95,55,119,23,87,61,125,29,93,53,117,21,85,
+ 191,255,159,223,183,247,151,215,189,253,157,221,181,245,149,213
+# define source_phase_x 1
+# define source_phase_y 1
+#else
+/*
+ * The following is a 45 degree spot screen with the spots enumerated
+ * in a defined order. This matrix is generated by the following call:
+
+/gamma_transfer {
+ dup dup 0 le exch 1 ge or not {
+ dup 0.17 lt
+ { 3 mul }
+ { dup 0.35 lt { 0.78 mul 0.38 add } { 0.53 mul 0.47 add } ifelse }
+ ifelse
+ } if
+} def
+
+[ [0 136 8 128 68 204 76 196]
+ [18 33 17 34 1 2 19 35 50 49 32 16 3 48 0 51
+ -15 -14 20 36 66 65 47 31 -13 64 15 52 -30 81 30 37]
+] /gamma_transfer load makedither
+
+ */
+ 38,11,14,32,165,105,90,171,38,12,14,33,161,101,88,167,
+ 30,6,0,16,61,225,231,125,30,6,1,17,63,222,227,122,
+ 27,3,8,19,71,242,205,110,28,4,9,20,74,246,208,106,
+ 35,24,22,40,182,46,56,144,36,25,22,41,186,48,58,148,
+ 152,91,81,174,39,12,15,34,156,95,84,178,40,13,16,34,
+ 69,212,235,129,31,7,2,18,66,216,239,133,32,8,2,18,
+ 79,254,203,114,28,4,10,20,76,250,199,118,29,5,10,21,
+ 193,44,54,142,36,26,23,42,189,43,52,139,37,26,24,42,
+ 39,12,15,33,159,99,87,169,38,11,14,33,163,103,89,172,
+ 31,7,1,17,65,220,229,123,30,6,1,17,62,223,233,127,
+ 28,4,9,20,75,248,210,108,27,3,9,19,72,244,206,112,
+ 36,25,23,41,188,49,60,150,35,25,22,41,184,47,57,146,
+ 157,97,85,180,40,13,16,35,154,93,83,176,39,13,15,34,
+ 67,218,240,135,32,8,3,19,70,214,237,131,31,7,2,18,
+ 78,252,197,120,29,5,11,21,80,255,201,116,29,5,10,21,
+ 191,43,51,137,37,27,24,43,195,44,53,140,37,26,23,42
+# define source_phase_x 4
+# define source_phase_y 0
+#endif
+};
+
+/* Set the size for a default halftone screen. */
+static void
+px_set_default_screen_size(px_state_t *pxs, int method)
+{ px_gstate_t *pxgs = pxs->pxgs;
+
+ pxgs->halftone.width = pxgs->halftone.height = 16;
+}
+
+/* If necessary, set the halftone in the graphics state. */
+int
+px_set_halftone(px_state_t *pxs)
+{
+ px_gstate_t *pxgs = pxs->pxgs;
+ int code;
+
+ if ( pxgs->halftone.set )
+ return 0;
+ if ( pxgs->halftone.method != eDownloaded ) {
+ gs_string thresh;
+ thresh.data = (byte *)order16x16;
+ thresh.size = 256;
+ code = pl_set_pcl_halftone(pxs->pgs,
+ /* set transfer */ identity_transfer,
+ /* width */ 16, /*height */ 16,
+ /* dither data */ thresh,
+ /* x phase */ (int)pxgs->halftone.origin.x,
+ /* y phase */ (int)pxgs->halftone.origin.y);
+ } else { /* downloaded */
+ int ht_width, ht_height;
+ switch ( pxs->orientation ) {
+ case ePortraitOrientation:
+ case eReversePortrait:
+ ht_width = pxgs->halftone.width;
+ ht_height = pxgs->halftone.height;
+ break;
+ case eLandscapeOrientation:
+ case eReverseLandscape:
+ ht_width = pxgs->halftone.height;
+ ht_height = pxgs->halftone.width;
+ break;
+ default:
+ return -1;
+ }
+
+ code = pl_set_pcl_halftone(pxs->pgs,
+ /* set transfer */ identity_transfer,
+ /* width */ ht_width, /*height */ ht_height,
+ /* dither data */ pxgs->halftone.thresholds,
+ /* x phase */ (int)pxgs->halftone.origin.x,
+ /* y phase */ (int)pxgs->halftone.origin.y);
+ if ( code < 0 )
+ gs_free_string(pxs->memory, pxgs->halftone.thresholds.data,
+ pxgs->halftone.thresholds.size,
+ "px_set_halftone(thresholds)");
+ else {
+ gs_free_string(pxs->memory, (byte *)pxgs->dither_matrix.data,
+ pxgs->dither_matrix.size,
+ "px_set_halftone(dither_matrix)");
+ pxgs->dither_matrix = pxgs->halftone.thresholds;
+ }
+ pxgs->halftone.thresholds.data = 0;
+ pxgs->halftone.thresholds.size = 0;
+ }
+ if ( code < 0 )
+ return code;
+ pxgs->halftone.set = true;
+ /* Cached patterns have already been halftoned, so clear the cache. */
+ px_purge_pattern_cache(pxs, eSessionPattern);
+ return 0;
+}
+
+/* ------ Patterns ------ */
+
+/*
+ * The library caches patterns in their fully rendered form, i.e., after
+ * halftoning. In order to avoid seams or anomalies, we have to replicate
+ * the pattern so that its size is an exact multiple of the halftone size.
+ */
+
+static uint
+ilcm(uint x, uint y)
+{ return x * (y / igcd(x, y));
+}
+
+/* Render a pattern. */
+static int
+px_paint_pattern(const gs_client_color *pcc, gs_state *pgs)
+{ const gs_client_pattern *ppat = gs_getpattern(pcc);
+ const px_pattern_t *pattern = ppat->client_data;
+ const byte *dp = pattern->data;
+ gs_image_enum *penum;
+ gs_image_t image;
+ int code;
+ int num_components =
+ (pattern->params.indexed || pattern->params.color_space == eGray ?
+ 1 : 3);
+ uint rep_width = pattern->params.width;
+ uint rep_height = pattern->params.height;
+ uint full_width = (uint)ppat->XStep;
+ uint full_height = (uint)ppat->YStep;
+ uint bits_per_row, bytes_per_row;
+ int x;
+
+ code = px_image_color_space(&image, &pattern->params, &pattern->palette, pgs);
+ if ( code < 0 )
+ return code;
+ penum = gs_image_enum_alloc(gs_state_memory(pgs), "px_paint_pattern");
+ if ( penum == 0 )
+ return_error(errorInsufficientMemory);
+ bits_per_row = rep_width * image.BitsPerComponent * num_components;
+ bytes_per_row = (bits_per_row + 7) >> 3;
+ /*
+ * As noted above, in general, we have to replicate the original
+ * pattern to a multiple that avoids halftone seams. If the
+ * number of bits per row is a multiple of 8, we can do this with
+ * a single image; otherwise, we need one image per X replica.
+ * To simplify the code, we always use the (slightly) slower method.
+ */
+ image.Width = rep_width;
+ image.Height = full_height;
+ image.CombineWithColor = true;
+ for ( x = 0; x < full_width; x += rep_width )
+ { int y;
+
+ image.ImageMatrix.tx = -x;
+ code = gs_image_init(penum, &image, false, pgs);
+ if ( code < 0 )
+ break;
+ for ( y = 0; code >= 0 && y < full_height; ++y )
+ { const byte *row = dp + (y % rep_height) * bytes_per_row;
+ uint used;
+
+ code = gs_image_next(penum, row, bytes_per_row, &used);
+ }
+ gs_image_cleanup(penum, pgs);
+ }
+ gs_free_object(gs_state_memory(pgs), penum, "px_paint_pattern");
+ return code;
+}
+
+/* Create the rendering of a pattern. */
+static int
+render_pattern(gs_client_color *pcc, const px_pattern_t *pattern,
+ const px_value_t *porigin, const px_value_t *pdsize, px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ uint rep_width = pattern->params.width;
+ uint rep_height = pattern->params.height;
+ uint full_width, full_height;
+ gs_state *pgs = pxs->pgs;
+ gs_client_pattern template;
+
+ /*
+ * If halftoning may occur, replicate the pattern so we don't get
+ * halftone seams.
+ */
+ { gx_device *dev = gs_currentdevice(pgs);
+ if (!gx_device_must_halftone(dev))
+ { /* No halftoning. */
+ full_width = rep_width;
+ full_height = rep_height;
+ }
+ else
+ { full_width = ilcm(rep_width, pxgs->halftone.width);
+ full_height = ilcm(rep_height, pxgs->halftone.height);
+ /*
+ * If the pattern would be enormous, don't replicate it.
+ * This is a HACK.
+ */
+ if ( full_width > 10000 )
+ full_width = rep_width;
+ if ( full_height > 10000 )
+ full_height = rep_height;
+ }
+ }
+ /* Construct a Pattern for the library, and render it. */
+ gs_pattern1_init(&template);
+ uid_set_UniqueID(&template.uid, pattern->id);
+ template.PaintType = 1;
+ template.TilingType = 1;
+ template.BBox.p.x = 0;
+ template.BBox.p.y = 0;
+ template.BBox.q.x = full_width;
+ template.BBox.q.y = full_height;
+ template.XStep = full_width;
+ template.YStep = full_height;
+ template.PaintProc = px_paint_pattern;
+ template.client_data = (void *)pattern;
+ { gs_matrix mat;
+ gs_point dsize;
+ int code;
+
+ if ( porigin )
+ gs_make_translation(real_value(porigin, 0),
+ real_value(porigin, 1), &mat);
+ else
+ gs_make_identity(&mat);
+
+ if ( pdsize )
+ { dsize.x = real_value(pdsize, 0);
+ dsize.y = real_value(pdsize, 1);
+ }
+ else
+ { dsize.x = pattern->params.dest_width;
+ dsize.y = pattern->params.dest_height;
+ }
+ gs_matrix_scale(&mat, dsize.x / rep_width, dsize.y / rep_height,
+ &mat);
+ /*
+ * gs_makepattern will make a copy of the current gstate.
+ * We don't want this copy to contain any circular back pointers
+ * to px_pattern_ts: such pointers are unnecessary, because
+ * px_paint_pattern doesn't use the pen and brush (in fact,
+ * it doesn't even reference the px_gstate_t). We also want to
+ * reset the path and clip path. The easiest (although not by
+ * any means the most efficient) way to do this is to do a gsave,
+ * reset the necessary things, do the makepattern, and then do
+ * a grestore.
+ */
+ code = gs_gsave(pgs);
+ if ( code < 0 )
+ return code;
+ { px_gstate_t *pxgs = pxs->pxgs;
+
+ px_gstate_rc_adjust(pxgs, -1, pxgs->memory);
+ pxgs->brush.type = pxgs->pen.type = pxpNull;
+ gs_newpath(pgs);
+ px_initclip(pxs);
+ }
+ {
+ gs_color_space *pcs;
+ /* set the color space */
+ switch ( pxgs->color_space ) {
+ case eGray:
+ pcs = gs_cspace_new_DeviceGray(pxgs->memory);
+ if ( pcs == NULL )
+ return_error(errorInsufficientMemory);
+ gs_setcolorspace(pgs, pcs);
+ break;
+ case eRGB:
+ pcs = gs_cspace_new_DeviceRGB(pxgs->memory);
+ if ( pcs == NULL )
+ return_error(errorInsufficientMemory);
+ break;
+ case eSRGB:
+ case eCRGB:
+ if ( pl_cspace_init_SRGB(&pcs, pgs) < 0 )
+ /* should not happen */
+ return_error(errorInsufficientMemory);
+ break;
+ default:
+ return_error(errorIllegalAttributeValue);
+ }
+ gs_setcolorspace(pgs, pcs);
+ }
+ code = gs_makepattern(pcc, &template, &mat, pgs, NULL);
+ gs_grestore(pgs);
+ return code;
+ }
+}
+
+/* ------ Brush/pen ------ */
+
+/* Check parameters and execute SetBrushSource or SetPenSource: */
+/* pxaRGBColor, pxaGrayLevel, pxaNullBrush/Pen, pxaPatternSelectID, */
+/* pxaPatternOrigin, pxaNewDestinationSize */
+static ulong
+int_type_max(px_data_type_t type)
+{ return
+ (type & pxd_ubyte ? 255 :
+ type & pxd_uint16 ? 65535 :
+ type & pxd_sint16 ? 32767 :
+ type & pxd_uint32 ? (ulong)0xffffffff :
+ /* type & pxd_sint32 */ 0x7fffffff);
+}
+static real
+fraction_value(const px_value_t *pv, int i)
+{ px_data_type_t type = pv->type;
+ real v;
+
+ if ( type & pxd_real32 )
+ return pv->value.ra[i];
+ v = pv->value.ia[i];
+ return (v < 0 ? 0 : v / int_type_max(type));
+}
+
+
+/* we use an enumeration instead of index numbers improve readability in this
+ "very busy" routine */
+typedef enum {
+ aRGBColor = 0,
+ aGrayLevel = 1,
+ aPrimaryArray = 2,
+ aPrimaryDepth = 3,
+ aNullBrushPen = 4,
+ aPatternSelectID = 5,
+ aPatternOrigin = 6,
+ aNewDestinationSize = 7
+} pxl_source_t;
+
+/* given a paint type decide if a halftone is necessary */
+static bool
+px_needs_halftone(const gs_memory_t *mem, px_paint_t *ppt)
+{
+ bool needs_halftone;
+ if ( ppt->type == pxpPattern )
+ needs_halftone = true;
+ else if ( ppt->type == pxpNull )
+ needs_halftone = false;
+ else if ( ppt->type == pxpGray )
+ needs_halftone = ppt->value.gray != 0 && ppt->value.gray != 1;
+ else if ( ppt->type == pxpRGB || ppt->type == pxpSRGB ) { /* rgb or srgb */
+ int i;
+ needs_halftone = false;
+ for ( i = 0; i < 3; i++ ) {
+ if ( ppt->value.rgb[i] != 0 && ppt->value.rgb[i] != 1 ) {
+ needs_halftone = true;
+ break;
+ }
+ }
+ } else {
+ dprintf("unknown paint type\n");
+ needs_halftone = true;
+ }
+ return needs_halftone;
+}
+
+static int
+set_source(const px_args_t *par, px_state_t *pxs, px_paint_t *ppt)
+{
+ px_gstate_t *pxgs = pxs->pxgs;
+ int code = 0;
+ /* pxaPatternSelectID */
+ if ( par->pv[aPatternSelectID] ) {
+ px_value_t key;
+ void *value;
+ px_pattern_t *pattern;
+ gs_client_color ccolor;
+ int code;
+ if ( par->pv[aRGBColor] || par->pv[aGrayLevel] || par->pv[aNullBrushPen] )
+ return_error(errorIllegalAttributeCombination);
+ key.type = pxd_array | pxd_ubyte;
+ key.value.array.data = (byte *)&par->pv[aPatternSelectID]->value.i;
+ key.value.array.size = sizeof(int32_t);
+ if ( !(px_dict_find(&pxgs->temp_pattern_dict, &key, &value) ||
+ px_dict_find(&pxs->page_pattern_dict, &key, &value) ||
+ px_dict_find(&pxs->session_pattern_dict, &key, &value))
+ )
+ return_error(errorRasterPatternUndefined);
+ pattern = value;
+ px_set_halftone(pxs);
+ code = render_pattern(&ccolor, pattern, par->pv[aPatternOrigin],
+ par->pv[aNewDestinationSize], pxs);
+ /*
+ * We don't use px_paint_rc_adjust(... 1 ...) here, because
+ * gs_makepattern creates pattern instances with a reference
+ * count already set to 1.
+ */
+ rc_increment(pattern);
+ if ( code < 0 )
+ return code;
+ px_paint_rc_adjust(ppt, -1, pxs->memory);
+ ppt->type = pxpPattern;
+ ppt->value.pattern.pattern = pattern;
+ ppt->value.pattern.color = ccolor;
+ /* not pxaPatternSelectID but we have a pattern origin or
+ newdestination size */
+ } else if ( par->pv[aPatternOrigin] || par->pv[aNewDestinationSize] ) {
+ return_error(errorIllegalAttributeCombination);
+ } else if ( par->pv[aRGBColor] ) {
+ const px_value_t *prgb = par->pv[aRGBColor];
+ int i;
+ if ( par->pv[aGrayLevel] || par->pv[aNullBrushPen] )
+ return_error(errorIllegalAttributeCombination);
+ if ( pxgs->color_space != eRGB && pxgs->color_space != eSRGB )
+ return_error(errorColorSpaceMismatch);
+ px_paint_rc_adjust(ppt, -1, pxs->memory);
+ if ( pxs->useciecolor )
+ ppt->type = pxpSRGB;
+ else
+ ppt->type = pxpRGB;
+ for ( i = 0; i < 3; ++i )
+ if ( prgb->type & pxd_any_real )
+ ppt->value.rgb[i] = real_elt(prgb, i);
+ else {
+ int32_t v = integer_elt(prgb, i);
+ ppt->value.rgb[i] = (v < 0 ? 0 : (real)v / int_type_max(prgb->type));
+ }
+ } else if ( par->pv[aGrayLevel] ) /* pxaGrayLevel */ {
+ if ( par->pv[aNullBrushPen] )
+ return_error(errorIllegalAttributeCombination);
+ if ( pxgs->color_space != eGray )
+ return_error(errorColorSpaceMismatch);
+ px_paint_rc_adjust(ppt, -1, pxs->memory);
+ ppt->type = pxpGray;
+ ppt->value.gray = fraction_value(par->pv[aGrayLevel], 0);
+ } else if ( par->pv[aNullBrushPen] ) /* pxaNullBrush/Pen */ {
+ px_paint_rc_adjust(ppt, -1, pxs->memory);
+ ppt->type = pxpNull;
+ } else if ( par->pv[aPrimaryDepth] && par->pv[aPrimaryArray] ) {
+ px_paint_rc_adjust(ppt, -1, pxs->memory);
+ if ( pxgs->color_space == eRGB )
+ if ( pxs->useciecolor )
+ ppt->type = pxpSRGB;
+ else
+ ppt->type = pxpRGB;
+ else if ( pxgs->color_space == eGray )
+ ppt->type = pxpGray;
+ else if ( pxgs->color_space == eSRGB )
+ ppt->type = pxpSRGB;
+ else {
+ dprintf1("Warning unknown color space %d\n", pxgs->color_space);
+ ppt->type = pxpGray;
+ }
+ /* NB depth?? - for range checking */
+ if ( ppt->type == pxpRGB || ppt->type == pxpSRGB ) {
+
+ ppt->value.rgb[0] = (float)par->pv[aPrimaryArray]->value.array.data[0] / 255.0;
+ ppt->value.rgb[1] = (float)par->pv[aPrimaryArray]->value.array.data[1] / 255.0;
+ ppt->value.rgb[2] = (float)par->pv[aPrimaryArray]->value.array.data[2] / 255.0;
+ } else
+ /* NB figure out reals and ints */
+ ppt->value.gray = (float)par->pv[aPrimaryArray]->value.array.data[0] / 255.0;
+ } else
+ return_error(errorMissingAttribute);
+ /*
+ * Update the halftone to the most recently set one.
+ * This will do the wrong thing if we set the brush or pen source,
+ * set the halftone, and then set the other source, but we have
+ * no way to handle this properly with the current library.
+ */
+ if ( code >= 0 && px_needs_halftone(pxs->memory, ppt) )
+ code = px_set_halftone(pxs);
+ return code;
+}
+
+/* Set up a brush or pen for drawing. */
+/* If it is a pattern, SetBrush/PenSource guaranteed that it is compatible */
+/* with the current color space. */
+int
+px_set_paint(const px_paint_t *ppt, px_state_t *pxs)
+{
+ gs_state *pgs = pxs->pgs;
+ px_paint_type_t type;
+
+ if ( pxs->useciecolor && ppt->type == pxpRGB )
+ type = pxpSRGB;
+ else
+ type = ppt->type;
+ switch ( type ) {
+ case pxpNull:
+ gs_setnullcolor(pgs);
+ return 0;
+ case pxpRGB:
+ return gs_setrgbcolor(pgs, ppt->value.rgb[0], ppt->value.rgb[1],
+ ppt->value.rgb[2]);
+ case pxpGray:
+ return gs_setgray(pgs, ppt->value.gray);
+ case pxpPattern:
+ return gs_setpattern(pgs, &ppt->value.pattern.color);
+ case pxpSRGB:
+ return pl_setSRGBcolor(pgs,
+ ppt->value.rgb[0],
+ ppt->value.rgb[1],
+ ppt->value.rgb[2]);
+ default: /* can't happen */
+ return_error(errorIllegalAttributeValue);
+ }
+}
+
+/* ---------------- Operators ---------------- */
+
+const byte apxSetBrushSource[] = {
+ 0, pxaRGBColor, pxaGrayLevel, pxaPrimaryArray, pxaPrimaryDepth, pxaNullBrush, pxaPatternSelectID,
+ pxaPatternOrigin, pxaNewDestinationSize, 0
+};
+
+int
+pxSetBrushSource(px_args_t *par, px_state_t *pxs)
+{ return set_source(par, pxs, &pxs->pxgs->brush);
+}
+
+const byte apxSetColorSpace[] = {
+ 0, pxaColorSpace, pxaColorimetricColorSpace, pxaXYChromaticities, pxaWhiteReferencePoint,
+ pxaCRGBMinMax, pxaGammaGain, pxaPaletteDepth, pxaPaletteData, 0
+};
+
+/* it appears the 4600 does not support CRGB define this to enable support */
+/* #define SUPPORT_COLORIMETRIC */
+
+int
+pxSetColorSpace(px_args_t *par, px_state_t *pxs)
+{ px_gstate_t *pxgs = pxs->pxgs;
+ pxeColorSpace_t cspace;
+
+ if ( par->pv[0] )
+ cspace = par->pv[0]->value.i;
+ else if ( par->pv[1] )
+ cspace = par->pv[1]->value.i;
+ else
+ return_error(errorIllegalAttributeValue);
+#ifndef SUPPORT_COLORIMETRIC
+ if ( cspace == eCRGB )
+ /* oddly the 4600 reports this a missing attribute, not
+ the expected illegal attribute */
+ return_error(errorMissingAttribute);
+#endif
+ /* substitute srgb if cie color is in effect */
+ if ( ( cspace == eRGB ) && pxs->useciecolor )
+ cspace = eSRGB;
+ if ( par->pv[6] && par->pv[7] )
+ { int ncomp = (( cspace == eRGB || cspace == eSRGB || cspace == eCRGB ) ? 3 : 1);
+ uint size = par->pv[7]->value.array.size;
+ if ( !(size == ncomp << 1 || size == ncomp << 4 ||
+ size == ncomp << 8)
+ )
+ return_error(errorIllegalAttributeValue);
+ /* The palette is in an array, but we want a string. */
+ {
+ if ( pxgs->palette.data && !pxgs->palette_is_shared &&
+ pxgs->palette.size != size
+ )
+ { gs_free_string(pxs->memory, (byte *)pxgs->palette.data,
+ pxgs->palette.size,
+ "pxSetColorSpace(old palette)");
+ pxgs->palette.data = 0;
+ pxgs->palette.size = 0;
+ }
+ if ( pxgs->palette.data == 0 || pxgs->palette_is_shared )
+ { byte *pdata =
+ gs_alloc_string(pxs->memory, size,
+ "pxSetColorSpace(palette)");
+
+ if ( pdata == 0 )
+ return_error(errorInsufficientMemory);
+ pxgs->palette.data = pdata;
+ pxgs->palette.size = size;
+ }
+ memcpy((void *)pxgs->palette.data, par->pv[7]->value.array.data, size);
+ }
+ }
+ else if ( par->pv[6] || par->pv[7] )
+ return_error(errorMissingAttribute);
+ else if ( pxgs->palette.data )
+ { if ( !pxgs->palette_is_shared )
+ gs_free_string(pxs->memory, (byte *)pxgs->palette.data,
+ pxgs->palette.size,
+ "pxSetColorSpace(old palette)");
+ pxgs->palette.data = 0;
+ pxgs->palette.size = 0;
+ }
+ pxgs->palette_is_shared = false;
+ pxgs->color_space = cspace;
+#ifndef SET_COLOR_SPACE_NO_SET_BLACK
+ { px_paint_rc_adjust(&pxgs->brush, -1, pxs->memory);
+ pxgs->brush.type = pxpGray;
+ pxgs->brush.value.gray = 0;
+ }
+ { px_paint_rc_adjust(&pxgs->pen, -1, pxs->memory);
+ pxgs->pen.type = pxpGray;
+ pxgs->pen.value.gray = 0;
+ }
+#endif
+ return 0;
+}
+
+const byte apxSetHalftoneMethod[] = {
+ 0, pxaDitherOrigin, pxaDeviceMatrix, pxaDitherMatrixDataType,
+ pxaDitherMatrixSize, pxaDitherMatrixDepth, pxaAllObjectTypes,
+ pxaTextObjects, pxaVectorObjects, pxaRasterObjects, 0
+};
+
+int
+pxSetHalftoneMethod(px_args_t *par, px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+ px_gstate_t *pxgs = pxs->pxgs;
+ pxeDitherMatrix_t method;
+
+ if ( par->pv[6] || par->pv[7] || par->pv[8] || par->pv[9] )
+ /* ignore object type arguments */
+ return 0;
+
+ if ( par->pv[1] )
+ { /* Internal halftone */
+ if ( par->pv[2] || par->pv[3] || par->pv[4] )
+ return_error(errorIllegalAttributeCombination);
+ method = par->pv[1]->value.i;
+ px_set_default_screen_size(pxs, method);
+ pxs->download_string.data = 0;
+ pxs->download_string.size = 0;
+ }
+ else if ( par->pv[2] && par->pv[3] && par->pv[4] )
+ { /* Dither matrix */
+ uint width = par->pv[3]->value.ia[0];
+ uint source_width = (width + 3) & ~3;
+ uint height = par->pv[3]->value.ia[1];
+ uint size = width * height;
+ uint source_size = source_width * height;
+
+ if ( par->source.position == 0 )
+ { byte *data;
+ if ( par->source.available == 0 )
+ return pxNeedData;
+ data = gs_alloc_string(pxs->memory, size, "dither matrix");
+ if ( data == 0 )
+ return_error(errorInsufficientMemory);
+ pxs->download_string.data = data;
+ pxs->download_string.size = size;
+ }
+ while ( par->source.position < source_size )
+ { uint source_x = par->source.position % source_width;
+ uint source_y = par->source.position / source_width;
+ uint used;
+
+ if ( par->source.available == 0 )
+ return pxNeedData;
+ if ( source_x >= width )
+ { /* Skip padding bytes at end of row. */
+ used = min(par->source.available, source_width - source_x);
+ }
+ else
+ { /* Read data. */
+ const byte *src = par->source.data;
+ byte *dest = pxs->download_string.data;
+ uint i;
+ int skip;
+
+ used = min(par->source.available, width - source_x);
+ /*
+ * The documentation doesn't say this, but we have to
+ * rotate the dither matrix to match the orientation,
+ * remembering that we have a Y-inverted coordinate
+ * system. This is quite a nuisance!
+ */
+ switch ( pxs->orientation )
+ {
+ case ePortraitOrientation:
+ dest += source_y * width + source_x;
+ skip = 1;
+ break;
+ case eLandscapeOrientation:
+ dest += (width - 1 - source_x) * height + source_y;
+ skip = -height;
+ break;
+ case eReversePortrait:
+ dest += (height - 1 - source_y) * width +
+ width - 1 - source_x;
+ skip = -1;
+ break;
+ case eReverseLandscape:
+ dest += source_x * height + width - 1 - source_y;
+ skip = height;
+ break;
+ default:
+ return -1;
+ }
+ for ( i = 0; i < used; ++i, ++src, dest += skip )
+ *dest = *src;
+ }
+ par->source.position += used;
+ par->source.available -= used;
+ par->source.data += used;
+
+ }
+ pxgs->halftone.width = width;
+ pxgs->halftone.height = height;
+ method = eDownloaded;
+ }
+ else
+ return_error(errorMissingAttribute);
+ if ( par->pv[0] )
+ gs_transform(pgs, real_value(par->pv[0], 0),
+ real_value(par->pv[0], 1), &pxgs->halftone.origin);
+ else
+ gs_transform(pgs, 0.0, 0.0, &pxgs->halftone.origin);
+ pxgs->halftone.thresholds = pxs->download_string;
+ pxgs->halftone.method = method;
+ pxgs->halftone.set = false;
+ return 0;
+}
+
+const byte apxSetPenSource[] = {
+ 0, pxaRGBColor, pxaGrayLevel, pxaPrimaryArray, pxaPrimaryDepth, pxaNullPen, pxaPatternSelectID,
+ pxaPatternOrigin, pxaNewDestinationSize, 0
+};
+
+int
+pxSetPenSource(px_args_t *par, px_state_t *pxs)
+{ return set_source(par, pxs, &pxs->pxgs->pen);
+}
+
+const byte apxSetColorTreatment[] =
+ {0, pxaColorTreatment, pxaAllObjectTypes, pxaTextObjects, pxaVectorObjects, pxaRasterObjects, 0};
+
+int
+pxSetColorTreatment(px_args_t *par, px_state_t *pxs)
+{
+ return 0;
+}
+
+const byte apxSetNeutralAxis[] = {0, pxaAllObjectTypes, pxaTextObjects,
+ pxaVectorObjects, pxaRasterObjects, 0};
+
+int
+pxSetNeutralAxis(px_args_t *par, px_state_t *pxs)
+{
+ return 0;
+}
+
+const byte apxSetColorTrapping[] = {pxaAllObjectTypes, 0, 0};
+
+int
+pxSetColorTrapping(px_args_t *par, px_state_t *pxs)
+{
+ return 0;
+}
+
+const byte apxSetAdaptiveHalftoning[] =
+ {0, pxaAllObjectTypes, pxaTextObjects, pxaVectorObjects, pxaRasterObjects, 0};
+
+int
+pxSetAdaptiveHalftoning(px_args_t *par, px_state_t *pxs)
+{
+ return 0;
+}
+
diff --git a/pxl/pxl.mak b/pxl/pxl.mak
new file mode 100644
index 000000000..1f57aeee9
--- /dev/null
+++ b/pxl/pxl.mak
@@ -0,0 +1,206 @@
+# Copyright (C) 1996, 1997, 1998 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# makefile for PCL XL interpreters.
+# Users of this makefile must define the following:
+# GLSRCDIR - the GS library source directory
+# GLGENDIR - the GS library generated file directory
+# PLSRCDIR - the PCL* support library source directory
+# PLOBJDIR - the PCL* support library object / executable directory
+# PXLSRCDIR - the source directory
+# PXLGENDIR - the directory for source files generated during building
+# PXLOBJDIR - the object / executable directory
+# TOP_OBJ - object file to top-level interpreter API
+
+PLOBJ=$(PLOBJDIR)$(D)
+
+PXLSRC=$(PXLSRCDIR)$(D)
+PXLGEN=$(PXLGENDIR)$(D)
+PXLOBJ=$(PXLOBJDIR)$(D)
+PXLO_=$(O_)$(PXLOBJ)
+
+PXLCCC=$(CC_) $(I_)$(PXLSRCDIR)$(_I) $(I_)$(PXLGENDIR)$(_I) $(I_)$(PCLSRCDIR)$(_I) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(I_)$(GLGENDIR)$(_I) $(C_)
+
+# Define the name of this makefile.
+PXL_MAK=$(PXLSRC)pxl.mak
+
+pxl.clean: pxl.config-clean pxl.clean-not-config-clean
+
+pxl.clean-not-config-clean: clean_gs
+ $(RM_) $(PXLOBJ)*.$(OBJ)
+ $(RMN_) $(PXLGEN)pxbfont.c $(PXLGEN)pxsymbol.c $(PXLGEN)pxsymbol.h
+ $(RM_) $(PXLOBJ)devs.tr6
+
+# devices are still created in the current directory. Until that
+# is fixed we will have to remove them from both directories.
+pxl.config-clean:
+ $(RM_) $(PXLOBJ)*.dev
+ $(RM_) *.dev
+
+################ PCL XL ################
+
+pxattr_h=$(PXLSRC)pxattr.h $(gdevpxat_h)
+pxbfont_h=$(PXLSRC)pxbfont.h
+pxenum_h=$(PXLSRC)pxenum.h $(gdevpxen_h)
+pxerrors_h=$(PXLSRC)pxerrors.h
+pxfont_h=$(PXLSRC)pxfont.h $(plfont_h)
+pxptable_h=$(PXLSRC)pxptable.h
+pxtag_h=$(PXLSRC)pxtag.h $(gdevpxop_h)
+pxsymbol_h=$(PXLGEN)pxsymbol.h
+pxvalue_h=$(PXLSRC)pxvalue.h $(gstypes_h) $(pxattr_h) $(stdint__h)
+pxdict_h=$(PXLSRC)pxdict.h $(pldict_h) $(pxvalue_h)
+pxgstate_h=$(PXLSRC)pxgstate.h $(gsccolor_h) $(gsiparam_h) $(gsmatrix_h) $(gsrefct_h) $(gxbitmap_h) $(gxfixed_h) $(plsymbol_h) $(pxdict_h) $(pxenum_h)
+pxoper_h=$(PXLSRC)pxoper.h $(gserror_h) $(pxattr_h) $(pxerrors_h) $(pxvalue_h)
+pxparse_h=$(PXLSRC)pxparse.h $(pxoper_h)
+pxstate_h=$(PXLSRC)pxstate.h $(gsmemory_h) $(pxgstate_h) $(pltop_h)
+pxpthr_h=$(PXLSRC)pxpthr.h
+
+$(PXLOBJ)pxbfont.$(OBJ): $(PXLSRC)pxbfont.c $(AK) $(stdpre_h)\
+ $(pxbfont_h)
+ $(PXLCCC) $(PXLSRC)pxbfont.c $(PXLO_)pxbfont.$(OBJ)
+
+$(PXLOBJ)pxerrors.$(OBJ): $(PXLSRC)pxerrors.c $(AK)\
+ $(memory__h) $(stdio__h) $(string__h)\
+ $(gsccode_h) $(gscoord_h) $(gsmatrix_h) $(gsmemory_h)\
+ $(gspaint_h) $(gspath_h) $(gsstate_h) $(gstypes_h) $(gsutil_h)\
+ $(gxchar_h) $(gxfixed_h) $(gxfont_h) $(scommon_h)\
+ $(pxbfont_h) $(pxerrors_h) $(pxfont_h) $(pxparse_h) $(pxptable_h) $(pxstate_h)
+ $(PXLCCC) $(PXLSRC)pxerrors.c $(PXLO_)pxerrors.$(OBJ)
+
+$(PXLOBJ)pxparse.$(OBJ): $(PXLSRC)pxparse.c $(AK) $(memory__h)\
+ $(gdebug_h) $(gserror_h) $(gsio_h) $(gstypes_h)\
+ $(plparse_h) $(pxpthr_h)\
+ $(pxattr_h) $(pxenum_h) $(pxerrors_h) $(pxoper_h) $(pxparse_h) $(pxptable_h)\
+ $(pxstate_h) $(pxtag_h) $(pxvalue_h) $(gsstruct_h)
+ $(PXLCCC) $(PXLSRC)pxparse.c $(PXLO_)pxparse.$(OBJ)
+
+$(PXLOBJ)pxstate.$(OBJ): $(PXLSRC)pxstate.c $(AK) $(pxfont_h) $(stdio__h)\
+ $(gsmemory_h) $(gsstruct_h) $(gstypes_h) $(gxfcache_h)\
+ $(pxstate_h) $(pxfont_h) $(pxparse_h) $(scommon_h)
+ $(PXLCCC) $(PXLSRC)pxstate.c $(PXLO_)pxstate.$(OBJ)
+
+# See the comment above under pxbfont.c.
+# /usr/bin/gs -I/usr/lib/ghostscript -q -dNODISPLAY -dHEADER pxsymbol.ps >pxsymbol.psh
+$(PXLSRC)pxsymbol.psh: $(PXLSRC)pxsymbol.ps
+ $(GS_XE) -q -dNODISPLAY -dHEADER $(PXLSRC)pxsymbol.ps >$(PXLGEN)pxsym_.psh
+ $(CP_) $(PXLGEN)pxsym_.psh $(PXLSRC)pxsymbol.psh
+ $(RM_) $(PXLGEN)pxsym_.psh
+
+$(PXLGEN)pxsymbol.h: $(PXLSRC)pxsymbol.psh
+ $(CP_) $(PXLSRC)pxsymbol.psh $(PXLGEN)pxsymbol.h
+
+# See the comment above under pxbfont.c.
+# /usr/bin/gs -I/usr/lib/ghostscript -q -dNODISPLAY pxsymbol.ps >pxsymbol.psc
+$(PXLSRC)pxsymbol.psc: $(PXLSRC)pxsymbol.ps
+ $(GS_XE) -q -dNODISPLAY $(PXLSRC)pxsymbol.ps >$(PXLGEN)pxsym_.psc
+ $(CP_) $(PXLGEN)pxsym_.psc $(PXLSRC)pxsymbol.psc
+ $(RM_) $(PXLGEN)pxsym_.psc
+
+$(PXLGEN)pxsymbol.c: $(PXLSRC)pxsymbol.psc
+ $(CP_) $(PXLSRC)pxsymbol.psc $(PXLGEN)pxsymbol.c
+
+$(PXLOBJ)pxsymbol.$(OBJ): $(PXLGEN)pxsymbol.c $(AK) $(pxsymbol_h)
+ $(PXLCCC) $(PXLGEN)pxsymbol.c $(PXLO_)pxsymbol.$(OBJ)
+
+$(PXLOBJ)pxptable.$(OBJ): $(PXLSRC)pxptable.c $(AK) $(std_h)\
+ $(pxenum_h) $(pxoper_h) $(pxptable_h) $(pxvalue_h) $(pxstate_h)
+ $(PXLCCC) $(PXLSRC)pxptable.c $(PXLO_)pxptable.$(OBJ)
+
+$(PXLOBJ)pxpthr.$(OBJ): $(PXLSRC)pxpthr.c $(AK) \
+ $(pcommand_h) $(pgmand_h) $(pcstate_h) $(pcparse_h) $(pctop_h)\
+ $(pcpage_h) $(pxstate_h) $(pxoper_h) $(stdio__h) $(pxpthr_h)
+ $(PXLCCC) $(PXLSRC)pxpthr.c $(PXLO_)pxpthr.$(OBJ)
+
+$(PXLOBJ)pxvalue.$(OBJ): $(PXLSRC)pxvalue.c $(AK) $(std_h) $(gsmemory_h) $(pxvalue_h)
+ $(PXLCCC) $(PXLSRC)pxvalue.c $(PXLO_)pxvalue.$(OBJ)
+
+# We have to break up pxl_other because of the MS-DOS command line
+# limit of 120 characters.
+pxl_other_obj1=$(PXLOBJ)pxbfont.$(OBJ) $(PXLOBJ)pxerrors.$(OBJ) $(PXLOBJ)pxparse.$(OBJ)
+pxl_other_obj2=$(PXLOBJ)pxstate.$(OBJ) $(PXLOBJ)pxptable.$(OBJ) $(PXLOBJ)pxpthr.$(OBJ) $(PXLOBJ)pxvalue.$(OBJ)
+pxl_other_obj=$(pxl_other_obj1) $(pxl_other_obj2)
+
+# Operators
+
+# This implements finding fonts by name, but doesn't implement any operators
+# per se.
+$(PXLOBJ)pxffont.$(OBJ): $(PXLSRC)pxffont.c $(AK) $(string__h)\
+ $(gschar_h) $(gsmatrix_h) $(gx_h) $(gxfont_h) $(gxfont42_h)\
+ $(pxfont_h) $(pxoper_h) $(pxstate_h) $(pjtop_h)
+ $(PXLCCC) $(PXLSRC)pxffont.c $(PXLO_)pxffont.$(OBJ)
+
+$(PXLOBJ)pxfont.$(OBJ): $(PXLSRC)pxfont.c $(AK) $(math__h) $(stdio__h) $(string__h)\
+ $(gdebug_h) $(gschar_h) $(gscoord_h) $(gserrors_h) $(gsimage_h)\
+ $(gspaint_h) $(gspath_h) $(gsstate_h) $(gsstruct_h) $(gsutil_h)\
+ $(gxchar_h) $(gxfixed_h) $(gxfont_h) $(gxfont42_h) $(gxpath_h) $(gzstate_h)\
+ $(plvalue_h)\
+ $(pxfont_h) $(pxoper_h) $(pxstate_h)
+ $(PXLCCC) $(UFST_INCLUDES) $(PXLSRC)pxfont.c $(PXLO_)pxfont.$(OBJ)
+
+$(PXLOBJ)pxgstate.$(OBJ): $(PXLSRC)pxgstate.c $(AK) $(math__h) $(memory__h) $(stdio__h)\
+ $(gscoord_h) $(gsimage_h) $(gsmemory_h) $(gspath_h) $(gspath2_h) $(gsrop_h)\
+ $(gsstate_h) $(gsstruct_h) $(gdebug_h) $(gscie_h) $(gscolor2_h) $(gstypes_h)\
+ $(gxcspace_h) $(gxpath_h) $(gzstate_h)\
+ $(pxoper_h) $(pxstate_h) $(plsrgb_h)
+ $(PXLCCC) $(PXLSRC)pxgstate.c $(PXLO_)pxgstate.$(OBJ)
+
+$(PXLOBJ)pximage.$(OBJ): $(PXLSRC)pximage.c $(AK) $(std_h)\
+ $(string__h) $(gscoord_h) $(gsimage_h) $(gspaint_h) $(gspath_h) $(gspath2_h)\
+ $(gsrefct_h) $(gsrop_h) $(gsstate_h) $(gsstruct_h) $(gsuid_h) $(gsutil_h)\
+ $(gxbitmap_h) $(gxcspace_h) $(gxdevice_h) $(gxcolor2_h) $(gxpcolor_h)\
+ $(scommon_h) $(srlx_h) $(strimpl_h) $(gxdcolor_h) \
+ $(pldraw_h) $(jpeglib__h) $(sdct_h) $(sjpeg_h)\
+ $(pxerrors_h) $(pxoper_h) $(pxstate_h) $(plsrgb_h) $(gdebug_h)
+ $(PXLCCC) $(PXLSRC)pximage.c $(PXLO_)pximage.$(OBJ)
+
+$(PXLOBJ)pxink.$(OBJ): $(PXLSRC)pxink.c $(math__h) $(stdio__h) $(memory__h)\
+ $(gdebug_h) $(gscolor2_h) $(gscoord_h) $(gsimage_h) $(gsmemory_h) $(gspath_h)\
+ $(gstypes_h) $(gscie_h) $(gscrd_h) $(gsstate_h)\
+ $(gxarith_h) $(gxcspace_h) $(gxdevice_h) $(gxht_h) $(gxstate_h)\
+ $(pxoper_h) $(pxstate_h) $(plht_h) $(pldraw_h)
+ $(PXLCCC) $(PXLSRC)pxink.c $(PXLO_)pxink.$(OBJ)
+
+$(PXLOBJ)pxpaint.$(OBJ): $(PXLSRC)pxpaint.c $(AK) $(math__h) $(stdio__h)\
+ $(gscoord_h) $(gspaint_h) $(gspath_h) $(gspath2_h) $(gsrop_h) $(gsstate_h)\
+ $(gxfarith_h) $(gxfixed_h) $(gxistate_h) $(gxmatrix_h) $(gxpath_h)\
+ $(pxfont_h) $(pxoper_h) $(pxstate_h)
+ $(PXLCCC) $(PXLSRC)pxpaint.c $(PXLO_)pxpaint.$(OBJ)
+
+$(PXLOBJ)pxsessio.$(OBJ): $(PXLSRC)pxsessio.c $(AK) $(math__h) $(stdio__h)\
+ $(string__h) $(pxoper_h) $(pxstate_h) $(pxfont_h) \
+ $(pjparse_h) $(gschar_h) $(gscoord_h) $(gserrors_h) $(gspaint_h) $(gsparam_h)\
+ $(gsstate_h) $(gxfixed_h) $(gxpath_h) $(gxfcache_h)\
+ $(gxdevice_h) $(pjtop_h) $(pllfont_h)
+ $(PXLCCC) $(PXLSRC)pxsessio.c $(PXLO_)pxsessio.$(OBJ)
+
+$(PXLOBJ)pxstream.$(OBJ): $(PXLSRC)pxstream.c $(AK) $(memory__h)\
+ $(gsmemory_h) $(scommon_h)\
+ $(pxoper_h) $(pxparse_h) $(pxstate_h)
+ $(PXLCCC) $(PXLSRC)pxstream.c $(PXLO_)pxstream.$(OBJ)
+
+# We have to break up pxl_ops because of the MS-DOS command line
+# limit of 120 characters.
+pxl_ops_obj1=$(PXLOBJ)pxffont.$(OBJ) $(PXLOBJ)pxfont.$(OBJ) $(PXLOBJ)pxgstate.$(OBJ) $(PXLOBJ)pximage.$(OBJ)
+pxl_ops_obj2=$(PXLOBJ)pxink.$(OBJ) $(PXLOBJ)pxpaint.$(OBJ) $(PXLOBJ)pxsessio.$(OBJ) $(PXLOBJ)pxstream.$(OBJ)
+pxl_ops_obj=$(pxl_ops_obj1) $(pxl_ops_obj2)
+
+# Top-level API
+$(PXL_TOP_OBJ): $(PXLSRC)pxtop.c $(AK) $(stdio__h)\
+ $(string__h) $(gdebug_h) $(gp_h) $(gsdevice_h) $(gserrors_h) $(gsmemory_h)\
+ $(gsstate_h) $(gsstruct_h) $(gspaint_h) $(gstypes_h) $(gxalloc_h) $(gxstate_h)\
+ $(gsnogc_h) $(pltop_h) $(plparse_h)\
+ $(pxattr_h) $(pxerrors_h) $(pxoper_h) $(pxparse_h) $(pxptable_h) $(pxstate_h)\
+ $(pxfont_h) $(pxvalue_h) $(PXLGEN)pconf.h $(plfont_h)
+ $(CP_) $(PXLGEN)pconf.h $(PXLGEN)pconfig.h
+ $(PXLCCC) $(PXLSRC)pxtop.c $(PXLO_)pxtop.$(OBJ)
+
+# Note that we must initialize pxfont before pxerrors.
+$(PXLOBJ)pxl.dev: $(PXL_MAK) $(ECHOGS_XE) $(pxl_other_obj) $(pxl_ops_obj)\
+ $(PLOBJ)pl.dev $(PLOBJ)pjl.dev $(PLOBJ)$(PXL_FONT_SCALER).dev
+ $(SETMOD) $(PXLOBJ)pxl $(pxl_other_obj1)
+ $(ADDMOD) $(PXLOBJ)pxl $(pxl_other_obj2)
+ $(ADDMOD) $(PXLOBJ)pxl $(pxl_ops_obj1)
+ $(ADDMOD) $(PXLOBJ)pxl $(pxl_ops_obj2)
+ $(ADDMOD) $(PXLOBJ)pxl -include $(PLOBJ)pl $(PLOBJ)pjl $(PLOBJ)$(PXL_FONT_SCALER)
+ $(ADDMOD) $(PXLOBJ)pxl -init pxfont pxerrors
+
diff --git a/pxl/pxlib.txt b/pxl/pxlib.txt
new file mode 100644
index 000000000..e7b42a0c1
--- /dev/null
+++ b/pxl/pxlib.txt
@@ -0,0 +1,222 @@
+
+ Copyright (C) 1997 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+
+This document describes the additions to Aladdin's PostScript-oriented
+graphics library that were required to handle the full PCL graphics model.
+
+ Graphics model extensions from PostScript to PCL
+
+Introduction
+============
+
+The PCL XL graphics model is very close to the PostScript model, but it is
+not identical, and it includes several features that are difficult or
+impossible to emulate using the PostScript concepts. This document presents
+the additions we made to our PostScript-oriented graphics library in order
+to implement the full PCL XL graphics model. We have noted the places where
+we did this only for efficiency, and where we saw no alternative.
+
+PCL5 (including HP-GL/2) also requires a very small number of additions
+beyond PCL XL. We have included these in this document as well.
+
+Changes in a given revision of this document are marked with the revision
+number in [brackets]. Revision history:
+ first issued January 18, 1997
+
+Both PCL5 and PCL XL
+====================
+
+RasterOp and transparency
+-------------------------
+
+All drawing operations must be capable of incorporating an arbitrary 3-input
+Boolean operation (RasterOp). With the RasterOp extension, imaging
+operations compute a function D = F(D,S,T), where F is an arbitrary 3-input
+Boolean function, D is the destination (frame buffer or print buffer), S is
+the source (described below), and T is the texture (always the current
+PostScript color, which may be a pattern). The source and texture depend on
+the PostScript imaging operation:
+
+ - For fill and stroke, the source is solid black, covering the
+ region to be painted.
+
+ - For *show and imagemask, the source is solid black, covering the
+ pixels to be painted.
+
+ - For image and colorimage, the source is the image data.
+
+On black-and-white devices, D, S, and T are considered to be 1-bit values in
+RGB space; this require modifying F if the device actually uses 0 = white, 1
+= black. (Our library handles this automatically.) On such devices, F is
+applied directly to the rendered bits, i.e. after transfer function and
+halftoning. On color (even non-contone) or gray-scale devices, D, S, and T
+are considered to be N-bit RGB values, and F is applied before any color
+realization.
+
+The source and destination each also have a "transparent" flag: if the
+corresponding flag is set, then white pixels in the source or destination
+respectively suppress writing into the frame buffer, regardless of what F
+may othewise compute. For black-and-white devices, transparency can be
+implemented by modifying F; for gray-scale or color devices, an explicit
+additional test is required.
+
+We see no reasonable way for clients to implement RasterOp, or transparency
+on non-black-and-white devices.
+
+Triangular caps
+---------------
+
+PCL supports triangular caps. If the square cap looks like this:
+
+ ________
+ | |
+ | |
+ | |
+
+then the triangular cap looks like this:
+
+ / \
+ / \
+ | |
+
+i.e. its lines meet the ends of the stroke at 135 degrees, and each other at
+90 degrees.
+
+If the library provides a way for clients to get the result of applying the
+current dash pattern to a path (similar in spirit to flattenpath), clients
+could in principle implement triangular caps.
+
+Null joins
+----------
+
+PCL supports a join style called null joins, in which a pair of caps is used
+instead of a join. I.e., with null joins, each line, curve, or arc is
+considered to be a separate subpath. Null join style does not affect the
+junctures between the line segments produced by flattening curves or arcs:
+these are always "smooth". (When null joins are selected, our library uses
+bevel joins between curve and arc segments.)
+
+While in principle clients could implement null joins, it would require
+extra work because it is the join style in effect at path painting time, not
+at path construction time, that determines the output; thus the client
+cannot use the obvious approach of breaking the path up as it is being
+constructed. Instead, the client must record the sequence of path drawing
+operations and replay them in modified form if the join style at painting
+time is different from the join style at construction time.
+
+Dots
+----
+
+When a dash pattern includes zero-length drawn segments, PostScript
+interpreters produce a dot if round caps are in effect, and nothing
+otherwise. H-P's PCL XL interpreters, however, always draw a pair of caps
+(including a hairline for butt caps); something similar happens in PCL5.
+
+We thought clients could implement this by replacing zero-length drawn
+elements of the dash pattern with tiny nearly-zero-length elements.
+However, this doesn't work:
+
+ - If the tiny element shortens the following skipped distance, then
+no dot will get drawn at the very end of a line that is an exact multiple of
+the pattern length.
+
+ - If the tiny element shortens the previous skipped distance (or a
+final skip if it is the first element of the pattern), the entire pattern
+will be displaced slightly, leading to other problems at points that exactly
+line up with the boundaries of pattern elements.
+
+ - If the tiny element shortens both the previous and following
+distance, then if it falls exactly on a corner, the caps will not be at 180
+degrees to each other, leading to visual anomalies.
+
+We verified through experimentation that all these problems do occur with a
+client-side implementation, and that they do not occur in H-P's printers.
+We still suspect there is a way for clients to implement this behavior,
+especially if the library can deliver the dash expansion as noted for
+triangular caps above.
+
+Accurate curves
+---------------
+
+The curve flattening method implied by the PostScript Language Reference
+Manual always uses chords to approximate curves. As a result, the last
+chord is not quite a segment of the tangent, and so a butt or square cap is
+not quite perpendicular to the tangent. In PostScript, this is usually not
+a problem, because line joining takes care of filling the small wedge-shaped
+gap that would otherwise occur between the end of an arc and an adjacent
+line continuing in the same direction. However, with null joins, the wedge
+becomes visible. Also, with a wide brush, the discrepancy from horizontal
+or vertical at the ends of semicircles becomes visually noticeable. Our
+library provides a flag that creates a very short tangent segment as the
+first and last line of a flattened curve, thereby avoiding this problem.
+
+In principle, clients could create accurate curve ends by adding the short
+tangent lines explicitly (and adjusting the end parameters of the curve
+appropriately), but it would be quite a nuisance.
+
+Character bolding
+-----------------
+
+PCL supports pseudo-bolding for characters. This is defined as "smearing"
+the filled region to the right and upward before imaging it onto the page.
+In particular, smearing happens before RasterOp.
+
+We don't implement this directly in our graphics library; however, our PCL
+interpreters implement it in the callback for rendering characters that are
+not yet in the cache. A client could implement it by asking for the bitmap
+of the character and then doing the smearing, but this would prevent the
+smeared character from being cached. (This may not be important in
+practice.)
+
+PCL5 only
+=========
+
+Triangular joins
+----------------
+
+PCL5 supports triangular joins. The triangular "spike" is the reflection of
+filling the outside "notch" where the lines meet. The spike is not affected
+by the miter limit.
+
+As with triangular caps, clients could implement triangular joins (with a
+bit of trouble) if the library did the dash pattern expansion first.
+
+PCL XL only
+===========
+
+Negative dash pattern elements
+------------------------------
+
+PCL XL allows negative lengths in dash patterns. What this appears to mean
+is that a negative segment is drawn backwards from the current point at the
+time it is encountered, with no caps (or perhaps the caps are reflected 180
+degrees so they are actually inside the segment -- we didn't experiment with
+segments short enough to test this), and also skips over an equal amount of
+following positive pattern elements. What seems bizarre to us is that the
+negative segment is not drawn back along the line: it is drawn in a straight
+line in a direction 180 degrees from the current line segment. If this
+occurs just after a corner, for example, the drawn segment sticks out in a
+direction far off the actual path.
+
+Our PCL XL interpreter currently handles negative lengths in the client, by
+transforming the pattern, but the results are not correct if the line is
+shorter than one full pattern repetition or if the line has sharp corners.
+Clients could handle the former if dash patterns were generalized so that
+instead of an offset, they had a separate initial part, i.e., if they could
+be of the form A B C D E D E D E...; but we don't see how clients could
+handle the odd H-P interpretation of the latter. (We doubt that it needs to
+be handled in practice.)
+
+Dual halftones
+--------------
+
+By default, source and texture (i.e., colors/patterns and images) use
+slightly different halftones. We think they are the same halftone with
+slightly different phase, but we aren't sure of this yet. This is required
+in order to produce certain subtle (but highly visible) interaction effects
+when combining halftoned source and texture with RasterOp.
+
+We don't see any way for clients to implement dual halftones when RasterOp
+is involved, because not all 3-input Boolean functions can be handled by
+performing two 2-input operations with a change of halftone in between.
diff --git a/pxl/pxoper.h b/pxl/pxoper.h
new file mode 100644
index 000000000..2579481c5
--- /dev/null
+++ b/pxl/pxoper.h
@@ -0,0 +1,113 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxoper.h */
+/* Definitions for PCL XL operators */
+
+#ifndef pxoper_INCLUDED
+# define pxoper_INCLUDED
+
+#include "gserror.h"
+#include "pxattr.h"
+#include "pxerrors.h"
+#include "pxvalue.h"
+
+#ifndef px_state_DEFINED
+# define px_state_DEFINED
+typedef struct px_state_s px_state_t;
+#endif
+
+#ifndef px_parser_state_t_DEFINED
+# define px_parser_state_t_DEFINED
+typedef struct px_parser_state_s px_parser_state_t;
+#endif
+
+/*
+ * The first argument of an operator procedure is a px_args_t. Two kinds
+ * of arguments require (potentially) special treatment: arrays, and data
+ * read from the data source.
+ *
+ * By default, the storage for an array argument is released after the
+ * operator is called; the operator does not know or care whether the
+ * storage was allocated on the heap or somewhere else. However, if the
+ * operator wants the storage to persist, it should examine the pxd_on_heap
+ * flag in the array value. If this flag is set, the storage is already
+ * heap-allocated; the operator should simply clear the flag to prevent the
+ * storage from being released. If pxd_on_heap is not set, the operator
+ * should allocate storage for the array on the heap and then copy the
+ * contents to the heap storage.
+ *
+ * If an operator needs data from the data source, it should check the
+ * source.available member of the argument record. If at least as much data
+ * is available as the operator needs, the operator should read the data it
+ * needs, update source.data and source.available (and, if it wishes,
+ * source.position) accordingly, and return 0 as usual. If not enough data
+ * is available, the operator should read as much as it wants (which may not
+ * be all of what is available) and return the special value pxNeedData.
+ *
+ * The variables source.position and source.count are provided solely so
+ * that simple data-reading operators don't need to allocate a separate
+ * state record. The scanner itself doesn't touch them, except for
+ * initializing source.position to 0 before invoking the operator the first
+ * time.
+ *
+ * We provide parser_macro_state and parser_operator_count so that we can
+ * implement ExecStream by simple recursion.
+ */
+
+/* ---------------- Definitions ---------------- */
+
+/*
+ * Define the structure for operator arguments. This structure is never
+ * allocated separately (only embedded in a px_parser_state_t) or referenced
+ * persistently, and all its non-transient pointers point into the parser
+ * state. Consequently, we don't need a marking procedure for it, but we do
+ * need to relocate those pointers. We handle this within
+ * px_parser_state_reloc_ptrs.
+ */
+#define max_px_args 20
+typedef struct px_args_s {
+ struct ds_ {
+ ulong position; /* position in data block, initially 0, */
+ /* provided for the operator's convenience */
+ uint count; /* another variable for the operators */
+ uint available; /* amount of data available in block */
+ bool phase; /* upon first call of the operator this will be 0. */
+ const byte *data;
+ } source;
+ /*
+ * ExecStream needs a pointer to the parser state so it can set the
+ * parser's macro-state after returning, and to report the stream's
+ * operator count in case of an error.
+ */
+ px_parser_state_t *parser;
+ px_value_t *pv[max_px_args];
+} px_args_t;
+
+/*
+ * Define the value that an operator returns if it needs more data from the
+ * data source.
+ */
+#define pxNeedData 42 /* not 0 or 1, and >0 */
+
+/*
+ * contrary to the specification and common sense the pxPassThrough
+ * operator does not know how much data it requires, the parser
+ * requires a special flag to know it is dealing with PassThrough */
+#define pxPassThrough 43
+
+/* Define the argument list for operators. */
+#define px_operator_proc(proc)\
+ int proc(px_args_t *, px_state_t *)
+
+#endif /* pxoper_INCLUDED */
diff --git a/pxl/pxpaint.c b/pxl/pxpaint.c
new file mode 100644
index 000000000..4ae845fa8
--- /dev/null
+++ b/pxl/pxpaint.c
@@ -0,0 +1,855 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxpaint.c */
+/* PCL XL painting operators */
+
+#include "math_.h"
+#include "stdio_.h" /* std.h + NULL */
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxfont.h" /* for px_text */
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsrop.h"
+#include "gxfarith.h"
+#include "gxfixed.h"
+#include "gxistate.h"
+#include "gxmatrix.h"
+#include "gxpath.h"
+
+/*
+ * The published H-P specification says that the single-object painting
+ * operators (Chord, Ellipse, Pie, Rectangle, RoundRectangle) leave the
+ * path set to the object; however, H-P printers apparently reset the
+ * path (but leave the current cursor defined). To obtain the latter
+ * behavior, uncomment the following #define.
+ */
+#define NEWPATH_AFTER_PAINT_SHAPE
+/*
+ * The published specification says that dash patterns do not scale when
+ * the CTM changes; however, H-P printers do scale the dash pattern.
+ * To make dash patterns not scale, uncomment the following #define.
+ */
+/*#define NO_SCALE_DASH_PATTERN*/
+/*
+ * The H-P documentation says we are supposed to draw rectangles
+ * counter-clockwise on the page, which is clockwise in user space.
+ * However, the LaserJet 6 (and probably the LJ 5 as well) draw rectangles
+ * clockwise! To draw rectangles clockwise, uncomment the following
+ * #define.
+ * clj4550 and clj4600 draw counter-clockwise rectangles
+ */
+/*#define DRAW_RECTANGLES_CLOCKWISE*/
+/*
+ * The H-P printers do really weird things for arcs, chords, or pies where
+ * the width and/or height of the bounding box is negative. To emulate
+ * their behavior, uncomment the following #define.
+ */
+#define REFLECT_NEGATIVE_ARCS
+
+/* Forward references */
+px_operator_proc(pxNewPath);
+
+/* ---------------- Utilities ---------------- */
+
+/* Add lines to the path. line_proc is gs_lineto or gs_rlineto. */
+/* Attributes: pxaEndPoint, pxaNumberOfPoints, pxaPointType. */
+static int
+add_lines(px_args_t *par, px_state_t *pxs,
+ int (*line_proc)(gs_state *, floatp, floatp))
+{ int code = 0;
+
+ if ( par->pv[0] )
+ { /* Single segment, specified as argument. */
+ if ( par->pv[1] || par->pv[2] )
+ return_error(errorIllegalAttributeCombination);
+ return (*line_proc)(pxs->pgs, real_value(par->pv[0], 0),
+ real_value(par->pv[0], 1));
+ }
+ /* Multiple segments, specified in source data. */
+ if ( !(par->pv[1] && par->pv[2]) )
+ return_error(errorMissingAttribute);
+ { int32_t num_points = par->pv[1]->value.i;
+ pxeDataType_t type = (pxeDataType_t)par->pv[2]->value.i;
+ int point_size = (type == eUByte || type == eSByte ? 2 : 4);
+
+ while ( par->source.position < num_points * point_size )
+ { const byte *dp = par->source.data;
+ int px, py;
+
+ if ( par->source.available < point_size )
+ { /* We don't even have one point's worth of source data. */
+ return pxNeedData;
+ }
+ switch ( type )
+ {
+ case eUByte:
+ px = dp[0];
+ py = dp[1];
+ break;
+ case eSByte:
+ px = (int)(dp[0] ^ 0x80) - 0x80;
+ py = (int)(dp[1] ^ 0x80) - 0x80;
+ break;
+ case eUInt16:
+ px = uint16at(dp, pxs->data_source_big_endian);
+ py = uint16at(dp + 2, pxs->data_source_big_endian);
+ break;
+ case eSInt16:
+ px = sint16at(dp, pxs->data_source_big_endian);
+ py = sint16at(dp + 2, pxs->data_source_big_endian);
+ break;
+ default: /* can't happen, pacify compiler */
+ return_error(errorIllegalAttributeValue);
+ }
+ code = (*line_proc)(pxs->pgs, (floatp)px, (floatp)py);
+ if ( code < 0 )
+ break;
+ par->source.position += point_size;
+ par->source.available -= point_size;
+ par->source.data += point_size;
+ }
+ }
+ return code;
+}
+
+/* Add Bezier curves to the path. curve_proc is gs_curveto or gs_rcurveto. */
+/* Attributes: pxaNumberOfPoints, pxaPointType, pxaControlPoint1, */
+/* pxaControlPoint2, pxaEndPoint. */
+static int
+add_curves(px_args_t *par, px_state_t *pxs,
+ int (*curve_proc)(gs_state *, floatp, floatp, floatp, floatp, floatp, floatp))
+{ int code = 0;
+
+ if ( par->pv[2] && par->pv[3] && par->pv[4] )
+ { /* Single curve, specified as argument. */
+ if ( par->pv[0] || par->pv[1] )
+ return_error(errorIllegalAttributeCombination);
+ return (*curve_proc)(pxs->pgs, real_value(par->pv[2], 0),
+ real_value(par->pv[2], 1),
+ real_value(par->pv[3], 0),
+ real_value(par->pv[3], 1),
+ real_value(par->pv[4], 0),
+ real_value(par->pv[4], 1));
+ }
+ /* Multiple segments, specified in source data. */
+ else if ( par->pv[0] && par->pv[1] )
+ { if ( par->pv[2] || par->pv[3] || par->pv[4] )
+ return_error(errorIllegalAttributeCombination);
+ }
+ else
+ return_error(errorMissingAttribute);
+ { int32_t num_points = par->pv[0]->value.i;
+ pxeDataType_t type = (pxeDataType_t)par->pv[1]->value.i;
+ int point_size = (type == eUByte || type == eSByte ? 2 : 4);
+ int segment_size = point_size * 3;
+
+ if ( num_points % 3 )
+ return_error(errorIllegalDataLength);
+ while ( par->source.position < num_points * point_size )
+ { const byte *dp = par->source.data;
+ int points[6];
+ int i;
+
+ if ( par->source.available < point_size * 3 )
+ { /* We don't even have one point's worth of source data. */
+ return pxNeedData;
+ }
+ switch ( type )
+ {
+ case eUByte:
+ for ( i = 0; i < 6; ++i )
+ points[i] = dp[i];
+ break;
+ case eSByte:
+ for ( i = 0; i < 6; ++i )
+ points[i] = (int)(dp[i] ^ 0x80) - 0x80;
+ break;
+ case eUInt16:
+ for ( i = 0; i < 12; i += 2 )
+ points[i >> 1] =
+ uint16at(dp + i, pxs->data_source_big_endian);
+ break;
+ case eSInt16:
+ for ( i = 0; i < 12; i += 2 )
+ points[i >> 1]
+ = sint16at(dp + i, pxs->data_source_big_endian);
+ break;
+ default: /* can't happen, pacify compiler */
+ return_error(errorIllegalAttributeValue);
+ }
+ code = (*curve_proc)(pxs->pgs,
+ (floatp)points[0], (floatp)points[1],
+ (floatp)points[2], (floatp)points[3],
+ (floatp)points[4], (floatp)points[5]);
+ if ( code < 0 )
+ break;
+ par->source.position += segment_size;
+ par->source.available -= segment_size;
+ par->source.data += segment_size;
+ }
+ }
+ return code;
+}
+
+/*
+ * Set up all the parameters for an arc, chord, ellipse, or pie. If pp3 and
+ * pp4 are NULL, we're filling the entire box. Store the upper left box
+ * corner (for repositioning the cursor), the center, the radius, and the
+ * two angles in *params, and return one of the following (or a negative
+ * error code):
+ */
+typedef enum {
+ /*
+ * Arc box is degenerate (zero width and/or height).
+ * Only origin and center have been set.
+ */
+ arc_degenerate = 0,
+ /*
+ * Arc box is square. No CTM adjustment was required; save_ctm is
+ * not set.
+ */
+ arc_square,
+ /*
+ * Arc box is rectangular, CTM has been saved and adjusted.
+ */
+ arc_rectangular
+} px_arc_type_t;
+typedef struct px_arc_params_s {
+ gs_point origin;
+ gs_point center;
+ double radius;
+ double ang3, ang4;
+ gs_matrix save_ctm;
+ bool reversed;
+} px_arc_params_t;
+static int /* px_arc_type_t or error code */
+setup_arc(px_arc_params_t *params, const px_value_t *pbox,
+ const px_value_t *pp3, const px_value_t *pp4, const px_state_t *pxs, bool ellipse)
+{ real x1 = real_value(pbox, 0);
+ real y1 = real_value(pbox, 1);
+ real x2 = real_value(pbox, 2);
+ real y2 = real_value(pbox, 3);
+ real xc = (x1 + x2) * 0.5;
+ real yc = (y1 + y2) * 0.5;
+ real xr, yr;
+ bool rotated;
+ int code;
+
+#ifdef REFLECT_NEGATIVE_ARCS
+ rotated = x1 > x2;
+ params->reversed = rotated ^ (y1 > y2);
+#else
+ rotated = false;
+ params->reversed = false;
+#endif
+ if ( x1 > x2 )
+ { real temp = x1; x1 = x2; x2 = temp;
+ }
+ if ( y1 > y2 )
+ { real temp = y1; y1 = y2; y2 = temp;
+ }
+ params->origin.x = x1;
+ params->origin.y = y1;
+ xr = (x2 - x1) * 0.5;
+ yr = (y2 - y1) * 0.5;
+ /* From what we can gather ellipses are degenerate if both
+ width and height of the bounding box are 0. Other objects
+ behave as expected. A 0 area bounding box is degenerate */
+ if ( ellipse ) {
+ /* The bounding box is degenerate, set what we can and exit. */
+ if ( xr == 0 && yr == 0 ) {
+ params->center.x = xc;
+ params->center.y = yc;
+ return arc_degenerate;
+ }
+ } else {
+ if ( xr == 0 || yr == 0 ) {
+ params->center.x = xc;
+ params->center.y = yc;
+ return arc_degenerate;
+ }
+ }
+
+ if ( pp3 && pp4 )
+ { real dx3 = real_value(pp3, 0) - xc;
+ real dy3 = real_value(pp3, 1) - yc;
+ real dx4 = real_value(pp4, 0) - xc;
+ real dy4 = real_value(pp4, 1) - yc;
+
+ if ( (dx3 == 0 && dy3 == 0) || (dx4 == 0 && dy4 == 0) )
+ return_error(errorIllegalAttributeValue);
+ { double ang3 = atan2(dy3 * xr, dx3 * yr) * radians_to_degrees;
+ double ang4 = atan2(dy4 * xr, dx4 * yr) * radians_to_degrees;
+
+ if ( rotated )
+ ang3 += 180, ang4 += 180;
+ params->ang3 = ang3;
+ params->ang4 = ang4;
+ }
+ }
+ params->radius = yr;
+ if ( xr == yr )
+ { params->center.x = xc;
+ params->center.y = yc;
+ return arc_square;
+ }
+ else
+ { /* Must adjust the CTM. Move the origin to (xc,yc) */
+ /* for simplicity. */
+ if ( (code = gs_currentmatrix(pxs->pgs, &params->save_ctm)) < 0 ||
+ (code = gs_translate(pxs->pgs, xc, yc)) < 0 ||
+ (code = gs_scale(pxs->pgs, xr, yr)) < 0
+ )
+ return code;
+ params->center.x = 0;
+ params->center.y = 0;
+ params->radius = 1.0;
+ return arc_rectangular;
+ }
+}
+
+/* per the nonsense in 5.7.3 (The ROP3 Operands) from the pxl
+ reference manual the following rops are allowed for stroking. */
+static bool
+pxl_allow_rop_for_stroke(gs_state *pgs)
+{
+ gs_rop3_t rop = gs_currentrasterop(pgs);
+ if ( rop == 0 || rop == 160 || rop == 170 || rop == 240 || rop == 250 || rop == 255 )
+ return true;
+ return false;
+}
+
+/* Paint the current path, optionally resetting it afterwards. */
+static int
+paint_path(px_state_t *pxs, bool reset)
+{ gs_state *pgs = pxs->pgs;
+ gx_path *ppath = gx_current_path(pgs);
+ px_gstate_t *pxgs = pxs->pxgs;
+ bool will_stroke = pxgs->pen.type != pxpNull;
+ gs_point cursor;
+ int code = 0;
+ gx_path *save_path = 0;
+
+ if ( gx_path_is_void(ppath) )
+ return 0; /* nothing to draw */
+#ifdef NO_SCALE_DASH_PATTERN
+# define save_for_stroke (!reset || pxgs->dashed)
+#else
+# define save_for_stroke (!reset)
+#endif
+ if ( pxgs->brush.type != pxpNull )
+ { int (*fill_proc)(gs_state *) =
+ (pxgs->fill_mode == eEvenOdd ? gs_eofill : gs_fill);
+
+ if ( (code = px_set_paint(&pxgs->brush, pxs)) < 0 )
+ return code;
+ pxs->have_page = true;
+ if ( !will_stroke && reset )
+ { gs_currentpoint(pgs, &cursor);
+ code = (*fill_proc)(pgs);
+ gs_moveto(pgs, cursor.x, cursor.y);
+ return code;
+ }
+ save_path = gx_path_alloc(pxs->memory, "paint_path(save_path)");
+ if ( save_path == 0 )
+ return_error(errorInsufficientMemory);
+ gx_path_assign_preserve(save_path, ppath);
+ code = (*fill_proc)(pgs);
+ if ( code < 0 )
+ goto rx;
+ if ( !will_stroke )
+ goto rx;
+ if ( save_for_stroke )
+ gx_path_assign_preserve(ppath, save_path);
+ else {
+ gx_path_assign_free(ppath, save_path);
+ gx_setcurrentpoint_from_path((gs_imager_state *)pgs, ppath);
+ gs_currentpoint(pgs, &cursor);
+ save_path = 0;
+ }
+ }
+ else if ( !will_stroke )
+ return 0;
+ else if ( save_for_stroke )
+ { save_path =
+ gx_path_alloc(pxs->memory, "paint_path(save_path)");
+ if ( save_path == 0 )
+ return_error(errorInsufficientMemory);
+ gx_path_assign_preserve(save_path, ppath);
+ }
+ else
+ gs_currentpoint(pgs, &cursor);
+ /*
+ * The PCL XL documentation from H-P says that dash lengths do not
+ * scale according to the CTM, but according to H-P developer
+ * support, this isn't true. We went to the trouble of implementing
+ * the published specification, so if it turns out to be right after
+ * all, we execute the following block of code.
+ */
+#ifdef NO_SCALE_DASH_PATTERN
+ /*
+ * If we have a dash pattern that was defined with a different
+ * CTM than the current one, we must pre-expand the dashes.
+ * (Eventually we should expand the library API to handle this.)
+ */
+ if ( pxgs->dashed )
+ { gs_matrix mat;
+ gs_currentmatrix(pgs, &mat);
+ if ( mat.xx != pxgs->dash_matrix.xx ||
+ mat.xy != pxgs->dash_matrix.xy ||
+ mat.yx != pxgs->dash_matrix.yx ||
+ mat.yy != pxgs->dash_matrix.yy
+ )
+ { code = gs_flattenpath(pgs);
+ if ( code < 0 )
+ goto rx;
+ gs_setmatrix(pgs, &pxgs->dash_matrix);
+ code = gs_dashpath(pgs);
+ gs_setmatrix(pgs, &mat);
+ if ( code < 0 )
+ goto rx;
+ }
+ }
+#endif
+ /*
+ * Per the description in the PCL XL reference documentation,
+ * set a standard logical operation and transparency for stroking.
+ */
+ {
+ gs_rop3_t save_rop = gs_currentrasterop(pgs);
+ bool save_transparent = gs_currenttexturetransparent(pgs);
+ bool need_restore_rop = false;
+
+ if (pxl_allow_rop_for_stroke(pgs) == false) {
+ gs_setrasterop(pgs, rop3_T);
+ gs_settexturetransparent(pgs, false);
+ need_restore_rop = true;
+ }
+ pxs->have_page = true;
+ /*
+ * The H-P printers thicken very thin strokes slightly.
+ * We do the same here.
+ */
+ {
+ float width = gs_currentlinewidth(pgs);
+ gs_matrix mat;
+ float sx, sy;
+
+ gs_currentmatrix(pgs, &mat);
+ sx = fabs(mat.xx) + fabs(mat.xy);
+ sy = fabs(mat.yx) + fabs(mat.yy);
+ width *= min(sx, sy);
+ if ( width < 5 )
+ gs_setfilladjust(pgs, 0.5, 0.5);
+ }
+ if ( (code = px_set_paint(&pxgs->pen, pxs)) < 0 ||
+ (code = gs_stroke(pgs)) < 0
+ )
+ DO_NOTHING;
+ if ( need_restore_rop ) {
+ gs_setrasterop(pgs, save_rop);
+ gs_settexturetransparent(pgs, save_transparent);
+ }
+ gs_setfilladjust(pgs, 0.0, 0.0);
+ }
+ rx: if ( save_path ) {
+ gx_path_assign_free(ppath, save_path); /* path without a Current point! */
+ gx_setcurrentpoint_from_path((gs_imager_state *)pgs, ppath);
+ }
+ else /* Iff save_path is NULL, set currentpoint back to original */
+ gs_moveto(pgs, cursor.x, cursor.y);
+ return code;
+}
+
+/* Paint a shape defined by a one-operator path. */
+static int
+paint_shape(px_args_t *par, px_state_t *pxs, px_operator_proc((*path_op)))
+{ int code;
+ if ( (code = pxNewPath(par, pxs)) < 0 ||
+ (code = (*path_op)(par, pxs)) < 0
+ )
+ return code;
+ /* See the beginning of the file regarding the following. */
+#ifdef NEWPATH_AFTER_PAINT_SHAPE
+ return paint_path(pxs, true);
+#else
+ return paint_path(pxs, false);
+#endif
+}
+
+/* ---------------- Operators ---------------- */
+
+const byte apxCloseSubPath[] = {0, 0};
+int
+pxCloseSubPath(px_args_t *par, px_state_t *pxs)
+{ return gs_closepath(pxs->pgs);
+}
+
+const byte apxNewPath[] = {0, 0};
+int
+pxNewPath(px_args_t *par, px_state_t *pxs)
+{ return gs_newpath(pxs->pgs);
+}
+
+const byte apxPaintPath[] = {0, 0};
+int
+pxPaintPath(px_args_t *par, px_state_t *pxs)
+{ return paint_path(pxs, false);
+}
+
+const byte apxArcPath[] = {
+ pxaBoundingBox, pxaStartPoint, pxaEndPoint, 0,
+ pxaArcDirection, 0
+};
+int
+pxArcPath(px_args_t *par, px_state_t *pxs)
+{ /*
+ * Note that "clockwise" in user space is counter-clockwise on
+ * the page, because the Y coordinate is inverted.
+ */
+ bool clockwise =
+ (par->pv[3] != 0 && par->pv[3]->value.i == eClockWise);
+ px_arc_params_t params;
+ int code = setup_arc(&params, par->pv[0], par->pv[1], par->pv[2], pxs, false);
+ int rcode = code;
+
+ if ( code >= 0 && code != arc_degenerate )
+ { bool closed = params.ang3 == params.ang4;
+ clockwise ^= params.reversed;
+ if ( closed )
+ { if ( clockwise ) params.ang4 += 360;
+ else params.ang3 += 360;
+ }
+ code = gs_arc_add(pxs->pgs, !clockwise, params.center.x,
+ params.center.y, params.radius, params.ang3,
+ params.ang4, false);
+ if ( code >= 0 && closed )
+ { /* We have to close the path explicitly. */
+ code = gs_closepath(pxs->pgs);
+ }
+ }
+ if ( rcode == arc_rectangular )
+ gs_setmatrix(pxs->pgs, &params.save_ctm);
+ return code;
+}
+
+const byte apxBezierPath[] = {
+ 0, pxaNumberOfPoints, pxaPointType, pxaControlPoint1, pxaControlPoint2,
+ pxaEndPoint, 0
+};
+int
+pxBezierPath(px_args_t *par, px_state_t *pxs)
+{ return add_curves(par, pxs, gs_curveto);
+}
+
+const byte apxBezierRelPath[] = {
+ 0, pxaNumberOfPoints, pxaPointType, pxaControlPoint1, pxaControlPoint2,
+ pxaEndPoint, 0
+};
+int
+pxBezierRelPath(px_args_t *par, px_state_t *pxs)
+{ return add_curves(par, pxs, gs_rcurveto);
+}
+
+const byte apxChord[] = {
+ pxaBoundingBox, pxaStartPoint, pxaEndPoint, 0, 0
+};
+px_operator_proc(pxChordPath);
+int
+pxChord(px_args_t *par, px_state_t *pxs)
+{ return paint_shape(par, pxs, pxChordPath);
+}
+
+const byte apxChordPath[] = {
+ pxaBoundingBox, pxaStartPoint, pxaEndPoint, 0, 0
+};
+int
+pxChordPath(px_args_t *par, px_state_t *pxs)
+{ px_arc_params_t params;
+ int code = setup_arc(&params, par->pv[0], par->pv[1], par->pv[2], pxs, false);
+ int rcode = code;
+
+ /* See ArcPath above for the meaning of "clockwise". */
+ if ( code >= 0 && code != arc_degenerate )
+ { if ( params.ang3 == params.ang4 )
+ params.ang3 += 360;
+ code = gs_arc_add(pxs->pgs, !params.reversed,
+ params.center.x, params.center.y,
+ params.radius, params.ang3, params.ang4,
+ false);
+ if ( code >= 0 )
+ code = gs_closepath(pxs->pgs);
+ }
+ if ( rcode == arc_rectangular )
+ gs_setmatrix(pxs->pgs, &params.save_ctm);
+ if ( code >= 0 )
+ code = gs_moveto(pxs->pgs, params.origin.x, params.origin.y);
+ return code;
+
+}
+
+const byte apxEllipse[] = {
+ pxaBoundingBox, 0, 0
+};
+px_operator_proc(pxEllipsePath);
+int
+pxEllipse(px_args_t *par, px_state_t *pxs)
+{ return paint_shape(par, pxs, pxEllipsePath);
+}
+
+const byte apxEllipsePath[] = {
+ pxaBoundingBox, 0, 0
+};
+int
+pxEllipsePath(px_args_t *par, px_state_t *pxs)
+{ px_arc_params_t params;
+ int code = setup_arc(&params, par->pv[0], NULL, NULL, pxs, true);
+ int rcode = code;
+ real a_start = 180.0;
+ real a_end = -180.0;
+
+ /* swap start and end angles if counter clockwise ellipse */
+ if ( params.reversed )
+ { a_start = -180.0;
+ a_end = 180.0;
+ }
+ /* See ArcPath above for the meaning of "clockwise". */
+ if ( code < 0 || code == arc_degenerate ||
+ (code = gs_arc_add(pxs->pgs, !params.reversed,
+ params.center.x, params.center.y,
+ params.radius, a_start, a_end, false)) < 0 ||
+ /* We have to close the path explicitly. */
+ (code = gs_closepath(pxs->pgs)) < 0
+ )
+ DO_NOTHING;
+ if ( rcode == arc_rectangular )
+ gs_setmatrix(pxs->pgs, &params.save_ctm);
+ if ( code >= 0 )
+ code = gs_moveto(pxs->pgs, params.origin.x, params.origin.y);
+ return code;
+}
+
+const byte apxLinePath[] = {
+ 0, pxaEndPoint, pxaNumberOfPoints, pxaPointType, 0
+};
+int
+pxLinePath(px_args_t *par, px_state_t *pxs)
+{ return add_lines(par, pxs, gs_lineto);
+}
+
+const byte apxLineRelPath[] = {
+ 0, pxaEndPoint, pxaNumberOfPoints, pxaPointType, 0
+};
+int
+pxLineRelPath(px_args_t *par, px_state_t *pxs)
+{ return add_lines(par, pxs, gs_rlineto);
+}
+
+const byte apxPie[] = {
+ pxaBoundingBox, pxaStartPoint, pxaEndPoint, 0, 0
+};
+px_operator_proc(pxPiePath);
+int
+pxPie(px_args_t *par, px_state_t *pxs)
+{ return paint_shape(par, pxs, pxPiePath);
+}
+
+const byte apxPiePath[] = {
+ pxaBoundingBox, pxaStartPoint, pxaEndPoint, 0, 0
+};
+int
+pxPiePath(px_args_t *par, px_state_t *pxs)
+{ px_arc_params_t params;
+ int code = setup_arc(&params, par->pv[0], par->pv[1], par->pv[2], pxs, false);
+ int rcode = code;
+
+ /* See ArcPath above for the meaning of "clockwise". */
+ if ( code >= 0 && code != arc_degenerate )
+ { if ( params.ang3 == params.ang4 )
+ params.ang3 += 360;
+ code = gs_moveto(pxs->pgs, params.center.x, params.center.y);
+ if ( code >= 0 )
+ { code = gs_arc_add(pxs->pgs, !params.reversed,
+ params.center.x, params.center.y,
+ params.radius, params.ang3, params.ang4,
+ true);
+ }
+ }
+ if ( rcode == arc_rectangular )
+ gs_setmatrix(pxs->pgs, &params.save_ctm);
+ if ( code < 0 || rcode == arc_degenerate ||
+ (code = gs_closepath(pxs->pgs)) < 0 ||
+ (code = gs_moveto(pxs->pgs, params.origin.x, params.origin.y)) < 0
+ )
+ DO_NOTHING;
+ return code;
+}
+
+const byte apxRectangle[] = {
+ pxaBoundingBox, 0, 0
+};
+px_operator_proc(pxRectanglePath);
+int
+pxRectangle(px_args_t *par, px_state_t *pxs)
+{ return paint_shape(par, pxs, pxRectanglePath);
+}
+
+const byte apxRectanglePath[] = {
+ pxaBoundingBox, 0, 0
+};
+int
+pxRectanglePath(px_args_t *par, px_state_t *pxs)
+{ floatp x1, y1, x2, y2;
+ gs_fixed_point p1;
+ gs_state *pgs = pxs->pgs;
+ gx_path *ppath = gx_current_path(pgs);
+ gs_fixed_point lines[3];
+#define p2 lines[1]
+#define pctm (&((const gs_imager_state *)pgs)->ctm)
+ int code;
+
+ set_box_value(x1, y1, x2, y2, par->pv[0]);
+ /*
+ * Rectangles are always drawn in a canonical order.
+ */
+ if ( x1 > x2 )
+ { floatp t = x1; x1 = x2; x2 = t; }
+ if ( y1 > y2 )
+ { floatp t = y1; y1 = y2; y2 = t; }
+ if ( (code = gs_point_transform2fixed(pctm, x1, y1, &p1)) < 0 ||
+ (code = gs_point_transform2fixed(pctm, x2, y2, &p2)) < 0 ||
+ (code = gs_moveto(pgs, x1, y1)) < 0
+ )
+ return code;
+#ifdef DRAW_RECTANGLES_CLOCKWISE
+ /*
+ * DRAW_RECTANGLES_CLOCKWISE means clockwise on the page, which is
+ * counter-clockwise in user space.
+ */
+ if ( (code = gs_point_transform2fixed(pctm, x2, y1, &lines[0])) < 0 ||
+ (code = gs_point_transform2fixed(pctm, x1, y2, &lines[2])) < 0
+ )
+ return code;
+#else
+ if ( (code = gs_point_transform2fixed(pctm, x1, y2, &lines[0])) < 0 ||
+ (code = gs_point_transform2fixed(pctm, x2, y1, &lines[2])) < 0
+ )
+ return code;
+#endif
+ if ( (code = gx_path_add_lines(ppath, lines, 3)) < 0 )
+ return code;
+ return gs_closepath(pgs);
+#undef pctm
+#undef p2
+}
+
+const byte apxRoundRectangle[] = {
+ pxaBoundingBox, pxaEllipseDimension, 0, 0
+};
+px_operator_proc(pxRoundRectanglePath);
+int
+pxRoundRectangle(px_args_t *par, px_state_t *pxs)
+{ return paint_shape(par, pxs, pxRoundRectanglePath);
+}
+
+const byte apxRoundRectanglePath[] = {
+ pxaBoundingBox, pxaEllipseDimension, 0, 0
+};
+int
+pxRoundRectanglePath(px_args_t *par, px_state_t *pxs)
+{ floatp x1, y1, x2, y2;
+ real xr = real_value(par->pv[1], 0) * 0.5;
+ real yr = real_value(par->pv[1], 1) * 0.5;
+ real xd, yd;
+ gs_matrix save_ctm;
+ gs_state *pgs = pxs->pgs;
+ int code;
+
+ set_box_value(x1, y1, x2, y2, par->pv[0]);
+ xd = x2 - x1;
+ yd = y2 - y1;
+ /*
+ * H-P printers give an error if the points are specified out
+ * of order.
+ */
+ if ( xd < 0 || yd < 0 )
+ return_error(errorIllegalAttributeValue);
+ if ( xr == 0 || yr == 0 )
+ return pxRectanglePath(par, pxs);
+ gs_currentmatrix(pgs, &save_ctm);
+ gs_translate(pgs, x1, y1);
+ if ( xr != yr )
+ { /* Change coordinates so the arcs are circular. */
+ double scale = xr / yr;
+ if ( (code = gs_scale(pgs, scale, 1.0)) < 0 )
+ return code;
+ xd *= yr / xr;
+ }
+#define r yr
+ /*
+ * Draw the rectangle counter-clockwise on the page, which is
+ * clockwise in user space. (This may be reversed if the
+ * coordinates are specified in a non-standard order.)
+ */
+ if ( (code = gs_moveto(pgs, 0.0, r)) < 0 ||
+ (code = gs_arcn(pgs, r, yd - r, r, 180.0, 90.0)) < 0 ||
+ (code = gs_arcn(pgs, xd - r, yd - r, r, 90.0, 0.0)) < 0 ||
+ (code = gs_arcn(pgs, xd - r, r, r, 0.0, 270.0)) < 0 ||
+ (code = gs_arcn(pgs, r, r, r, 270.0, 180.0)) < 0 ||
+ (code = gs_closepath(pgs)) < 0 ||
+ (code = gs_moveto(pgs, 0.0, 0.0)) < 0
+ )
+ return code;
+#undef r
+ return gs_setmatrix(pgs, &save_ctm);
+}
+
+const byte apxText[] = {
+ pxaTextData, 0, pxaXSpacingData, pxaYSpacingData, 0
+};
+int
+pxText(px_args_t *par, px_state_t *pxs)
+{ { int code = px_set_paint(&pxs->pxgs->brush, pxs);
+ if ( code < 0 )
+ return code;
+ }
+ if ( par->pv[0]->value.array.size != 0 &&
+ pxs->pxgs->brush.type != pxpNull
+ )
+ pxs->have_page = true;
+ return px_text(par, pxs, false);
+}
+
+const byte apxTextPath[] = {
+ pxaTextData, 0, pxaXSpacingData, pxaYSpacingData, 0
+};
+int
+pxTextPath(px_args_t *par, px_state_t *pxs)
+{
+ int code = px_set_paint(&pxs->pxgs->pen, pxs);
+ if ( code < 0 )
+ return code;
+ /* NB this should be refactored with pxText (immediately above)
+ and it is not a good heuristic for detecting a marked page. */
+ if ( par->pv[0]->value.array.size != 0 &&
+ pxs->pxgs->pen.type != pxpNull
+ )
+ pxs->have_page = true;
+ return px_text(par, pxs, true);
+}
+
diff --git a/pxl/pxparse.c b/pxl/pxparse.c
new file mode 100644
index 000000000..6ffb10d39
--- /dev/null
+++ b/pxl/pxparse.c
@@ -0,0 +1,917 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxparse.c */
+/* PCL XL parser */
+
+#include "memory_.h"
+#include "gdebug.h"
+#include "gserror.h"
+#include "gsio.h"
+#include "gstypes.h"
+#include "plparse.h"
+#include "pxattr.h"
+#include "pxenum.h"
+#include "pxerrors.h"
+#include "pxoper.h"
+#include "pxtag.h"
+#include "pxvalue.h"
+#include "pxparse.h" /* requires pxattr.h, pxvalue.h */
+#include "pxptable.h" /* requires pxenum.h, pxoper.h, pxvalue.h */
+#include "pxstate.h"
+#include "pxpthr.h"
+#include "gsstruct.h"
+
+/* GC structures and procedures */
+gs_private_st_composite(st_px_parser_state, px_parser_state_t,
+ "px_parser_state_t", parser_state_enum_ptrs, parser_state_reloc_ptrs);
+#define st ((px_parser_state_t *)vptr)
+static ENUM_PTRS_BEGIN(parser_state_enum_ptrs)
+ /* Mark from array pointers on the stack. */
+ if ( index < st->stack_count )
+ { px_value_t *pv = &st->stack[index];
+ ENUM_RETURN((!(~pv->type & (pxd_array | pxd_on_heap)) ?
+ pv->value.array.data : 0));
+ }
+ return 0;
+ENUM_PTRS_END
+static RELOC_PTRS_BEGIN(parser_state_reloc_ptrs) {
+ px_parser_state_t *st_new =
+ (*gc_proc(gcst, reloc_struct_ptr))((const void *)st, gcst);
+ long diff = (byte *)st_new - (byte *)st;
+
+ /* Relocate array pointers on the stack. */
+ { px_value_t *pv = &st->stack[0];
+ int i;
+
+ for ( i = 0; i < st->stack_count; ++pv, ++i )
+ if ( !(~pv->type & (pxd_array | pxd_on_heap)) )
+ RELOC_OBJ_VAR(pv->value.array.data);
+ }
+ /* Relocate the pointers from the args. */
+ st->args.parser = st_new;
+ { px_value_t **ppv = &st->args.pv[0];
+ int i;
+
+ for ( i = 0; i < max_px_args; ++ppv, ++i )
+ if ( *ppv )
+ *ppv = (px_value_t *)((byte *)*ppv + diff);
+ }
+} RELOC_PTRS_END
+#undef st
+
+/*
+ * We define the syntax of each possible tag by 4 parameters:
+ * - The minimum number of input bytes required to parse it;
+ * - A mask and match value for the state(s) in which it is legal;
+ * - A transition mask to be xor'ed with the state.
+ * See pxparse.h for the state mask values.
+ */
+typedef struct px_tag_syntax_s {
+ byte min_input;
+ byte state_value;
+ byte state_mask;
+ byte state_transition;
+} px_tag_syntax_t;
+
+/* Define the common syntaxes. */
+#define N (ptsData|ptsReading) /* normal state */
+#define I {1,0,0,0} /* illegal or unusual */
+#define P {1,ptsInPage,ptsInPage|N,0} /* ordinary operator */
+#define C {1,ptsInSession,ptsInSession|N,0} /* control operator */
+#define R(p,r,t) /* reading operator */\
+ {1,ptsInSession|p|r,ptsInSession|p|N,t}
+#define D(n) {n,0,ptsData,ptsData} /* data type */
+#define DI D(1) /* invalid data type */
+#define A(n) {n,ptsData,ptsData,ptsData} /* attribute */
+
+/* Define the syntax of all tags. */
+static const px_tag_syntax_t tag_syntax[256] = {
+/*0x*/
+ I,I,I,I,I,I,I,I, I,I,I,I,I,I,I,I,
+/*1x*/
+ I,I,I,I,I,I,I,I, I,I,I,{2,0,0,0},I,I,I,I,
+/*2x*/
+ I,I,I,I,I,I,I,I, I,I,I,I,I,I,I,I,
+/*3x*/
+ I,I,I,I,I,I,I,I, I,I,I,I,I,I,I,I,
+/*4x*/
+ {2,0,ptsInSession|N,0},
+ {1,0,ptsInSession|N,ptsInSession},
+ {1,ptsInSession,ptsInSession|ptsInPage|N,ptsInSession},
+ {1,ptsInSession,ptsInSession|ptsInPage|N,ptsInPage},
+ {1,ptsInPage,ptsInPage|N,ptsInPage},
+ P,{1,1,1,0},C,
+ C,C,P,P,P,P,P,R(0,0,ptsReadingFont),
+/*5x*/
+ R(0,ptsReadingFont,0),
+ R(0,ptsReadingFont,ptsReadingFont),
+ R(0,0,ptsReadingChar),
+ R(0,ptsReadingChar,0),
+ R(0,ptsReadingChar,ptsReadingChar),
+ C,P,P,
+ P,P,P,
+ {1,ptsInSession,ptsInSession|ptsExecStream|N,ptsReadingStream},
+ {1,ptsInSession|ptsReadingStream,ptsInSession|ptsExecStream|N,0},
+ {1,ptsInSession|ptsReadingStream,ptsInSession|ptsExecStream|N,ptsReadingStream},
+ {1,ptsInSession,ptsInSession|ptsReadingStream|N,0},
+ P,
+/*6x*/
+ P,P,P,P,P,P,P,P, P,P,P,P,P,P,P,P,
+/*7x*/
+ P,P,P,P,P,P,P,P, P,P,P,P,P,P,P,P,
+/*8x*/
+ P,P,P,P,P,P,P,P, P,P,P,P,P,P,P,P,
+/*9x*/
+ P,P,P,P,P,P,P,P, P,P,P,P,P,P,P,P,
+/*ax*/
+ P,P,P,P,P,P,P,P, P,P,P,P,P,P,P,P,
+/*bx*/
+ R(ptsInPage,0,ptsReadingImage),
+ R(ptsInPage,ptsReadingImage,0),
+ R(ptsInPage,ptsReadingImage,ptsReadingImage),
+ R(ptsInPage,0,ptsReadingRastPattern),
+ R(ptsInPage,ptsReadingRastPattern,0),
+ R(ptsInPage,ptsReadingRastPattern,ptsReadingRastPattern),
+ R(ptsInPage,0,ptsReadingScan),
+ P,
+ R(ptsInPage,ptsReadingScan,ptsReadingScan),
+ R(ptsInPage,ptsReadingScan,0),
+ P,P,P,P,P,P,
+/*cx*/
+ D(2),D(3),D(5),D(3),D(5),D(5),DI,DI,
+ D(3),D(3),D(3),D(3),D(3),D(3),DI,DI,
+/*dx*/
+ D(3),D(5),D(9),D(5),D(9),D(9),DI,DI,
+ DI,DI,DI,DI,DI,DI,DI,DI,
+/*ex*/
+ D(5),D(9),D(17),D(9),D(17),D(17),DI,DI,
+ DI,DI,DI,DI,DI,DI,DI,DI,
+/*fx*/
+ I,I,I,I,I,I,I,I,
+ A(2),A(3),{5,0,0,0},{2,0,0,0},I,I,I,I
+};
+#undef I
+#undef P
+#undef C
+#undef R
+#undef D
+#undef DI
+#undef A
+
+/* Allocate a parser state. */
+px_parser_state_t *
+px_process_alloc(gs_memory_t *memory)
+{ px_parser_state_t *st = gs_alloc_struct(memory, px_parser_state_t,
+ &st_px_parser_state,
+ "px_process_alloc");
+ if ( st == 0 )
+ return 0;
+ st->memory = memory;
+ px_process_init(st, true);
+ return st;
+}
+
+/* Release a parser state. */
+void
+px_process_release(px_parser_state_t *st)
+{ gs_free_object(st->memory, st, "px_process_alloc");
+}
+
+/* Initialize the parser state. */
+void
+px_process_init(px_parser_state_t *st, bool big_endian)
+{ st->big_endian = big_endian;
+ st->operator_count = 0;
+ st->parent_operator_count = 0;
+ st->last_operator = pxtNull;
+ st->saved_count = 0;
+ st->data_left = 0;
+ st->macro_state = ptsInitial;
+ st->stack_count = 0;
+ st->data_proc = 0;
+ { int i;
+ for ( i = 0; i < max_px_args; ++i )
+ st->args.pv[i] = 0;
+ }
+ st->args.parser = 0; /* for garbage collector */
+ memset(st->attribute_indices, 0, px_attribute_next);
+}
+
+/* Get numeric values from the input. */
+#define get_uint16(st, p) uint16at(p, st->big_endian)
+#define get_sint16(st, p) sint16at(p, st->big_endian)
+#define get_uint32(st, p) uint32at(p, st->big_endian)
+#define get_sint32(st, p) sint32at(p, st->big_endian)
+#define get_real32(st, p) real32at(p, st->big_endian)
+
+/* Move an array to the heap for persistence if needed. */
+/* See pxoper.h for details. */
+static int
+px_save_array(px_value_t *pv, px_state_t *pxs, client_name_t cname,
+ uint nbytes)
+{ if ( pv->type & pxd_on_heap )
+ { /* Turn off the "on heap" bit, to prevent freeing. */
+ pv->type &= ~pxd_on_heap;
+ }
+ else
+ { /* Allocate a heap copy. Only the first nbytes bytes */
+ /* of the data are valid. */
+ uint num_elements = pv->value.array.size;
+ uint elt_size = value_size(pv);
+
+ byte *copy = gs_alloc_byte_array(pxs->memory, num_elements,
+ elt_size, cname);
+ if ( copy == 0 )
+ return_error(errorInsufficientMemory);
+ memcpy(copy, pv->value.array.data, nbytes);
+ pv->value.array.data = copy;
+ }
+ return 0;
+}
+
+/* Clear the stack and the attribute indices, */
+/* and free heap-allocated arrays. */
+#define clear_stack()\
+ for ( ; sp > st->stack; --sp )\
+ { if ( sp->type & pxd_on_heap )\
+ gs_free_object(memory, (void *)sp->value.array.data,\
+ "px stack pop");\
+ st->attribute_indices[sp->attribute] = 0;\
+ }
+
+/* Define data tracing if debugging. */
+#ifdef DEBUG
+# define trace_data(format, cast, ptr, count)\
+ do\
+ { uint i_;\
+ for ( i_ = 0; i_ < count; ++i_ )\
+ dprintf1(format, (cast)((ptr)[i_]));\
+ dputc('\n');\
+ }\
+ while (0)
+static void
+trace_array_data(const char *label, const px_value_t *pav)
+{ px_data_type_t type = pav->type;
+ const byte *ptr = pav->value.array.data;
+ uint count = pav->value.array.size;
+ bool big_endian = (type & pxd_big_endian) != 0;
+ bool text = (type & pxd_ubyte) != 0;
+ uint i;
+
+ dputs(label);
+ dputs((type & pxd_ubyte ? " <" : " {"));
+ for ( i = 0; i < count; ++i )
+ { if ( !(i & 15) && i )
+ { const char *p;
+ dputs("\n ");
+ for ( p = label; *p; ++p )
+ dputc(' ');
+ }
+ if ( type & pxd_ubyte )
+ { dprintf1("%02x ", ptr[i]);
+ if ( ptr[i] < 32 || ptr[i] > 126 )
+ text = false;
+ }
+ else if ( type & pxd_uint16 )
+ dprintf1("%u ", uint16at(ptr + i * 2, big_endian));
+ else if ( type & pxd_sint16 )
+ dprintf1("%d ", sint16at(ptr + i * 2, big_endian));
+ else if ( type & pxd_uint32 )
+ dprintf1("%lu ", (ulong)uint32at(ptr + i * 4, big_endian));
+ else if ( type & pxd_sint32 )
+ dprintf1("%ld ", (long)sint32at(ptr + i * 4, big_endian));
+ else if ( type & pxd_real32 )
+ dprintf1("%g ", real32at(ptr + i * 4, big_endian));
+ else
+ dputs("? ");
+ }
+ dputs((type & pxd_ubyte ? ">\n" : "}\n"));
+ if ( text )
+ { dputs("%chars: \"");
+ debug_print_string(ptr, count);
+ dputs("\"\n");
+ }
+}
+# define trace_array(pav)\
+ if ( gs_debug_c('I') )\
+ trace_array_data("array:", pav)
+#else
+# define trace_data(format, cast, ptr, count) DO_NOTHING
+# define trace_array(pav) DO_NOTHING
+#endif
+
+/* Process a buffer of PCL XL commands. */
+int
+px_process(px_parser_state_t *st, px_state_t *pxs, stream_cursor_read *pr)
+{ const byte *orig_p = pr->ptr;
+ const byte *next_p = orig_p; /* start of data not copied to saved */
+ const byte *p;
+ const byte *rlimit;
+ px_value_t *sp = &st->stack[st->stack_count];
+#define stack_limit &st->stack[max_stack - 1]
+ gs_memory_t *memory = st->memory;
+ int code = 0;
+ uint left;
+ uint min_left;
+ px_tag_t tag;
+ const px_tag_syntax_t *syntax = 0;
+
+ st->args.parser = st;
+ st->parent_operator_count = 0; /* in case of error */
+ /* Check for leftover data from the previous call. */
+parse: if ( st->saved_count )
+ { /* Fill up the saved buffer so we can make progress. */
+ int move = min(sizeof(st->saved) - st->saved_count,
+ pr->limit - next_p);
+ memcpy(&st->saved[st->saved_count], next_p + 1, move);
+ next_p += move;
+ p = st->saved - 1;
+ rlimit = p + st->saved_count + move;
+ }
+ else
+ { /* No leftover data, just read from the input. */
+ p = next_p;
+ rlimit = pr->limit;
+ }
+top: if ( st->data_left )
+ { /* We're in the middle of reading an array or data block. */
+ if ( st->data_proc )
+ { /* This is a data block. */
+ uint avail = min(rlimit - p, st->data_left);
+ uint used;
+
+ st->args.source.available = avail;
+ st->args.source.data = p + 1;
+ code = (*st->data_proc)(&st->args, pxs);
+ used = st->args.source.data - (p + 1);
+#ifdef DEBUG
+ if ( gs_debug_c('I') )
+ { px_value_t data_array;
+ data_array.type = pxd_ubyte;
+ data_array.value.array.data = p + 1;
+ data_array.value.array.size = used;
+ trace_array_data("data:", &data_array);
+ }
+#endif
+ p = st->args.source.data - 1;
+ st->data_left -= used;
+ if ( code < 0 )
+ { st->args.source.position = 0;
+ goto x;
+ }
+ else if ( ( code == pxNeedData ) || ( code == pxPassThrough && st->data_left != 0 ) )
+ { code = 0; /* exit for more data */
+ goto x;
+ }
+ else
+ { st->args.source.position = 0;
+ st->data_proc = 0;
+ if ( st->data_left != 0 )
+ { code = gs_note_error(errorExtraData);
+ goto x;
+ }
+ clear_stack();
+ }
+ }
+ else
+ { /* This is an array. */
+ uint size = sp->value.array.size;
+ uint scale = value_size(sp);
+ uint nbytes = size * scale;
+ byte *dest =
+ (byte *)sp->value.array.data + nbytes - st->data_left;
+
+ left = rlimit - p;
+ if ( left < st->data_left )
+ { /* We still don't have enough data to fill the array. */
+ memcpy(dest, p + 1, left);
+ st->data_left -= left;
+ p = rlimit;
+ code = 0;
+ goto x;
+ }
+ /* Complete the array and continue parsing. */
+ memcpy(dest, p + 1, st->data_left);
+ trace_array(sp);
+ p += st->data_left;
+ }
+ st->data_left = 0;
+ }
+ else if ( st->data_proc )
+ { /* An operator is awaiting data. */
+ /* Skip white space until we find some. */
+ code = 0; /* in case we exit */
+ while ( (left = rlimit - p) != 0 )
+ { switch ( (tag = p[1]) )
+ {
+ case pxtNull:
+ case pxtHT: case pxtLF: case pxtVT: case pxtFF: case pxtCR:
+ ++p;
+ continue;
+ case pxt_dataLength:
+ if ( left < 5 )
+ goto x; /* can't look ahead */
+ st->data_left = get_uint32(st, p + 2);
+ if_debug2('i', "tag= 0x%2x data, length %u\n",
+ p[1], st->data_left);
+ p += 5;
+ goto top;
+ case pxt_dataLengthByte:
+ if ( left < 2 )
+ goto x; /* can't look ahead */
+ st->data_left = p[2];
+ if_debug2('i', "tag= 0x%2x data, length %u\n",
+ p[1], st->data_left);
+ p += 2;
+ goto top;
+ default:
+ { code = gs_note_error(errorMissingData);
+ goto x;
+ }
+ }
+ }
+ }
+ st->args.source.position = 0;
+ st->args.source.available = 0;
+ while ( (left = rlimit - p) != 0 &&
+ left >= (min_left = (syntax = &tag_syntax[tag = p[1]])->min_input)
+ )
+ { int count;
+#ifdef DEBUG
+ if ( gs_debug_c('i') )
+ { dprintf1("tag= 0x%02x ", tag);
+ if ( tag == pxt_attr_ubyte || tag == pxt_attr_uint16 )
+ { px_attribute_t attr =
+ (tag == pxt_attr_ubyte ? p[2] : get_uint16(st, p + 2));
+ const char *aname = px_attribute_names[attr];
+ if ( aname )
+ dprintf1(" @%s\n", aname);
+ else
+ dprintf1(" attribute %u ???\n", attr);
+ }
+ else
+ { const char *format;
+ const char *tname;
+ bool operator = false;
+ if ( tag < 0x40 )
+ format = "%s\n", tname = px_tag_0_names[tag];
+ else if ( tag < 0xc0 )
+ format = "%s", tname = px_operator_names[tag - 0x40],
+ operator = true;
+ else
+ { tname = px_tag_c0_names[tag - 0xc0];
+ if ( tag < 0xf0 )
+ format = " %s"; /* data values follow */
+ else
+ format = "%s\n";
+ }
+ if ( tname ) {
+ dprintf1(format, tname);
+ if (operator)
+ dprintf1(" (%ld)\n", st->operator_count+1);
+ }
+ else
+ dputs("???\n");
+ }
+ }
+#endif
+ if ( (st->macro_state & syntax->state_mask) != syntax->state_value )
+ { /*
+ * We should probably distinguish here between
+ * out-of-context operators and illegal tags, but it's too
+ * much trouble.
+ */
+ code = gs_note_error(errorIllegalOperatorSequence);
+ if ( tag >= 0x40 && tag < 0xc0 )
+ st->last_operator = tag;
+ goto x;
+ }
+ st->macro_state ^= syntax->state_transition;
+ switch ( tag >> 3 )
+ {
+ case 0:
+ switch ( tag )
+ {
+ case pxtNull: ++p; continue;
+ default: break;
+ }
+ break;
+ case 1:
+ switch ( tag )
+ {
+ case pxtHT: case pxtLF: case pxtVT: case pxtFF: case pxtCR:
+ ++p;
+ continue;
+ default:
+ break;
+ }
+ break;
+ case 3:
+ if ( tag == pxt1b ) /* ESC */
+ { /* Check for UEL */
+ if ( memcmp(p + 1, "\033%-12345X", min(left, 9)) )
+ break; /* not UEL, error */
+ if ( left < 9 )
+ goto x; /* need more data */
+ p += 9;
+ code = e_ExitLanguage;
+ goto x;
+ }
+ break;
+ case 4:
+ switch ( tag )
+ {
+ case pxtSpace:
+ /* break; will error, compatible with lj */
+ /* ++p;continue; silently ignores the space */
+ ++p;
+ continue;
+ default: break;
+ }
+ break;
+ case 8: case 9:
+ case 10: case 11: case 12: case 13: case 14:
+ case 15: case 16: case 17: case 18: case 19:
+ case 20: case 21: case 22: case 23:
+ /* Operators */
+ /* Make sure that we have all the required attributes, */
+ /* and no attributes that are neither required nor */
+ /* optional. (It's up to the operator to make any */
+ /* more precise checks than this. */
+ st->operator_count++;
+ /* if this is a passthrough operator we have to tell
+ the passthrough module if this operator was
+ preceded by another passthrough operator or a
+ different xl operator */
+ if (tag == pxtPassThrough) {
+ pxpcl_passthroughcontiguous(st->last_operator == tag);
+ } else if ( st->last_operator == pxtPassThrough ) {
+ pxpcl_endpassthroughcontiguous(pxs);
+ }
+
+ st->last_operator = tag;
+ { const px_operator_definition_t *pod =
+ &px_operator_definitions[tag - 0x40];
+ int left = sp - st->stack;
+ const byte /*px_attribute_t*/ *pal = pod->attrs;
+ px_value_t **ppv = st->args.pv;
+ bool required = true;
+
+ code = 0;
+ /*
+ * Scan the attributes. Illegal attributes take priority
+ * over missing attributes, which in turn take priority
+ * over illegal data types.
+ */
+ for ( ; ; ++pal, ++ppv )
+ { px_attribute_t attr = *pal;
+ uint index;
+
+ if ( !attr )
+ { /*
+ * We've reached the end of either the required or
+ * the optional attribute list.
+ */
+ if ( !required )
+ break;
+ required = false;
+ --ppv; /* cancel incrementing */
+ continue;
+ }
+ if ( (index = st->attribute_indices[attr]) == 0 )
+ { if ( required )
+ code = gs_note_error(errorMissingAttribute);
+ else
+ *ppv = 0;
+ }
+ else
+ { /* Check the attribute data type and value. */
+ px_value_t *pv = *ppv = &st->stack[index];
+ const px_attr_value_type_t *pavt =
+ &px_attr_value_types[attr];
+ int acode;
+
+ if ( (~pavt->mask & pv->type &
+ (pxd_structure | pxd_representation)) ||
+ (pavt->mask == (pxd_scalar | pxd_ubyte) &&
+ (pv->value.i < 0 || pv->value.i > pavt->limit))
+ )
+ { if ( code >= 0 )
+ code = gs_note_error(errorIllegalAttributeDataType);
+ }
+ if ( pavt->proc != 0 && (acode = (*pavt->proc)(pv)) < 0 )
+ { if ( code >= 0 )
+ code = acode;
+ }
+ --left;
+ }
+ }
+
+ /* Make sure there are no attributes left over. */
+ if ( left )
+ code = gs_note_error(errorIllegalAttribute);
+ if ( code >= 0 ) {
+ st->args.source.phase = 0;
+ code = (*pod->proc)(&st->args, pxs);
+ }
+ if ( code < 0 )
+ goto x;
+ /* Check whether the operator wanted source data. */
+ if ( code == pxNeedData )
+ { if ( !pxs->data_source_open )
+ { code = gs_note_error(errorDataSourceNotOpen);
+ goto x;
+ }
+ st->data_proc = pod->proc;
+ ++p;
+ goto top;
+ }
+ }
+ clear_stack();
+ ++p;
+ continue;
+ case 24: sp[1].type = pxd_scalar; count = 1; goto data;
+ case 26: sp[1].type = pxd_xy; count = 2; goto data;
+ case 28: sp[1].type = pxd_box; count = 4; goto data;
+ /* Scalar, point, and box data */
+data: { int i;
+ if ( sp == stack_limit )
+ { code = gs_note_error(errorInternalOverflow);
+ goto x;
+ }
+ ++sp;
+ sp->attribute = 0;
+ p += 2;
+#ifdef DEBUG
+# define trace_scalar(format, cast, alt)\
+ if ( gs_debug_c('i') )\
+ trace_data(format, cast, sp->value.alt, count)
+#else
+# define trace_scalar(format, cast, alt) DO_NOTHING
+#endif
+ switch ( tag & 7 )
+ {
+ case pxt_ubyte & 7:
+ sp->type |= pxd_ubyte;
+ for ( i = 0; i < count; ++p, ++i )
+ sp->value.ia[i] = *p;
+dux: trace_scalar(" %lu", ulong, ia);
+ --p;
+ continue;
+ case pxt_uint16 & 7:
+ sp->type |= pxd_uint16;
+ for ( i = 0; i < count; p += 2, ++i )
+ sp->value.ia[i] = get_uint16(st, p);
+ goto dux;
+ case pxt_uint32 & 7:
+ sp->type |= pxd_uint32;
+ for ( i = 0; i < count; p += 4, ++i )
+ sp->value.ia[i] = get_uint32(st, p);
+ goto dux;
+ case pxt_sint16 & 7:
+ sp->type |= pxd_sint16;
+ for ( i = 0; i < count; p += 2, ++i )
+ sp->value.ia[i] = get_sint16(st, p);
+dsx: trace_scalar(" %ld", long, ia);
+ --p;
+ continue;
+ case pxt_sint32 & 7:
+ sp->type |= pxd_sint32;
+ for ( i = 0; i < count; p += 4, ++i )
+ sp->value.ia[i] = get_sint32(st, p);
+ goto dsx;
+ case pxt_real32 & 7:
+ sp->type |= pxd_real32;
+ for ( i = 0; i < count; p += 4, ++i )
+ sp->value.ra[i] = get_real32(st, p);
+ trace_scalar(" %g", double, ra);
+ --p;
+ continue;
+ default:
+ break;
+ }
+ }
+ break;
+ case 25:
+ /* Array data */
+ { const byte *dp;
+ uint nbytes;
+ if ( sp == stack_limit )
+ { code = gs_note_error(errorInternalOverflow);
+ goto x;
+ }
+ switch ( p[2] )
+ {
+ case pxt_ubyte:
+ sp[1].value.array.size = p[3];
+ dp = p + 4;
+ break;
+ case pxt_uint16:
+ if ( left < 4 )
+ { if_debug0('i', "...\n");
+ /* Undo the state transition. */
+ st->macro_state ^= syntax->state_transition;
+ goto x;
+ }
+ sp[1].value.array.size = get_uint16(st, p+3);
+ dp = p + 5;
+ break;
+ default:
+ st->last_operator = tag; /* for error message */
+ code = gs_note_error(errorIllegalTag);
+ goto x;
+ }
+ nbytes = sp[1].value.array.size;
+ if_debug1('i', "[%u]\n", sp[1].value.array.size);
+ switch ( tag )
+ {
+ case pxt_ubyte_array:
+ sp[1].type = pxd_array | pxd_ubyte;
+array: ++sp;
+ if ( st->big_endian )
+ sp->type |= pxd_big_endian;
+ sp->value.array.data = dp;
+ sp->attribute = 0;
+ /* Check whether we have enough data for the entire */
+ /* array. */
+ if ( rlimit + 1 - dp < nbytes )
+ { /* Exit now, continue reading when we return. */
+ uint avail = rlimit + 1 - dp;
+
+ code = px_save_array(sp, pxs, "partial array",
+ avail);
+ if ( code < 0 )
+ goto x;
+ sp->type |= pxd_on_heap;
+ st->data_left = nbytes - avail;
+ st->data_proc = 0;
+ p = rlimit;
+ goto x;
+ }
+ p = dp + nbytes - 1;
+ trace_array(sp);
+ continue;
+ case pxt_uint16_array:
+ sp[1].type = pxd_array | pxd_uint16;
+a16: nbytes <<= 1;
+ goto array;
+ case pxt_uint32_array:
+ sp[1].type = pxd_array | pxd_uint32;
+a32: nbytes <<= 2;
+ goto array;
+ case pxt_sint16_array:
+ sp[1].type = pxd_array | pxd_sint16;
+ goto a16;
+ case pxt_sint32_array:
+ sp[1].type = pxd_array | pxd_sint32;
+ goto a32;
+ case pxt_real32_array:
+ sp[1].type = pxd_array | pxd_real32;
+ goto a32;
+ default:
+ break;
+ }
+ break;
+ }
+ break;
+ case 31:
+ { px_attribute_t attr;
+ const byte *pnext;
+
+ switch ( tag )
+ {
+ case pxt_attr_ubyte:
+ attr = p[2];
+ pnext = p + 2;
+ goto a;
+ case pxt_attr_uint16:
+ attr = get_uint16(st, p+2);
+ pnext = p + 3;
+a: if ( attr >= px_attribute_next )
+ break;
+ /*
+ * We could check the attribute value type here, but
+ * in order to match the behavior of the H-P printers,
+ * we don't do it until we see the operator.
+ *
+ * It is legal to specify the same attribute more than
+ * once; the last value has priority. If this happens,
+ * since the order of attributes doesn't matter, we can
+ * just replace the former value on the stack.
+ */
+ sp->attribute = attr;
+ if ( st->attribute_indices[attr] != 0 )
+ { px_value_t *old_sp =
+ &st->stack[st->attribute_indices[attr]];
+ /* If the old value is on the heap, free it. */
+ if ( old_sp->type & pxd_on_heap )
+ gs_free_object(memory, (void *)old_sp->value.array.data,
+ "old value for duplicate attribute");
+ *old_sp = *sp--;
+ }
+ else
+ st->attribute_indices[attr] = sp - st->stack;
+ p = pnext;
+ continue;
+ case pxt_dataLength:
+ /*
+ * Unexpected data length operators are normally not
+ * allowed, but there might be a zero-length data
+ * block immediately following a zero-size image,
+ * which doesn't ask for any data.
+ */
+ if ( uint32at(p + 2, true /*arbitrary*/) == 0 )
+ { p += 5;
+ continue;
+ }
+ break;
+ case pxt_dataLengthByte:
+ /* See the comment under pxt_dataLength above. */
+ if ( p[2] == 0 )
+ { p += 2;
+ continue;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ /* Unknown tag value. Report an error. */
+ st->last_operator = tag; /* for error message */
+ code = gs_note_error(errorIllegalTag);
+ break;
+ }
+x: /* Save any leftover input. */
+ left = rlimit - p;
+ if ( rlimit != pr->limit )
+ { /* We were reading saved input. */
+ if ( left <= next_p - orig_p )
+ { /* We finished reading the previously saved input. */
+ /* Continue reading current input, unless we got an error. */
+ p = next_p -= left;
+ rlimit = pr->limit;
+ st->saved_count = 0;
+ if ( code >= 0 )
+ goto parse;
+ }
+ else
+ { /* There's still some previously saved input left over. */
+ memmove(st->saved, p + 1, st->saved_count = left);
+ p = next_p;
+ rlimit = pr->limit;
+ left = rlimit - p;
+ }
+ }
+ /* Except in case of error, save any remaining input. */
+ if ( code >= 0 )
+ { if ( left + st->saved_count > sizeof(st->saved) )
+ { /* Fatal error -- shouldn't happen! */
+ code = gs_note_error(errorInternalOverflow);
+ st->saved_count = 0;
+ }
+ else
+ { memcpy(&st->saved[st->saved_count], p + 1, left);
+ st->saved_count += left;
+ p = rlimit;
+ }
+ }
+ pr->ptr = p;
+ st->stack_count = sp - st->stack;
+ /* Move to the heap any arrays whose data was being referenced */
+ /* directly in the input buffer. */
+ for ( ; sp > st->stack; --sp )
+ if ( (sp->type & (pxd_array | pxd_on_heap)) == pxd_array )
+ { int code = px_save_array(sp, pxs, "px stack array to heap",
+ sp->value.array.size * value_size(sp));
+ if ( code < 0 )
+ break;
+ sp->type |= pxd_on_heap;
+ }
+ if ( code < 0 && syntax != 0 )
+ { /* Undo the state transition. */
+ st->macro_state ^= syntax->state_transition;
+ }
+ return code;
+}
+
+uint
+px_parser_data_left(px_parser_state_t *pxp)
+{
+ return pxp->data_left;
+}
+
diff --git a/pxl/pxparse.h b/pxl/pxparse.h
new file mode 100644
index 000000000..b3ec1b8c1
--- /dev/null
+++ b/pxl/pxparse.h
@@ -0,0 +1,106 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxparse.h */
+/* Definitions and interface for PCL XL parser */
+/* Requires gsmemory.h */
+
+#ifndef pxparse_INCLUDED
+# define pxparse_INCLUDED
+
+#include "pxoper.h"
+
+/* ---------------- Definitions ---------------- */
+
+/*
+ * Define the minimum parser input buffer size. The input buffer can
+ * contain as much or as little data as the client wishes to supply;
+ * the parser will always consume all of it.
+ *
+ * The minimum input buffer size is determined by the largest minimum size
+ * required by the data decompression methods for bitmaps, which is currently
+ * 1 byte for the RLE method. Aside from that, the minimum size demanded
+ * by the language itself is the size of the largest fixed-size language
+ * token, which is 17 bytes (real32 or int32 box). However, there is no
+ * requirement that the client provide a buffer of this size: the parser
+ * will buffer data internally if necessary.
+ */
+#define px_parser_max_token_size 1024
+#define px_parser_min_input_size px_parser_max_token_size
+
+/* Define the parser macro-states (used only for checking). */
+#define ptsInSession 0x01
+#define ptsInPage 0x02
+#define ptsData 0x04 /* read data, want attribute */
+#define ptsReadingStream 0x08
+#define ptsReadingRastPattern 0x10
+#define ptsReadingChar 0x18
+#define ptsReadingFont 0x20
+#define ptsReadingImage 0x28
+#define ptsReadingScan 0x30
+#define ptsReading 0x38 /* reading state */
+#define ptsExecStream 0x40 /* executing a stream */
+#define ptsInitial 0
+
+/* Define the parser state. */
+#ifndef px_parser_state_t_DEFINED
+# define px_parser_state_t_DEFINED
+typedef struct px_parser_state_s px_parser_state_t;
+#endif
+#define max_stack max_px_args /* must not exceed 256 */
+struct px_parser_state_s {
+ /* Set at initialization */
+ gs_memory_t *memory;
+ bool big_endian;
+ /* Updated dynamically, for error reporting only */
+ long operator_count;
+ long parent_operator_count;
+ int /*px_tag_t*/ last_operator; /* pxtNull if none */
+ /* Updated dynamically */
+ int saved_count; /* amount of leftover input in saved */
+ uint data_left; /* amount left to read of data or array */
+ uint macro_state; /* mask for macro-state */
+ int stack_count;
+ px_operator_proc((*data_proc)); /* operator awaiting data, if any */
+ byte saved[px_parser_max_token_size];
+ px_value_t stack[max_stack + 2];
+ px_args_t args;
+ byte attribute_indices[px_attribute_next]; /* indices of attrs on stack */
+};
+
+/* Define an abstract type for the state. */
+#ifndef px_state_DEFINED
+# define px_state_DEFINED
+typedef struct px_state_s px_state_t;
+#endif
+
+/* ---------------- Procedural interface ---------------- */
+
+/* Allocate a parser state. */
+px_parser_state_t *px_process_alloc(gs_memory_t *memory);
+
+/* Release a parser state. */
+void px_process_release(px_parser_state_t *st);
+
+/* Initialize the parser state. */
+void px_process_init(px_parser_state_t *st, bool big_endian);
+
+/* Process a buffer of PCL XL commands. */
+int px_process(px_parser_state_t *st, px_state_t *pxs,
+ stream_cursor_read *pr);
+
+/* unfortunately we have to export this for pass through mode, other
+ commands do not need to know how much data is left to parse. */
+uint px_parser_data_left(px_parser_state_t *pxp);
+
+#endif /* pxparse_INCLUDED */
diff --git a/pxl/pxprint.bat b/pxl/pxprint.bat
new file mode 100644
index 000000000..ee9605c0e
--- /dev/null
+++ b/pxl/pxprint.bat
@@ -0,0 +1,17 @@
+if '%1'=='' goto usage
+if '%2'=='' goto p1
+if '%3'=='' goto p2
+if '%4'=='' goto p3
+goto usage
+:p3
+pclxl -sDEVICE#ljet4 -dMaxBitmap#200000 -dBufferSpace#200000 -sOutputFile#PRN -dNOPAUSE %1 -dFirstPage#%2 -dLastPage#%3
+goto x
+:p2
+pclxl -sDEVICE#ljet4 -dMaxBitmap#200000 -dBufferSpace#200000 -sOutputFile#PRN -dNOPAUSE %1 -dFirstPage#%2
+goto x
+:p1
+pclxl -sDEVICE#ljet4 -dMaxBitmap#200000 -dBufferSpace#200000 -sOutputFile#PRN -dNOPAUSE %1
+goto x
+:usage
+echo Usage: pxprint file [first-page [last-page]]
+:x
diff --git a/pxl/pxprint.tcl b/pxl/pxprint.tcl
new file mode 100755
index 000000000..459936d73
--- /dev/null
+++ b/pxl/pxprint.tcl
@@ -0,0 +1,16 @@
+#!/usr/bin/tclsh
+proc print {file {first ""} {last ""}} {
+ if {$first == ""} {
+ set first 1
+ set last 99999
+ } elseif {$last == ""} {
+ set last $first
+ }
+ exec pclxl -sDEVICE=ljet4 -dMaxBitmap=200000 -dBufferSpace=200000 -sOutputFile=/prn -dNOPAUSE -dFirstPage=$first -dLastPage=$last $file >@stdout 2>@stderr
+}
+set argc [llength $argv]
+if {$argc < 1 || $argc > 3} {
+ puts stderr "Usage: pxprint file [first-page [last-page]]"
+ exit
+}
+eval print $argv
diff --git a/pxl/pxptable.c b/pxl/pxptable.c
new file mode 100644
index 000000000..5130cce0e
--- /dev/null
+++ b/pxl/pxptable.c
@@ -0,0 +1,742 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxptable.c */
+/* PCL XL parser tables */
+
+#include "std.h"
+#include "pxenum.h"
+#include "pxoper.h"
+#include "pxvalue.h"
+#include "pxptable.h" /* requires pxenum.h, pxoper.h, pxvalue.h */
+#include "pxstate.h"
+
+/* ---------------- Attribute values ---------------- */
+
+#define sc(sizes) {pxd_scalar|sizes} /* scalar */
+#define scp(sizes,proc) {pxd_scalar|sizes, 0, proc}
+#define scub() {pxd_scalar|ub, 255}
+#define xy(sizes) {pxd_xy|sizes} /* XY pair */
+#define xyp(sizes,proc) {pxd_xy|sizes, 0, proc}
+#define box(sizes) {pxd_box|sizes} /* box */
+#define arr(sizes) {pxd_array|sizes} /* array */
+#define arrp(sizes,proc) {pxd_array|sizes, 0, proc}
+#define en(limit) {pxd_scalar|pxd_ubyte, (limit)-1} /* enumeration */
+#define enp(limit,proc) {pxd_scalar|pxd_ubyte, (limit)-1, proc}
+#define zero en(1) /* must be zero */
+#define ub pxd_ubyte
+#define us pxd_uint16
+#define ul pxd_uint32
+#define ss pxd_sint16
+#define sl pxd_sint32
+#define rl pxd_real32
+
+#define none {0}
+#define none5 none, none, none, none, none
+
+#define ok_iff(test)\
+ ((test) ? 0 : gs_note_error(errorIllegalAttributeValue))
+
+static int
+checkCharAngle(const px_value_t *pv)
+{ real v = real_value(pv, 0);
+ return ok_iff(v >= -360 && v <= 360);
+}
+static int
+checkCharBoldValue(const px_value_t *pv)
+{ return ok_iff(pv->value.r >= 0 && pv->value.r <= 1);
+}
+static int
+checkCharScale(const px_value_t *pv)
+{ real x = real_value(pv, 0), y = real_value(pv, 1);
+ return ok_iff(x >= -32768 && x <= 32767 && y >= -32768 && y <= 32767);
+}
+#define checkCharShear checkCharScale
+static int
+checkDestinationSize(const px_value_t *pv)
+{ return ok_iff(pv->value.ia[0] != 0 && pv->value.ia[1] != 0);
+}
+static int
+checkDitherMatrixDataType(const px_value_t *pv)
+{ return ok_iff(pv->value.i == eUByte);
+}
+static int
+checkDitherMatrixDepth(const px_value_t *pv)
+{ return ok_iff(pv->value.i == e8Bit);
+}
+static int
+checkDitherMatrixSize(const px_value_t *pv)
+{ return ok_iff(pv->value.i >= 1 && pv->value.i <= 256);
+}
+static int
+checkGrayLevel(const px_value_t *pv)
+{ return ok_iff(pv->type & pxd_any_real ?
+ pv->value.r >= 0 && pv->value.r <= 1 :
+ true);
+}
+
+static int
+checkPageAngle(const px_value_t *pv)
+{
+ /* XL 1.0 generates an error for non-orthogonal page angles */
+ return 0;
+}
+
+static int
+checkPageScale(const px_value_t *pv)
+{ real x = real_value(pv, 0), y = real_value(pv, 1);
+ return ok_iff(x >= 0 && x <= 32767 && y >= 0 && y <= 32767);
+}
+static int
+checkRGBColor(const px_value_t *pv)
+{ if ( pv->value.array.size != 3 )
+ return_error(errorIllegalArraySize);
+ if ( pv->type & pxd_any_real )
+ { /* Check for values between 0 and 1. */
+ uint i;
+ for ( i = 0; i < pv->value.array.size; ++i )
+ { real v = real_elt(pv, i);
+ if ( v < 0.0 || v > 1.0 )
+ return_error(errorIllegalAttributeValue);
+ }
+ }
+ return 0;
+}
+static int
+checkSourceHeight(const px_value_t *pv)
+{ return ok_iff(pv->value.i >= 1);
+}
+#define checkSourceWidth checkSourceHeight
+static int
+checkUnitsPerMeasure(const px_value_t *pv)
+{ real x = real_value(pv, 0), y = real_value(pv, 1);
+ return ok_iff(x > 0 && x <= 65535 && y > 0 && y <= 65535);
+}
+#undef ok_iff
+
+const px_attr_value_type_t px_attr_value_types[] = {
+/* 0 */ none,
+/* 1 */ none,
+/* 2 */ en(pxeColorDepth_next), /* PaletteDepth = 2 */
+/* 3 */ en(pxeColorSpace_next), /* ColorSpace */
+/* 4 */ zero, /* NullBrush */
+/* 5 */ zero, /* NullPen */
+/* 6 */ arr(ub), /* PaletteData */
+/* 7 */ none,
+/* 8 */ sc(ss), /* PatternSelectID = 8 */
+/* 9 */ scp(ub|rl, checkGrayLevel), /* GrayLevel */
+/* 10 */ none,
+/* 11 */ arrp(ub|rl, checkRGBColor), /* RGBColor = 11 */
+/* 12 */ xy(ss), /* PatternOrigin */
+/* 13 */ xyp(us, checkDestinationSize), /* NewDestinationSize */
+/* 14 */ arr(ub), /* PrimaryArray = 14 */
+/* 15 */ en(pxeColorDepth_next), /* PrimaryDepth = 15 */
+/* 16 */ none,
+/* 17 */ en(pxeColorimetricColorSpace_next), /* ColorimetricColorSpace = 17 */
+/* 18 */ arr(rl), /* XYChromaticities = 18 */
+/* 19 */ arr(rl), /* WhiteReferencePoint = 19 */
+/* 20 */ arr(rl), /* CRGBMinMax = 20 */
+/* 21 */ arr(rl), /* GammaGain = 21 */
+/* 22 */ none,
+/* 23 */ none,
+/* 24 */ none,
+/* 25 */ none,
+/* 26 */ none,
+/* 27 */ none,
+/* 28 */ none,
+/* 29 */ en(pxeColorTrapping_next), /* AllObjects NB ColorTrapping is largest enum */
+/* 30 */ en(pxeColorTrapping_next), /* TextObjects = 30 */
+/* 31 */ en(pxeColorTrapping_next), /* VectorObjects = 31 */
+/* 32 */ en(pxeColorTrapping_next), /* RasterObjects = 32 */
+/* 33 */ en(pxeDitherMatrix_next), /* DeviceMatrix = 33 */
+/* 34 */ enp(pxeDataType_next, checkDitherMatrixDataType), /* DitherMatrixDataType */
+/* 35 */ xy(ub|us|ss), /* DitherOrigin */
+/* 36 */ scub(), /* MediaDestination */
+/* 37 */ {pxd_scalar|pxd_array|pxd_ubyte, 255}, /* MediaSize */
+/* 38 */ scub(), /* MediaSource */
+/* 39 */ arr(ub), /* MediaType */
+/* 40 */ scub(), /* Orientation -- illegal values only produce a warning! */
+/* 41 */ scp(us|ss, checkPageAngle), /* PageAngle */
+/* 42 */ xy(ub|us|ss), /* PageOrigin */
+/* 43 */ xyp(ub|us|rl, checkPageScale), /* PageScale */
+/* 44 */ scub(), /* ROP3 */
+/* 45 */ en(pxeTxMode_next), /* TxMode */
+/* 46 */ none,
+/* 47 */ xy(us|rl), /* CustomMediaSize = 47 */
+/* 48 */ en(pxeMeasure_next), /* CustomMediaSizeUnits */
+/* 49 */ sc(us), /* PageCopies */
+/* 50 */ xyp(us, checkDitherMatrixSize), /* DitherMatrixSize */
+/* 51 */ enp(pxeColorDepth_next, checkDitherMatrixDepth), /* DitherMatrixDepth */
+/* 52 */ en(pxeSimplexPageMode_next), /* SimplexPageMode */
+/* 53 */ en(pxeDuplexPageMode_next), /* DuplexPageMode */
+/* 54 */ en(pxeDuplexPageSide_next), /* DuplexPageSide */
+/* 55 */ none,
+/* 56 */ none,
+/* 57 */ none,
+/* 58 */ none,
+/* 59 */ none,
+/* 60 */ none,
+/* 61 */ none,
+/* 62 */ none,
+/* 63 */ none,
+/* 64 */ none,
+/* 65 */ en(pxeArcDirection_next), /* ArcDirection = 65 */
+/* 66 */ box(ub|us|ss), /* BoundingBox */
+/* 67 */ sc(ub|us|ss), /* DashOffset */
+/* 68 */ xy(ub|us), /* EllipseDimension */
+/* 69 */ xy(ub|us|ss), /* EndPoint */
+/* 70 */ en(pxeFillMode_next), /* FillMode */
+/* 71 */ en(pxeLineCap_next), /* LineCapStyle */
+/* 72 */ en(pxeLineJoin_next), /* LineJoinStyle */
+/* 73 */ sc(ub|us), /* MiterLength */
+/* 74 */ arr(ub|us|ss), /* LineDashStyle */
+/* 75 */ sc(ub|us), /* PenWidth */
+/* 76 */ xy(ub|us|ss), /* Point */
+/* 77 */ sc(ub|us), /* NumberOfPoints */
+/* 78 */ zero, /* SolidLine */
+/* 79 */ xy(ub|us|ss), /* StartPoint */
+/* 80 */ en(pxeDataType_next), /* PointType */
+/* 81 */ xy(ub|us|ss), /* ControlPoint1 */
+/* 82 */ xy(ub|us|ss), /* ControlPoint2 */
+/* 83 */ en(pxeClipRegion_next), /* ClipRegion */
+/* 84 */ en(pxeClipMode_next), /* ClipMode */
+/* 85 */ none,
+/* 86 */ none,
+/* 87 */ none,
+/* 88 */ none,
+/* 89 */ none,
+/* 90 */ none,
+/* 91 */ none,
+/* 92 */ none,
+/* 93 */ none,
+/* 94 */ none,
+/* 95 */ none,
+/* 96 */ none,
+/* 97 */ none,
+/* 98 */ en(pxeColorDepth_next), /* ColorDepth = 98 */
+/* 99 */ sc(us), /* BlockHeight */
+/* 100 */ en(pxeColorMapping_next), /* ColorMapping */
+/* 101 */ en(pxeCompressMode_next), /* CompressMode */
+/* 102 */ box(us), /* DestinationBox */
+/* 103 */ xyp(us, checkDestinationSize), /* DestinationSize */
+/* 104 */ en(pxePatternPersistence_next), /* PatternPersistence */
+/* 105 */ sc(ss), /* PatternDefineID */
+/* 106 */ none,
+/* 107 */ scp(us, checkSourceHeight), /* SourceHeight = 107 */
+/* 108 */ scp(us, checkSourceWidth), /* SourceWidth */
+/* 109 */ sc(us), /* StartLine */
+/* 110 */ scub(), /* PadBytesMultiple */
+/* 111 */ sc(ul), /* BlockByteLength */
+/* 112 */ none,
+/* 113 */ none,
+/* 114 */ none,
+/* 115 */ sc(us), /* NumberOfScanLines = 115 */
+/* 116 */ none,
+/* 117 */ none,
+/* 118 */ none,
+/* 119 */ none,
+/* 120 */ en(pxeColorTreatment_next),
+/* 121 */ none,
+/* 122 */ none,
+/* 123 */ none,
+/* 124 */ none,
+/* 125 */ none,
+/* 126 */ none,
+/* 127 */ none,
+/* 128 */ none,
+/* 129 */ arr(ub|us), /* CommentData = 129 */
+/* 130 */ en(pxeDataOrg_next), /* DataOrg */
+/* 131 */ none,
+/* 132 */ none,
+/* 133 */ none,
+/* 134 */ en(pxeMeasure_next), /* Measure = 134 */
+/* 135 */ none,
+/* 136 */ en(pxeDataSource_next), /* SourceType = 136 */
+/* 137 */ xyp(us|rl, checkUnitsPerMeasure), /* UnitsPerMeasure */
+/* 138 */ none,
+/* 139 */ arr(ub|us), /* StreamName = 139 */
+/* 140 */ sc(ul), /* StreamDataLength */
+/* 141 */ none,
+/* 142 */ none,
+/* 143 */ en(pxeErrorReport_next), /* ErrorReport = 143 */
+/* 144 */ none,
+/* 145 */ sc(ul), /* VUExtension = 145 */
+/* 146 */ none,
+/* 147 */ scub(), /* VUAttr1 = 147 */
+/* 148 */ none,
+/* 149 */ none,
+/* 150 */ none,
+/* 151 */ none,
+/* 152 */ none,
+/* 153 */ none,
+/* 154 */ none,
+/* 155 */ none,
+/* 156 */ none,
+/* 157 */ none,
+/* 158 */ none,
+/* 159 */ none,
+/* 160 */ none,
+/* 161 */ scp(us|ss|rl, checkCharAngle), /* CharAngle = 161 */
+/* 162 */ sc(ub|us), /* CharCode */
+/* 163 */ sc(us|ul), /* CharDataSize HP spec says us - driver sometimes emits ul */
+/* 164 */ xyp(ub|us|rl, checkCharScale), /* CharScale */
+/* 165 */ xyp(ub|us|ss|rl, checkCharShear), /* CharShear */
+/* 166 */ sc(ub|us|rl), /* CharSize */
+/* 167 */ sc(us), /* FontHeaderLength */
+/* 168 */ arr(ub|us), /* FontName */
+/* 169 */ zero, /* FontFormat */
+/* 170 */ sc(us), /* SymbolSet */
+/* 171 */ arr(ub|us), /* TextData */
+/* 172 */ arr(ub), /* CharSubModeArray */
+/* 173 */ en(pxeWritingMode_next), /* WritingMode */
+/* 174 */ none,
+/* 175 */ arr(ub|us|ss), /* XSpacingData = 175 */
+/* 176 */ arr(ub|us|ss), /* YSpacingData */
+/* 177 */ scp(rl, checkCharBoldValue), /* CharBoldValue */
+};
+
+#undef v
+#undef vp
+#undef vub
+#undef xy
+#undef xyp
+#undef box
+#undef array
+#undef arrayp
+#undef en
+#undef enp
+#undef zero
+#undef ub
+#undef us
+#undef ul
+#undef ss
+#undef sl
+#undef rl
+#undef none
+#undef none5
+
+/* ---------------- Attribute names for debugging ---------------- */
+
+#ifdef DEBUG
+
+const char *px_attribute_names[] = {
+/*0*/
+ 0, 0, "PaletteDepth", "ColorSpace", "NullBrush",
+ "NullPen", "PaletteData", 0, "PatternSelectID", "GrayLevel",
+/*10*/
+ 0, "RGBColor", "PatternOrigin", "NewDestinationSize", "PrimaryArray",
+ "PrimaryDepth", 0,
+ "ColorimetricColorSpace", "XYChromaticities", "WhiteReferencePoint", "CRGBMinMax", "GammaGain",
+/*22*/
+ 0, 0, 0, 0,
+ 0, 0, 0, "AllObjectTypes",
+/*30*/
+ "TextObjects", "VectorObjects", "RasterObjects", "DeviceMatrix", "DitherMatrixDataType",
+ "DitherOrigin", "MediaDestination", "MediaSize", "MediaSource", "MediaType",
+/*40*/
+ "Orientation", "PageAngle", "PageOrigin", "PageScale", "ROP3",
+ "TxMode", 0, "CustomMediaSize", "CustomMediaSizeUnits", "PageCopies",
+/*50*/
+ "DitherMatrixSize", "DitherMatrixDepth", "SimplexPageMode", "DuplexPageMode",
+ "DuplexPageSide",
+ 0, 0, 0, 0, 0,
+/*60*/
+ 0, 0, 0, 0, 0,
+ "ArcDirection", "BoundingBox", "DashOffset", "EllipseDimension", "EndPoint",
+/*70*/
+ "FillMode", "LineCapStyle", "LineJoinStyle", "MiterLength", "LineDashStyle",
+ "PenWidth", "Point", "NumberOfPoints", "SolidLine", "StartPoint",
+/*80*/
+ "PointType", "ControlPoint1", "ControlPoint2", "ClipRegion", "ClipMode",
+ 0, 0, 0, 0, 0,
+/*90*/
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, "ColorDepth", "BlockHeight",
+/*100*/
+ "ColorMapping", "CompressMode", "DestinationBox", "DestinationSize",
+ "PatternPersistence",
+ "PatternDefineID", 0, "SourceHeight", "SourceWidth", "StartLine",
+/*110*/
+ "PadBytesMultiple",
+ "BlockByteLength",
+ 0, 0, 0,
+ "NumberOfScanLines", 0, 0, 0, 0,
+/*120*/
+ "ColorTreatment", 0, 0, 0, 0,
+ 0, 0, 0, 0, "CommentData",
+/*130*/
+ "DataOrg", 0, 0, 0, "Measure",
+ 0, "SourceType", "UnitsPerMeasure", 0, "StreamName",
+/*140*/
+ "StreamDataLength", 0, 0, "ErrorReport", 0,
+ "VUExtension", 0, "VUAttr1", 0, 0,
+/*150*/
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+/*160*/
+ 0, "CharAngle", "CharCode", "CharDataSize", "CharScale",
+ "CharShear", "CharSize", "FontHeaderLength", "FontName", "FontFormat",
+/*170*/
+ "SymbolSet", "TextData", "CharSubModeArray", 0, 0,
+ "XSpacingData", "YSpacingData", "CharBoldValue"
+};
+
+#endif
+
+/* ---------------- Tag names for debugging ---------------- */
+
+#ifdef DEBUG
+
+const char *px_tag_0_names[0x40] = {
+/*0x*/
+ "Null", 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, "HT", "LF", "VT",
+ "FF", "CR", 0, 0,
+/*1x*/
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, "ESC",
+ 0, 0, 0, 0,
+/*2x*/
+ "Space", 0, 0, 0,
+ 0, 0, 0, "_beginASCII",
+ "_beginBinaryMSB", "_beginBinaryLSB", 0, 0,
+ 0, 0, 0, 0,
+/*3x*/
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0
+};
+
+const char *px_tag_c0_names[0x40] = {
+/*cx*/
+ "_ubyte", "_uint16", "_uint32", "_sint16",
+ "_sint32", "_real32", 0, 0,
+ "_ubyte_array", "_uint16_array", "_uint32_array", "_sint16_array",
+ "_sint32_array", "_real32_array", 0, 0,
+/*dx*/
+ "_ubyte_xy", "_uint16_xy", "_uint32_xy", "_sint16_xy",
+ "_sint32_xy", "_real32_xy", 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+/*ex*/
+ "_ubyte_box", "_uint16_box", "_uint32_box", "_sint16_box",
+ "_sint32_box", "_real32_box", 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+/*fx*/
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ "_attr_ubyte", "_attr_uint16", "_dataLength", "_dataLengthByte",
+ 0, 0, 0, 0
+};
+
+#endif
+
+/* ---------------- Operator names ---------------- */
+
+/* These are needed even in non-debug configurations, */
+/* for producing error reports. */
+
+const char *px_operator_names[0x80] = {
+/*4x*/
+ 0, "BeginSession", "EndSession", "BeginPage",
+ "EndPage", 0, "VendorUnique", "Comment",
+ "OpenDataSource", "CloseDataSource", 0, 0,
+ 0, 0, 0, "BeginFontHeader",
+/*5x*/
+ "ReadFontHeader", "EndFontHeader", "BeginChar", "ReadChar",
+ "EndChar", "RemoveFont",
+ "SetCharAttributes",
+ "SetDefaultGS", "SetColorTreatment",
+ 0, 0, "BeginStream",
+ "ReadStream", "EndStream", "ExecStream", "RemoveStream",
+/*6x*/
+ "PopGS", "PushGS", "SetClipReplace", "SetBrushSource",
+ "SetCharAngle", "SetCharScale", "SetCharShear", "SetClipIntersect",
+ "SetClipRectangle", "SetClipToPage", "SetColorSpace", "SetCursor",
+ "SetCursorRel", "SetHalftoneMethod", "SetFillMode", "SetFont",
+/*7x*/
+ "SetLineDash", "SetLineCap", "SetLineJoin", "SetMiterLimit",
+ "SetPageDefaultCTM", "SetPageOrigin", "SetPageRotation", "SetPageScale",
+ "SetPaintTxMode", "SetPenSource", "SetPenWidth", "SetROP",
+ "SetSourceTxMode", "SetCharBoldValue", "SetNeutralAxis", "SetClipMode",
+/*8x*/
+ "SetPathToClip", "SetCharSubMode", "BeginUserDefinedLineCap", "pxtEndUserDefinedLineCap",
+ "CloseSubPath", "NewPath", "PaintPath", 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+/*9x*/
+ 0, "ArcPath", "SetColorTrapping", "BezierPath",
+ "SetAdaptiveHalftoning", "BezierRelPath", "Chord", "ChordPath",
+ "Ellipse", "EllipsePath", 0, "LinePath",
+ 0, "LineRelPath", "Pie", "PiePath",
+/*ax*/
+ "Rectangle", "RectanglePath", "RoundRectangle", "RoundRectanglePath",
+ 0, 0, 0, 0,
+ "Text", "TextPath", 0, 0,
+ 0, 0, 0, 0,
+/*bx*/
+ "BeginImage", "ReadImage", "EndImage", "BeginRastPattern",
+ "ReadRastPattern", "EndRastPattern", "BeginScan", 0,
+ "EndScan", "ScanLineRel", 0, 0,
+ 0, 0, 0, "Passthrough"
+};
+
+/* ---------------- Operator definitions ---------------- */
+
+#define odef(proc, args)\
+ extern px_operator_proc(proc);\
+ extern const byte /*px_attribute*/ args[]
+
+/* Define the implementation of undefined operators. */
+static const byte apxBadOperator[] = {0, 0};
+static int
+pxBadOperator(px_args_t *par, px_state_t *pxs)
+{ return_error(errorIllegalTag);
+}
+
+odef(pxBeginSession, apxBeginSession);
+odef(pxEndSession, apxEndSession);
+odef(pxBeginPage, apxBeginPage);
+odef(pxEndPage, apxEndPage);
+odef(pxVendorUnique, apxVendorUnique);
+odef(pxComment, apxComment);
+odef(pxOpenDataSource, apxOpenDataSource);
+odef(pxCloseDataSource, apxCloseDataSource);
+odef(pxBeginFontHeader, apxBeginFontHeader);
+odef(pxBeginUserDefinedLineCap, apxBeginUserDefinedLineCap);
+odef(pxEndUserDefinedLineCap, apxEndUserDefinedLineCap);
+odef(pxReadFontHeader, apxReadFontHeader);
+odef(pxEndFontHeader, apxEndFontHeader);
+odef(pxBeginChar, apxBeginChar);
+odef(pxReadChar, apxReadChar);
+odef(pxEndChar, apxEndChar);
+odef(pxRemoveFont, apxRemoveFont);
+odef(pxSetCharAttributes, apxSetCharAttributes);
+odef(pxBeginStream, apxBeginStream);
+odef(pxReadStream, apxReadStream);
+odef(pxEndStream, apxEndStream);
+odef(pxExecStream, apxExecStream);
+odef(pxRemoveStream, apxRemoveStream);
+odef(pxPopGS, apxPopGS);
+odef(pxPushGS, apxPushGS);
+odef(pxSetDefaultGS, apxSetDefaultGS);
+odef(pxSetClipReplace, apxSetClipReplace);
+odef(pxSetColorTreatment, apxSetColorTreatment);
+odef(pxSetBrushSource, apxSetBrushSource);
+odef(pxSetCharAngle, apxSetCharAngle);
+odef(pxSetCharScale, apxSetCharScale);
+odef(pxSetCharShear, apxSetCharShear);
+odef(pxSetClipIntersect, apxSetClipIntersect);
+odef(pxSetClipRectangle, apxSetClipRectangle);
+odef(pxSetClipToPage, apxSetClipToPage);
+odef(pxSetColorSpace, apxSetColorSpace);
+odef(pxSetCursor, apxSetCursor);
+odef(pxSetCursorRel, apxSetCursorRel);
+odef(pxSetHalftoneMethod, apxSetHalftoneMethod);
+odef(pxSetFillMode, apxSetFillMode);
+odef(pxSetFont, apxSetFont);
+odef(pxSetLineDash, apxSetLineDash);
+odef(pxSetLineCap, apxSetLineCap);
+odef(pxSetLineJoin, apxSetLineJoin);
+odef(pxSetMiterLimit, apxSetMiterLimit);
+odef(pxSetNeutralAxis, apxSetNeutralAxis);
+odef(pxSetPageDefaultCTM, apxSetPageDefaultCTM);
+odef(pxSetPageOrigin, apxSetPageOrigin);
+odef(pxSetPageRotation, apxSetPageRotation);
+odef(pxSetPageScale, apxSetPageScale);
+odef(pxSetPaintTxMode, apxSetPaintTxMode);
+odef(pxSetPenSource, apxSetPenSource);
+odef(pxSetPenWidth, apxSetPenWidth);
+odef(pxSetROP, apxSetROP);
+odef(pxSetSourceTxMode, apxSetSourceTxMode);
+odef(pxSetCharBoldValue, apxSetCharBoldValue);
+odef(pxSetClipMode, apxSetClipMode);
+odef(pxSetPathToClip, apxSetPathToClip);
+odef(pxSetCharSubMode, apxSetCharSubMode);
+odef(pxCloseSubPath, apxCloseSubPath);
+odef(pxNewPath, apxNewPath);
+odef(pxPaintPath, apxPaintPath);
+odef(pxArcPath, apxArcPath);
+odef(pxBezierPath, apxBezierPath);
+odef(pxBezierRelPath, apxBezierRelPath);
+odef(pxChord, apxChord);
+odef(pxChordPath, apxChordPath);
+odef(pxEllipse, apxEllipse);
+odef(pxEllipsePath, apxEllipsePath);
+odef(pxLinePath, apxLinePath);
+odef(pxLineRelPath, apxLineRelPath);
+odef(pxPie, apxPie);
+odef(pxPiePath, apxPiePath);
+odef(pxRectangle, apxRectangle);
+odef(pxRectanglePath, apxRectanglePath);
+odef(pxRoundRectangle, apxRoundRectangle);
+odef(pxRoundRectanglePath, apxRoundRectanglePath);
+odef(pxText, apxText);
+odef(pxTextPath, apxTextPath);
+odef(pxBeginImage, apxBeginImage);
+odef(pxReadImage, apxReadImage);
+odef(pxEndImage, apxEndImage);
+odef(pxBeginRastPattern, apxBeginRastPattern);
+odef(pxReadRastPattern, apxReadRastPattern);
+odef(pxEndRastPattern, apxEndRastPattern);
+odef(pxBeginScan, apxBeginScan);
+odef(pxEndScan, apxEndScan);
+odef(pxScanLineRel, apxScanLineRel);
+odef(pxSetAdaptiveHalftoning, apxSetAdaptiveHalftoning);
+odef(pxPassthrough, apxPassthrough);
+odef(pxSetColorTrapping, apxSetColorTrapping);
+
+#define none {pxBadOperator, apxBadOperator}
+
+const px_operator_definition_t px_operator_definitions[] = {
+/*4x*/
+ none,
+ {pxBeginSession, apxBeginSession},
+ {pxEndSession, apxEndSession},
+ {pxBeginPage, apxBeginPage},
+ {pxEndPage, apxEndPage},
+ none,
+ {pxVendorUnique, apxVendorUnique},
+ {pxComment, apxComment},
+ {pxOpenDataSource, apxOpenDataSource},
+ {pxCloseDataSource, apxCloseDataSource},
+ none,
+ none,
+ none,
+ none,
+ none,
+ {pxBeginFontHeader, apxBeginFontHeader},
+/*5x*/
+ {pxReadFontHeader, apxReadFontHeader},
+ {pxEndFontHeader, apxEndFontHeader},
+ {pxBeginChar, apxBeginChar},
+ {pxReadChar, apxReadChar},
+ {pxEndChar, apxEndChar},
+ {pxRemoveFont, apxRemoveFont},
+ {pxSetCharAttributes, apxSetCharAttributes},
+ {pxSetDefaultGS, apxSetDefaultGS},
+ {pxSetColorTreatment, apxSetColorTreatment},
+ none,
+ none,
+ {pxBeginStream, apxBeginStream},
+ {pxReadStream, apxReadStream},
+ {pxEndStream, apxEndStream},
+ {pxExecStream, apxExecStream},
+ {pxRemoveStream, apxRemoveStream},
+/*6x*/
+ {pxPopGS, apxPopGS},
+ {pxPushGS, apxPushGS},
+ {pxSetClipReplace, apxSetClipReplace},
+ {pxSetBrushSource, apxSetBrushSource},
+ {pxSetCharAngle, apxSetCharAngle},
+ {pxSetCharScale, apxSetCharScale},
+ {pxSetCharShear, apxSetCharShear},
+ {pxSetClipIntersect, apxSetClipIntersect},
+ {pxSetClipRectangle, apxSetClipRectangle},
+ {pxSetClipToPage, apxSetClipToPage},
+ {pxSetColorSpace, apxSetColorSpace},
+ {pxSetCursor, apxSetCursor},
+ {pxSetCursorRel, apxSetCursorRel},
+ {pxSetHalftoneMethod, apxSetHalftoneMethod},
+ {pxSetFillMode, apxSetFillMode},
+ {pxSetFont, apxSetFont},
+/*7x*/
+ {pxSetLineDash, apxSetLineDash},
+ {pxSetLineCap, apxSetLineCap},
+ {pxSetLineJoin, apxSetLineJoin},
+ {pxSetMiterLimit, apxSetMiterLimit},
+ {pxSetPageDefaultCTM, apxSetPageDefaultCTM},
+ {pxSetPageOrigin, apxSetPageOrigin},
+ {pxSetPageRotation, apxSetPageRotation},
+ {pxSetPageScale, apxSetPageScale},
+ {pxSetPaintTxMode, apxSetPaintTxMode},
+ {pxSetPenSource, apxSetPenSource},
+ {pxSetPenWidth, apxSetPenWidth},
+ {pxSetROP, apxSetROP},
+ {pxSetSourceTxMode, apxSetSourceTxMode},
+ {pxSetCharBoldValue, apxSetCharBoldValue},
+ {pxSetNeutralAxis, apxSetNeutralAxis},
+ {pxSetClipMode, apxSetClipMode},
+/*8x*/
+ {pxSetPathToClip, apxSetPathToClip},
+ {pxSetCharSubMode, apxSetCharSubMode},
+ {pxBeginUserDefinedLineCap, apxBeginUserDefinedLineCap},
+ {pxEndUserDefinedLineCap, apxEndUserDefinedLineCap},
+ {pxCloseSubPath, apxCloseSubPath},
+ {pxNewPath, apxNewPath},
+ {pxPaintPath, apxPaintPath},
+ none,
+ none,
+ none,
+ none,
+ none,
+ none,
+ none,
+ none,
+ none,
+/*9x*/
+ none,
+ {pxArcPath, apxArcPath},
+ {pxSetColorTrapping, apxSetColorTrapping},
+ {pxBezierPath, apxBezierPath},
+ {pxSetAdaptiveHalftoning, apxSetAdaptiveHalftoning},
+ {pxBezierRelPath, apxBezierRelPath},
+ {pxChord, apxChord},
+ {pxChordPath, apxChordPath},
+ {pxEllipse, apxEllipse},
+ {pxEllipsePath, apxEllipsePath},
+ none,
+ {pxLinePath, apxLinePath},
+ none,
+ {pxLineRelPath, apxLineRelPath},
+ {pxPie, apxPie},
+ {pxPiePath, apxPiePath},
+/*ax*/
+ {pxRectangle, apxRectangle},
+ {pxRectanglePath, apxRectanglePath},
+ {pxRoundRectangle, apxRoundRectangle},
+ {pxRoundRectanglePath, apxRoundRectanglePath},
+ none,
+ none,
+ none,
+ none,
+ {pxText, apxText},
+ {pxTextPath, apxTextPath},
+ none,
+ none,
+ none,
+ none,
+ none,
+ none,
+/*bx*/
+ {pxBeginImage, apxBeginImage},
+ {pxReadImage, apxReadImage},
+ {pxEndImage, apxEndImage},
+ {pxBeginRastPattern, apxBeginRastPattern},
+ {pxReadRastPattern, apxReadRastPattern},
+ {pxEndRastPattern, apxEndRastPattern},
+ {pxBeginScan, apxBeginScan},
+ none,
+ {pxEndScan, apxEndScan},
+ {pxScanLineRel, apxScanLineRel},
+ none,
+ none,
+ none,
+ none,
+ none,
+ {pxPassthrough, apxPassthrough}
+};
diff --git a/pxl/pxptable.h b/pxl/pxptable.h
new file mode 100644
index 000000000..8c0538cc4
--- /dev/null
+++ b/pxl/pxptable.h
@@ -0,0 +1,63 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxptable.h */
+/* Definitions for PCL XL parser tables */
+/* Requires pxenum.h, pxoper.h, pxvalue.h */
+
+#ifndef pxptable_INCLUDED
+# define pxptable_INCLUDED
+
+/*
+ * Define the table for checking attribute values.
+ * The 'and' of the mask and the actual data type must be non-zero.
+ * If the data type is ubyte, the value must be less than or equal to
+ * the limit value.
+ * If the procedure is not null, it provides an extra check, returning
+ * 0 or an error code.
+ */
+#define value_check_proc(proc)\
+ int proc(const px_value_t *)
+typedef struct px_attr_value_type_s {
+ ushort mask;
+ ushort limit;
+ value_check_proc((*proc));
+} px_attr_value_type_t;
+
+extern const px_attr_value_type_t px_attr_value_types[];
+
+/*
+ * Define the table for checking and dispatching operators.
+ * Each operator references a string of attributes: first a list of
+ * required attributes, then 0, then a list of optional attributes,
+ * then another 0.
+ */
+typedef struct px_operator_definition_s {
+ px_operator_proc((*proc));
+ const byte /*px_attribute*/ *attrs;
+} px_operator_definition_t;
+
+extern const px_operator_definition_t px_operator_definitions[];
+
+/* Define tag and attribute names for debugging. */
+#ifdef DEBUG
+extern const char *px_tag_0_names[0x40]; /* tags 0-3f */
+extern const char *px_tag_c0_names[0x40]; /* tags c0-ff */
+extern const char *px_attribute_names[];
+#endif
+
+/* Define the table of operator names. */
+/* This is needed even when not debugging, for producing error reports. */
+extern const char *px_operator_names[0x80]; /* tags 40-bf */
+
+#endif /* pxptable_INCLUDED */
diff --git a/pxl/pxpthr.c b/pxl/pxpthr.c
new file mode 100644
index 000000000..93a30e84d
--- /dev/null
+++ b/pxl/pxpthr.c
@@ -0,0 +1,330 @@
+/* Portions Copyright (C) 2007 artofcode LLC.
+ Portions Copyright (C) 2007 Artifex Software Inc.
+ Portions Copyright (C) 2007 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxpthr.c.c */
+/* PCL XL passtrough mode */
+#include "stdio_.h" /* std.h + NULL */
+#include "gsdevice.h"
+#include "gstypes.h"
+#include "gspath.h"
+#include "gscoord.h"
+#include "gsstate.h"
+#include "pcommand.h"
+#include "pgmand.h"
+#include "pcstate.h"
+#include "pcparse.h"
+#include "pctop.h"
+#include "pcpage.h"
+#include "pcdraw.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxgstate.h"
+#include "pxpthr.h"
+#include "pxparse.h"
+
+const byte apxPassthrough[] = {0, 0};
+
+/* NB - globals needing cleanup
+ */
+static pcl_state_t *global_pcs = NULL;
+static pcl_parser_state_t global_pcl_parser_state;
+static hpgl_parser_state_t global_gl_parser_state;
+
+/* if this is a contiguous passthrough meaning that 2 passtrough
+ operators have been given back to back and pxl should not regain
+ control. */
+static bool global_this_pass_contiguous = false;
+
+/* this is the first passthrough on this page */
+static bool global_pass_first = true;
+
+/* store away the current font attributes PCL can't set these,
+ * they persist for XL, rotation is missing */
+gs_point global_char_shear;
+gs_point global_char_scale;
+float global_char_bold_value;
+
+/* forward decl */
+void pxpcl_release(void);
+void pxpcl_pagestatereset(void);
+
+
+
+/* NB: tests for this function are used to flag pxl snippet mode
+ */
+static int
+pcl_end_page_noop(pcl_state_t *pcs, int num_copies, int flush)
+{
+ return pxPassThrough;
+}
+
+/* set variables other that setting the page device that do not
+ default to pcl reset values */
+void
+pxPassthrough_pcl_state_nonpage_exceptions(px_state_t *pxs)
+{
+ /* xl cursor -> pcl cursor position */
+ gs_point xlcp, pclcp, dp;
+ int code1 = 0;
+ int code2 = 0;
+ int code3 = 0;
+
+ /* make the pcl ctm active, after resets the hpgl/2 ctm is
+ active. */
+ pcl_set_graphics_state(global_pcs);
+ /* xl current point -> device point -> pcl current
+ point. If anything fails we assume the current
+ point is not valid and use the cap from the pcl
+ state initialization - pcl's origin */
+ if ((code1 = gs_currentpoint(pxs->pgs, &xlcp)) ||
+ (code2 = gs_transform(pxs->pgs, xlcp.x, xlcp.y, &dp)) ||
+ (code3 = gs_itransform(global_pcs->pgs, dp.x, dp.y, &pclcp)) ) {
+ global_pcs->cap.x = 0;
+ global_pcs->cap.y = inch2coord(2.0/6.0); /* 1/6" off by 2x in resolution. */
+ if (gs_debug_c('i'))
+ dprintf2("passthrough: changing cap NO currentpoint (%d, %d) \n",
+ global_pcs->cap.x, global_pcs->cap.y);
+ } else {
+ if (gs_debug_c('i'))
+ dprintf8("passthrough: changing cap from (%d,%d) (%d,%d) (%d, %d) (%d, %d) \n",
+ global_pcs->cap.x, global_pcs->cap.y,
+ (coord)xlcp.x, (coord)xlcp.y,
+ (coord)dp.x, (coord)dp.y,
+ (coord)pclcp.x, (coord)pclcp.y);
+ global_pcs->cap.x = (coord)pclcp.x;
+ global_pcs->cap.y = (coord)pclcp.y;
+ }
+ if (global_pcs->underline_enabled)
+ global_pcs->underline_start = global_pcs->cap;
+
+ /* Hacked copy of font state; rotation doesn't copy? */
+ if ( pxs->pxgs->char_shear.x || pxs->pxgs->char_shear.y ) {
+ global_char_shear.x = pxs->pxgs->char_shear.x;
+ global_char_shear.y = pxs->pxgs->char_shear.y;
+ }
+ if ( pxs->pxgs->char_scale.x != 1.0 || pxs->pxgs->char_scale.y != 1.0 ) {
+ global_char_scale.x = pxs->pxgs->char_scale.x;
+ global_char_scale.y = pxs->pxgs->char_scale.y;
+ }
+ if ( pxs->pxgs->char_bold_value > 0.001 )
+ global_char_bold_value = pxs->pxgs->char_bold_value;
+
+}
+
+/* retrieve the current pcl state and initialize pcl */
+static int
+pxPassthrough_init(px_state_t *pxs)
+{
+ int code;
+
+ if (gs_debug_c('i'))
+ dprintf("passthrough: initializing global pcl state\n");
+ global_pcs = pcl_get_gstate(pxs->pcls);
+
+ /* default to pcl5c */
+ global_pcs->personality = 0;
+
+ /* do an initial reset to set up a permanent reset. The
+ motivation here is to avoid tracking down a slew of memory
+ leaks */
+ global_pcs->xfm_state.paper_size = pcl_get_default_paper(global_pcs); /* pxl paper ? */
+ pcl_do_resets(global_pcs, pcl_reset_initial);
+ pcl_do_resets(global_pcs, pcl_reset_permanent);
+
+ /* mark the page as blank and install xl's page device in
+ pcl's state */
+ global_pcs->page_marked = 0;
+ code = gs_setdevice_no_erase(global_pcs->pgs, gs_currentdevice(pxs->pgs));
+ if ( code < 0 )
+ return code;
+
+ /* yet another reset with the new page device */
+ pcl_do_resets(global_pcs, pcl_reset_initial);
+ /* set the parser state and initialize the pcl parser */
+ global_pcl_parser_state.definitions = global_pcs->pcl_commands;
+ global_pcl_parser_state.hpgl_parser_state=&global_gl_parser_state;
+ pcl_process_init(&global_pcl_parser_state);
+ /* default 600 to match XL allow PCL to override */
+ global_pcs->uom_cp = 7200L / 600L;
+ return 0;
+}
+
+void
+pxPassthrough_setpagestate(px_state_t *pxs)
+{
+ /* by definition we are in "snippet mode" if pxl has dirtied
+ the page */
+ if ( pxs->have_page ) {
+ if (gs_debug_c('i'))
+ dprintf("passthrough: snippet mode\n");
+ /* disable an end page in pcl, also used to flag in snippet mode */
+ global_pcs->end_page = pcl_end_page_noop;
+ /* set the page size and orientation. Really just sets
+ the page tranformation does not feed a page (see noop
+ above) */
+ pcl_new_logical_page_for_passthrough(global_pcs, (int)pxs->orientation, 2 /* letter NB FIXME */);
+
+ if (gs_debug_c('i'))
+ dprintf2("passthrough: snippet mode changing orientation from %d to %d\n",
+ global_pcs->xfm_state.lp_orient, (int)pxs->orientation);
+
+ } else { /* not snippet mode - full page mode */
+ /* pcl can feed the page and presumedely pcl commands will
+ be used to set pcl's state. */
+ global_pcs->end_page = pcl_end_page_top;
+ /* clean the pcl page if it was marked by a previous snippet
+ and set to full page mode. */
+ global_pcs->page_marked = 0;
+ pcl_new_logical_page_for_passthrough(global_pcs, (int)pxs->orientation, 2 /* letter NB FIXME */);
+ if (gs_debug_c('i'))
+ dprintf("passthrough: full page mode\n");
+ }
+}
+
+int
+pxPassthrough(px_args_t *par, px_state_t *pxs)
+{
+
+ stream_cursor_read r;
+ int code = 0;
+ uint used;
+
+ /* apparently if there is no open data source we open one. By the
+ spec this should already be open, in practice it is not. */
+ if ( !pxs->data_source_open ) {
+ if (gs_debug_c('i'))
+ dprintf("passthrough: data source not open upon entry\n");
+ pxs->data_source_open = true;
+ pxs->data_source_big_endian = true;
+ }
+
+ /* source available is part of the equation to determine if this
+ operator is being called for the first time */
+ if ( par->source.available == 0 ) {
+ if (par->source.phase == 0) {
+ if (gs_debug_c('i'))
+ dprintf("passthrough starting getting more data\n");
+
+ if ( !global_pcs )
+ pxPassthrough_init(pxs);
+
+ /* this is the first passthrough on this page */
+ if ( global_pass_first ) {
+ pxPassthrough_setpagestate(pxs);
+ pxPassthrough_pcl_state_nonpage_exceptions(pxs);
+ global_pass_first = false;
+ } else {
+ /* there was a previous passthrough check if there were
+ any intervening XL commands */
+ if ( global_this_pass_contiguous == false )
+ pxPassthrough_pcl_state_nonpage_exceptions(pxs);
+ }
+ par->source.phase = 1;
+ }
+ return pxNeedData;
+ }
+
+ /* NB cie does not work yet. I am not sure if this state value
+ should come from xl or pjl */
+ global_pcs->useciecolor = 0;
+
+ /* set pcl data stream pointers to xl's and process this batch of data. */
+ r.ptr = par->source.data - 1;
+ r.limit = par->source.data + par->source.available - 1;
+ code = pcl_process(&global_pcl_parser_state, global_pcs, &r);
+ /* updata xl's parser position to reflect what pcl has consumed. */
+ used = (r.ptr + 1 - par->source.data);
+ par->source.available -= used;
+ par->source.data = r.ptr + 1;
+
+ if ( code < 0 ) {
+ dprintf1("passthrough: error return %d\n", code);
+ return code;
+ }
+ /* always return need data and we exit at the top when the data is
+ exhausted. */
+ {
+ if (used > px_parser_data_left(par->parser)) {
+ dprintf("error: read past end of stream\n");
+ return -1;
+ } else if (used < px_parser_data_left(par->parser)) {
+ return pxNeedData;
+ } else {
+ /* end of operator and data */
+ return 0;
+ }
+ }
+}
+
+
+void
+pxpcl_pagestatereset()
+{
+ global_pass_first = true;
+ if ( global_pcs ) {
+ global_pcs->xfm_state.left_offset_cp = 0.0;
+ global_pcs->xfm_state.top_offset_cp = 0.0;
+ global_pcs->margins.top = 0;
+ global_pcs->margins.left = 0;
+ }
+}
+
+void
+pxpcl_release(void)
+{
+ if (global_pcs) {
+ if (gs_debug_c('i'))
+ dprintf("passthrough: releasing global pcl state\n");
+ pcl_grestore(global_pcs);
+ gs_grestore_only(global_pcs->pgs);
+ gs_nulldevice(global_pcs->pgs);
+ pcl_do_resets(global_pcs, pcl_reset_permanent);
+ global_pcs = NULL;
+ pxpcl_pagestatereset();
+ global_this_pass_contiguous = false;
+ global_pass_first = true;
+ global_char_shear.x = 0;
+ global_char_shear.y = 0;
+ global_char_scale.x = 1.0;
+ global_char_scale.y = 1.0;
+ global_char_bold_value = 0.0;
+ }
+}
+
+/* the pxl parser must give us this information */
+void
+pxpcl_passthroughcontiguous(bool cont)
+{
+ global_this_pass_contiguous = cont;
+}
+
+/* copy state from pcl to pxl after a non-snippet passthrough
+ */
+void
+pxpcl_endpassthroughcontiguous(px_state_t *pxs)
+{
+ if ( global_pcs->end_page == pcl_end_page_top &&
+ global_pcs->page_marked &&
+ pxs->orientation != global_pcs->xfm_state.lp_orient ) {
+
+ /* end of pcl whole job; need to reflect pcl orientation changes */
+ pxs->orientation = global_pcs->xfm_state.lp_orient;
+ pxBeginPageFromPassthrough(pxs);
+ }
+
+ pxs->pxgs->char_shear.x = global_char_shear.x;
+ pxs->pxgs->char_shear.y = global_char_shear.y;
+ pxs->pxgs->char_scale.x = global_char_scale.x;
+ pxs->pxgs->char_scale.y = global_char_scale.y;
+ pxs->pxgs->char_bold_value = global_char_bold_value;
+}
diff --git a/pxl/pxpthr.h b/pxl/pxpthr.h
new file mode 100644
index 000000000..89f599c09
--- /dev/null
+++ b/pxl/pxpthr.h
@@ -0,0 +1,32 @@
+/* Portions Copyright (C) 2007 artofcode LLC.
+ Portions Copyright (C) 2007 Artifex Software Inc.
+ Portions Copyright (C) 2007 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxpthr.c.c */
+/* Definitions for PCL XL passtrough mode */
+
+#ifndef pxpthr_INCLUDED
+# define pxpthr_INCLUDED
+
+/* set passthrough contiguous mode */
+void pxpcl_passthroughcontiguous(bool contiguous);
+
+/* end passthrough contiguous mode */
+void pxpcl_endpassthroughcontiguous(px_state_t *pxs);
+
+/* reset pcl's page */
+void pxpcl_pagestatereset(void);
+
+/* release the passthrough state */
+void pxpcl_release(void);
+
+#endif /* pxpthr_INCLUDED */
diff --git a/pxl/pxsessio.c b/pxl/pxsessio.c
new file mode 100644
index 000000000..7e8b98227
--- /dev/null
+++ b/pxl/pxsessio.c
@@ -0,0 +1,816 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxsessio.c */
+/* PCL XL session operators */
+
+#include "math_.h" /* for fabs */
+#include "stdio_.h"
+#include "string_.h"
+#include "pxoper.h"
+#include "pxpthr.h"
+#include "pxstate.h"
+#include "pxfont.h"
+#include "pjparse.h"
+#include "gschar.h"
+#include "gscoord.h"
+#include "gserrors.h" /* for gs_error_undefined */
+#include "gspaint.h"
+#include "gsparam.h"
+#include "gsstate.h"
+#include "gxfixed.h"
+#include "gxpath.h" /* for gx_clip_to_rectangle */
+#include "gxdcolor.h"
+#include "gxpcolor.h"
+#include "gxfcache.h"
+#include "gxdevice.h"
+#include "gxstate.h"
+#include "pjtop.h"
+#include "pllfont.h"
+#include "plsrgb.h"
+
+/* Imported operators */
+px_operator_proc(pxCloseDataSource);
+px_operator_proc(pxNewPath);
+px_operator_proc(pxPopGS);
+px_operator_proc(pxPushGS);
+px_operator_proc(pxSetHalftoneMethod);
+px_operator_proc(pxSetPageDefaultCTM);
+
+/*
+ * Define the known paper sizes and unprintable margins. For convenience,
+ * we define this in terms of 300 dpi pixels, in portrait orientation. This
+ * table should obviously be device-dependent.
+ */
+#define media_size_scale (72.0 / 300.0)
+#define m_default 50, 50, 50, 50
+#define m_data(ms_enum, res, width, height)\
+ {ms_enum, width * 300 / (res), height * 300 / (res), m_default},
+static px_media_t known_media[] = {
+ px_enumerate_media(m_data)
+ /* The list ends with a comma, so add a dummy entry */
+ /* that can't be matched because its key is a duplicate. */
+ {eLetterPaper}
+};
+#undef m_data
+#undef m_default
+
+/* table to associate paper name string with paper name enumeration.
+ Note these paper string names correspond exactly with the PJL paper
+ nomenclature. */
+static const struct {
+ const char *pname;
+ pxeMediaSize_t paper_enum;
+} pxl_paper_sizes[] = {
+ { "defaultpaper", eDefaultPaperSize },
+ { "letter", eLetterPaper },
+ { "legal", eLegalPaper },
+ { "a4", eA4Paper },
+ { "executive", eExecPaper },
+ { "ledger", eLedgerPaper },
+ { "a3", eA3Paper },
+ { "com10", eCOM10Envelope },
+ { "monarch", eMonarchEnvelope },
+ { "c5", eC5Envelope },
+ { "dl", eDLEnvelope },
+ { "jisb4", eJB4Paper },
+ { "jisb5", eJB5Paper },
+ { "b5", eB5Envelope },
+ { "b5paper", eB5Paper }, /* 3.0 not sure about pjl name */
+ { "jpost", eJPostcard },
+ { "jpostd", eJDoublePostcard },
+ { "a5", eA5Paper },
+ { "a6", eA6Paper },
+ { "jisb6", eJB6Paper },
+ { "jis8K", eJIS8K },
+ { "jis16K", eJIS16K },
+ { "jisexec", eJISExec },
+};
+
+/* system paper size string (same as pjl paper size) to pxl enumeration type */
+static pxeMediaSize_t
+px_paper_string_to_media(pjl_envvar_t *paper_str)
+{
+ /* table to map pjl paper type strings to pxl enums */
+ int i;
+ for (i = 0; i < countof(pxl_paper_sizes); i++) {
+ if ( !pjl_compare(paper_str, pxl_paper_sizes[i].pname) )
+ return pxl_paper_sizes[i].paper_enum;
+ }
+ /* not found return letter */
+ return eLetterPaper;
+}
+
+/* Define the mapping from the Measure enumeration to points. */
+static const double measure_to_points[] = pxeMeasure_to_points;
+
+/* ---------------- Internal procedures ---------------- */
+
+
+/* return the default media set up in the XL state */
+static px_media_t *
+px_get_default_media(px_state_t *pxs)
+{
+ int i;
+ for (i = 0; i < countof(known_media); i++)
+ if ( known_media[i].ms_enum == pxs->media_size )
+ return &known_media[i];
+ /* shouldn't get here but just in case we return letter. */
+ return &known_media[0];
+}
+
+ void
+px_get_default_media_size(px_state_t *pxs, gs_point *pt)
+{
+ px_media_t *media = px_get_default_media(pxs);
+ pt->x = media->width * media_size_scale;
+ pt->y = media->height * media_size_scale;
+}
+
+/* Finish putting one device parameter. */
+static int
+px_put1(gx_device *dev, gs_c_param_list *plist, int ecode)
+{ int code = ecode;
+ if ( code >= 0 )
+ { gs_c_param_list_read(plist);
+ code = gs_putdeviceparams(dev, (gs_param_list *)plist);
+ }
+ gs_c_param_list_release(plist);
+ return (code == 0 || code == gs_error_undefined ? ecode : code);
+}
+
+/* Adjust one scale factor to an integral value if we can. */
+static double
+px_adjust_scale(double value, double extent)
+{ /* If we can make the value an integer with a total error */
+ /* of less than 1/2 pixel over the entire page, we do it. */
+ double int_value = floor(value + 0.5);
+
+ return (fabs((int_value - value) * extent) < 0.5 ? int_value : value);
+}
+
+/* Clean up at the end of a page, but before rendering. */
+static void
+px_end_page_cleanup(px_state_t *pxs)
+{ px_dict_release(&pxs->page_pattern_dict);
+ /* Clean up stray gstate information. */
+ while ( pxs->pxgs->stack_depth > 0 )
+ pxPopGS(NULL, pxs);
+ /* Pop an extra time to mirror the push in BeginPage. */
+ pxs->pxgs->stack_depth++;
+ pxPopGS(NULL, pxs);
+ pxNewPath(NULL, pxs);
+ px_purge_pattern_cache(pxs, ePagePattern);
+ pxpcl_pagestatereset();
+}
+
+/* Purge all */
+static bool
+purge_all(const gs_memory_t *mem, cached_char *cc, void *dummy)
+{
+ return true;
+}
+
+/* clears the entire cache */
+/* Clean up at the end of a session. */
+static void
+px_end_session_cleanup(px_state_t *pxs)
+{ if ( pxs->data_source_open )
+ pxCloseDataSource(NULL, pxs);
+ px_purge_character_cache(pxs);
+ px_dict_release(&pxs->session_pattern_dict);
+ if (gstate_pattern_cache(pxs->pgs)) {
+ (gstate_pattern_cache(pxs->pgs)->free_all)
+ (gstate_pattern_cache(pxs->pgs));
+ gs_free_object(pxs->memory,
+ gstate_pattern_cache(pxs->pgs)->tiles,
+ "px_end_session_cleanup(tiles)");
+ gs_free_object(pxs->memory,
+ gstate_pattern_cache(pxs->pgs),
+ "px_end_session_cleanup(struct)");
+ {
+ gs_state *pgs = pxs->pgs;
+ while (pgs) {
+ gstate_set_pattern_cache(pgs, 0);
+ pgs = gs_state_saved(pgs);
+ }
+ }
+ }
+ /* We believe that streams do *not* persist across sessions.... */
+ px_dict_release(&pxs->stream_dict);
+ /* delete downloaded fonts on end of session */
+ px_dict_release(&pxs->font_dict);
+ pxpcl_release();
+}
+
+/* ---------------- Non-operator procedures ---------------- */
+
+/* Clean up after an error or UEL. */
+void px_state_cleanup(px_state_t *pxs)
+{ px_end_page_cleanup(pxs);
+ px_end_session_cleanup(pxs);
+ pxs->have_page = false;
+}
+
+void px_purge_character_cache(px_state_t *pxs)
+{
+ gx_purge_selected_cached_chars(pxs->font_dir, purge_all, pxs);
+}
+
+/* ---------------- Operators ---------------- */
+
+const byte apxBeginSession[] = {
+ pxaMeasure, pxaUnitsPerMeasure, 0,
+ pxaErrorReport, 0
+};
+int
+pxBeginSession(px_args_t *par, px_state_t *pxs)
+{ pxs->measure = par->pv[0]->value.i;
+ pxs->units_per_measure.x = real_value(par->pv[1], 0);
+ pxs->units_per_measure.y = real_value(par->pv[1], 1);
+
+ pxs->stream_level = 0;
+
+ if ( par->pv[2] )
+ pxs->error_report = par->pv[2]->value.i;
+ else
+ pxs->error_report = eNoReporting;
+ px_dict_init(&pxs->session_pattern_dict, pxs->memory, px_free_pattern);
+ /* Set media parameters to device defaults, in case BeginPage */
+ /* doesn't specify valid ones. */
+ /* This is obviously device-dependent. */
+ /* get the pjl state */
+ {
+ pjl_envvar_t *pjl_psize = pjl_proc_get_envvar(pxs->pjls, "paper");
+ /* NB. We are not sure about the interaction of pjl's
+ wide a4 commands so we don't attempt to implement
+ it. */
+ /* bool pjl_widea4
+ = pjl_proc_compare(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "widea4"), "no"); */
+ int pjl_copies
+ = pjl_proc_vartoi(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "copies"));
+ bool pjl_duplex
+ = pjl_proc_compare(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "duplex"), "off");
+ bool pjl_bindshort
+ = pjl_proc_compare(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "binding"), "longedge");
+ bool pjl_manualfeed
+ = pjl_proc_compare(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "manualfeed"), "off");
+ pxs->media_size = px_paper_string_to_media(pjl_psize);
+ pxs->media_source = (pjl_manualfeed ? eManualFeed : eDefaultSource);
+ pxs->duplex = pjl_duplex;
+ pxs->duplex_page_mode = (pjl_bindshort ? eDuplexHorizontalBinding :
+ eDuplexVerticalBinding);
+ pxs->duplex_back_side = eFrontMediaSide;
+ pxs->copies = pjl_copies;
+ pxs->media_destination = eDefaultDestination;
+ pxs->media_type = eDefaultType;
+ pxs->useciecolor = !pjl_proc_compare(pxs->pjls,
+ pjl_proc_get_envvar(pxs->pjls, "useciecolor"), "on");
+
+ if (!pjl_proc_compare(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "orientation"), "LANDSCAPE"))
+ pxs->orientation = eLandscapeOrientation;
+ if (!pjl_proc_compare(pxs->pjls, pjl_proc_get_envvar(pxs->pjls, "orientation"), "PORTRAIT"))
+ pxs->orientation = ePortraitOrientation;
+ /* NB reverse orientations missing */
+
+ /* install the built in fonts */
+ if ( pl_load_built_in_fonts(pjl_proc_fontsource_to_path(pxs->pjls, "I"),
+ pxs->memory,
+ &pxs->builtin_font_dict,
+ pxs->font_dir,
+ (int)pxfsInternal,
+ true /* use unicode key names */) < 0 ) {
+ dprintf("Fatal error - no resident fonts\n");
+ return -1;
+
+ }
+ }
+ return 0;
+}
+
+const byte apxEndSession[] = {0, 0};
+int
+pxEndSession(px_args_t *par, px_state_t *pxs)
+{ px_end_session_cleanup(pxs);
+ if ( pxs->warning_length )
+ return_error(errorWarningsReported);
+ return 0;
+}
+
+const byte apxBeginPage[] = {
+ 0, pxaOrientation,
+ pxaMediaSource, pxaMediaSize, pxaCustomMediaSize, pxaCustomMediaSizeUnits,
+ pxaSimplexPageMode, pxaDuplexPageMode, pxaDuplexPageSide,
+ pxaMediaDestination, pxaMediaType, 0
+};
+int
+pxBeginPage(px_args_t *par, px_state_t *pxs)
+{ gs_state *pgs = pxs->pgs;
+ gx_device *dev = gs_currentdevice(pgs);
+ gs_point page_size_pixels;
+ gs_matrix points2device;
+ bool no_pv_2 = false;
+
+ /* check for 2.1 no parameter special cases */
+ {
+ int i;
+ bool have_params = false;
+ for ( i = (par->pv[0] == 0 ? 0 : 1); i<sizeof(par->pv)/sizeof(par->pv[0]); i++ ) {
+ if (par->pv[i]) {
+ have_params = true;
+ break;
+ }
+ }
+ if ( have_params == false ) {
+ if (par->pv[0]) {
+ int32_t orientation = par->pv[0]->value.i;
+ if ( orientation < 0 || orientation >= pxeOrientation_next )
+ { px_record_warning("IllegalOrientation", true, pxs);
+ orientation = ePortraitOrientation;
+ }
+ pxs->orientation = (pxeOrientation_t)orientation;
+ }
+ goto setd;
+ }
+ }
+ /* Check parameter presence for legal combinations. */
+ if ( par->pv[2] )
+ { if ( par->pv[3] || par->pv[4] )
+ return_error(errorIllegalAttributeCombination);
+ }
+ else if ( par->pv[3] && par->pv[4] )
+ { if ( par->pv[2] )
+ return_error(errorIllegalAttributeCombination);
+ }
+ else {
+ pxs->pm = px_get_default_media(pxs);
+ no_pv_2 = true;
+ }
+ if ( par->pv[5] )
+ { if ( par->pv[6] || par->pv[7] )
+ return_error(errorIllegalAttributeCombination);
+ }
+ else if ( par->pv[6] )
+ { if ( par->pv[5] )
+ return_error(errorIllegalAttributeCombination);
+ }
+
+
+ /* Copy parameters to the PCL XL state. */
+ /* For some reason, invalid Orientations only produces a warning. */
+ if ( par->pv[0] ) {
+ int32_t orientation = par->pv[0]->value.i;
+ if ( orientation < 0 || orientation >= pxeOrientation_next ) {
+ px_record_warning("IllegalOrientation", true, pxs);
+ orientation = ePortraitOrientation;
+ }
+ pxs->orientation = (pxeOrientation_t)orientation;
+ }
+
+ if ( par->pv[1] )
+ pxs->media_source = par->pv[1]->value.i;
+ if ( par->pv[2] ) {
+ /* default to letter */
+ pxeMediaSize_t ms_enum = eLetterPaper;
+ int i;
+ /* could be an array or enumeration */
+ if ( par->pv[2]->type & pxd_array ) {
+ /* it's an array, so convert it to the associated
+ enumeration */
+ byte *str = gs_alloc_string(pxs->memory,
+ array_value_size(par->pv[2]) + 1,
+ "pxBeginPage");
+ if ( str == 0 )
+ return_error(errorInsufficientMemory);
+ /* null terminate */
+ memcpy(str, par->pv[2]->value.array.data, array_value_size(par->pv[2]));
+ str[array_value_size(par->pv[2])] = '\0';
+ ms_enum = px_paper_string_to_media(/* NB */(pjl_envvar_t *)str);
+ gs_free_string(pxs->memory, str,
+ array_value_size(par->pv[2]) + 1, "pxBeginPage");
+
+ } else if ( par->pv[2]->value.i ) { /* it's an enumeration */
+ ms_enum = par->pv[2]->value.i;
+ }
+ if ( ms_enum == eDefaultPaperSize ) {
+ pxs->pm = px_get_default_media(pxs);
+ }
+ else {
+ for ( pxs->pm = known_media, i = 0; i < countof(known_media); ++pxs->pm, ++i )
+ if ( pxs->pm->ms_enum == ms_enum )
+ break;
+ if ( i == countof(known_media) ) { /* No match, select default media. */
+ pxs->pm = px_get_default_media(pxs);
+ px_record_warning("IllegalMediaSize", false, pxs);
+ }
+ }
+media: pxs->media_size = pxs->pm->ms_enum;
+ pxs->media_dims.x = pxs->pm->width * media_size_scale;
+ pxs->media_dims.y = pxs->pm->height * media_size_scale;
+ pxs->media_height = pxs->pm->height;
+ pxs->media_width = pxs->pm->width;
+ } else if ( no_pv_2 ) {
+ goto media;
+ } else { /* custom (!par->pv[2]) */
+ double scale = measure_to_points[par->pv[4]->value.i];
+ pxs->media_dims.x = real_value(par->pv[3], 0) * scale;
+ pxs->media_dims.y = real_value(par->pv[3], 1) * scale;
+ /*
+ * Assume the unprintable margins for custom media are the same
+ * as for the default media. This may not be right.
+ */
+ pxs->pm = px_get_default_media(pxs);
+ pxs->media_height = pxs->media_dims.y / media_size_scale;
+ pxs->media_width = pxs->media_dims.x / media_size_scale;
+ }
+ if ( par->pv[5] )
+ { pxs->duplex = false;
+ }
+ else if ( par->pv[6] )
+ { pxs->duplex = true;
+ pxs->duplex_page_mode = par->pv[6]->value.i;
+ if ( par->pv[7] )
+ pxs->duplex_back_side = (par->pv[7]->value.i == eBackMediaSide);
+ }
+ if ( par->pv[8] )
+ pxs->media_destination = par->pv[8]->value.i;
+ if ( par->pv[9] )
+ pxs->media_type = par->pv[9]->value.i;
+
+ /* Pass the media parameters to the device. */
+setd: { gs_memory_t *mem = pxs->memory;
+ gs_c_param_list list;
+#define plist ((gs_param_list *)&list)
+ gs_param_float_array fa;
+ float fv[4];
+ int iv;
+ bool bv;
+ int ecode = 0;
+ int code;
+
+ fa.data = fv;
+ fa.persistent = false;
+
+ gs_c_param_list_write(&list, mem);
+ iv = pxs->orientation; /* might not be an int */
+ code = param_write_int(plist, "Orientation", &iv);
+ ecode = px_put1(dev, &list, ecode);
+
+ gs_c_param_list_write(&list, mem);
+ fv[0] = pxs->media_dims.x;
+ fv[1] = pxs->media_dims.y;
+ fa.size = 2;
+ code = param_write_float_array(plist, ".MediaSize", &fa);
+ ecode = px_put1(dev, &list, ecode);
+ gs_c_param_list_write(&list, mem);
+
+ /* Set the mis-named "Margins" (actually the offset on the page) */
+ /* to zero. */
+ gs_c_param_list_write(&list, mem);
+ fv[0] = 0;
+ fv[1] = 0;
+ fa.size = 2;
+ code = param_write_float_array(plist, "Margins", &fa);
+ ecode = px_put1(dev, &list, ecode);
+
+ iv = pxs->media_source; /* might not be an int */
+ if ( iv < 0 || iv >= pxeMediaSource_next )
+ px_record_warning("IllegalMediaSource", false, pxs);
+ else
+ { gs_c_param_list_write(&list, mem);
+ code = param_write_int(plist, ".MediaSource", &iv);
+ ecode = px_put1(dev, &list, ecode);
+ }
+
+ gs_c_param_list_write(&list, mem);
+ code = param_write_bool(plist, "Duplex", &pxs->duplex);
+ ecode = px_put1(dev, &list, ecode);
+
+ gs_c_param_list_write(&list, mem);
+ bv = pxs->duplex_page_mode == eDuplexHorizontalBinding;
+ code = param_write_bool(plist, "Tumble", &bv);
+ ecode = px_put1(dev, &list, ecode);
+
+ gs_c_param_list_write(&list, mem);
+ bv = !pxs->duplex_back_side;
+ code = param_write_bool(plist, "FirstSide", &bv);
+ ecode = px_put1(dev, &list, ecode);
+
+ gs_c_param_list_write(&list, mem);
+ iv = pxs->media_destination; /* might not be an int */
+ code = param_write_int(plist, ".MediaDestination", &iv);
+ ecode = px_put1(dev, &list, ecode);
+
+ gs_c_param_list_write(&list, mem);
+ iv = pxs->media_type; /* might not be an int */
+ code = param_write_int(plist, ".MediaType", &iv);
+ ecode = px_put1(dev, &list, ecode);
+
+ /*
+ * We aren't sure what to do if the device rejects the parameter
+ * value....
+ */
+ switch ( ecode )
+ {
+ case 1:
+ code = gs_setdevice(pgs, dev);
+ if ( code < 0 )
+ return code;
+ case 0:
+ break;
+ default:
+ return_error(errorIllegalAttributeValue);
+ }
+#undef plist
+ }
+ { int code;
+
+ px_initgraphics(pxs);
+ gs_currentmatrix(pgs, &points2device);
+ gs_dtransform(pgs, pxs->media_dims.x, pxs->media_dims.y,
+ &page_size_pixels);
+ { /*
+ * Put the origin at the upper left corner of the page;
+ * also account for the orientation.
+ */
+ gs_matrix orient;
+
+ orient.xx = orient.xy = orient.yx = orient.yy =
+ orient.tx = orient.ty = 0;
+ switch ( pxs->orientation )
+ {
+ case eDefaultOrientation:
+ case ePortraitOrientation:
+ code = gs_translate(pgs, 0.0, pxs->media_dims.y);
+ orient.xx = 1, orient.yy = -1;
+ break;
+ case eLandscapeOrientation:
+ code = 0;
+ orient.xy = 1, orient.yx = 1;
+ break;
+ case eReversePortrait:
+ code = gs_translate(pgs, pxs->media_dims.x, 0);
+ orient.xx = -1, orient.yy = 1;
+ break;
+ case eReverseLandscape:
+ code = gs_translate(pgs, pxs->media_dims.x, pxs->media_dims.y);
+ orient.xy = -1, orient.yx = -1;
+ break;
+ default: /* can't happen */
+ return_error(errorIllegalAttributeValue);
+ }
+ if ( code < 0 ||
+ (code = gs_concat(pgs, &orient)) < 0
+ )
+ return code;
+ }
+ { /* Scale according to session parameters. */
+ /* If we can make the scale integral safely, we do. */
+ double scale = measure_to_points[pxs->measure];
+ gs_matrix mat;
+
+ if ( (code = gs_scale(pgs, scale / pxs->units_per_measure.x,
+ scale / pxs->units_per_measure.y)) < 0
+ )
+ return code;
+ gs_currentmatrix(pgs, &mat);
+ mat.xx = px_adjust_scale(mat.xx, page_size_pixels.x);
+ mat.xy = px_adjust_scale(mat.xy, page_size_pixels.y);
+ mat.yx = px_adjust_scale(mat.yx, page_size_pixels.x);
+ mat.yy = px_adjust_scale(mat.yy, page_size_pixels.y);
+ gs_setmatrix(pgs, &mat);
+ pxs->initial_matrix = mat;
+ }
+ {
+ /* note we don't expect errors here since the
+ coordinates are functions of media sizes known at
+ compile time */
+ gs_rect page_bbox, device_page_bbox;
+ gs_fixed_rect fixed_bbox;
+ /* XL requires a 1/6" border to print correctly, this
+ will set up the border as long as we do not exceed
+ the boundary of the hardware margins. If the
+ engine's border is larger than 1/6" the XL output
+ will be clipped by the engine and will not behave as
+ expected */
+ page_bbox.p.x = max(dev->HWMargins[0], pxs->pm->m_left * media_size_scale);
+ page_bbox.p.y = max(dev->HWMargins[1], pxs->pm->m_top * media_size_scale);
+ page_bbox.q.x = (pxs->media_width * media_size_scale) -
+ max(dev->HWMargins[2], pxs->pm->m_bottom * media_size_scale);
+ page_bbox.q.y = (pxs->media_height * media_size_scale) -
+ max(dev->HWMargins[3], pxs->pm->m_right * media_size_scale);
+ gs_bbox_transform(&page_bbox, &points2device, &device_page_bbox);
+ /* clip to rectangle takes fixed coordinates */
+ fixed_bbox.p.x = float2fixed(device_page_bbox.p.x);
+ fixed_bbox.p.y = float2fixed(device_page_bbox.p.y);
+ fixed_bbox.q.x = float2fixed(device_page_bbox.q.x);
+ fixed_bbox.q.y = float2fixed(device_page_bbox.q.y);
+ gx_clip_to_rectangle(pgs, &fixed_bbox);
+ pxs->pxgs->initial_clip_rect = fixed_bbox;
+ }
+ }
+ { /*
+ * Set the default halftone method. We have to do this here,
+ * rather than earlier, so that the origin is set correctly.
+ */
+ px_args_t args;
+ px_value_t device_matrix;
+ memset(args.pv, 0, sizeof(args.pv));
+ args.pv[1] = &device_matrix; /* DeviceMatrix */
+ device_matrix.type = pxd_scalar | pxd_ubyte;
+ device_matrix.value.i = eDeviceBest;
+ pxSetHalftoneMethod(&args, pxs);
+ }
+ /* Initialize other parts of the PCL XL state. */
+ px_dict_init(&pxs->page_pattern_dict, pxs->memory, px_free_pattern);
+ gs_erasepage(pgs);
+ pxs->have_page = false;
+ /* Make sure there is a legitimate halftone installed. */
+ { int code = px_set_halftone(pxs);
+ if ( code < 0 )
+ return code;
+ }
+ /*
+ * Do a gsave so we can be sure to get rid of all page-related
+ * state at the end of the page, but make sure PopGS doesn't pop
+ * this state from the stack.
+ */
+ { int code = pxPushGS(NULL, pxs);
+ if ( code < 0 )
+ return code;
+ pxs->pxgs->stack_depth--;
+ return code;
+ }
+}
+
+
+int
+pxBeginPageFromPassthrough(px_state_t *pxs)
+{
+ int code;
+ gs_state *pgs = pxs->pgs;
+ gx_device *dev = gs_currentdevice(pgs);
+ gs_point page_size_pixels;
+ gs_matrix points2device;
+
+ px_initgraphics(pxs);
+ gs_currentmatrix(pgs, &points2device);
+ gs_dtransform(pgs, pxs->media_dims.x, pxs->media_dims.y,
+ &page_size_pixels);
+ { /*
+ * Put the origin at the upper left corner of the page;
+ * also account for the orientation.
+ */
+ gs_matrix orient;
+
+ orient.xx = orient.xy = orient.yx = orient.yy =
+ orient.tx = orient.ty = 0;
+ switch ( pxs->orientation )
+ {
+ case eDefaultOrientation:
+ case ePortraitOrientation:
+ code = gs_translate(pgs, 0.0, pxs->media_dims.y);
+ orient.xx = 1, orient.yy = -1;
+ break;
+ case eLandscapeOrientation:
+ code = 0;
+ orient.xy = 1, orient.yx = 1;
+ break;
+ case eReversePortrait:
+ code = gs_translate(pgs, pxs->media_dims.x, 0);
+ orient.xx = -1, orient.yy = 1;
+ break;
+ case eReverseLandscape:
+ code = gs_translate(pgs, pxs->media_dims.x, pxs->media_dims.y);
+ orient.xy = -1, orient.yx = -1;
+ break;
+ default: /* can't happen */
+ return_error(errorIllegalAttributeValue);
+ }
+ if ( code < 0 ||
+ (code = gs_concat(pgs, &orient)) < 0
+ )
+ return code;
+ }
+ { /* Scale according to session parameters. */
+ /* If we can make the scale integral safely, we do. */
+ double scale = measure_to_points[pxs->measure];
+ gs_matrix mat;
+
+ if ( (code = gs_scale(pgs, scale / pxs->units_per_measure.x,
+ scale / pxs->units_per_measure.y)) < 0
+ )
+ return code;
+ gs_currentmatrix(pgs, &mat);
+ mat.xx = px_adjust_scale(mat.xx, page_size_pixels.x);
+ mat.xy = px_adjust_scale(mat.xy, page_size_pixels.y);
+ mat.yx = px_adjust_scale(mat.yx, page_size_pixels.x);
+ mat.yy = px_adjust_scale(mat.yy, page_size_pixels.y);
+ gs_setmatrix(pgs, &mat);
+ pxs->initial_matrix = mat;
+ }
+ {
+ /* note we don't expect errors here since the
+ coordinates are functions of media sizes known at
+ compile time */
+ gs_rect page_bbox, device_page_bbox;
+ gs_fixed_rect fixed_bbox;
+ /* XL requires a 1/6" border to print correctly, this
+ will set up the border as long as we do not exceed
+ the boundary of the hardware margins. If the
+ engine's border is larger than 1/6" the XL output
+ will be clipped by the engine and will not behave as
+ expected */
+ page_bbox.p.x = max(dev->HWMargins[0], pxs->pm->m_left * media_size_scale);
+ page_bbox.p.y = max(dev->HWMargins[1], pxs->pm->m_top * media_size_scale);
+ page_bbox.q.x = (pxs->media_width * media_size_scale) -
+ max(dev->HWMargins[2], pxs->pm->m_bottom * media_size_scale);
+ page_bbox.q.y = (pxs->media_height * media_size_scale) -
+ max(dev->HWMargins[3], pxs->pm->m_right * media_size_scale);
+ gs_bbox_transform(&page_bbox, &points2device, &device_page_bbox);
+ /* clip to rectangle takes fixed coordinates */
+ fixed_bbox.p.x = float2fixed(device_page_bbox.p.x);
+ fixed_bbox.p.y = float2fixed(device_page_bbox.p.y);
+ fixed_bbox.q.x = float2fixed(device_page_bbox.q.x);
+ fixed_bbox.q.y = float2fixed(device_page_bbox.q.y);
+ gx_clip_to_rectangle(pgs, &fixed_bbox);
+ pxs->pxgs->initial_clip_rect = fixed_bbox;
+ }
+
+ pxs->have_page = true;
+ return 0;
+}
+
+const byte apxEndPage[] = {
+ 0,
+ pxaPageCopies, 0
+};
+int
+pxEndPage(px_args_t *par, px_state_t *pxs)
+{ px_end_page_cleanup(pxs);
+ (*pxs->end_page)(pxs, (par->pv[0] ? par->pv[0]->value.i : pxs->copies), 1);
+ pxs->have_page = false;
+ return 0;
+}
+/* The default end-page procedure just calls the device procedure. */
+int
+px_default_end_page(px_state_t *pxs, int num_copies, int flush)
+{ return gs_output_page(pxs->pgs, num_copies, flush);
+}
+
+const byte apxVendorUnique[] = {
+ pxaVUExtension, 0, pxaVUAttr1, 0
+};
+
+/** we do NOTHING with the vendor unique command.
+ * it is undocumented, but appears that it contains the sames color commands as the
+ * XL 2.1 spec. This is based on only finding it in hpclj 4500 driver output.
+ * of course HP denys that the 4500 supports XL.
+ */
+int
+pxVendorUnique(px_args_t *par, px_state_t *pxs)
+{
+ return 0;
+}
+
+
+
+const byte apxComment[] = {
+ 0,
+ pxaCommentData, 0
+};
+int
+pxComment(px_args_t *par, px_state_t *pxs)
+{ return 0;
+}
+
+const byte apxOpenDataSource[] = {
+ pxaSourceType, pxaDataOrg, 0, 0
+};
+int
+pxOpenDataSource(px_args_t *par, px_state_t *pxs)
+{ if ( pxs->data_source_open )
+ return_error(errorDataSourceNotClosed);
+ pxs->data_source_open = true;
+ pxs->data_source_big_endian =
+ par->pv[1]->value.i == eBinaryHighByteFirst;
+ return 0;
+}
+
+const byte apxCloseDataSource[] = {0, 0};
+int
+pxCloseDataSource(px_args_t *par, px_state_t *pxs)
+{ pxs->data_source_open = false;
+ return 0;
+}
+
diff --git a/pxl/pxspec.txt b/pxl/pxspec.txt
new file mode 100644
index 000000000..c14d7635e
--- /dev/null
+++ b/pxl/pxspec.txt
@@ -0,0 +1,563 @@
+
+ Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+
+This document presents the results of Aladdin's investigation of the PCL XL
+Feature Reference Protocol Class 1.1 specification and of its relationship
+to the implementation in the H-P LaserJet 6MP printer.
+
+ Report on PCL XL and LaserJet 6MP
+
+Introduction
+============
+
+In order to implement a fully test-suite-compliant PCL XL interpreter, we
+had to compare the output of our own code with the output printed by an H-P
+printer for the same input data. These comparisons uncovered a number of
+disagreements between the specification and the implementation in the
+printer we used (the LJ 6MP), as well as omission of many details necessary
+to create compatible implementations. In some cases, it seemed likely to us
+that the published specification did not properly describe the intended
+behavior; in other cases, it seemed likely that the observed behavior was
+the result of a printer firmware bug. Of course, only H-P can answer
+authoritatively the question of which alternative is correct.
+
+In presenting test cases below, we have used an imagined source syntax for
+PCL XL. This code is meant to be executed in an environment where one user
+space unit is 1/300" and where all elements of the graphics state have their
+default values.
+
+This document only addresses a very few of the many typographical and
+grammatical errors and internal inconsistencies in the published PCL XL
+specification. In most cases, we found the intention clear.
+
+Changes in a given revision of this document are marked with the revision
+number in [brackets]. Revision history:
+ first issued December 6, 1996
+ rev. [1] December 12, 1996
+ rev. [2] December 13, 1996
+ rev. [3] December 19, 1996
+ rev. [4] December 31, 1996
+ rev. [5] January 7, 1997
+ rev. [6] January 17, 1997
+ rev. [7] February 6, 1997
+
+Miscellaneous
+=============
+
+[7] Embedded data streams
+-------------------------
+
+H-P printers require that if a command reads data from the data source, then
+all the data required by the command must follow the command in a *single*
+data block; it cannot be divided up into multiple blocks whose total length
+is the amount of data required.
+
+Clipping
+--------
+
+The overall discussion of clipping mode and clipping region is inconsistent
+in many places both with itself and with the implementation. Based on
+experiments with the printer, we believe the following is the intended
+behavior:
+
+ - The ClipMode in the graphics state only controls which rule is
+used to determine the inside of the region defined by the *newly presented
+path*. The inside of that region is then intersected with the existing
+clipping region (which is simply an abstract region of the plane,
+independent of being defined by a particular path) to define the new
+clipping region, again as an abstract region of the plane.
+
+ - The ClipRegion parameter of the SetClip operators only controls
+whether the interior or exterior of the region defined by the *newly
+presented path* should be used to intersect with the existing clipping
+region. The result of the operator is an abstract region of the plane.
+
+This interpretation is consistent with the PostScript clipping model and is
+much simpler to understand (and implement) than what the specification
+attempts to describe. Unfortunately, the sample code to illustrate these
+conclusions is too large to present here.
+
+On top of all this, there appears to be a firmware bug in the implementation
+of SetClipIntersect. See below.
+
+[5] Line joins
+--------------
+
+Unlike PostScript, which applies a line join at the ends of every line
+segment (including the segments produced by flattening curves), PCL XL [7]
+does not apply the line join within an individual arc or Bezier (including
+curves that are part of TrueType characters). This produces a "smooth"
+rather than a "bristly" effect when a null line join is selected.
+
+Session operators
+=================
+
+[3] BeginPage
+-------------
+
+Apparently illegal values for Orientation, like MediaSize and MediaSource,
+only produce warnings, not errors.
+
+Font control operators
+======================
+
+[7] RemoveFont
+--------------
+
+[2] If RemoveFont provokes multiple warnings within a single page,
+apparently only the last occurrence of each warning is remembered. Test
+case:
+
+ (Bogus1) ba @FontName RemoveFont
+ (Bogus2) ba @FontName RemoveFont
+ (Arial ) ba @FontName RemoveFont
+ (Bogus3) ba @FontName RemoveFont
+ (CG Times ) ba @FontName RemoveFont
+
+Only Bogus3 (UndefinedFontNotRemoved) and CG Times (InternalFontNotRemoved)
+will appear on the error page.
+
+Graphics state operators
+========================
+
+Miscellaneous
+-------------
+
+The specification fails to state (section 5.0) that CharBoldValue and
+CharSubMode are elements of the graphics state, and that their default
+values are 0 and eNoSubstitution respectively.
+
+SetColorSpace
+-------------
+
+The specification says that this operator sets both the pen and brush to
+paint black. In fact, [3] the operator does no such thing. Test case:
+
+ 20 us @PenWidth SetPenWidth
+ 4 4 usp @PageScale SetPageScale
+
+ 1 b @ColorSpace SetColorSpace % eGray
+ 0.5 r @GrayLevel SetPenSource
+ 0.8 r @GrayLevel SetBrushSource
+ 100 100 200 200 usq @BoundingBox Rectangle
+
+ 2 b @ColorSpace SetColorSpace % eRGB
+ 300 100 400 200 usq @BoundingBox Rectangle
+
+The two rectangles are identical. We think this is probably an error in the
+specification, since the observed behavior seems reasonable.
+
+SetBrushSource, SetPenSource
+----------------------------
+
+The statement "The paint source identified in the attribute list is
+compatible with the current color space" is misleading, since it is
+acceptable to set the brush source to a raster pattern defined in a color
+space different from the current one.
+
+[6] SetCharAngle, SetCharScale, SetCharShear
+--------------------------------------------
+
+The statement that these are "not cumulative" is somewhat misleading. What
+the H-P printers apparently do is remember only the most recent invocation
+of these commands, including the order in which they were received. Thus,
+for example, the sequences <Angle1, Scale, Angle2> and <Scale, Angle1,
+Angle2> are both equivalent to <Scale, Angle2>, but <Angle1, Angle2, Scale>
+is equivalent to <Angle2, Scale>, which is different.
+
+SetCharSubMode
+--------------
+
+Character substitution is not defined or discussed anywhere else in this
+document. However, from other reading, we are quite certain that this
+operator requires an array with exactly 1 element, and that it turns on or
+off vertical substitution using the VT segment of TrueType fonts, as for
+PCL5.
+
+SetMiterLimit
+-------------
+
+Setting a miter limit of 0 is [4] apparently equivalent to setting the miter
+limit to its default value of 10. We believe this behavior is deliberate
+and that the specification omitted this point accidentally.
+
+SetLineDash
+-----------
+
+The last sentence, stating that "the dash style of a line is not scaled when
+a line is scaled", is simply wrong. Test case:
+
+ [40 20] @LineDashStyle SetLineDash
+ [100 100] @Point SetCursor
+ [300 0] @EndPoint LineRelPath
+ PaintPath NewPath
+ [100 200] @Point SetCursor
+ [2 2] @Scale SetPageScale
+ [300 0] @EndPoint LineRelPath
+ PaintPath
+
+In the second line, the dashes and gaps are twice as long. We think the
+text in the specification may be a holdover from an earlier version of the
+design, and that the scaling behavior is the one that is actually intended,
+since, for example, it matches the behavior of PostScript's setdash
+operator.
+
+SetClip*
+--------
+
+The discussion of ClipMode and ClipRegion is wrong almost everywhere. See
+the "Graphics State" section above.
+
+SetClipIntersect
+----------------
+
+It appears that SetClipIntersect disregards the ClipRegion attribute if any
+intersection actually occurs. Test cases ("region1" and "region2" are
+parameters, eInterior or eExterior):
+
+ eEvenOdd @ClipMode SetClipMode
+ [120 120] @Point SetCursor
+ [100 0] @EndPoint LineRelPath
+ [-100 100] @EndPoint LineRelPath
+ CloseSubPath
+ region1 @ClipRegion SetClipIntersect
+ [120 120] @Point SetCursor
+ [100 0] @EndPoint LineRelPath
+ [0 100] @EndPoint LineRelPath
+ CloseSubPath
+ region2 @ClipRegion SetClipIntersect
+ [100 100 440 440] @BoundingBox Rectangle
+
+The outputs with region2 = eInterior are what one would expect (triangles
+pointing "south" and "west"), but the outputs with region2 = eExterior are
+the same (a square with a triangle cut-out pointing "northeast") whether
+region1 = eInterior or region1 = eExterior. We were unable to come up with
+an interpretation of the specification that would make this the correct
+behavior, so we think this is a firmware bug.
+
+SetROP
+------
+
+The specification, read literally, would require keeping an internal
+representation of the page in which every pixel was represented as a 24-bit
+RGB value. The implementation in the printer does no such thing: it applies
+the given RasterOp/transparency algorithm to the physical device pixels
+*after halftoning*, with white pixels resulting from halftoning being
+treated as transparent if the corresponding transparency mode is set. This
+is tremendously simpler and cheaper to implement than what is in the
+specification, but it is also produces very different results. Test case:
+
+ 1 @ColorSpace SetColorSpace
+ 15 @GrayLevel SetBrushSource
+ [100 100 200 200] @BoundingBox Rectangle
+ 86 @ROP3 SetROP % D ^ (T | S)
+ 240 @GrayLevel SetBrushSource
+ [100 100 200 200] @BoundingBox Rectangle
+
+The specification requires painting the interior of the rectangle with the
+XOR of the 15 and the 240, i.e., 255, i.e., white. In fact, this produces a
+dark gray shade resulting from XORing the two halftone masks together.
+
+The equations for transparency processing (section 5.7.5) are badly
+presented: Src and Paint in the first equation of each case (the computation
+of Temporary_ROP3) refer to the actual pixels, while Src and Paint in the
+other equations refer to masks that have 1s where the corresponding pixel is
+not white. For black-and-white printers with black = 1, the two are
+equivalent, but for color printers, they are quite different.
+
+In order to make ORing different gray shades together produce a result
+approximating the sum of the shade values rather than the maximum, H-P has
+apparently used very carefully designed default halftone screens, and
+*different* screens for the source and paint operands of RasterOp. There is
+no way to achieve this effect with user-defined dither matrices, because the
+same matrix is used for all cases. Test case:
+
+ << optionally download a dither matrix >>
+ eRGB @ColorSpace SetColorSpace
+ For values of x from 0 by 5 to 255
+ For values of y from 0 to 5 by 255
+ Let X = x * 10 + 100, Y = y * 10 + 100
+ 252 @ROP3 SetROP
+ x @GrayValue SetBrushSource
+ [X Y X+10 Y+10] @BoundingBox Rectangle
+ 238 @ROP3 SetROP
+ 0 @GrayValue SetBrushSource
+ [X Y] @Point SetCursor
+ 0 @ColorMapping 2 @ColorDepth
+ 1 @SourceWidth 1 @SourceHeight
+ [10 10] @DestinationSize
+ BeginImage
+ 0 @StartLine 1 @BlockHeight 0 @CompressMode
+ ReadImage
+ <fb 04> % stream preamble
+ <y 00 00 00> % stream data
+ EndImage
+
+The output for the downloaded matrix is very different from the output for
+the default screen; a careful examination of the output with the default
+screen will reveal that the square at (x,y) is different from the square at
+(y,x), confirming that different screens are used for source and paint.
+
+[3] SetHalftoneMethod
+---------------------
+
+[4] Setting a new halftone method does not affect the current brush or pen:
+apparently SetBrushSource and SetPenSource immediately render the color
+using the current halftone method, and PaintPath uses that rendering. To
+verify this:
+
+ << SetBrushSource with a gray level >>
+ ... SetHalftoneMethod ...
+ << construct a path >>
+ PaintPath
+
+The path will be painted with a brush that uses the old halftone method, not
+the new one.
+
+[7] The DitherOrigin is apparently relative not to the current user
+coordinate system (as documented), but to the default user coordinate system
+in the current orientation. Here is a test file:
+
+ 150 600 usp @PageOrigin SetPageOrigin
+ 0 b @DitherMatrixDataType
+ 32 32 usp @DitherMatrixSize
+ 2 b @DitherMatrixDepth
+ SetHalftoneMethod
+ << 1024 bytes of distinctive-pattern matrix omitted >>
+ 2 b @ColorSpace SetColorSpace
+ [100 100 100] ba @RGBColor SetBrushSource
+ 0 0 32 32 usq @BoundingBox Rectangle
+
+If the DitherOrigin were taken correctly, the output would consist of a
+single, unshifted copy of the halftone tile. However, the tile is shifted.
+
+[7] When using the default dither matrix, the X component of the
+DitherOrigin is ignored. For example:
+
+ eGray @ColorSpace SetColorSpace
+ 0 b @NullPen SetPenSource
+ 90 b @ROP3 SetROP % D ^ T
+ 175 b @GrayLevel SetBrushSource
+ 0 0 100 100 usq Rectangle
+ 1 0 usp @DitherOrigin
+ eDeviceBest @DeviceMatrix
+ SetHalftoneMethod
+ 175 b @GrayLevel SetBrushSource
+ 0 0 100 100 usq Rectangle
+
+The result is white: the dither matrix was not translated, and the gray
+pattern cancelled itself out. If one replaces the 6th line with
+
+ 0 1 usp @DitherOrigin
+
+the result is a gray square, showing that the matrix was translated.
+
+Painting operators
+==================
+
+[3] ArcPath
+-----------
+
+If the corners of the BoundingBox are specified with x1 > x2 or y1 > y2, the
+following peculiar changes occur in the output:
+
+ - x1 < x2, y1 < y2: the arc is drawn counter-clockwise from
+ StartPoint to EndPoint, per the specification.
+
+ - x1 < x2, y1 > y2: the arc is drawn clockwise from EndPoint to
+ StartPoint.
+
+ - x1 > x2, y1 < y2: the arc is drawn clockwise from the point
+ opposite EndPoint to the point opposite StartPoint.
+
+ - x1 > x2, y1 > y2: the arc is drawn counter-clockwise from
+ point opposite StartPoint to the point opposite EndPoint.
+
+There is probably some simple way of characterizing these changes
+mathematically, but we haven't found it. We think this is probably a
+firmware bug, but it could also be a specification error.
+
+[3] Chord
+---------
+
+The arc of the chord is drawn before the line. This is not documented; it
+matters when a dash pattern is being used.
+
+Chord behaves like ArcPath for BoundingBox values with x1 < x2 or y1 < y2.
+
+Chord probably clears the path, rather than leaving it set to the shape.
+(We didn't verify this, but it seems likely given that Ellipse and Pie do
+it.) See Rectangle below.
+
+[3] ChordPath
+-------------
+
+The arc of the chord is drawn before the line. This is not documented; it
+matters when a dash pattern is being used.
+
+ChordPath behaves like ArcPath for BoundingBox values with x1 < x2 or y1 <
+y2.
+
+[1] Ellipse
+-----------
+
+[1] The specification does not say what the starting point of an ellipse is,
+or in which direction the ellipse is drawn; this matters when a dash pattern
+is being used. [7] The starting point and drawing direction for ellipses
+are as follows:
+
+ - x1 < x2, y1 < y2: starts at 180 degree point (on the ellipse's X
+ axis at minimum X), draws counter-clockwise.
+
+ - x1 < x2, y1 > y2: starts at 180 degree point, draws clockwise.
+
+ - x1 > x2, y1 < y2: starts at 0 degree point, draws clockwise.
+
+ - x1 > x2, y1 > y2: starts at 0 degree point, draws
+ counter-clockwise.
+
+Ellipse clears the path, rather than leaving it set to the shape. See
+Rectangle below.
+
+[3] Pie
+-------
+
+The line from the center to the starting point of the arc is drawn first,
+then the arc, then the line back to the center. This is not documented; it
+matters when a dash pattern is being used.
+
+Pie behaves like ArcPath for BoundingBox values with x1 < x2 or y1 < y2.
+
+Pie clears the path, rather than leaving it set to the shape. See Rectangle
+below.
+
+[3] PiePath
+-----------
+
+PiePath draws in the same order as Pie.
+
+PiePath behaves like ArcPath for BoundingBox values with x1 < x2 or y1 < y2.
+
+Rectangle
+---------
+
+The specification says that Rectangle is equivalent to
+ NewPath RectanglePath PaintPath
+
+Since PaintPath does not reset the path, Rectangle should leave the path set
+to the rectangle; the postcondition in the specification says this
+explicitly. However, the implementation resets the path after Rectangle.
+Test case:
+
+ 25 @PenWidth SetPenWidth
+ 0 @NullBrush SetBrushSource
+ eGray @ColorSpace SetColorSpace
+ 60 @GrayLevel SetPenSource
+ 100 100 @Point SetCursor
+ 200 0 @EndPoint LineRelPath
+ PaintPath % should not reset path
+ 120 @GrayLevel SetPenSource
+ 100 150 @Point SetCursor
+ 200 0 @EndPoint LineRelPath
+ PaintPath % should repaint first line
+ 180 @GrayLevel SetPenSource
+ 100 200 200 300 @BoundingBox Rectangle % should leave path set to rectangle
+ 230 @GrayLevel SetPenSource
+ 100 400 @Point SetCursor
+ 200 0 @EndPoint LineRelPath
+ PaintPath % should repaint rectangle
+
+The last line is painted a lighter gray than the rectangle, demonstrating
+that Rectangle left the path empty. We are not sure whether this is a
+firmware bug or a change in the intended specification.
+
+We verified that Ellipse and Pie behave the same way, but we did not test
+whether this behavior extends to the other operators (Chord, RoundRectangle)
+that one might expect to behave similarly.
+
+Rectangle, RectanglePath
+------------------------
+
+[1] Even though the specification says rectangles are drawn
+counter-clockwise, they are actually drawn clockwise, starting in the upper
+left corner. Test case:
+
+ 10 us @PenWidth SetPenWidth
+ [130 10 40 10 30 10 20 10] ssa @LineDashStyle
+ 0 ss @DashOffset SetLineDash
+ 0 b @NullBrush SetBrushSource
+ 200 200 700 400 ssq @BoundingBox Rectangle
+
+The dash pattern clearly starts in the upper left corner and runs clockwise.
+
+[7] Rectangles allow specifying the bounding box points in any order; the
+rectangle is always drawn clockwise, starting with the point that has the
+lesser user space coordinates.
+
+RoundRectangle, RoundRectanglePath
+----------------------------------
+
+The BoundingBox attribute gives the bounding box for the rectangle, not the
+ellipse. This is just a typo, but a substantial one.
+
+[1] Round rectangles, unlike rectangles, *are* drawn counter-clockwise.
+starting at the top of the straight part of the left edge. Test case:
+
+ 10 us @PenWidth SetPenWidth
+ [130 10 40 10 30 10 20 10] ssa @LineDashStyle
+ 0 ss @DashOffset SetLineDash
+ 0 b @NullBrush SetBrushSource
+ 200 200 700 400 ssq @BoundingBox
+ 120 120 usp @EllipseDimension RoundRectangle
+
+[7] Round rectangles give an IllegalAttributeValue error if the bounding box
+points are not specified with x1 < x2, y1 < y2.
+
+ScanLineRel
+-----------
+
+The description of x-pairs in section 6.12 is either misleading or wrong.
+If the current X position is X and the values in the x-pair are U and V, the
+x-pair causes a line to be drawn from X+U to X+U+V, not X+U to X+V. (The
+test case is too messy to present here.)
+
+[3] Text, TextPath
+------------------
+
+[3] It appears that text transforms *objects*, whereas images and paths
+transform *coordinates*. Mathematically, this requires applying
+transformations to text in the opposite order from graphics. Test case:
+
+ (TimesNewRmn ) ba @FontName
+ 200 us @CharSize 277 us @SymbolSet SetFont
+ 2500 2500 usp @PageOrigin SetPageOrigin
+ 4 1 usp @PageScale SetPageScale
+ NewPath 0 0 usp @Point SetCursor
+
+ << repeat 2-4 times: >>
+
+ PushGS
+ (1) ba @TextData Text
+ 200 0 usp @Point SetCursor
+ 1 1.5 rp @PageScale SetPageScale
+ (2) ba @TextData TextPath PaintPath NewPath
+ 400 0 usp @PageOrigin SetPageOrigin
+ 1 1.5 rp @PageScale SetPageScale
+ 90 us @PageAngle SetPageRotation
+ 0 0 usp @Point SetCursor
+ (3) ba @TextData Text
+ 200 0 usp @Point SetCursor
+ 1 1.5 rp @PageScale SetPageScale
+ (4) ba @TextData TextPath PaintPath NewPath
+ PopGS
+ 90 us @PageAngle SetPageRotation
+
+ << end repeat >>
+
+For example, the '1' characters are all the same shape, indicating that they
+were scaled (as objects) before being rotated; if this transformation had
+been applied to the coordinates, both the portrait and the landscape
+characters would have been stretched in the page X direction. This
+interpretation of the specification is far from obvious, but it is not
+unreasonable, so we think it is what is intended rather than a bug.
diff --git a/pxl/pxstate.c b/pxl/pxstate.c
new file mode 100644
index 000000000..60d13090f
--- /dev/null
+++ b/pxl/pxstate.c
@@ -0,0 +1,97 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxstate.c */
+/* State allocation/initialization/cleanup */
+
+#include "stdio_.h" /* std.h + NULL */
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "scommon.h"
+#include "pxparse.h"
+#include "pxstate.h"
+#include "pxfont.h"
+#include "gxfcache.h"
+
+/* Import the initialization procedure table from pxtop.c. */
+typedef int (*px_init_proc)(px_state_t *);
+extern const px_init_proc px_init_table[];
+
+/* Allocate a px_state_t. */
+px_state_t *
+px_state_alloc(gs_memory_t *memory)
+{
+ px_state_t *pxs = (px_state_t *)gs_alloc_bytes(memory,
+ sizeof(px_state_t),
+ "px_state_alloc");
+ px_gstate_t *pxgs = px_gstate_alloc(memory);
+
+ if ( pxs == 0 || pxgs == 0 ) {
+ gs_free_object(memory, pxgs, "px_gstate_alloc");
+ gs_free_object(memory, pxs, "px_state_alloc");
+ return 0;
+ }
+ pxs->memory = memory;
+ pxs->pxgs = pxgs;
+ pxgs->pxs = pxs;
+ px_state_init(pxs, NULL);
+ /* Run module initialization code. */
+ {
+ const px_init_proc *init;
+ for ( init = px_init_table; *init; ++init )
+ (*init)(pxs);
+ }
+ return pxs;
+}
+
+/* Release a px_state_t */
+void
+px_state_release(px_state_t *pxs)
+{
+ px_value_t val = {0}; /* arbitrary */
+ /* delete the pxl error page and error page enumeration, the
+ following deletes the font without having to import the font
+ freeing procedure. We add the font to the font dictionary and
+ then release all of the fonts */
+ px_dict_put(&pxs->font_dict, &val, pxs->error_page_font);
+ px_dict_release(&pxs->font_dict);
+ gs_free_object(pxs->memory, pxs->error_page_show_enum,
+ "px_state_release(pxs->error_page_show_enum)");
+ /* Don't free pxgs since it'll get freed as pgs' client */
+ gs_free_object(pxs->memory, pxs, "px_state_release");
+}
+
+/* Do one-time state initialization. */
+/* There isn't much of this: most state is initialized per-session. */
+void
+px_state_init(px_state_t *pxs, gs_state *pgs)
+{ pxs->pgs = pgs;
+ px_gstate_init(pxs->pxgs, pgs);
+ pxs->error_report = eErrorPage; /* default before first session */
+ pxs->end_page = px_default_end_page;
+ pxs->data_source_open = false;
+ px_dict_init(&pxs->stream_dict, pxs->memory, NULL);
+ px_dict_init(&pxs->builtin_font_dict, pxs->memory, px_free_font);
+ px_dict_init(&pxs->font_dict, pxs->memory, px_free_font);
+ pxs->warning_length = 0;
+}
+
+/* Do one-time finalization at the end of execution. */
+void
+px_state_finit(px_state_t *pxs)
+{ /* If streams persisted across sessions, we would release them here. */
+#if 0
+ px_dict_release(&pxs->stream_dict);
+#endif
+}
diff --git a/pxl/pxstate.h b/pxl/pxstate.h
new file mode 100644
index 000000000..14c4ec389
--- /dev/null
+++ b/pxl/pxstate.h
@@ -0,0 +1,189 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxstate.h */
+/* State definitions for PCL XL interpreter */
+
+#ifndef pxstate_INCLUDED
+# define pxstate_INCLUDED
+
+#include "gsmemory.h"
+#include "pxgstate.h"
+#include "pltop.h"
+
+/* Define an abstract type for a font directory. */
+#ifndef gs_font_dir_DEFINED
+# define gs_font_dir_DEFINED
+typedef struct gs_font_dir_s gs_font_dir;
+#endif
+
+/* Define an abstract type for a text enumerator. */
+/* We only need this for the preallocated enumerator for the error page. */
+#ifndef gs_show_enum_DEFINED
+# define gs_show_enum_DEFINED
+typedef struct gs_show_enum_s gs_show_enum;
+#endif
+
+/* Define an abstract type for an image enumerator. */
+#ifndef px_image_enum_DEFINED
+# define px_image_enum_DEFINED
+typedef struct px_image_enum_s px_image_enum_t;
+#endif
+
+/* Define an abstract type for an pattern enumerator. */
+#ifndef px_pattern_enum_DEFINED
+# define px_pattern_enum_DEFINED
+typedef struct px_pattern_enum_s px_pattern_enum_t;
+#endif
+
+/* Define the type of the PCL XL state. */
+#ifndef px_state_DEFINED
+# define px_state_DEFINED
+typedef struct px_state_s px_state_t;
+#endif
+
+/* NB need a separate header file for media */
+typedef struct px_media_s {
+ pxeMediaSize_t ms_enum;
+ short width, height;
+ short m_left, m_top, m_right, m_bottom;
+} px_media_t;
+
+/* This structure captures the entire state of the PCL XL "virtual */
+/* machine", except for graphics state parameters in the gs_state. */
+struct px_state_s {
+
+ gs_memory_t *memory;
+ /* Hook back to client data, for callback procedures */
+ void *client_data;
+ gs_id known_fonts_base_id;
+
+ /* Session state */
+
+ pxeMeasure_t measure;
+ gs_point units_per_measure;
+ pxeErrorReport_t error_report;
+ bool useciecolor;
+
+ /* Pattern dictionary */
+ px_dict_t session_pattern_dict;
+
+ /* Page state */
+
+ pxeOrientation_t orientation;
+ pxeMediaSource_t media_source;
+ gs_point media_dims;
+ bool duplex;
+ int copies;
+ pxeDuplexPageMode_t duplex_page_mode;
+ bool duplex_back_side;
+ pxeMediaDestination_t media_destination;
+
+ /* NB media needs reorganization. */
+ pxeMediaType_t media_type;
+ px_media_t media_with_dims;
+ px_media_t *pm;
+ pxeMediaSize_t media_size;
+ short media_height;
+ short media_width;
+
+ int (*end_page)(px_state_t *pxs, int num_copies, int flush);
+ /* Pattern dictionary */
+ px_dict_t page_pattern_dict;
+ /* Internal variables */
+ bool have_page; /* true if anything has been written on page */
+ /* Cached values */
+ gs_matrix initial_matrix;
+
+ /* Data source */
+
+ bool data_source_open;
+ bool data_source_big_endian;
+ /* Stream dictionary */
+ px_dict_t stream_dict;
+ /* Stream reading state */
+ gs_string stream_name;
+ int stream_level; /* recursion depth */
+ struct sd2_ {
+ byte *data;
+ uint size;
+ } stream_def;
+
+ /* Font dictionary */
+ px_dict_t font_dict;
+ px_dict_t builtin_font_dict;
+ /* Font/character downloading state */
+ px_font_t *download_font;
+ int font_format;
+ /* Global structures */
+ gs_font_dir *font_dir;
+ px_font_t *error_page_font;
+ gs_show_enum *error_page_show_enum;
+
+ /* Graphics state */
+
+ gs_state *pgs; /* PostScript graphics state */
+ px_gstate_t *pxgs;
+ /* Image/pattern reading state */
+ px_image_enum_t *image_enum;
+ px_pattern_enum_t *pattern_enum;
+
+ /* Miscellaneous */
+ struct db_ {
+ byte *data;
+ uint size;
+ } download_bytes; /* font/character/halftone data */
+ gs_string download_string; /* ditto */
+ struct sp_n {
+ int x;
+ double y0, y1;
+ } scan_point; /* position when reading scan lines */
+
+ /* We put the warning table and error line buffer at the end */
+ /* so that the offsets of the scalars will stay small. */
+#define px_max_error_line 120
+ char error_line[px_max_error_line + 1]; /* for errors with their own msg */
+#define px_max_warning_message 500
+ uint warning_length;
+ char warnings[px_max_warning_message + 1];
+ /* ---------------- PJL state -------------------- */
+ pl_interp_instance_t *pjls;
+ /* ---------------- PCL state -------------------- */
+ pl_interp_instance_t *pcls;
+};
+
+/* Allocate a px_state_t. */
+px_state_t *px_state_alloc(gs_memory_t *);
+
+/* Release a px_state_t */
+void px_state_release(px_state_t *pxs);
+
+/* Do one-time state initialization. */
+void px_state_init(px_state_t *, gs_state *);
+
+/* Define the default end-of-page procedure. */
+int px_default_end_page(px_state_t *, int, int);
+
+/* Clean up after an error or UEL. */
+void px_state_cleanup(px_state_t *);
+
+/* Do one-time finalization. */
+void px_state_finit(px_state_t *);
+
+/* get media size */
+void px_get_default_media_size(px_state_t *pxs, gs_point *pt);
+
+/* special begin page operator for passthrough mode. */
+int pxBeginPageFromPassthrough(px_state_t *pxs);
+
+#endif /* pxstate_INCLUDED */
diff --git a/pxl/pxstream.c b/pxl/pxstream.c
new file mode 100644
index 000000000..a48168373
--- /dev/null
+++ b/pxl/pxstream.c
@@ -0,0 +1,193 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxstream.c */
+/* PCL XL user-defined stream operators */
+
+#include "memory_.h"
+#include "gsmemory.h"
+#include "scommon.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxparse.h"
+
+/* ---------------- Internal procedures ---------------- */
+
+/* Tag a stream name with its character width. */
+static int
+tag_stream_name(const px_value_t *psnv, gs_string *pstr,
+ gs_memory_t *mem, client_name_t cname)
+{ uint size = array_value_size(psnv);
+ byte *str = gs_alloc_string(mem, size + 1, cname);
+
+ if ( str == 0 )
+ return_error(errorInsufficientMemory);
+ str[0] = value_size(psnv);
+ memcpy(str + 1, psnv->value.array.data, size);
+ pstr->data = str;
+ pstr->size = size + 1;
+ return 0;
+}
+
+/* ---------------- Operators ---------------- */
+
+const byte apxBeginStream[] = {
+ pxaStreamName, 0, 0
+};
+int
+pxBeginStream(px_args_t *par, px_state_t *pxs)
+{ int code = tag_stream_name(par->pv[0], &pxs->stream_name, pxs->memory,
+ "pxBeginStream(name)");
+
+ if ( code < 0 )
+ return code;
+ pxs->stream_def.size = 0;
+ pl_dict_undef(&pxs->stream_dict, pxs->stream_name.data,
+ pxs->stream_name.size);
+ return 0;
+}
+
+const byte apxReadStream[] = {
+ pxaStreamDataLength, 0, 0
+};
+int
+pxReadStream(px_args_t *par, px_state_t *pxs)
+{ ulong len = par->pv[0]->value.i;
+ ulong copy = min(len - par->source.position, par->source.available);
+ uint old_size = pxs->stream_def.size;
+ byte *str;
+
+ if ( copy == 0 )
+ return pxNeedData;
+ if ( old_size == 0 )
+ str = gs_alloc_bytes(pxs->memory, copy, "pxReadStream");
+ else
+ str = gs_resize_object(pxs->memory, pxs->stream_def.data,
+ old_size + copy, "pxReadStream");
+ if ( str == 0 )
+ return_error(errorInsufficientMemory);
+ memcpy(str + old_size, par->source.data, copy);
+ pxs->stream_def.data = str;
+ pxs->stream_def.size = old_size + copy;
+ par->source.data += copy;
+ par->source.available -= copy;
+ return ((par->source.position += copy) == len ? 0 : pxNeedData);
+}
+
+const byte apxEndStream[] = {0, 0};
+int
+pxEndStream(px_args_t *par, px_state_t *pxs)
+{ int code = pl_dict_put(&pxs->stream_dict, pxs->stream_name.data,
+ pxs->stream_name.size, pxs->stream_def.data);
+
+ gs_free_string(pxs->memory, pxs->stream_name.data,
+ pxs->stream_name.size, "pxEndStream(name)");
+ return (code < 0 ? gs_note_error(errorInsufficientMemory) : 0);
+}
+
+const byte apxRemoveStream[] = {
+ pxaStreamName, 0, 0
+};
+
+int
+pxRemoveStream(px_args_t *par, px_state_t *pxs)
+{
+ gs_string str;
+ void *def;
+ int code = tag_stream_name(par->pv[0], &str, pxs->memory,
+ "pxExecStream(name)");
+ if ( code < 0 )
+ return code;
+ {
+ bool found = pl_dict_find(&pxs->stream_dict, str.data, str.size,
+ &def);
+ if ( !found )
+ return_error(errorStreamUndefined);
+ pl_dict_undef(&pxs->stream_dict, str.data, str.size);
+ gs_free_string(pxs->memory, str.data, str.size,
+ "pxRemoveStream(name)");
+ }
+ return 0;
+}
+
+const byte apxExecStream[] = {
+ pxaStreamName, 0, 0
+};
+int
+pxExecStream(px_args_t *par, px_state_t *pxs)
+{ gs_string str;
+ void *def;
+ const byte *def_data;
+ uint def_size;
+ bool big_endian;
+ const byte *start;
+ px_parser_state_t *pst = par->parser;
+ px_parser_state_t st;
+ stream_cursor_read r;
+ int code = tag_stream_name(par->pv[0], &str, pxs->memory,
+ "pxExecStream(name)");
+
+ if ( code < 0 )
+ return code;
+
+ if ( pxs->stream_level > 32 )
+ return_error(errorStreamNestingFull);
+
+ { bool found = pl_dict_find(&pxs->stream_dict, str.data, str.size,
+ &def);
+
+ gs_free_string(pxs->memory, str.data, str.size,
+ "pxExecStream(name)");
+ if ( !found )
+ return_error(errorStreamUndefined);
+ }
+ def_data = def;
+ def_size = gs_object_size(pxs->memory, def);
+ /* We do all the syntax checking for streams here, rather than */
+ /* in ReadStream or EndStream, for simplicity. */
+ switch ( def_data[0] )
+ {
+ case '(': big_endian = true; break;
+ case ')': big_endian = false; break;
+ default: return_error(errorUnsupportedBinding);
+ }
+ if ( def_size < 16 ||
+ strncmp(def_data + 1, " HP-PCL XL", 10)
+ )
+ return_error(errorUnsupportedClassName);
+ /* support protocol level 1, 2 and 3 */
+ if ( strncmp(def_data + 11, ";1;", 3) &&
+ strncmp(def_data + 11, ";2;", 3) &&
+ strncmp(def_data + 11, ";3;", 3) )
+ return_error(errorUnsupportedProtocol);
+ start = memchr(def_data + 14, '\n', def_size - 14);
+ if ( !start )
+ return_error(errorIllegalStreamHeader);
+ st.memory = pxs->memory;
+ px_process_init(&st, big_endian);
+ st.macro_state = pst->macro_state | ptsExecStream;
+ st.last_operator = pst->last_operator;
+ r.ptr = start;
+ r.limit = def_data + def_size - 1;
+ pxs->stream_level++;
+ code = px_process(&st, pxs, &r);
+ pxs->stream_level--;
+ pst->macro_state = st.macro_state & ~ptsExecStream;
+ if ( code < 0 )
+ { /* Set the operator counts for error reporting. */
+ pst->parent_operator_count = pst->operator_count;
+ pst->operator_count = st.operator_count;
+ pst->last_operator = st.last_operator;
+ }
+ return code;
+}
diff --git a/pxl/pxsymbol.ps b/pxl/pxsymbol.ps
new file mode 100644
index 000000000..e8ccae018
--- /dev/null
+++ b/pxl/pxsymbol.ps
@@ -0,0 +1,111 @@
+%!
+% Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+% Unauthorized use, copying, and/or distribution prohibited.
+
+% Construct the PCL XL symbol set mappings.
+% This generates both a .c and a .h file.
+
+% Load all known encodings.
+(../gs_???_e.ps)
+ { (r) file
+ dup token pop dup /currentglobal eq
+ { % The next 4 tokens are standard.
+ 5 { pop dup token pop } repeat
+ }
+ if
+ % stack: file token
+ /Encoding resourcestatus
+ { pop 2 ne
+ { closefile }
+ { dup 0 setfileposition run }
+ ifelse
+ }
+ { dup 0 setfileposition run
+ }
+ ifelse
+ }
+100 string filenameforall
+
+% Construct a list of all the glyphs.
+/glyphs 1000 dict def
+(*)
+ { /Encoding findresource { glyphs exch dup put } forall
+ }
+100 string /Encoding resourceforall
+glyphs /.notdef undef
+
+% Write the copyright notice and initial boilerplate.
+(/* Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+ */
+) print
+
+/HEADER where { pop HEADER } { false } ifelse
+ { (
+/* pxsymbol.h */
+/* PCL XL symbol set table declarations */
+
+) print
+ (*)
+ { (extern const unsigned short px) print =only ([];
+) print
+ }
+ 100 string /Encoding resourceforall
+ flush quit
+ }
+if
+
+(
+/* pxsymbol.c */
+/* PCL XL symbol set mapping definitions */
+
+#include "pxsymbol.h"
+) print
+
+% Write the enumeration of the glyphs.
+% It would be too much work to really sort them, so we only sort by
+% the first character.
+(
+typedef enum {
+ pxg__notdef = 0) print
+
+65 1 122
+ { /first exch def
+ glyphs
+ { =string cvs 0 get first eq
+ { (,
+ pxg_) print =only }
+ { pop }
+ ifelse
+ }
+ forall
+ }
+for
+(
+} px_glyph_t;
+) print
+
+% Write the actual encodings.
+(*)
+ { (
+const unsigned short px) print dup =only ([257] = {) print
+ /Encoding findresource
+ 0 4 255
+ { (
+ ) print
+ dup 1 exch 3 add
+ { ( pxg_) print 2 copy get dup /.notdef eq { pop (_notdef) } if
+ =only (,) print pop
+ }
+ for
+ }
+ for
+ (
+ pxg__notdef
+};
+) print pop
+ }
+100 string /Encoding resourceforall
+
+% All done.
+flush quit
diff --git a/pxl/pxsymbol.psc b/pxl/pxsymbol.psc
new file mode 100644
index 000000000..aad7bfb93
--- /dev/null
+++ b/pxl/pxsymbol.psc
@@ -0,0 +1,1267 @@
+/* Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+ */
+
+/* pxsymbol.c */
+/* PCL XL symbol set mapping definitions */
+
+#include "pxsymbol.h"
+
+typedef enum {
+ pxg__notdef = 0,
+ pxg_Aacute,
+ pxg_Atilde,
+ pxg_Aring,
+ pxg_Alpha,
+ pxg_AE,
+ pxg_Agrave,
+ pxg_Acircumflex,
+ pxg_Adieresis,
+ pxg_Aacutesmall,
+ pxg_Acircumflexsmall,
+ pxg_Atildesmall,
+ pxg_Agravesmall,
+ pxg_Adieresissmall,
+ pxg_Aringsmall,
+ pxg_Asmall,
+ pxg_AEsmall,
+ pxg_Acutesmall,
+ pxg_A,
+ pxg_Beta,
+ pxg_Brevesmall,
+ pxg_Bsmall,
+ pxg_B,
+ pxg_Chi,
+ pxg_Ccedilla,
+ pxg_Circumflexsmall,
+ pxg_Ccedillasmall,
+ pxg_Cedillasmall,
+ pxg_Csmall,
+ pxg_Caronsmall,
+ pxg_C,
+ pxg_Delta,
+ pxg_Dotaccentsmall,
+ pxg_Dieresissmall,
+ pxg_Dsmall,
+ pxg_D,
+ pxg_Eta,
+ pxg_Egrave,
+ pxg_Ecircumflex,
+ pxg_Eth,
+ pxg_Epsilon,
+ pxg_Eacute,
+ pxg_Edieresis,
+ pxg_Egravesmall,
+ pxg_Edieresissmall,
+ pxg_Ethsmall,
+ pxg_Eacutesmall,
+ pxg_Ecircumflexsmall,
+ pxg_Esmall,
+ pxg_E,
+ pxg_Fsmall,
+ pxg_F,
+ pxg_Gamma,
+ pxg_Gsmall,
+ pxg_Gravesmall,
+ pxg_G,
+ pxg_Hsmall,
+ pxg_Hungarumlautsmall,
+ pxg_H,
+ pxg_Ifraktur,
+ pxg_Iacute,
+ pxg_Idieresis,
+ pxg_Igrave,
+ pxg_Icircumflex,
+ pxg_Iota,
+ pxg_Icircumflexsmall,
+ pxg_Ismall,
+ pxg_Igravesmall,
+ pxg_Idieresissmall,
+ pxg_Iacutesmall,
+ pxg_I,
+ pxg_Jsmall,
+ pxg_J,
+ pxg_Kappa,
+ pxg_Ksmall,
+ pxg_K,
+ pxg_Lambda,
+ pxg_Lslash,
+ pxg_Lsmall,
+ pxg_Lslashsmall,
+ pxg_L,
+ pxg_Mu,
+ pxg_Msmall,
+ pxg_Macronsmall,
+ pxg_M,
+ pxg_Ntilde,
+ pxg_Nu,
+ pxg_Ntildesmall,
+ pxg_Nsmall,
+ pxg_N,
+ pxg_Omicron,
+ pxg_Oslash,
+ pxg_Oacute,
+ pxg_Otilde,
+ pxg_Omega,
+ pxg_Ograve,
+ pxg_Ocircumflex,
+ pxg_Odieresis,
+ pxg_OE,
+ pxg_OEsmall,
+ pxg_Ogravesmall,
+ pxg_Odieresissmall,
+ pxg_Osmall,
+ pxg_Oslashsmall,
+ pxg_Oacutesmall,
+ pxg_Ocircumflexsmall,
+ pxg_Ogoneksmall,
+ pxg_Otildesmall,
+ pxg_O,
+ pxg_Phi,
+ pxg_Psi,
+ pxg_Pi,
+ pxg_Psmall,
+ pxg_P,
+ pxg_Qsmall,
+ pxg_Q,
+ pxg_Rfraktur,
+ pxg_Rho,
+ pxg_Ringsmall,
+ pxg_Rsmall,
+ pxg_R,
+ pxg_Sigma,
+ pxg_Ssmall,
+ pxg_Scaronsmall,
+ pxg_Scaron,
+ pxg_S,
+ pxg_Theta,
+ pxg_Thorn,
+ pxg_Tau,
+ pxg_Tsmall,
+ pxg_Tildesmall,
+ pxg_Thornsmall,
+ pxg_T,
+ pxg_Upsilon1,
+ pxg_Ucircumflex,
+ pxg_Upsilon,
+ pxg_Uacute,
+ pxg_Udieresis,
+ pxg_Ugrave,
+ pxg_Uacutesmall,
+ pxg_Ucircumflexsmall,
+ pxg_Usmall,
+ pxg_Ugravesmall,
+ pxg_Udieresissmall,
+ pxg_U,
+ pxg_Vsmall,
+ pxg_V,
+ pxg_Wsmall,
+ pxg_W,
+ pxg_Xi,
+ pxg_Xsmall,
+ pxg_X,
+ pxg_Yacute,
+ pxg_Ydieresissmall,
+ pxg_Yacutesmall,
+ pxg_Ysmall,
+ pxg_Ydieresis,
+ pxg_Y,
+ pxg_Zeta,
+ pxg_Zsmall,
+ pxg_Zcaronsmall,
+ pxg_Zcaron,
+ pxg_Z,
+ pxg_arrowleft,
+ pxg_arrowdblboth,
+ pxg_a11,
+ pxg_arrowright,
+ pxg_arrowdblup,
+ pxg_a13,
+ pxg_alpha,
+ pxg_angle,
+ pxg_arrowdbldown,
+ pxg_a15,
+ pxg_angleleft,
+ pxg_a2,
+ pxg_angleright,
+ pxg_a4,
+ pxg_approxequal,
+ pxg_a119,
+ pxg_a105,
+ pxg_arrowboth,
+ pxg_arrowhorizex,
+ pxg_a117,
+ pxg_arrowup,
+ pxg_aleph,
+ pxg_arrowdblleft,
+ pxg_a12,
+ pxg_arrowdown,
+ pxg_arrowdblright,
+ pxg_a14,
+ pxg_a1,
+ pxg_a3,
+ pxg_a202,
+ pxg_a5,
+ pxg_arrowvertex,
+ pxg_a118,
+ pxg_a16,
+ pxg_agrave,
+ pxg_acircumflex,
+ pxg_adieresis,
+ pxg_acute,
+ pxg_aacute,
+ pxg_ae,
+ pxg_atilde,
+ pxg_aring,
+ pxg_asteriskmath,
+ pxg_asterisk,
+ pxg_asciicircum,
+ pxg_a17,
+ pxg_a18,
+ pxg_a19,
+ pxg_a20,
+ pxg_asciitilde,
+ pxg_a6,
+ pxg_a7,
+ pxg_a8,
+ pxg_a9,
+ pxg_a10,
+ pxg_a112,
+ pxg_a111,
+ pxg_a110,
+ pxg_a109,
+ pxg_a120,
+ pxg_a121,
+ pxg_a122,
+ pxg_a123,
+ pxg_a124,
+ pxg_a125,
+ pxg_a126,
+ pxg_a127,
+ pxg_a128,
+ pxg_a129,
+ pxg_a130,
+ pxg_a131,
+ pxg_a132,
+ pxg_a133,
+ pxg_a134,
+ pxg_a135,
+ pxg_a136,
+ pxg_a137,
+ pxg_a138,
+ pxg_a139,
+ pxg_a140,
+ pxg_a141,
+ pxg_a142,
+ pxg_a143,
+ pxg_a144,
+ pxg_a145,
+ pxg_a146,
+ pxg_a147,
+ pxg_a148,
+ pxg_a149,
+ pxg_a150,
+ pxg_a151,
+ pxg_a152,
+ pxg_a153,
+ pxg_a154,
+ pxg_a155,
+ pxg_a156,
+ pxg_a157,
+ pxg_a158,
+ pxg_ampersand,
+ pxg_at,
+ pxg_asuperior,
+ pxg_a159,
+ pxg_a160,
+ pxg_a161,
+ pxg_a163,
+ pxg_a164,
+ pxg_a196,
+ pxg_a165,
+ pxg_a192,
+ pxg_a166,
+ pxg_ampersandsmall,
+ pxg_a179,
+ pxg_a198,
+ pxg_a169,
+ pxg_a180,
+ pxg_a195,
+ pxg_a171,
+ pxg_a181,
+ pxg_a188,
+ pxg_a173,
+ pxg_a182,
+ pxg_a190,
+ pxg_a174,
+ pxg_a183,
+ pxg_a176,
+ pxg_a197,
+ pxg_a178,
+ pxg_a194,
+ pxg_a168,
+ pxg_a193,
+ pxg_a186,
+ pxg_a170,
+ pxg_a199,
+ pxg_a187,
+ pxg_a172,
+ pxg_a200,
+ pxg_a189,
+ pxg_a162,
+ pxg_a201,
+ pxg_a191,
+ pxg_a175,
+ pxg_a184,
+ pxg_a177,
+ pxg_a185,
+ pxg_a167,
+ pxg_a34,
+ pxg_a47,
+ pxg_a60,
+ pxg_a73,
+ pxg_a97,
+ pxg_a23,
+ pxg_a36,
+ pxg_a49,
+ pxg_a62,
+ pxg_a203,
+ pxg_a99,
+ pxg_a25,
+ pxg_a38,
+ pxg_a51,
+ pxg_a64,
+ pxg_a204,
+ pxg_a101,
+ pxg_a27,
+ pxg_a40,
+ pxg_a53,
+ pxg_a66,
+ pxg_a77,
+ pxg_a103,
+ pxg_a29,
+ pxg_a42,
+ pxg_a55,
+ pxg_a68,
+ pxg_a79,
+ pxg_a106,
+ pxg_a31,
+ pxg_a44,
+ pxg_a57,
+ pxg_a70,
+ pxg_a82,
+ pxg_a108,
+ pxg_a33,
+ pxg_a46,
+ pxg_a59,
+ pxg_a72,
+ pxg_a84,
+ pxg_a22,
+ pxg_a35,
+ pxg_a48,
+ pxg_a61,
+ pxg_a74,
+ pxg_a98,
+ pxg_a24,
+ pxg_a37,
+ pxg_a50,
+ pxg_a63,
+ pxg_a75,
+ pxg_a100,
+ pxg_a26,
+ pxg_a39,
+ pxg_a52,
+ pxg_a65,
+ pxg_a76,
+ pxg_a102,
+ pxg_a28,
+ pxg_a41,
+ pxg_a54,
+ pxg_a67,
+ pxg_a78,
+ pxg_a,
+ pxg_a104,
+ pxg_a30,
+ pxg_a43,
+ pxg_a56,
+ pxg_a69,
+ pxg_a81,
+ pxg_a107,
+ pxg_a32,
+ pxg_a45,
+ pxg_a58,
+ pxg_a71,
+ pxg_a83,
+ pxg_a21,
+ pxg_bracketleftex,
+ pxg_bracelefttp,
+ pxg_bracketrightex,
+ pxg_braceleftbt,
+ pxg_bracerighttp,
+ pxg_bracerightbt,
+ pxg_bracketlefttp,
+ pxg_bracketleftbt,
+ pxg_bracketrighttp,
+ pxg_beta,
+ pxg_braceleftmid,
+ pxg_bracketrightbt,
+ pxg_braceex,
+ pxg_bracerightmid,
+ pxg_brokenbar,
+ pxg_bullet,
+ pxg_breve,
+ pxg_backslash,
+ pxg_bar,
+ pxg_bracketleft,
+ pxg_bracketright,
+ pxg_braceleft,
+ pxg_braceright,
+ pxg_bsuperior,
+ pxg_b,
+ pxg_carriagereturn,
+ pxg_chi,
+ pxg_circleplus,
+ pxg_club,
+ pxg_copyrightsans,
+ pxg_circlemultiply,
+ pxg_copyrightserif,
+ pxg_circumflex,
+ pxg_caron,
+ pxg_ccedilla,
+ pxg_currency,
+ pxg_cedilla,
+ pxg_comma,
+ pxg_cent,
+ pxg_colon,
+ pxg_commasuperior,
+ pxg_centinferior,
+ pxg_centsuperior,
+ pxg_commainferior,
+ pxg_colonmonetary,
+ pxg_centoldstyle,
+ pxg_copyright,
+ pxg_congruent,
+ pxg_c,
+ pxg_dotmath,
+ pxg_delta,
+ pxg_diamond,
+ pxg_divide,
+ pxg_dotaccent,
+ pxg_dotlessi,
+ pxg_degree,
+ pxg_dieresis,
+ pxg_dagger,
+ pxg_daggerdbl,
+ pxg_dollar,
+ pxg_dollarinferior,
+ pxg_dsuperior,
+ pxg_dollarsuperior,
+ pxg_dollaroldstyle,
+ pxg_d,
+ pxg_element,
+ pxg_epsilon,
+ pxg_emptyset,
+ pxg_equivalence,
+ pxg_eta,
+ pxg_endash,
+ pxg_emdash,
+ pxg_ecircumflex,
+ pxg_ellipsis,
+ pxg_eth,
+ pxg_eacute,
+ pxg_edieresis,
+ pxg_existential,
+ pxg_egrave,
+ pxg_exclam,
+ pxg_equal,
+ pxg_eight,
+ pxg_exclamdown,
+ pxg_eightsuperior,
+ pxg_eightoldstyle,
+ pxg_eightinferior,
+ pxg_exclamdownsmall,
+ pxg_esuperior,
+ pxg_exclamsmall,
+ pxg_e,
+ pxg_fl,
+ pxg_fraction,
+ pxg_florin,
+ pxg_fi,
+ pxg_five,
+ pxg_four,
+ pxg_ffi,
+ pxg_fourinferior,
+ pxg_fivesuperior,
+ pxg_fiveeighths,
+ pxg_ff,
+ pxg_ffl,
+ pxg_figuredash,
+ pxg_foursuperior,
+ pxg_fiveinferior,
+ pxg_fouroldstyle,
+ pxg_fiveoldstyle,
+ pxg_f,
+ pxg_gamma,
+ pxg_greaterequal,
+ pxg_gradient,
+ pxg_grave,
+ pxg_guillemotleft,
+ pxg_germandbls,
+ pxg_guillemotright,
+ pxg_guilsinglleft,
+ pxg_guilsinglright,
+ pxg_greater,
+ pxg_guilsingleft,
+ pxg_guilsingright,
+ pxg_g,
+ pxg_heart,
+ pxg_hungarumlaut,
+ pxg_hyphen,
+ pxg_hyphensuperior,
+ pxg_hypheninferior,
+ pxg_h,
+ pxg_intersection,
+ pxg_integraltp,
+ pxg_iota,
+ pxg_integralbt,
+ pxg_infinity,
+ pxg_integral,
+ pxg_integralex,
+ pxg_igrave,
+ pxg_icircumflex,
+ pxg_iacute,
+ pxg_idieresis,
+ pxg_isuperior,
+ pxg_i,
+ pxg_j,
+ pxg_kappa,
+ pxg_k,
+ pxg_lambda,
+ pxg_lessequal,
+ pxg_logicalor,
+ pxg_lozenge,
+ pxg_logicaland,
+ pxg_logicalnot,
+ pxg_lslash,
+ pxg_less,
+ pxg_lsuperior,
+ pxg_l,
+ pxg_minute,
+ pxg_macron,
+ pxg_multiply,
+ pxg_minus,
+ pxg_mu,
+ pxg_msuperior,
+ pxg_m,
+ pxg_notequal,
+ pxg_notsubset,
+ pxg_nu,
+ pxg_notelement,
+ pxg_ntilde,
+ pxg_nine,
+ pxg_numbersign,
+ pxg_nineoldstyle,
+ pxg_nineinferior,
+ pxg_ninesuperior,
+ pxg_nsuperior,
+ pxg_n,
+ pxg_omicron,
+ pxg_omega,
+ pxg_omega1,
+ pxg_ordfeminine,
+ pxg_ordmasculine,
+ pxg_onesuperior,
+ pxg_onehalf,
+ pxg_ograve,
+ pxg_ogonek,
+ pxg_oacute,
+ pxg_onequarter,
+ pxg_ocircumflex,
+ pxg_otilde,
+ pxg_odieresis,
+ pxg_oslash,
+ pxg_oe,
+ pxg_one,
+ pxg_oneeighth,
+ pxg_onefitted,
+ pxg_onethird,
+ pxg_osuperior,
+ pxg_oneinferior,
+ pxg_onedotenleader,
+ pxg_oneoldstyle,
+ pxg_o,
+ pxg_phi1,
+ pxg_propersubset,
+ pxg_parenleftbt,
+ pxg_parenrighttp,
+ pxg_perpendicular,
+ pxg_parenrightbt,
+ pxg_proportional,
+ pxg_propersuperset,
+ pxg_parenleftex,
+ pxg_psi,
+ pxg_parenrightex,
+ pxg_pi,
+ pxg_partialdiff,
+ pxg_phi,
+ pxg_parenlefttp,
+ pxg_paragraph,
+ pxg_plusminus,
+ pxg_periodcentered,
+ pxg_parenleft,
+ pxg_perthousand,
+ pxg_period,
+ pxg_percent,
+ pxg_periodsuperior,
+ pxg_parenright,
+ pxg_plus,
+ pxg_periodinferior,
+ pxg_parenleftinferior,
+ pxg_parenrightinferior,
+ pxg_parenleftsuperior,
+ pxg_parenrightsuperior,
+ pxg_product,
+ pxg_p,
+ pxg_questiondown,
+ pxg_quotesingle,
+ pxg_quotedblleft,
+ pxg_quoteleft,
+ pxg_quotesinglbase,
+ pxg_quotedblbase,
+ pxg_quotedblright,
+ pxg_question,
+ pxg_quoteright,
+ pxg_quotedbl,
+ pxg_questionsmall,
+ pxg_questiondownsmall,
+ pxg_q,
+ pxg_registerserif,
+ pxg_reflexsubset,
+ pxg_radicalex,
+ pxg_rho,
+ pxg_registersans,
+ pxg_radical,
+ pxg_reflexsuperset,
+ pxg_registered,
+ pxg_ring,
+ pxg_rsuperior,
+ pxg_rupiah,
+ pxg_r,
+ pxg_second,
+ pxg_sigma,
+ pxg_summation,
+ pxg_similar,
+ pxg_spade,
+ pxg_section,
+ pxg_suchthat,
+ pxg_sigma1,
+ pxg_sterling,
+ pxg_seven,
+ pxg_semicolon,
+ pxg_six,
+ pxg_space,
+ pxg_slash,
+ pxg_sixinferior,
+ pxg_ssuperior,
+ pxg_seveninferior,
+ pxg_sevensuperior,
+ pxg_sixsuperior,
+ pxg_seveneighths,
+ pxg_sevenoldstyle,
+ pxg_scaron,
+ pxg_sixoldstyle,
+ pxg_s,
+ pxg_theta,
+ pxg_trademarkserif,
+ pxg_therefore,
+ pxg_tau,
+ pxg_trademarksans,
+ pxg_threequarters,
+ pxg_threesuperior,
+ pxg_theta1,
+ pxg_tilde,
+ pxg_twosuperior,
+ pxg_thorn,
+ pxg_two,
+ pxg_three,
+ pxg_tsuperior,
+ pxg_threeinferior,
+ pxg_threequartersemdash,
+ pxg_threeeighths,
+ pxg_twoinferior,
+ pxg_twothirds,
+ pxg_trademark,
+ pxg_twodotenleader,
+ pxg_twooldstyle,
+ pxg_threeoldstyle,
+ pxg_t,
+ pxg_upsilon,
+ pxg_union,
+ pxg_universal,
+ pxg_ugrave,
+ pxg_uacute,
+ pxg_ucircumflex,
+ pxg_udieresis,
+ pxg_underscore,
+ pxg_u,
+ pxg_v,
+ pxg_weierstrass,
+ pxg_w,
+ pxg_xi,
+ pxg_x,
+ pxg_yen,
+ pxg_yacute,
+ pxg_ydieresis,
+ pxg_y,
+ pxg_zeta,
+ pxg_zero,
+ pxg_zerosuperior,
+ pxg_zeroinferior,
+ pxg_zcaron,
+ pxg_zerooldstyle,
+ pxg_z
+} px_glyph_t;
+
+const unsigned short pxSymbolEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclam, pxg_universal, pxg_numbersign,
+ pxg_existential, pxg_percent, pxg_ampersand, pxg_suchthat,
+ pxg_parenleft, pxg_parenright, pxg_asteriskmath, pxg_plus,
+ pxg_comma, pxg_minus, pxg_period, pxg_slash,
+ pxg_zero, pxg_one, pxg_two, pxg_three,
+ pxg_four, pxg_five, pxg_six, pxg_seven,
+ pxg_eight, pxg_nine, pxg_colon, pxg_semicolon,
+ pxg_less, pxg_equal, pxg_greater, pxg_question,
+ pxg_congruent, pxg_Alpha, pxg_Beta, pxg_Chi,
+ pxg_Delta, pxg_Epsilon, pxg_Phi, pxg_Gamma,
+ pxg_Eta, pxg_Iota, pxg_theta1, pxg_Kappa,
+ pxg_Lambda, pxg_Mu, pxg_Nu, pxg_Omicron,
+ pxg_Pi, pxg_Theta, pxg_Rho, pxg_Sigma,
+ pxg_Tau, pxg_Upsilon, pxg_sigma1, pxg_Omega,
+ pxg_Xi, pxg_Psi, pxg_Zeta, pxg_bracketleft,
+ pxg_therefore, pxg_bracketright, pxg_perpendicular, pxg_underscore,
+ pxg_radicalex, pxg_alpha, pxg_beta, pxg_chi,
+ pxg_delta, pxg_epsilon, pxg_phi, pxg_gamma,
+ pxg_eta, pxg_iota, pxg_phi1, pxg_kappa,
+ pxg_lambda, pxg_mu, pxg_nu, pxg_omicron,
+ pxg_pi, pxg_theta, pxg_rho, pxg_sigma,
+ pxg_tau, pxg_upsilon, pxg_omega1, pxg_omega,
+ pxg_xi, pxg_psi, pxg_zeta, pxg_braceleft,
+ pxg_bar, pxg_braceright, pxg_similar, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_Upsilon1, pxg_minute, pxg_lessequal,
+ pxg_fraction, pxg_infinity, pxg_florin, pxg_club,
+ pxg_diamond, pxg_heart, pxg_spade, pxg_arrowboth,
+ pxg_arrowleft, pxg_arrowup, pxg_arrowright, pxg_arrowdown,
+ pxg_degree, pxg_plusminus, pxg_second, pxg_greaterequal,
+ pxg_multiply, pxg_proportional, pxg_partialdiff, pxg_bullet,
+ pxg_divide, pxg_notequal, pxg_equivalence, pxg_approxequal,
+ pxg_ellipsis, pxg_arrowvertex, pxg_arrowhorizex, pxg_carriagereturn,
+ pxg_aleph, pxg_Ifraktur, pxg_Rfraktur, pxg_weierstrass,
+ pxg_circlemultiply, pxg_circleplus, pxg_emptyset, pxg_intersection,
+ pxg_union, pxg_propersuperset, pxg_reflexsuperset, pxg_notsubset,
+ pxg_propersubset, pxg_reflexsubset, pxg_element, pxg_notelement,
+ pxg_angle, pxg_gradient, pxg_registerserif, pxg_copyrightserif,
+ pxg_trademarkserif, pxg_product, pxg_radical, pxg_dotmath,
+ pxg_logicalnot, pxg_logicaland, pxg_logicalor, pxg_arrowdblboth,
+ pxg_arrowdblleft, pxg_arrowdblup, pxg_arrowdblright, pxg_arrowdbldown,
+ pxg_lozenge, pxg_angleleft, pxg_registersans, pxg_copyrightsans,
+ pxg_trademarksans, pxg_summation, pxg_parenlefttp, pxg_parenleftex,
+ pxg_parenleftbt, pxg_bracketlefttp, pxg_bracketleftex, pxg_bracketleftbt,
+ pxg_bracelefttp, pxg_braceleftmid, pxg_braceleftbt, pxg_braceex,
+ pxg__notdef, pxg_angleright, pxg_integral, pxg_integraltp,
+ pxg_integralex, pxg_integralbt, pxg_parenrighttp, pxg_parenrightex,
+ pxg_parenrightbt, pxg_bracketrighttp, pxg_bracketrightex, pxg_bracketrightbt,
+ pxg_bracerighttp, pxg_bracerightmid, pxg_bracerightbt, pxg__notdef,
+ pxg__notdef
+};
+
+const unsigned short pxMacExpertEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclamsmall, pxg_Hungarumlautsmall, pxg_centoldstyle,
+ pxg_dollaroldstyle, pxg_dollarsuperior, pxg_ampersandsmall, pxg_Acutesmall,
+ pxg_parenleftsuperior, pxg_parenrightsuperior, pxg_twodotenleader, pxg_onedotenleader,
+ pxg_comma, pxg_hyphen, pxg_period, pxg_fraction,
+ pxg_zerooldstyle, pxg_oneoldstyle, pxg_twooldstyle, pxg_threeoldstyle,
+ pxg_fouroldstyle, pxg_fiveoldstyle, pxg_sixoldstyle, pxg_sevenoldstyle,
+ pxg_eightoldstyle, pxg_nineoldstyle, pxg_colon, pxg_semicolon,
+ pxg__notdef, pxg_threequartersemdash, pxg__notdef, pxg_questionsmall,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_Ethsmall, pxg__notdef, pxg__notdef, pxg_onequarter,
+ pxg_onehalf, pxg_threequarters, pxg_oneeighth, pxg_threeeighths,
+ pxg_fiveeighths, pxg_seveneighths, pxg_onethird, pxg_twothirds,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg_ff, pxg_fi,
+ pxg_fl, pxg_ffi, pxg_ffl, pxg_parenleftinferior,
+ pxg__notdef, pxg_parenrightinferior, pxg_Circumflexsmall, pxg_hypheninferior,
+ pxg_Gravesmall, pxg_Asmall, pxg_Bsmall, pxg_Csmall,
+ pxg_Dsmall, pxg_Esmall, pxg_Fsmall, pxg_Gsmall,
+ pxg_Hsmall, pxg_Ismall, pxg_Jsmall, pxg_Ksmall,
+ pxg_Lsmall, pxg_Msmall, pxg_Nsmall, pxg_Osmall,
+ pxg_Psmall, pxg_Qsmall, pxg_Rsmall, pxg_Ssmall,
+ pxg_Tsmall, pxg_Usmall, pxg_Vsmall, pxg_Wsmall,
+ pxg_Xsmall, pxg_Ysmall, pxg_Zsmall, pxg_colonmonetary,
+ pxg_onefitted, pxg_rupiah, pxg_Tildesmall, pxg__notdef,
+ pxg__notdef, pxg_asuperior, pxg_centsuperior, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg_Aacutesmall,
+ pxg_Agravesmall, pxg_Acircumflexsmall, pxg_Adieresissmall, pxg_Atildesmall,
+ pxg_Aringsmall, pxg_Ccedillasmall, pxg_Eacutesmall, pxg_Egravesmall,
+ pxg_Ecircumflexsmall, pxg_Edieresissmall, pxg_Iacutesmall, pxg_Igravesmall,
+ pxg_Icircumflexsmall, pxg_Idieresissmall, pxg_Ntildesmall, pxg_Oacutesmall,
+ pxg_Ogravesmall, pxg_Ocircumflexsmall, pxg_Odieresissmall, pxg_Otildesmall,
+ pxg_Uacutesmall, pxg_Ugravesmall, pxg_Ucircumflexsmall, pxg_Udieresissmall,
+ pxg__notdef, pxg_eightsuperior, pxg_fourinferior, pxg_threeinferior,
+ pxg_sixinferior, pxg_eightinferior, pxg_seveninferior, pxg_Scaronsmall,
+ pxg__notdef, pxg_centinferior, pxg_twoinferior, pxg__notdef,
+ pxg_Dieresissmall, pxg__notdef, pxg_Caronsmall, pxg_osuperior,
+ pxg_fiveinferior, pxg__notdef, pxg_commainferior, pxg_periodinferior,
+ pxg_Yacutesmall, pxg__notdef, pxg_dollarinferior, pxg__notdef,
+ pxg__notdef, pxg_Thornsmall, pxg__notdef, pxg_nineinferior,
+ pxg_zeroinferior, pxg_Zcaronsmall, pxg_AEsmall, pxg_Oslashsmall,
+ pxg_questiondownsmall, pxg_oneinferior, pxg_Lslashsmall, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_Cedillasmall, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg_OEsmall,
+ pxg_figuredash, pxg_hyphensuperior, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg_exclamdownsmall, pxg__notdef,
+ pxg_Ydieresissmall, pxg__notdef, pxg_onesuperior, pxg_twosuperior,
+ pxg_threesuperior, pxg_foursuperior, pxg_fivesuperior, pxg_sixsuperior,
+ pxg_sevensuperior, pxg_ninesuperior, pxg_zerosuperior, pxg__notdef,
+ pxg_esuperior, pxg_rsuperior, pxg_tsuperior, pxg__notdef,
+ pxg__notdef, pxg_isuperior, pxg_ssuperior, pxg_dsuperior,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_lsuperior, pxg_Ogoneksmall, pxg_Brevesmall,
+ pxg_Macronsmall, pxg_bsuperior, pxg_nsuperior, pxg_msuperior,
+ pxg_commasuperior, pxg_periodsuperior, pxg_Dotaccentsmall, pxg_Ringsmall,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef
+};
+
+const unsigned short pxISOLatin1Encoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclam, pxg_quotedbl, pxg_numbersign,
+ pxg_dollar, pxg_percent, pxg_ampersand, pxg_quoteright,
+ pxg_parenleft, pxg_parenright, pxg_asterisk, pxg_plus,
+ pxg_comma, pxg_minus, pxg_period, pxg_slash,
+ pxg_zero, pxg_one, pxg_two, pxg_three,
+ pxg_four, pxg_five, pxg_six, pxg_seven,
+ pxg_eight, pxg_nine, pxg_colon, pxg_semicolon,
+ pxg_less, pxg_equal, pxg_greater, pxg_question,
+ pxg_at, pxg_A, pxg_B, pxg_C,
+ pxg_D, pxg_E, pxg_F, pxg_G,
+ pxg_H, pxg_I, pxg_J, pxg_K,
+ pxg_L, pxg_M, pxg_N, pxg_O,
+ pxg_P, pxg_Q, pxg_R, pxg_S,
+ pxg_T, pxg_U, pxg_V, pxg_W,
+ pxg_X, pxg_Y, pxg_Z, pxg_bracketleft,
+ pxg_backslash, pxg_bracketright, pxg_asciicircum, pxg_underscore,
+ pxg_quoteleft, pxg_a, pxg_b, pxg_c,
+ pxg_d, pxg_e, pxg_f, pxg_g,
+ pxg_h, pxg_i, pxg_j, pxg_k,
+ pxg_l, pxg_m, pxg_n, pxg_o,
+ pxg_p, pxg_q, pxg_r, pxg_s,
+ pxg_t, pxg_u, pxg_v, pxg_w,
+ pxg_x, pxg_y, pxg_z, pxg_braceleft,
+ pxg_bar, pxg_braceright, pxg_asciitilde, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_dotlessi, pxg_grave, pxg_acute, pxg_circumflex,
+ pxg_tilde, pxg_macron, pxg_breve, pxg_dotaccent,
+ pxg_dieresis, pxg__notdef, pxg_ring, pxg_cedilla,
+ pxg__notdef, pxg_hungarumlaut, pxg_ogonek, pxg_caron,
+ pxg_space, pxg_exclamdown, pxg_cent, pxg_sterling,
+ pxg_currency, pxg_yen, pxg_brokenbar, pxg_section,
+ pxg_dieresis, pxg_copyright, pxg_ordfeminine, pxg_guillemotleft,
+ pxg_logicalnot, pxg_hyphen, pxg_registered, pxg_macron,
+ pxg_degree, pxg_plusminus, pxg_twosuperior, pxg_threesuperior,
+ pxg_acute, pxg_mu, pxg_paragraph, pxg_periodcentered,
+ pxg_cedilla, pxg_onesuperior, pxg_ordmasculine, pxg_guillemotright,
+ pxg_onequarter, pxg_onehalf, pxg_threequarters, pxg_questiondown,
+ pxg_Agrave, pxg_Aacute, pxg_Acircumflex, pxg_Atilde,
+ pxg_Adieresis, pxg_Aring, pxg_AE, pxg_Ccedilla,
+ pxg_Egrave, pxg_Eacute, pxg_Ecircumflex, pxg_Edieresis,
+ pxg_Igrave, pxg_Iacute, pxg_Icircumflex, pxg_Idieresis,
+ pxg_Eth, pxg_Ntilde, pxg_Ograve, pxg_Oacute,
+ pxg_Ocircumflex, pxg_Otilde, pxg_Odieresis, pxg_multiply,
+ pxg_Oslash, pxg_Ugrave, pxg_Uacute, pxg_Ucircumflex,
+ pxg_Udieresis, pxg_Yacute, pxg_Thorn, pxg_germandbls,
+ pxg_agrave, pxg_aacute, pxg_acircumflex, pxg_atilde,
+ pxg_adieresis, pxg_aring, pxg_ae, pxg_ccedilla,
+ pxg_egrave, pxg_eacute, pxg_ecircumflex, pxg_edieresis,
+ pxg_igrave, pxg_iacute, pxg_icircumflex, pxg_idieresis,
+ pxg_eth, pxg_ntilde, pxg_ograve, pxg_oacute,
+ pxg_ocircumflex, pxg_otilde, pxg_odieresis, pxg_divide,
+ pxg_oslash, pxg_ugrave, pxg_uacute, pxg_ucircumflex,
+ pxg_udieresis, pxg_yacute, pxg_thorn, pxg_ydieresis,
+ pxg__notdef
+};
+
+const unsigned short pxStandardEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclam, pxg_quotedbl, pxg_numbersign,
+ pxg_dollar, pxg_percent, pxg_ampersand, pxg_quoteright,
+ pxg_parenleft, pxg_parenright, pxg_asterisk, pxg_plus,
+ pxg_comma, pxg_hyphen, pxg_period, pxg_slash,
+ pxg_zero, pxg_one, pxg_two, pxg_three,
+ pxg_four, pxg_five, pxg_six, pxg_seven,
+ pxg_eight, pxg_nine, pxg_colon, pxg_semicolon,
+ pxg_less, pxg_equal, pxg_greater, pxg_question,
+ pxg_at, pxg_A, pxg_B, pxg_C,
+ pxg_D, pxg_E, pxg_F, pxg_G,
+ pxg_H, pxg_I, pxg_J, pxg_K,
+ pxg_L, pxg_M, pxg_N, pxg_O,
+ pxg_P, pxg_Q, pxg_R, pxg_S,
+ pxg_T, pxg_U, pxg_V, pxg_W,
+ pxg_X, pxg_Y, pxg_Z, pxg_bracketleft,
+ pxg_backslash, pxg_bracketright, pxg_asciicircum, pxg_underscore,
+ pxg_quoteleft, pxg_a, pxg_b, pxg_c,
+ pxg_d, pxg_e, pxg_f, pxg_g,
+ pxg_h, pxg_i, pxg_j, pxg_k,
+ pxg_l, pxg_m, pxg_n, pxg_o,
+ pxg_p, pxg_q, pxg_r, pxg_s,
+ pxg_t, pxg_u, pxg_v, pxg_w,
+ pxg_x, pxg_y, pxg_z, pxg_braceleft,
+ pxg_bar, pxg_braceright, pxg_asciitilde, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_exclamdown, pxg_cent, pxg_sterling,
+ pxg_fraction, pxg_yen, pxg_florin, pxg_section,
+ pxg_currency, pxg_quotesingle, pxg_quotedblleft, pxg_guillemotleft,
+ pxg_guilsinglleft, pxg_guilsinglright, pxg_fi, pxg_fl,
+ pxg__notdef, pxg_endash, pxg_dagger, pxg_daggerdbl,
+ pxg_periodcentered, pxg__notdef, pxg_paragraph, pxg_bullet,
+ pxg_quotesinglbase, pxg_quotedblbase, pxg_quotedblright, pxg_guillemotright,
+ pxg_ellipsis, pxg_perthousand, pxg__notdef, pxg_questiondown,
+ pxg__notdef, pxg_grave, pxg_acute, pxg_circumflex,
+ pxg_tilde, pxg_macron, pxg_breve, pxg_dotaccent,
+ pxg_dieresis, pxg__notdef, pxg_ring, pxg_cedilla,
+ pxg__notdef, pxg_hungarumlaut, pxg_ogonek, pxg_caron,
+ pxg_emdash, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_AE, pxg__notdef, pxg_ordfeminine,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_Lslash, pxg_Oslash, pxg_OE, pxg_ordmasculine,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_ae, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_dotlessi, pxg__notdef, pxg__notdef,
+ pxg_lslash, pxg_oslash, pxg_oe, pxg_germandbls,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef
+};
+
+const unsigned short pxDingbatsEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_a1, pxg_a2, pxg_a202,
+ pxg_a3, pxg_a4, pxg_a5, pxg_a119,
+ pxg_a118, pxg_a117, pxg_a11, pxg_a12,
+ pxg_a13, pxg_a14, pxg_a15, pxg_a16,
+ pxg_a105, pxg_a17, pxg_a18, pxg_a19,
+ pxg_a20, pxg_a21, pxg_a22, pxg_a23,
+ pxg_a24, pxg_a25, pxg_a26, pxg_a27,
+ pxg_a28, pxg_a6, pxg_a7, pxg_a8,
+ pxg_a9, pxg_a10, pxg_a29, pxg_a30,
+ pxg_a31, pxg_a32, pxg_a33, pxg_a34,
+ pxg_a35, pxg_a36, pxg_a37, pxg_a38,
+ pxg_a39, pxg_a40, pxg_a41, pxg_a42,
+ pxg_a43, pxg_a44, pxg_a45, pxg_a46,
+ pxg_a47, pxg_a48, pxg_a49, pxg_a50,
+ pxg_a51, pxg_a52, pxg_a53, pxg_a54,
+ pxg_a55, pxg_a56, pxg_a57, pxg_a58,
+ pxg_a59, pxg_a60, pxg_a61, pxg_a62,
+ pxg_a63, pxg_a64, pxg_a65, pxg_a66,
+ pxg_a67, pxg_a68, pxg_a69, pxg_a70,
+ pxg_a71, pxg_a72, pxg_a73, pxg_a74,
+ pxg_a203, pxg_a75, pxg_a204, pxg_a76,
+ pxg_a77, pxg_a78, pxg_a79, pxg_a81,
+ pxg_a82, pxg_a83, pxg_a84, pxg_a97,
+ pxg_a98, pxg_a99, pxg_a100, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg_a101, pxg_a102, pxg_a103,
+ pxg_a104, pxg_a106, pxg_a107, pxg_a108,
+ pxg_a112, pxg_a111, pxg_a110, pxg_a109,
+ pxg_a120, pxg_a121, pxg_a122, pxg_a123,
+ pxg_a124, pxg_a125, pxg_a126, pxg_a127,
+ pxg_a128, pxg_a129, pxg_a130, pxg_a131,
+ pxg_a132, pxg_a133, pxg_a134, pxg_a135,
+ pxg_a136, pxg_a137, pxg_a138, pxg_a139,
+ pxg_a140, pxg_a141, pxg_a142, pxg_a143,
+ pxg_a144, pxg_a145, pxg_a146, pxg_a147,
+ pxg_a148, pxg_a149, pxg_a150, pxg_a151,
+ pxg_a152, pxg_a153, pxg_a154, pxg_a155,
+ pxg_a156, pxg_a157, pxg_a158, pxg_a159,
+ pxg_a160, pxg_a161, pxg_a163, pxg_a164,
+ pxg_a196, pxg_a165, pxg_a192, pxg_a166,
+ pxg_a167, pxg_a168, pxg_a169, pxg_a170,
+ pxg_a171, pxg_a172, pxg_a173, pxg_a162,
+ pxg_a174, pxg_a175, pxg_a176, pxg_a177,
+ pxg_a178, pxg_a179, pxg_a193, pxg_a180,
+ pxg_a199, pxg_a181, pxg_a200, pxg_a182,
+ pxg__notdef, pxg_a201, pxg_a183, pxg_a184,
+ pxg_a197, pxg_a185, pxg_a194, pxg_a198,
+ pxg_a186, pxg_a195, pxg_a187, pxg_a188,
+ pxg_a189, pxg_a190, pxg_a191, pxg__notdef,
+ pxg__notdef
+};
+
+const unsigned short pxMacRomanEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclam, pxg_quotedbl, pxg_numbersign,
+ pxg_dollar, pxg_percent, pxg_ampersand, pxg_quotesingle,
+ pxg_parenleft, pxg_parenright, pxg_asterisk, pxg_plus,
+ pxg_comma, pxg_hyphen, pxg_period, pxg_slash,
+ pxg_zero, pxg_one, pxg_two, pxg_three,
+ pxg_four, pxg_five, pxg_six, pxg_seven,
+ pxg_eight, pxg_nine, pxg_colon, pxg_semicolon,
+ pxg_less, pxg_equal, pxg_greater, pxg_question,
+ pxg_at, pxg_A, pxg_B, pxg_C,
+ pxg_D, pxg_E, pxg_F, pxg_G,
+ pxg_H, pxg_I, pxg_J, pxg_K,
+ pxg_L, pxg_M, pxg_N, pxg_O,
+ pxg_P, pxg_Q, pxg_R, pxg_S,
+ pxg_T, pxg_U, pxg_V, pxg_W,
+ pxg_X, pxg_Y, pxg_Z, pxg_bracketleft,
+ pxg_backslash, pxg_bracketright, pxg_asciicircum, pxg_underscore,
+ pxg_grave, pxg_a, pxg_b, pxg_c,
+ pxg_d, pxg_e, pxg_f, pxg_g,
+ pxg_h, pxg_i, pxg_j, pxg_k,
+ pxg_l, pxg_m, pxg_n, pxg_o,
+ pxg_p, pxg_q, pxg_r, pxg_s,
+ pxg_t, pxg_u, pxg_v, pxg_w,
+ pxg_x, pxg_y, pxg_z, pxg_braceleft,
+ pxg_bar, pxg_braceright, pxg_asciitilde, pxg__notdef,
+ pxg_Adieresis, pxg_Aring, pxg_Ccedilla, pxg_Eacute,
+ pxg_Ntilde, pxg_Odieresis, pxg_Udieresis, pxg_aacute,
+ pxg_agrave, pxg_acircumflex, pxg_adieresis, pxg_atilde,
+ pxg_aring, pxg_ccedilla, pxg_eacute, pxg_egrave,
+ pxg_ecircumflex, pxg_edieresis, pxg_iacute, pxg_igrave,
+ pxg_icircumflex, pxg_idieresis, pxg_ntilde, pxg_oacute,
+ pxg_ograve, pxg_ocircumflex, pxg_odieresis, pxg_otilde,
+ pxg_uacute, pxg_ugrave, pxg_ucircumflex, pxg_udieresis,
+ pxg_dagger, pxg_degree, pxg_cent, pxg_sterling,
+ pxg_section, pxg_bullet, pxg_paragraph, pxg_germandbls,
+ pxg_registered, pxg_copyright, pxg_trademark, pxg_acute,
+ pxg_dieresis, pxg__notdef, pxg_AE, pxg_Oslash,
+ pxg__notdef, pxg_plusminus, pxg__notdef, pxg__notdef,
+ pxg_yen, pxg_mu, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg_ordfeminine,
+ pxg_ordmasculine, pxg__notdef, pxg_ae, pxg_oslash,
+ pxg_questiondown, pxg_exclamdown, pxg_logicalnot, pxg__notdef,
+ pxg_florin, pxg__notdef, pxg__notdef, pxg_guillemotleft,
+ pxg_guillemotright, pxg_ellipsis, pxg_space, pxg_Agrave,
+ pxg_Atilde, pxg_Otilde, pxg_OE, pxg_oe,
+ pxg_endash, pxg_emdash, pxg_quotedblleft, pxg_quotedblright,
+ pxg_quoteleft, pxg_quoteright, pxg_divide, pxg__notdef,
+ pxg_ydieresis, pxg_Ydieresis, pxg_fraction, pxg_currency,
+ pxg_guilsingleft, pxg_guilsingright, pxg_fi, pxg_fl,
+ pxg_daggerdbl, pxg_periodcentered, pxg_quotesinglbase, pxg_quotedblbase,
+ pxg_perthousand, pxg_Acircumflex, pxg_Ecircumflex, pxg_Aacute,
+ pxg_Edieresis, pxg_Egrave, pxg_Iacute, pxg_Icircumflex,
+ pxg_Idieresis, pxg_Igrave, pxg_Oacute, pxg_Ocircumflex,
+ pxg__notdef, pxg_Ograve, pxg_Uacute, pxg_Ucircumflex,
+ pxg_Ugrave, pxg_dotlessi, pxg_circumflex, pxg_tilde,
+ pxg_macron, pxg_breve, pxg_dotaccent, pxg_ring,
+ pxg_cedilla, pxg_hungarumlaut, pxg_ogonek, pxg_caron,
+ pxg__notdef
+};
+
+const unsigned short pxWinAnsiEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclam, pxg_quotedbl, pxg_numbersign,
+ pxg_dollar, pxg_percent, pxg_ampersand, pxg_quotesingle,
+ pxg_parenleft, pxg_parenright, pxg_asterisk, pxg_plus,
+ pxg_comma, pxg_minus, pxg_period, pxg_slash,
+ pxg_zero, pxg_one, pxg_two, pxg_three,
+ pxg_four, pxg_five, pxg_six, pxg_seven,
+ pxg_eight, pxg_nine, pxg_colon, pxg_semicolon,
+ pxg_less, pxg_equal, pxg_greater, pxg_question,
+ pxg_at, pxg_A, pxg_B, pxg_C,
+ pxg_D, pxg_E, pxg_F, pxg_G,
+ pxg_H, pxg_I, pxg_J, pxg_K,
+ pxg_L, pxg_M, pxg_N, pxg_O,
+ pxg_P, pxg_Q, pxg_R, pxg_S,
+ pxg_T, pxg_U, pxg_V, pxg_W,
+ pxg_X, pxg_Y, pxg_Z, pxg_bracketleft,
+ pxg_backslash, pxg_bracketright, pxg_asciicircum, pxg_underscore,
+ pxg_grave, pxg_a, pxg_b, pxg_c,
+ pxg_d, pxg_e, pxg_f, pxg_g,
+ pxg_h, pxg_i, pxg_j, pxg_k,
+ pxg_l, pxg_m, pxg_n, pxg_o,
+ pxg_p, pxg_q, pxg_r, pxg_s,
+ pxg_t, pxg_u, pxg_v, pxg_w,
+ pxg_x, pxg_y, pxg_z, pxg_braceleft,
+ pxg_bar, pxg_braceright, pxg_asciitilde, pxg_bullet,
+ pxg_bullet, pxg_bullet, pxg_quotesinglbase, pxg_florin,
+ pxg_quotedblbase, pxg_ellipsis, pxg_dagger, pxg_daggerdbl,
+ pxg_circumflex, pxg_perthousand, pxg_Scaron, pxg_guilsinglleft,
+ pxg_OE, pxg_bullet, pxg_bullet, pxg_bullet,
+ pxg_bullet, pxg_quoteleft, pxg_quoteright, pxg_quotedblleft,
+ pxg_quotedblright, pxg_bullet, pxg_endash, pxg_emdash,
+ pxg_tilde, pxg_trademark, pxg_scaron, pxg_guilsinglright,
+ pxg_oe, pxg_bullet, pxg_bullet, pxg_Ydieresis,
+ pxg_space, pxg_exclamdown, pxg_cent, pxg_sterling,
+ pxg_currency, pxg_yen, pxg_brokenbar, pxg_section,
+ pxg_dieresis, pxg_copyright, pxg_ordfeminine, pxg_guillemotleft,
+ pxg_logicalnot, pxg_hyphen, pxg_registered, pxg_macron,
+ pxg_degree, pxg_plusminus, pxg_twosuperior, pxg_threesuperior,
+ pxg_acute, pxg_mu, pxg_paragraph, pxg_periodcentered,
+ pxg_cedilla, pxg_onesuperior, pxg_ordmasculine, pxg_guillemotright,
+ pxg_onequarter, pxg_onehalf, pxg_threequarters, pxg_questiondown,
+ pxg_Agrave, pxg_Aacute, pxg_Acircumflex, pxg_Atilde,
+ pxg_Adieresis, pxg_Aring, pxg_AE, pxg_Ccedilla,
+ pxg_Egrave, pxg_Eacute, pxg_Ecircumflex, pxg_Edieresis,
+ pxg_Igrave, pxg_Iacute, pxg_Icircumflex, pxg_Idieresis,
+ pxg_Eth, pxg_Ntilde, pxg_Ograve, pxg_Oacute,
+ pxg_Ocircumflex, pxg_Otilde, pxg_Odieresis, pxg_multiply,
+ pxg_Oslash, pxg_Ugrave, pxg_Uacute, pxg_Ucircumflex,
+ pxg_Udieresis, pxg_Yacute, pxg_Thorn, pxg_germandbls,
+ pxg_agrave, pxg_aacute, pxg_acircumflex, pxg_atilde,
+ pxg_adieresis, pxg_aring, pxg_ae, pxg_ccedilla,
+ pxg_egrave, pxg_eacute, pxg_ecircumflex, pxg_edieresis,
+ pxg_igrave, pxg_iacute, pxg_icircumflex, pxg_idieresis,
+ pxg_eth, pxg_ntilde, pxg_ograve, pxg_oacute,
+ pxg_ocircumflex, pxg_otilde, pxg_odieresis, pxg_divide,
+ pxg_oslash, pxg_ugrave, pxg_uacute, pxg_ucircumflex,
+ pxg_udieresis, pxg_yacute, pxg_thorn, pxg_ydieresis,
+ pxg__notdef
+};
+
+const unsigned short pxPDFDocEncoding[257] = {
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg__notdef, pxg__notdef, pxg__notdef, pxg__notdef,
+ pxg_space, pxg_exclam, pxg_quotedbl, pxg_numbersign,
+ pxg_dollar, pxg_percent, pxg_ampersand, pxg_quotesingle,
+ pxg_parenleft, pxg_parenright, pxg_asterisk, pxg_plus,
+ pxg_comma, pxg_minus, pxg_period, pxg_slash,
+ pxg_zero, pxg_one, pxg_two, pxg_three,
+ pxg_four, pxg_five, pxg_six, pxg_seven,
+ pxg_eight, pxg_nine, pxg_colon, pxg_semicolon,
+ pxg_less, pxg_equal, pxg_greater, pxg_question,
+ pxg_at, pxg_A, pxg_B, pxg_C,
+ pxg_D, pxg_E, pxg_F, pxg_G,
+ pxg_H, pxg_I, pxg_J, pxg_K,
+ pxg_L, pxg_M, pxg_N, pxg_O,
+ pxg_P, pxg_Q, pxg_R, pxg_S,
+ pxg_T, pxg_U, pxg_V, pxg_W,
+ pxg_X, pxg_Y, pxg_Z, pxg_bracketleft,
+ pxg_backslash, pxg_bracketright, pxg_asciicircum, pxg_underscore,
+ pxg_grave, pxg_a, pxg_b, pxg_c,
+ pxg_d, pxg_e, pxg_f, pxg_g,
+ pxg_h, pxg_i, pxg_j, pxg_k,
+ pxg_l, pxg_m, pxg_n, pxg_o,
+ pxg_p, pxg_q, pxg_r, pxg_s,
+ pxg_t, pxg_u, pxg_v, pxg_w,
+ pxg_x, pxg_y, pxg_z, pxg_braceleft,
+ pxg_bar, pxg_braceright, pxg_asciitilde, pxg__notdef,
+ pxg_bullet, pxg_dagger, pxg_daggerdbl, pxg_ellipsis,
+ pxg_emdash, pxg_endash, pxg_florin, pxg_fraction,
+ pxg_guilsinglleft, pxg_guilsinglright, pxg_minus, pxg_perthousand,
+ pxg_quotedblbase, pxg_quotedblleft, pxg_quotedblright, pxg_quoteleft,
+ pxg_quoteright, pxg_quotesinglbase, pxg_trademark, pxg_fi,
+ pxg_fl, pxg_Lslash, pxg_OE, pxg_Scaron,
+ pxg_Ydieresis, pxg_Zcaron, pxg_dotlessi, pxg_lslash,
+ pxg_oe, pxg_scaron, pxg_zcaron, pxg__notdef,
+ pxg__notdef, pxg_exclamdown, pxg_cent, pxg_sterling,
+ pxg_currency, pxg_yen, pxg_brokenbar, pxg_section,
+ pxg_dieresis, pxg_copyright, pxg_ordfeminine, pxg_guillemotleft,
+ pxg_logicalnot, pxg__notdef, pxg_registered, pxg_macron,
+ pxg_degree, pxg_plusminus, pxg_twosuperior, pxg_threesuperior,
+ pxg_acute, pxg_mu, pxg_paragraph, pxg_periodcentered,
+ pxg_cedilla, pxg_onesuperior, pxg_ordmasculine, pxg_guillemotright,
+ pxg_onequarter, pxg_onehalf, pxg_threequarters, pxg_questiondown,
+ pxg_Agrave, pxg_Aacute, pxg_Acircumflex, pxg_Atilde,
+ pxg_Adieresis, pxg_Aring, pxg_AE, pxg_Ccedilla,
+ pxg_Egrave, pxg_Eacute, pxg_Ecircumflex, pxg_Edieresis,
+ pxg_Igrave, pxg_Iacute, pxg_Icircumflex, pxg_Idieresis,
+ pxg_Eth, pxg_Ntilde, pxg_Ograve, pxg_Oacute,
+ pxg_Ocircumflex, pxg_Otilde, pxg_Odieresis, pxg_multiply,
+ pxg_Oslash, pxg_Ugrave, pxg_Uacute, pxg_Ucircumflex,
+ pxg_Udieresis, pxg_Yacute, pxg_Thorn, pxg_germandbls,
+ pxg_agrave, pxg_aacute, pxg_acircumflex, pxg_atilde,
+ pxg_adieresis, pxg_aring, pxg_ae, pxg_ccedilla,
+ pxg_egrave, pxg_eacute, pxg_ecircumflex, pxg_edieresis,
+ pxg_igrave, pxg_iacute, pxg_icircumflex, pxg_idieresis,
+ pxg_eth, pxg_ntilde, pxg_ograve, pxg_oacute,
+ pxg_ocircumflex, pxg_otilde, pxg_odieresis, pxg_divide,
+ pxg_oslash, pxg_ugrave, pxg_uacute, pxg_ucircumflex,
+ pxg_udieresis, pxg_yacute, pxg_thorn, pxg_ydieresis,
+ pxg__notdef
+};
diff --git a/pxl/pxsymbol.psh b/pxl/pxsymbol.psh
new file mode 100644
index 000000000..5ec082aaf
--- /dev/null
+++ b/pxl/pxsymbol.psh
@@ -0,0 +1,15 @@
+/* Copyright (C) 1996 Aladdin Enterprises. All rights reserved.
+ Unauthorized use, copying, and/or distribution prohibited.
+ */
+
+/* pxsymbol.h */
+/* PCL XL symbol set table declarations */
+
+extern const unsigned short pxPDFDocEncoding[];
+extern const unsigned short pxMacExpertEncoding[];
+extern const unsigned short pxSymbolEncoding[];
+extern const unsigned short pxISOLatin1Encoding[];
+extern const unsigned short pxStandardEncoding[];
+extern const unsigned short pxDingbatsEncoding[];
+extern const unsigned short pxMacRomanEncoding[];
+extern const unsigned short pxWinAnsiEncoding[];
diff --git a/pxl/pxtag.h b/pxl/pxtag.h
new file mode 100644
index 000000000..7bb7890ed
--- /dev/null
+++ b/pxl/pxtag.h
@@ -0,0 +1,19 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxtag.h */
+/* Operator and other tag definitions for PCL XL parser */
+
+/* The contents of this file have been moved to the graphics library, */
+/* so they can be used in the PCL XL driver. */
+#include "gdevpxop.h"
diff --git a/pxl/pxtop.c b/pxl/pxtop.c
new file mode 100644
index 000000000..85f15123a
--- /dev/null
+++ b/pxl/pxtop.c
@@ -0,0 +1,687 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxtop.c */
+/* Top-level API implementation of PCL/XL */
+
+#include "stdio_.h"
+#include "string_.h"
+#include "gdebug.h"
+#include "gserrors.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsnogc.h"
+#include "gsstate.h" /* must precede gsdevice.h */
+#include "gsdevice.h"
+#include "gsstruct.h" /* for gxalloc.h */
+#include "gspaint.h"
+#include "gxalloc.h"
+#include "gxstate.h"
+#include "plparse.h"
+#include "pxattr.h" /* for pxparse.h */
+#include "pxerrors.h"
+#include "pxoper.h"
+#include "pxstate.h"
+#include "pxfont.h"
+#include "pxvalue.h" /* for pxparse.h */
+#include "pxparse.h"
+#include "pxptable.h"
+#include "pxstate.h"
+#include "pltop.h"
+
+/* Define the table of pointers to initialization data. */
+
+typedef int (*px_init_proc) ( px_state_t * );
+
+int pxfont_init(px_state_t *pxs );
+int pxerrors_init(px_state_t *pxs );
+
+const px_init_proc px_init_table[] = {
+ &pxfont_init,
+ &pxerrors_init,
+ 0
+};
+
+/* Imported operators */
+px_operator_proc(pxEndPage);
+px_operator_proc(pxBeginSession);
+
+/* Forward decls */
+static int pxl_end_page_top(px_state_t *pxs, int num_copies, int flush);
+static int px_top_init(px_parser_state_t *st, px_state_t *pxs, bool big_endian);
+
+
+/* ------------ PCXL stream header processor ------- */
+/* State used to process an XL stream header */
+typedef struct px_stream_header_process_s {
+ enum {PSHPReady, PSHPSkipping, PSHPDone} state;
+ px_parser_state_t *st; /* parser state to refer to */
+ px_state_t *pxs; /* xl state to refer to */
+} px_stream_header_process_t;
+
+
+/* Initialize stream header processor */
+static void
+px_stream_header_init(
+ px_stream_header_process_t *process, /* header state to init */
+ px_parser_state_t *st, /* parser state to refer to */
+ px_state_t *pxs /* xl state to refer to */
+)
+{
+ process->state = PSHPReady;
+ process->st = st;
+ process->pxs = pxs;
+}
+
+/* Process stream header input */
+static int /* ret -ve error, 0 if needs more input, 1 if done successfully */
+px_stream_header_process(
+ px_stream_header_process_t *process, /* header state to refer */
+ stream_cursor_read *cursor /* cusor to read data */
+)
+{
+ while (cursor->ptr != cursor->limit)
+ {
+ byte chr;
+ switch (process->state)
+ {
+ case PSHPReady:
+ process->state = PSHPSkipping; /* switch to next state */
+ switch ( (chr = *++cursor->ptr) )
+ {
+ case '(':
+ px_top_init(process->st, process->pxs, true);
+ break;
+ case ')':
+ px_top_init(process->st, process->pxs, false);
+ break;
+ default:
+ /* Initialize state to avoid confusion */
+ px_top_init(process->st, process->pxs, true);
+ return gs_note_error(errorUnsupportedBinding);
+ }
+ break;
+ case PSHPSkipping:
+ if ( (chr = *++cursor->ptr) == '\n' )
+ {
+ process->state = PSHPDone;
+ return 1;
+ }
+ break;
+ case PSHPDone:
+ default:
+ /* Shouldn't ever come here */
+ return gs_note_error(errorIllegalStreamHeader);
+ }
+ }
+
+ return 0; /* need more input */
+}
+
+/* De-initialize stream header processor */
+static void
+px_stream_header_dnit(
+ px_stream_header_process_t *process /* header state to dnit */
+)
+{
+ /* empty proc */
+}
+
+/************************************************************/
+/******** Language wrapper implementation (see pltop.h) *****/
+/************************************************************/
+
+/*
+ * PXL interpeter: derived from pl_interp_t
+ */
+typedef struct pxl_interp_s {
+ pl_interp_t pl; /* common part: must be first */
+ gs_memory_t *memory; /* memory allocator to use */
+} pxl_interp_t;
+
+/*
+ * PXL interpreter instance: derived from pl_interp_instance_t
+ */
+typedef struct pxl_interp_instance_s {
+ pl_interp_instance_t pl; /* common part: must be first */
+ gs_memory_t *memory; /* memory allocator to use */
+ px_parser_state_t *st; /* parser state */
+ px_state_t *pxs; /* interp state */
+ gs_state *pgs; /* grafix state */
+ pl_page_action_t pre_page_action; /* action before page out */
+ void *pre_page_closure; /* closure to call pre_page_action with */
+ pl_page_action_t post_page_action; /* action before page out */
+ void *post_page_closure;/* closure to call post_page_action with */
+ enum {PSHeader, PSXL, PSDone}
+ processState; /* interp's processing state */
+ px_stream_header_process_t
+ headerState; /* used to decode stream header */
+} pxl_interp_instance_t;
+
+
+/* Get implemtation's characteristics */
+const pl_interp_characteristics_t * /* always returns a descriptor */
+pxl_impl_characteristics(
+ const pl_interp_implementation_t *impl /* implementation of interpereter to alloc */
+)
+{
+ /* version and build date are not currently used */
+#define PXLVERSION NULL
+#define PXLBUILDDATE NULL
+ static pl_interp_characteristics_t pxl_characteristics = {
+ "PCLXL",
+ ") HP-PCL XL",
+ "Artifex",
+ PXLVERSION,
+ PXLBUILDDATE,
+ px_parser_min_input_size
+ };
+ return &pxl_characteristics;
+}
+
+/* Don't need to do anything to PXL interpreter */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_allocate_interp(
+ pl_interp_t **interp, /* RETURNS abstract interpreter struct */
+ const pl_interp_implementation_t *impl, /* implementation of interpereter to alloc */
+ gs_memory_t *mem /* allocator to allocate interp from */
+)
+{
+ static pl_interp_t pi; /* there's only one interpreter */
+
+ /* There's only one PXL interp, so return the static */
+ *interp = &pi;
+ return 0; /* success */
+}
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_allocate_interp_instance(
+ pl_interp_instance_t **instance, /* RETURNS instance struct */
+ pl_interp_t *interp, /* dummy interpreter */
+ gs_memory_t *mem /* allocator to allocate instance from */
+)
+{
+ /* Allocate everything up front */
+ pxl_interp_instance_t *pxli /****** SHOULD HAVE A STRUCT DESCRIPTOR ******/
+ = (pxl_interp_instance_t *)gs_alloc_bytes( mem,
+ sizeof(pxl_interp_instance_t),
+ "pxl_allocate_interp_instance(pxl_interp_instance_t)"
+ );
+ gs_state *pgs = gs_state_alloc(mem);
+ px_parser_state_t *st = px_process_alloc(mem); /* parser init, cheap */
+ px_state_t *pxs = px_state_alloc(mem); /* inits interp state, potentially expensive */
+ /* If allocation error, deallocate & return */
+ if (!pxli || !pgs || !st || !pxs) {
+ if (!pxli)
+ gs_free_object(mem, pxli, "pxl_impl_allocate_interp_instance(pxl_interp_instance_t)");
+ if (!pgs)
+ gs_state_free(pgs);
+ if (!st)
+ px_process_release(st);
+ if (!pxs)
+ px_state_release(pxs);
+ return gs_error_VMerror;
+ }
+
+ /* Setup pointers to allocated mem within instance */
+ pxli->memory = mem;
+ pxli->pgs = pgs;
+ pxli->pxs = pxs;
+ pxli->st = st;
+
+ /* zero-init pre/post page actions for now */
+ pxli->pre_page_action = 0;
+ pxli->post_page_action = 0;
+
+ /* General init of pxl_state */
+ px_state_init(pxs, pgs); /*pgs only needed to set pxs as pgs' client */
+ pxs->client_data = pxli;
+ pxs->end_page = pxl_end_page_top; /* after px_state_init */
+
+ /* Return success */
+ *instance = (pl_interp_instance_t *)pxli;
+ return 0;
+}
+
+/* Set a client language into an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_set_client_instance(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_interp_instance_t *client, /* client to set */
+ pl_interp_instance_clients_t which_client
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ if ( which_client == PCL_CLIENT )
+ pxli->pxs->pcls = client;
+ else if ( which_client == PJL_CLIENT )
+ pxli->pxs->pjls = client;
+ /* ignore unknown clients */
+ return 0;
+}
+
+/* Set an interpreter instance's pre-page action */
+static int /* ret 0 ok, else -ve err */
+pxl_impl_set_pre_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute (rets 1 to abort w/o err) */
+ void *closure /* closure to call action with */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ pxli->pre_page_action = action;
+ pxli->pre_page_closure = closure;
+ return 0;
+}
+
+/* Set an interpreter instance's post-page action */
+static int /* ret 0 ok, else -ve err */
+pxl_impl_set_post_page_action(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ pl_page_action_t action, /* action to execute */
+ void *closure /* closure to call action with */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ pxli->post_page_action = action;
+ pxli->post_page_closure = closure;
+ return 0;
+}
+
+/* Set a device into an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_set_device(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gx_device *device /* device to set (open or closed) */
+)
+{
+ int code;
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ enum {Sbegin, Ssetdevice, Sinitg, Sgsave, Serase, Sdone} stage;
+ stage = Sbegin;
+ gs_opendevice(device);
+
+ /* Set the device into the gstate */
+ stage = Ssetdevice;
+ if ((code = gs_setdevice_no_erase(pxli->pgs, device)) < 0) /* can't erase yet */
+ goto pisdEnd;
+
+ /* Init XL graphics */
+ stage = Sinitg;
+ if ((code = px_initgraphics(pxli->pxs)) < 0)
+ goto pisdEnd;
+
+ /* Do inits of gstate that may be reset by setdevice */
+ gs_setaccuratecurves(pxli->pgs, true); /* All H-P languages want accurate curves. */
+
+ /* gsave and grestore (among other places) assume that */
+ /* there are at least 2 gstates on the graphics stack. */
+ /* Ensure that now. */
+ stage = Sgsave;
+ if ( (code = gs_gsave(pxli->pgs)) < 0)
+ goto pisdEnd;
+
+ stage = Serase;
+ if ( (code = gs_erasepage(pxli->pgs)) < 0 )
+ goto pisdEnd;
+
+ stage = Sdone; /* success */
+
+ /* Unwind any errors */
+pisdEnd:
+ switch (stage) {
+ case Sdone: /* don't undo success */
+ break;
+
+ case Serase: /* gs_erasepage failed */
+ /* undo gsave */
+ gs_grestore_only(pxli->pgs); /* destroys gs_save stack */
+ /* fall thru to next */
+ case Sgsave: /* gsave failed */
+ case Sinitg:
+ /* undo setdevice */
+ gs_nulldevice(pxli->pgs);
+ /* fall thru to next */
+
+ case Ssetdevice: /* gs_setdevice failed */
+ case Sbegin: /* nothing left to undo */
+ break;
+ }
+ return code;
+}
+
+static int
+pxl_impl_get_device_memory(
+ pl_interp_instance_t *instance, /* interp instance to use */
+ gs_memory_t **pmem)
+{
+ return 0;
+}
+
+/* Prepare interp instance for the next "job" */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_init_job(
+ pl_interp_instance_t *instance /* interp instance to start job in */
+)
+{
+ int code = 0;
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ px_reset_errors(pxli->pxs);
+ px_process_init(pxli->st, true);
+
+ /* set input status to: expecting stream header */
+ px_stream_header_init(&pxli->headerState, pxli->st, pxli->pxs);
+ pxli->processState = PSHeader;
+
+ return code;
+}
+
+/* Parse a cursor-full of data */
+static int /* ret 0 or +ve if ok, else -ve error code */
+pxl_impl_process(
+ pl_interp_instance_t *instance, /* interp instance to process data job in */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ int code;
+
+ /* Process some input */
+ switch (pxli->processState)
+ {
+ case PSDone:
+ return e_ExitLanguage;
+ case PSHeader: /* Input stream header */
+ code = px_stream_header_process(&pxli->headerState, cursor);
+ if (code == 0)
+ break; /* need more input later */
+ else
+ /* stream header termination */
+ if (code < 0)
+ {
+ pxli->processState = PSDone;
+ return code; /* return error */
+ }
+ else
+ {
+ code = 0;
+ pxli->processState = PSXL;
+ }
+ /* fall thru to PSXL */
+ case PSXL: /* PCL XL */
+ code = px_process(pxli->st, pxli->pxs, cursor);
+ if ( code == e_ExitLanguage )
+ { pxli->processState = PSDone;
+ code = 0;
+ }
+ else if ( code == errorWarningsReported )
+ { /* The parser doesn't skip over the EndSession */
+ /* operator, because an "error" occurred. */
+ cursor->ptr++;
+ }
+ else if (code < 0)
+ /* Map library error codes to PCL XL codes when possible. */
+ switch ( code )
+ {
+#define subst(gs_error, px_error)\
+ case gs_error: code = px_error; break
+ subst(gs_error_invalidfont, errorIllegalFontData);
+ subst(gs_error_limitcheck, errorInternalOverflow);
+ subst(gs_error_nocurrentpoint, errorCurrentCursorUndefined);
+ subst(gs_error_rangecheck, errorIllegalAttributeValue);
+ subst(gs_error_VMerror, errorInsufficientMemory);
+#undef subst
+ }
+ break; /* may need more input later */
+ }
+
+ return code;
+}
+
+/* Skip to end of job ret 1 if done, 0 ok but EOJ not found, else -ve error code */
+static int
+pxl_impl_flush_to_eoj(
+ pl_interp_instance_t *instance, /* interp instance to flush for */
+ stream_cursor_read *cursor /* data to process */
+)
+{
+ const byte *p = cursor->ptr;
+ const byte *rlimit = cursor->limit;
+
+ /* Skip to, but leave UEL in buffer for PJL to find later */
+ for (; p < rlimit; ++p)
+ if (p[1] == '\033') {
+ uint avail = rlimit - p;
+
+ if (memcmp(p + 1, "\033%-12345X", min(avail, 9)))
+ continue;
+ if (avail < 9)
+ break;
+ cursor->ptr = p;
+ return 1; /* found eoj */
+ }
+ cursor->ptr = p;
+ return 0; /* need more */
+}
+
+/* Parser action for end-of-file */
+static int /* ret 0 or +ve if ok, else -ve error code */
+pxl_impl_process_eof(
+ pl_interp_instance_t *instance /* interp instance to process data job in */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+
+ px_state_cleanup(pxli->pxs);
+
+ return 0;
+}
+
+/* Report any errors after running a job */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_report_errors(
+ pl_interp_instance_t *instance, /* interp instance to wrap up job in */
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ px_parser_state_t *st = pxli->st;
+ px_state_t *pxs = pxli->pxs;
+ int report = pxs->error_report;
+ const char *subsystem =
+ (code <= px_error_next ? "KERNEL" : "GRAPHICS");
+ char message[px_max_error_line+1];
+ int N = 0;
+ int y;
+
+ if (code >= 0)
+ return code; /* not really an error */
+ if ( report & eErrorPage )
+ y = px_begin_error_page(pxs);
+ while ( (N = px_error_message_line(message, N, subsystem,
+ code, st, pxs)) >= 0
+ )
+ { if ( (report & eBackChannel) || force_to_cout )
+ errprintf(message);
+ if ( report & eErrorPage )
+ y = px_error_page_show(message, y, pxs);
+ }
+ if ( ((report & pxeErrorReport_next) && file_position != -1L) || force_to_cout )
+ errprintf("file position of error = %ld\n", file_position);
+ if ( report & eErrorPage )
+ { px_args_t args;
+ args.pv[0] = 0;
+ pxEndPage(&args, pxs);
+ }
+ px_reset_errors(pxs);
+
+ return code;
+}
+
+/* Wrap up interp instance after a "job" */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_dnit_job(
+ pl_interp_instance_t *instance /* interp instance to wrap up job in */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ px_stream_header_dnit(&pxli->headerState);
+ px_state_cleanup(pxli->pxs);
+ return 0;
+}
+
+/* Remove a device from an interperter instance */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_remove_device(
+ pl_interp_instance_t *instance /* interp instance to use */
+)
+{
+ int code = 0; /* first error status encountered */
+ int error;
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ /* return to original gstate */
+ gs_grestore_only(pxli->pgs); /* destroys gs_save stack */
+ /* Deselect device */
+ /* NB */
+ error = gs_nulldevice(pxli->pgs);
+ if (code >= 0)
+ code = error;
+
+ return code;
+}
+
+/* Deallocate a interpreter instance */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_deallocate_interp_instance(
+ pl_interp_instance_t *instance /* instance to dealloc */
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)instance;
+ gs_memory_t *mem = pxli->memory;
+
+ px_dict_release(&pxli->pxs->font_dict);
+ px_dict_release(&pxli->pxs->builtin_font_dict);
+ /* do total dnit of interp state */
+ px_state_finit(pxli->pxs);
+ /* free halftone cache */
+ gs_state_free(pxli->pgs);
+ px_process_release(pxli->st);
+ px_state_release(pxli->pxs);
+ gs_free_object(mem, pxli, "pxl_impl_deallocate_interp_instance(pxl_interp_instance_t)");
+ return 0;
+}
+
+/* Do static deinit of PXL interpreter */
+static int /* ret 0 ok, else -ve error code */
+pxl_impl_deallocate_interp(
+ pl_interp_t *interp /* interpreter to deallocate */
+)
+{
+ /* nothing to do */
+ return 0;
+}
+
+/*
+ * End-of-page called back by PXL
+ */
+static int
+pxl_end_page_top(
+ px_state_t * pxls,
+ int num_copies,
+ int flush
+)
+{
+ pxl_interp_instance_t *pxli = (pxl_interp_instance_t *)(pxls->client_data);
+ pl_interp_instance_t *instance = (pl_interp_instance_t *)pxli;
+ int code = 0;
+
+ /* do pre-page action */
+ if (pxli->pre_page_action)
+ {
+ code = pxli->pre_page_action(instance, pxli->pre_page_closure);
+ if (code < 0)
+ return code;
+ if (code != 0)
+ return 0; /* code > 0 means abort w/no error */
+ }
+
+ /* output the page */
+ code = gs_output_page(pxli->pgs, num_copies, flush);
+ if (code < 0)
+ return code;
+
+ /* do post-page action */
+ if (pxli->post_page_action)
+ {
+ code = pxli->post_page_action(instance, pxli->post_page_closure);
+ if (code < 0)
+ return code;
+ }
+
+ return 0;
+}
+
+/* Parser implementation descriptor */
+const pl_interp_implementation_t pxl_implementation = {
+ pxl_impl_characteristics,
+ pxl_impl_allocate_interp,
+ pxl_impl_allocate_interp_instance,
+ pxl_impl_set_client_instance,
+ pxl_impl_set_pre_page_action,
+ pxl_impl_set_post_page_action,
+ pxl_impl_set_device,
+ pxl_impl_init_job,
+ pxl_impl_process,
+ pxl_impl_flush_to_eoj,
+ pxl_impl_process_eof,
+ pxl_impl_report_errors,
+ pxl_impl_dnit_job,
+ pxl_impl_remove_device,
+ pxl_impl_deallocate_interp_instance,
+ pxl_impl_deallocate_interp,
+ pxl_impl_get_device_memory,
+};
+
+/* ---------- Utility Procs ----------- */
+/* Initialize the parser state, and session parameters in case we get */
+/* an error before the session is established. */
+static int
+px_top_init(px_parser_state_t *st, px_state_t *pxs, bool big_endian)
+{
+ px_args_t args;
+ px_value_t v[3];
+
+ px_process_init(st, big_endian);
+
+ /* Measure */
+ v[0].type = pxd_scalar | pxd_ubyte;
+ v[0].value.i = eInch;
+ args.pv[0] = &v[0];
+ /* UnitsPerMeasure */
+ v[1].type = pxd_xy | pxd_uint16;
+ v[1].value.ia[0] = v[1].value.ia[1] = 100; /* arbitrary */
+ args.pv[1] = &v[1];
+ /* ErrorReporting */
+ v[2].type = pxd_scalar | pxd_ubyte;
+ v[2].value.i = eErrorPage;
+ args.pv[2] = &v[2];
+ {
+ int code = pxBeginSession(&args, pxs);
+ if ( code < 0 )
+ return code;
+ }
+ return 0;
+}
diff --git a/pxl/pxvalue.c b/pxl/pxvalue.c
new file mode 100644
index 000000000..77f743d15
--- /dev/null
+++ b/pxl/pxvalue.c
@@ -0,0 +1,80 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxvalue.c */
+/* Value accessing for PCL XL */
+
+#include "std.h"
+#include "gsmemory.h"
+#include "pxvalue.h"
+
+/* Get numeric values from the input or an array. */
+uint
+uint16at(const byte *p, bool big_endian)
+{ return (big_endian ? (p[0] << 8) + p[1] : (p[1] << 8) + p[0]);
+}
+int
+sint16at(const byte *p, bool big_endian)
+{ return ((int)uint16at(p, big_endian) ^ 0x8000) - 0x8000;
+}
+int32_t
+uint32at(const byte *p, bool big_endian)
+{ return
+ (big_endian ?
+ ((int32_t)((p[0] << 8) + p[1]) << 16) + (p[2] << 8) + p[3] :
+ ((int32_t)((p[3] << 8) + p[2]) << 16) + (p[1] << 8) + p[0]);
+}
+int32_t
+sint32at(const byte *p, bool big_endian)
+{ return (uint32at(p, big_endian) ^ 0x80000000) - 0x80000000;
+}
+real
+real32at(const byte *p, bool big_endian)
+{
+ union {
+ float f;
+ int32_t d;
+ } df;
+
+ df.d = uint32at(p, big_endian);
+ return (real)df.f;
+}
+
+/* Get an element from an array. */
+/* The caller does all index and type checking. */
+int32_t
+integer_elt(const px_value_t *pav, uint index)
+{ px_data_type_t type = pav->type;
+ const byte *base = pav->value.array.data;
+ bool big_endian;
+
+ if ( type & pxd_ubyte )
+ return base[index];
+ big_endian = (type & pxd_big_endian) != 0;
+ if ( type & pxd_uint16 )
+ return uint16at(base + (index << 1), big_endian);
+ else if ( type & pxd_sint16 )
+ return sint16at(base + (index << 1), big_endian);
+ else if ( type & pxd_uint32 )
+ return uint32at(base + (index << 2), big_endian);
+ else /* ( type & pxd_sint32 ) */
+ return sint32at(base + (index << 2), big_endian);
+}
+real
+real_elt(const px_value_t *pav, uint index)
+{ return
+ (pav->type & pxd_real32 ?
+ real32at(pav->value.array.data + (index << 2),
+ (pav->type & pxd_big_endian) != 0) :
+ (real)integer_elt(pav, index));
+}
diff --git a/pxl/pxvalue.h b/pxl/pxvalue.h
new file mode 100644
index 000000000..3d5a6bbb1
--- /dev/null
+++ b/pxl/pxvalue.h
@@ -0,0 +1,103 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+/*$Id$ */
+
+/* pxvalue.h */
+/* Value definitions for PCL XL parser */
+
+#ifndef pxvalue_INCLUDED
+# define pxvalue_INCLUDED
+
+#include "stdint_.h"
+#include "gstypes.h"
+#include "pxattr.h"
+
+/* ---------------- Values on stack ---------------- */
+
+/* Define masks for checking data types of attribute values. */
+typedef enum {
+ /* Structure */
+ pxd_scalar = 1,
+ pxd_xy = 2,
+ pxd_box = 4,
+ pxd_array = 8,
+ pxd_structure = 0xf,
+ /* Representation */
+ pxd_ubyte = 0x10,
+ pxd_uint16 = 0x20,
+ pxd_uint32 = 0x40,
+ pxd_sint16 = 0x80,
+ pxd_sint32 = 0x100,
+ pxd_any_int = pxd_ubyte | pxd_uint16 | pxd_uint32 | pxd_sint16 | pxd_sint32,
+ pxd_real32 = 0x200,
+ pxd_any_real = pxd_real32,
+ pxd_representation = 0x3f0,
+ /* Byte ordering for arrays */
+ pxd_big_endian = 0x400,
+ /* Heap allocation for arrays */
+ pxd_on_heap = 0x800
+} px_data_type_t;
+
+typedef float real;
+
+/* Define a type for values on the stack. */
+typedef struct px_array_s {
+ uint size; /* number of elements, not length in bytes */
+ const byte *data;
+} px_array_t;
+typedef struct {
+ px_data_type_t type;
+ px_attribute_t attribute;
+ union v_ {
+ int32_t i;
+ int32_t ia[4]; /* ia[0] aliases i */
+ real r;
+ real ra[4]; /* ra[0] aliases r */
+ px_array_t array;
+ } value;
+} px_value_t;
+
+#define real_value(pv, n)\
+ ((pv)->type & pxd_any_real ? (pv)->value.ra[n] : (real)(pv)->value.ia[n])
+
+#define set_box_value(x1, y1, x2, y2, pv)\
+ do {\
+ const px_value_t *pv_ = (pv);\
+ if ( pv_->type & pxd_any_real )\
+ x1 = pv_->value.ra[0], y1 = pv_->value.ra[1],\
+ x2 = pv_->value.ra[2], y2 = pv_->value.ra[3];\
+ else\
+ x1 = pv_->value.ia[0], y1 = pv_->value.ia[1],\
+ x2 = pv_->value.ia[2], y2 = pv_->value.ia[3];\
+ } while ( 0 )
+
+#define value_size(pv)\
+ ((pv)->type & pxd_ubyte ? 1 : (pv)->type & (pxd_uint16 | pxd_sint16) ? 2 : 4)
+
+#define array_value_size(pav)\
+ ((pav)->value.array.size * value_size(pav))
+
+/* ---------------- Procedures ---------------- */
+
+/* Get numeric values from the input or an array. */
+uint uint16at(const byte *p, bool big_endian);
+int sint16at(const byte *p, bool big_endian);
+int32_t uint32at(const byte *p, bool big_endian);
+int32_t sint32at(const byte *p, bool big_endian);
+real real32at(const byte *p, bool big_endian);
+
+/* Get an element from an array. */
+/* The caller does all index and type checking. */
+int32_t integer_elt(const px_value_t *pav, uint index);
+real real_elt(const px_value_t *pav, uint index);
+
+#endif /* pxvalue_INCLUDED */
diff --git a/sRGB.icc b/sRGB.icc
new file mode 100644
index 000000000..5e129fae4
--- /dev/null
+++ b/sRGB.icc
Binary files differ
diff --git a/svg/ghostsvg.h b/svg/ghostsvg.h
new file mode 100644
index 000000000..52d1c322d
--- /dev/null
+++ b/svg/ghostsvg.h
@@ -0,0 +1,143 @@
+#include "memory_.h"
+#include "math_.h"
+
+#include <stdlib.h>
+#include <ctype.h> /* for toupper() */
+
+#include "gsgc.h"
+#include "gstypes.h"
+#include "gsstate.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gsmemory.h"
+#include "gsparam.h"
+#include "gsdevice.h"
+#include "scommon.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gsimage.h"
+#include "gscspace.h"
+#include "gsptype1.h"
+#include "gscolor2.h"
+#include "gscolor3.h"
+#include "gsutil.h"
+#include "gsicc.h"
+
+#include "gstrans.h"
+
+#include "gxpath.h" /* gsshade.h depends on it */
+#include "gxfixed.h" /* gsshade.h depends on it */
+#include "gxmatrix.h" /* gxtype1.h depends on it */
+#include "gsshade.h"
+#include "gsfunc.h"
+#include "gsfunc3.h" /* we use stitching and exponential interp */
+
+#include "gxfont.h"
+#include "gxchar.h"
+#include "gxtype1.h"
+#include "gxfont1.h"
+#include "gxfont42.h"
+#include "gxfcache.h"
+#include "gxistate.h"
+
+#include "gzstate.h"
+#include "gzpath.h"
+
+#include "zlib.h"
+
+/* override the debug printfs */
+#ifndef DEBUG
+#undef _dpl
+#define _dpl
+#undef dpf
+#define dpf
+#endif
+
+#ifndef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef ABS
+#define ABS(a) ((a) < 0 ? -(a) : (a))
+#endif
+
+/*
+ * Forward declarations.
+ */
+
+typedef struct svg_context_s svg_context_t;
+typedef struct svg_item_s svg_item_t;
+
+/*
+ * Context and memory.
+ */
+
+#if (defined(_MSC_VER) && _MSC_VER < 1310) || !defined(__GNUC__)
+/* Provide a fallback if this symbol is unsupported */
+#define __FUNCTION__ "ghostsvg"
+#endif
+
+#define svg_alloc(ctx, size) \
+ ((void*)gs_alloc_bytes(ctx->memory, size, __FUNCTION__));
+#define svg_realloc(ctx, ptr, size) \
+ gs_resize_object(ctx->memory, ptr, size, __FUNCTION__);
+#define svg_strdup(ctx, str) \
+ svg_strdup_imp(ctx, str, __FUNCTION__);
+#define svg_free(ctx, ptr) \
+ gs_free_object(ctx->memory, ptr, __FUNCTION__);
+
+size_t svg_strlcpy(char *destination, const char *source, size_t size);
+size_t svg_strlcat(char *destination, const char *source, size_t size);
+
+char *svg_strdup_imp(svg_context_t *ctx, const char *str, const char *function);
+char *svg_clean_path(char *name);
+void svg_absolute_path(char *output, char *pwd, char *path);
+
+/* end of page device callback foo */
+int svg_show_page(svg_context_t *ctx, int num_copies, int flush);
+
+int svg_utf8_to_ucs(int *p, const char *s, int n);
+
+/*
+ * Global context and XML parsing.
+ */
+
+int svg_open_xml_parser(svg_context_t *ctx);
+int svg_feed_xml_parser(svg_context_t *ctx, char *buf, int len);
+svg_item_t * svg_close_xml_parser(svg_context_t *ctx);
+int svg_parse_document(svg_context_t *ctx, svg_item_t *root);
+
+svg_item_t * svg_next(svg_item_t *item);
+svg_item_t * svg_down(svg_item_t *item);
+void svg_free_item(svg_context_t *ctx, svg_item_t *item);
+char * svg_tag(svg_item_t *item);
+char * svg_att(svg_item_t *item, const char *att);
+void svg_debug_item(svg_item_t *item, int level);
+
+struct svg_item_s
+{
+ char *name;
+ char **atts;
+ svg_item_t *up;
+ svg_item_t *down;
+ svg_item_t *next;
+};
+
+struct svg_context_s
+{
+ void *instance;
+ gs_memory_t *memory;
+ gs_state *pgs;
+ gs_font_dir *fontdir;
+ gs_color_space *srgb;
+
+ svg_item_t *root;
+ svg_item_t *head;
+ const char *error;
+ void *parser; /* Expat XML_Parser */
+};
+
diff --git a/svg/svg.mak b/svg/svg.mak
new file mode 100644
index 000000000..2ebeaee6b
--- /dev/null
+++ b/svg/svg.mak
@@ -0,0 +1,58 @@
+SVGSRC = $(SVGSRCDIR)$(D)
+SVGGEN = $(SVGGENDIR)$(D)
+SVGOBJ = $(SVGOBJDIR)$(D)
+SVGO_ = $(O_)$(SVGOBJ)
+EXPATINCDIR = $(EXPATSRCDIR)$(D)lib
+PLOBJ = $(PLOBJDIR)$(D)
+
+SVGCCC = $(CC_) $(I_)$(SVGSRCDIR)$(_I) $(I_)$(SVGGENDIR)$(_I) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(I_)$(EXPATINCDIR)$(_I) $(I_)$(ZSRCDIR)$(_I) $(C_)
+
+# Define the name of this makefile.
+SVG_MAK = $(SVGSRC)svg.mak
+
+svg.clean: svg.config-clean svg.clean-not-config-clean
+
+svg.clean-not-config-clean:
+ $(RM_) $(SVGOBJ)*.$(OBJ)
+
+svg.config-clean: clean_gs
+ $(RM_) $(SVGOBJ)*.dev
+ $(RM_) $(SVGOBJ)devs.tr5
+
+
+ghostsvg_h=$(SVGSRC)ghostsvg.h $(memory__h) $(math__h) \
+ $(gsgc_h) $(gstypes_h) $(gsstate_h) $(gsmatrix_h) $(gscoord_h) \
+ $(gsmemory_h) $(gsparam_h) $(gsdevice_h) $(scommon_h) \
+ $(gserror_h) $(gserrors_h) $(gspaint_h) $(gspath_h) $(gsimage_h) \
+ $(gscspace_h) $(gsptype1_h) $(gscolor2_h) $(gscolor3_h) \
+ $(gsutil_h) $(gsicc_h) $(gstrans_h) $(gxpath_h) $(gxfixed_h) \
+ $(gxmatrix_h) $(gsshade_h) $(gsfunc_h) $(gsfunc3_h) \
+ $(gxfont_h) $(gxchar_h) $(gxtype1_h) $(gxfont1_h) $(gxfont42_h) \
+ $(gxfcache_h) $(gxistate_h) $(gzstate_h) $(gzpath_h) $(zlib_h)
+
+SVGINCLUDES=$(ghostsvg_h)
+
+$(SVGOBJ)svgxml.$(OBJ): $(SVGSRC)svgxml.c $(SVGINCLUDES)
+ $(SVGCCC) $(SVGSRC)svgxml.c $(SVGO_)svgxml.$(OBJ)
+
+$(SVGOBJ)svgdoc.$(OBJ): $(SVGSRC)svgdoc.c $(SVGINCLUDES)
+ $(SVGCCC) $(SVGSRC)svgdoc.c $(SVGO_)svgdoc.$(OBJ)
+
+
+$(SVG_TOP_OBJ): $(SVGSRC)svgtop.c $(pltop_h) $(SVGGEN)pconf.h $(SVGINCLUDES)
+ $(CP_) $(SVGGEN)pconf.h $(SVGGEN)pconfig.h
+ $(SVGCCC) $(SVGSRC)svgtop.c $(SVGO_)svgtop.$(OBJ)
+
+SVG_OBJS=\
+ $(SVGOBJ)svgxml.$(OBJ) \
+ $(SVGOBJ)svgdoc.$(OBJ) \
+
+# NB - note this is a bit squirrely. Right now the pjl interpreter is
+# required and shouldn't be and PLOBJ==SVGGEN is required.
+
+$(SVGOBJ)svg.dev: $(SVG_MAK) $(ECHOGS_XE) $(SVG_OBJS) \
+ $(SVGGEN)expat.dev \
+ $(SVGGEN)pl.dev $(SVGGEN)$(PL_SCALER).dev $(SVGGEN)pjl.dev
+ $(SETMOD) $(SVGOBJ)svg $(SVG_OBJS)
+ $(ADDMOD) $(SVGOBJ)svg -include $(SVGGEN)expat $(SVGGEN)pl $(SVGGEN)$(PL_SCALER) $(SVGGEN)pjl.dev
+
diff --git a/svg/svg_gcc.mak b/svg/svg_gcc.mak
new file mode 100644
index 000000000..a417ea8a6
--- /dev/null
+++ b/svg/svg_gcc.mak
@@ -0,0 +1,69 @@
+# The "?=" style of this makefile is designed to facilitate "deriving"
+# your own make file from it by setting your own custom options, then include'ing
+# this file. In its current form, this file will compile using default options
+# and locations. It is recommended that you make any modifications to settings
+# in this file by creating your own makefile which includes this one.
+#
+# This file only defines the portions of the makefile that are different
+# between the present language switcher vs. the standard pcl6 makefile which
+# is included near the bottom. All other settings default to the base makefile.
+
+# Define the name of this makefile.
+MAKEFILE+= ../svg/svg_gcc.mak
+
+# Include SVG support
+SVG_INCLUDED?=TRUE
+
+# Font scaler
+PL_SCALER?=afs
+
+# The build process will put all of its output in this directory:
+# GENDIR is defined in the 'base' makefile, but we need its value immediately
+GENDIR?=./obj
+
+# The sources are taken from these directories:
+MAINSRCDIR?=../main
+PSSRCDIR?=../gs/src
+SVGSRCDIR?=../svg
+PSLIBDIR?=../gs/lib
+ICCSRCDIR?=../gs/icclib
+PNGSRCDIR?=../gs/libpng
+EXPATSRCDIR?=../gs/expat
+
+SHARE_EXPAT?=0
+EXPAT_CFLAGS=-DHAVE_MEMMOVE
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+PLPLATFORM?=
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+GLGENDIR?=$(GENDIR)
+GLOBJDIR?=$(GENDIR)
+PSGENDIR?=$(GENDIR)
+PSOBJDIR?=$(GENDIR)
+JGENDIR?=$(GENDIR)
+JOBJDIR?=$(GENDIR)
+ZGENDIR?=$(GENDIR)
+ZOBJDIR?=$(GENDIR)
+EXPATGENDIR?=$(GENDIR)
+EXPATOBJDIR?=$(GENDIR)
+
+# Executable path\name w/o the .EXE extension
+TARGET_DEVS=$(SVGOBJDIR)/svg.dev
+TARGET_XE?=$(GENDIR)/gsvg
+
+# Main file's name
+# this is already in pcl6_gcc.mak
+SVG_TOP_OBJ?=$(SVGOBJDIR)/svgtop.$(OBJ)
+TOP_OBJ?=$(SVG_TOP_OBJ)
+
+PDL_INCLUDE_FLAGS?=-DSVG_INCLUDED
+
+include $(MAINSRCDIR)/pcl6_gcc.mak
+
+# Subsystems
+# this is already in pcl6_gcc.mak
+include $(SVGSRCDIR)/svg.mak
+include $(PSSRCDIR)/expat.mak
diff --git a/svg/svg_msvc.mak b/svg/svg_msvc.mak
new file mode 100644
index 000000000..58dc6fa1d
--- /dev/null
+++ b/svg/svg_msvc.mak
@@ -0,0 +1,132 @@
+# Define the name of this makefile.
+MAKEFILE= $(MAKEFILE) ..\svg\svg_msvc.mak
+
+# Include SVG support
+!ifndef SVG_INCLUDED
+SVG_INCLUDED=TRUE
+!endif SVG_INCLUDED
+
+# Font scaler
+!ifndef PL_SCALER
+PL_SCALER=afs
+!endif
+
+# The build process will put all of its output in this directory:
+# GENDIR is defined in the 'base' makefile, but we need its value immediately
+!ifndef GENDIR
+GENDIR=.\obj
+!endif
+
+# The sources are taken from these directories:
+!ifndef MAINSRCDIR
+MAINSRCDIR=..\main
+!endif
+
+!ifndef PSSRCDIR
+PSSRCDIR=..\gs\src
+!endif
+
+!ifndef SVGSRCDIR
+SVGSRCDIR=..\svg
+!endif
+
+!ifndef PSLIBDIR
+PSLIBDIR=..\gs\lib
+!endif
+
+!ifndef ICCSRCDIR
+ICCSRCDIR=..\gs\icclib
+!endif
+
+!ifndef EXPATSRCDIR
+EXPATSRCDIR=..\gs\expat
+!endif
+
+!ifndef SHARE_EXPAT
+SHARE_EXPAT=0
+!endif
+
+!ifndef EXPAT_CFLAGS
+EXPAT_CFLAGS=/DHAVE_MEMMOVE
+!endif
+
+!ifndef PSRCDIR
+PSRCDIR=..\gs\libpng
+!endif
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+!ifndef PLPLATFORM
+PLPLATFORM=
+!endif
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+!ifndef GLGENDIR
+GLGENDIR=$(GENDIR)
+!endif
+
+!ifndef GLOBJDIR
+GLOBJDIR=$(GENDIR)
+!endif
+
+!ifndef PSGENDIR
+PSGENDIR=$(GENDIR)
+!endif
+
+!ifndef PSOBJDIR
+PSOBJDIR=$(GENDIR)
+!endif
+
+!ifndef JGENDIR
+JGENDIR=$(GENDIR)
+!endif
+
+!ifndef JOBJDIR
+JOBJDIR=$(GENDIR)
+!endif
+
+!ifndef ZGENDIR
+ZGENDIR=$(GENDIR)
+!endif
+
+!ifndef ZOBJDIR
+ZOBJDIR=$(GENDIR)
+!endif
+
+!ifndef EXPATGENDIR
+EXPATGENDIR=$(GENDIR)
+!endif
+
+!ifndef EXPATOBJDIR
+EXPATOBJDIR=$(GENDIR)
+!endif
+
+# Executable path\name w/o the .EXE extension
+!ifndef TARGET_XE
+TARGET_XE=$(GENDIR)\gsvg
+!endif
+
+# Main file's name
+# this is already in pcl6_gcc.mak
+#SVG_TOP_OBJ=$(SVGOBJDIR)\svgtop.$(OBJ)
+#TOP_OBJ+= $(SVG_TOP_OBJ)
+#XCFLAGS=-DSVG_INCLUDED
+
+# Choose COMPILE_INITS=1 for init files and fonts in ROM (otherwise =0)
+!ifndef COMPILE_INITS
+COMPILE_INITS=0
+!endif
+
+# configuration assumptions
+!ifndef GX_COLOR_INDEX_DEFINE
+GX_COLOR_INDEX_DEFINE=-DGX_COLOR_INDEX_TYPE="unsigned long long"
+!endif
+
+# "Subclassed" makefile
+!include $(MAINSRCDIR)\pcl6_msvc.mak
+
+# Subsystems
+# this is already in pcl6_gcc.mak
+#include $(SVGSRCDIR)\svg.mak
+!include $(PSSRCDIR)\expat.mak
diff --git a/svg/svgdoc.c b/svg/svgdoc.c
new file mode 100644
index 000000000..73b0cabc8
--- /dev/null
+++ b/svg/svgdoc.c
@@ -0,0 +1,10 @@
+#include "ghostsvg.h"
+
+int
+svg_parse_document(svg_context_t *ctx, svg_item_t *root)
+{
+ svg_debug_item(root, 0);
+
+ return 0;
+}
+
diff --git a/svg/svgtop.c b/svg/svgtop.c
new file mode 100644
index 000000000..2e537cfe8
--- /dev/null
+++ b/svg/svgtop.c
@@ -0,0 +1,486 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+/*$Id$*/
+
+/* Top-level API implementation of Scalable Vector Graphics (SVG) */
+
+/* Language wrapper implementation (see pltop.h) */
+
+#include "ghostsvg.h"
+
+#include "pltop.h"
+
+#include "gxdevice.h" /* so we can include gxht.h below */
+#include "gxht.h" /* gsht1.h is incomplete, we need storage size of gs_halftone */
+#include "gsht1.h"
+
+static int svg_install_halftone(svg_context_t *ctx, gx_device *pdevice);
+
+#define SVG_PARSER_MIN_INPUT_SIZE 8192
+
+/*
+ * The SVG interpeter is identical to pl_interp_t.
+ * The SVG interpreter instance is derived from pl_interp_instance_t.
+ */
+
+typedef struct svg_interp_instance_s svg_interp_instance_t;
+
+struct svg_interp_instance_s
+{
+ pl_interp_instance_t pl; /* common part: must be first */
+
+ pl_page_action_t pre_page_action; /* action before page out */
+ void *pre_page_closure; /* closure to call pre_page_action with */
+ pl_page_action_t post_page_action; /* action before page out */
+ void *post_page_closure; /* closure to call post_page_action with */
+
+ svg_context_t *ctx;
+};
+
+/* version and build date are not currently used */
+#define SVG_VERSION NULL
+#define SVG_BUILD_DATE NULL
+
+const pl_interp_characteristics_t *
+svg_imp_characteristics(const pl_interp_implementation_t *pimpl)
+{
+ static pl_interp_characteristics_t svg_characteristics =
+ {
+ "SVG",
+ "<?xml", /* string to recognize SVG files */
+ "Artifex",
+ SVG_VERSION,
+ SVG_BUILD_DATE,
+ SVG_PARSER_MIN_INPUT_SIZE, /* Minimum input size */
+ };
+ return &svg_characteristics;
+}
+
+static int
+svg_imp_allocate_interp(pl_interp_t **ppinterp,
+ const pl_interp_implementation_t *pimpl,
+ gs_memory_t *pmem)
+{
+ static pl_interp_t interp; /* there's only one interpreter */
+ *ppinterp = &interp;
+ return 0;
+}
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+static int
+svg_imp_allocate_interp_instance(pl_interp_instance_t **ppinstance,
+ pl_interp_t *pinterp,
+ gs_memory_t *pmem)
+{
+ svg_interp_instance_t *instance;
+ svg_context_t *ctx;
+ gs_state *pgs;
+
+ dputs("-- svg_imp_allocate_interp_instance --\n");
+
+ instance = (svg_interp_instance_t *) gs_alloc_bytes(pmem,
+ sizeof(svg_interp_instance_t), "svg_imp_allocate_interp_instance");
+
+ ctx = (svg_context_t *) gs_alloc_bytes(pmem,
+ sizeof(svg_context_t), "svg_imp_allocate_interp_instance");
+
+ pgs = gs_state_alloc(pmem);
+
+ memset(ctx, 0, sizeof(svg_context_t));
+
+ if (!instance || !ctx || !pgs)
+ {
+ if (instance)
+ gs_free_object(pmem, instance, "svg_imp_allocate_interp_instance");
+ if (ctx)
+ gs_free_object(pmem, ctx, "svg_imp_allocate_interp_instance");
+ if (pgs)
+ gs_state_free(pgs);
+ return gs_error_VMerror;
+ }
+
+ ctx->instance = instance;
+ ctx->memory = pmem;
+ ctx->pgs = pgs;
+ ctx->fontdir = NULL;
+
+ /* TODO: load some builtin ICC profiles here */
+ ctx->srgb = gs_cspace_new_DeviceRGB(ctx->memory);
+
+ instance->pre_page_action = 0;
+ instance->pre_page_closure = 0;
+ instance->post_page_action = 0;
+ instance->post_page_closure = 0;
+
+ instance->ctx = ctx;
+
+ // XXX - svg_init_font_cache(ctx);
+
+ *ppinstance = (pl_interp_instance_t *)instance;
+
+ return 0;
+}
+
+/* Set a client language into an interperter instance */
+static int
+svg_imp_set_client_instance(pl_interp_instance_t *pinstance,
+ pl_interp_instance_t *pclient,
+ pl_interp_instance_clients_t which_client)
+{
+ /* ignore */
+ return 0;
+}
+
+static int
+svg_imp_set_pre_page_action(pl_interp_instance_t *pinstance,
+ pl_page_action_t action, void *closure)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ instance->pre_page_action = action;
+ instance->pre_page_closure = closure;
+ return 0;
+}
+
+static int
+svg_imp_set_post_page_action(pl_interp_instance_t *pinstance,
+ pl_page_action_t action, void *closure)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ instance->post_page_action = action;
+ instance->post_page_closure = closure;
+ return 0;
+}
+
+static int
+svg_imp_set_device(pl_interp_instance_t *pinstance, gx_device *pdevice)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+ int code;
+
+ dputs("-- svg_imp_set_device --\n");
+
+ gs_opendevice(pdevice);
+
+ code = gs_setdevice_no_erase(ctx->pgs, pdevice);
+ if (code < 0)
+ goto cleanup_setdevice;
+
+ gs_setaccuratecurves(ctx->pgs, true); /* NB not sure */
+
+ /* gsave and grestore (among other places) assume that */
+ /* there are at least 2 gstates on the graphics stack. */
+ /* Ensure that now. */
+ code = gs_gsave(ctx->pgs);
+ if (code < 0)
+ goto cleanup_gsave;
+
+ code = gs_erasepage(ctx->pgs);
+ if (code < 0)
+ goto cleanup_erase;
+
+ code = svg_install_halftone(ctx, pdevice);
+ if (code < 0)
+ goto cleanup_halftone;
+
+ return 0;
+
+cleanup_halftone:
+cleanup_erase:
+ /* undo gsave */
+ gs_grestore_only(ctx->pgs); /* destroys gs_save stack */
+
+cleanup_gsave:
+ /* undo setdevice */
+ gs_nulldevice(ctx->pgs);
+
+cleanup_setdevice:
+ /* nothing to undo */
+ return code;
+}
+
+static int
+svg_imp_get_device_memory(pl_interp_instance_t *pinstance, gs_memory_t **ppmem)
+{
+ /* huh? we do nothing here */
+ return 0;
+}
+
+/* Parse a cursor-full of data */
+static int
+svg_imp_process(pl_interp_instance_t *pinstance, stream_cursor_read *pcursor)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+ return svg_process_data(ctx, pcursor);
+}
+
+/* Skip to end of job.
+ * Return 1 if done, 0 ok but EOJ not found, else negative error code.
+ */
+static int
+svg_imp_flush_to_eoj(pl_interp_instance_t *pinstance, stream_cursor_read *pcursor)
+{
+ /* assume SVG cannot be pjl embedded */
+ pcursor->ptr = pcursor->limit;
+ return 0;
+}
+
+/* Report any errors after running a job */
+static int
+svg_imp_report_errors(pl_interp_instance_t *pinstance,
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+ )
+{
+ return 0;
+}
+
+/* Prepare interp instance for the next "job" */
+static int
+svg_imp_init_job(pl_interp_instance_t *pinstance)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+
+ dputs("-- svg_imp_init_job --\n");
+
+ return svg_open_xml_parser(ctx);
+}
+
+/* Process data for job */
+int
+svg_process_data(svg_context_t *ctx, stream_cursor_read *buf)
+{
+ int code;
+
+ dputs("svg_process_data\n");
+
+ code = svg_feed_xml_parser(ctx, buf->ptr + 1, buf->limit - buf->ptr);
+
+ buf->ptr = buf->limit;
+
+ return code;
+}
+
+/* Parser action for end-of-file */
+static int
+svg_imp_process_eof(pl_interp_instance_t *pinstance)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+ svg_item_t *root;
+
+ dputs("svg_process_eof\n");
+
+ root = svg_close_xml_parser(ctx);
+ if (!root)
+ return gs_rethrow(-1, "cannot parse xml document");
+
+ return svg_parse_document(ctx, root);
+}
+
+/* Wrap up interp instance after a "job" */
+static int
+svg_imp_dnit_job(pl_interp_instance_t *pinstance)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+
+ dputs("-- svg_imp_dnit_job --\n");
+
+ return 0;
+}
+
+/* Remove a device from an interperter instance */
+static int
+svg_imp_remove_device(pl_interp_instance_t *pinstance)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+
+ int code = 0; /* first error status encountered */
+ int error;
+
+ dputs("-- svg_imp_remove_device --\n");
+
+ /* return to original gstate */
+ gs_grestore_only(ctx->pgs); /* destroys gs_save stack */
+
+ /* Deselect device */
+ /* NB */
+ error = gs_nulldevice(ctx->pgs);
+ if (code >= 0)
+ code = error;
+
+ return code;
+}
+
+/* Deallocate a interpreter instance */
+static int
+svg_imp_deallocate_interp_instance(pl_interp_instance_t *pinstance)
+{
+ svg_interp_instance_t *instance = (svg_interp_instance_t *)pinstance;
+ svg_context_t *ctx = instance->ctx;
+ gs_memory_t *mem = ctx->memory;
+
+ dputs("-- svg_imp_deallocate_interp_instance --\n");
+
+ /* language clients don't free the font cache machinery */
+
+ // free gstate?
+ gs_free_object(mem, ctx, "svg_imp_deallocate_interp_instance");
+ gs_free_object(mem, instance, "svg_imp_deallocate_interp_instance");
+
+ return 0;
+}
+
+/* Do static deinit of SVG interpreter */
+static int
+svg_imp_deallocate_interp(pl_interp_t *pinterp)
+{
+ /* nothing to do */
+ return 0;
+}
+
+/* Parser implementation descriptor */
+const pl_interp_implementation_t svg_implementation =
+{
+ svg_imp_characteristics,
+ svg_imp_allocate_interp,
+ svg_imp_allocate_interp_instance,
+ svg_imp_set_client_instance,
+ svg_imp_set_pre_page_action,
+ svg_imp_set_post_page_action,
+ svg_imp_set_device,
+ svg_imp_init_job,
+ svg_imp_process,
+ svg_imp_flush_to_eoj,
+ svg_imp_process_eof,
+ svg_imp_report_errors,
+ svg_imp_dnit_job,
+ svg_imp_remove_device,
+ svg_imp_deallocate_interp_instance,
+ svg_imp_deallocate_interp,
+ svg_imp_get_device_memory,
+};
+
+/*
+ * End-of-page function called by SVG parser.
+ */
+int
+svg_show_page(svg_context_t *ctx, int num_copies, int flush)
+{
+ pl_interp_instance_t *pinstance = ctx->instance;
+ svg_interp_instance_t *instance = ctx->instance;
+
+ int code = 0;
+
+ /* do pre-page action */
+ if (instance->pre_page_action)
+ {
+ code = instance->pre_page_action(pinstance, instance->pre_page_closure);
+ if (code < 0)
+ return code;
+ if (code != 0)
+ return 0; /* code > 0 means abort w/no error */
+ }
+
+ /* output the page */
+ code = gs_output_page(ctx->pgs, num_copies, flush);
+ if (code < 0)
+ return code;
+
+ /* do post-page action */
+ if (instance->post_page_action)
+ {
+ code = instance->post_page_action(pinstance, instance->post_page_closure);
+ if (code < 0)
+ return code;
+ }
+
+ return 0;
+}
+
+/*
+ * We need to install a halftone ourselves, this is not
+ * done automatically.
+ */
+
+static float
+identity_transfer(floatp tint, const gx_transfer_map *ignore_map)
+{
+ return tint;
+}
+
+/* The following is a 45 degree spot screen with the spots enumerated
+ * in a defined order. */
+static const byte order16x16[256] = {
+ 38, 11, 14, 32, 165, 105, 90, 171, 38, 12, 14, 33, 161, 101, 88, 167,
+ 30, 6, 0, 16, 61, 225, 231, 125, 30, 6, 1, 17, 63, 222, 227, 122,
+ 27, 3, 8, 19, 71, 242, 205, 110, 28, 4, 9, 20, 74, 246, 208, 106,
+ 35, 24, 22, 40, 182, 46, 56, 144, 36, 25, 22, 41, 186, 48, 58, 148,
+ 152, 91, 81, 174, 39, 12, 15, 34, 156, 95, 84, 178, 40, 13, 16, 34,
+ 69, 212, 235, 129, 31, 7, 2, 18, 66, 216, 239, 133, 32, 8, 2, 18,
+ 79, 254, 203, 114, 28, 4, 10, 20, 76, 250, 199, 118, 29, 5, 10, 21,
+ 193, 44, 54, 142, 36, 26, 23, 42, 189, 43, 52, 139, 37, 26, 24, 42,
+ 39, 12, 15, 33, 159, 99, 87, 169, 38, 11, 14, 33, 163, 103, 89, 172,
+ 31, 7, 1, 17, 65, 220, 229, 123, 30, 6, 1, 17, 62, 223, 233, 127,
+ 28, 4, 9, 20, 75, 248, 210, 108, 27, 3, 9, 19, 72, 244, 206, 112,
+ 36, 25, 23, 41, 188, 49, 60, 150, 35, 25, 22, 41, 184, 47, 57, 146,
+ 157, 97, 85, 180, 40, 13, 16, 35, 154, 93, 83, 176, 39, 13, 15, 34,
+ 67, 218, 240, 135, 32, 8, 3, 19, 70, 214, 237, 131, 31, 7, 2, 18,
+ 78, 252, 197, 120, 29, 5, 11, 21, 80, 255, 201, 116, 29, 5, 10, 21,
+ 191, 43, 51, 137, 37, 27, 24, 43, 195, 44, 53, 140, 37, 26, 23, 42
+};
+
+#define source_phase_x 4
+#define source_phase_y 0
+
+static int
+svg_install_halftone(svg_context_t *ctx, gx_device *pdevice)
+{
+ gs_halftone ht;
+ gs_string thresh;
+ int code;
+
+ int width = 16;
+ int height = 16;
+ thresh.data = order16x16;
+ thresh.size = width * height;
+
+ if (gx_device_must_halftone(pdevice))
+ {
+ ht.type = ht_type_threshold;
+ ht.params.threshold.width = width;
+ ht.params.threshold.height = height;
+ ht.params.threshold.thresholds.data = thresh.data;
+ ht.params.threshold.thresholds.size = thresh.size;
+ ht.params.threshold.transfer = 0;
+ ht.params.threshold.transfer_closure.proc = 0;
+
+ gs_settransfer(ctx->pgs, identity_transfer);
+
+ code = gs_sethalftone(ctx->pgs, &ht);
+ if (code < 0)
+ return gs_throw(code, "could not install halftone");
+
+ code = gs_sethalftonephase(ctx->pgs, 0, 0);
+ if (code < 0)
+ return gs_throw(code, "could not set halftone phase");
+ }
+
+ return 0;
+}
+
diff --git a/svg/svgxml.c b/svg/svgxml.c
new file mode 100644
index 000000000..32168550e
--- /dev/null
+++ b/svg/svgxml.c
@@ -0,0 +1,284 @@
+/* Recursive descent XML parsing API on top of Expat. */
+
+#include "ghostsvg.h"
+
+#include <expat.h>
+
+#define XMLBUFLEN 4096
+
+static void on_open_tag(void *zp, const char *name, const char **atts)
+{
+ svg_context_t *ctx = zp;
+ svg_item_t *item;
+ svg_item_t *tail;
+ int namelen;
+ int attslen;
+ int textlen;
+ char *p;
+ int i;
+
+ if (ctx->error)
+ return;
+
+ /* count size to alloc */
+
+ namelen = strlen(name) + 1; /* zero terminated */
+ attslen = sizeof(char*); /* with space for sentinel */
+ textlen = 0;
+ for (i = 0; atts[i]; i++)
+ {
+ attslen += sizeof(char*);
+ textlen += strlen(atts[i]) + 1;
+ }
+
+ item = svg_alloc(ctx, sizeof(svg_item_t) + attslen + namelen + textlen);
+ if (!item)
+ {
+ ctx->error = "out of memory";
+ }
+
+ /* copy strings to new memory */
+
+ item->atts = (char**) (((char*)item) + sizeof(svg_item_t));
+ item->name = ((char*)item) + sizeof(svg_item_t) + attslen;
+ p = ((char*)item) + sizeof(svg_item_t) + attslen + namelen;
+
+ strcpy(item->name, name);
+ for (i = 0; atts[i]; i++)
+ {
+ item->atts[i] = p;
+ strcpy(item->atts[i], atts[i]);
+ p += strlen(p) + 1;
+ }
+
+ item->atts[i] = 0;
+
+ /* link item into tree */
+
+ item->up = ctx->head;
+ item->down = NULL;
+ item->next = NULL;
+
+ if (!ctx->head)
+ {
+ ctx->root = item;
+ ctx->head = item;
+ return;
+ }
+
+ if (!ctx->head->down)
+ {
+ ctx->head->down = item;
+ ctx->head = item;
+ return;
+ }
+
+ tail = ctx->head->down;
+ while (tail->next)
+ tail = tail->next;
+ tail->next = item;
+ ctx->head = item;
+}
+
+static void on_close_tag(void *zp, const char *name)
+{
+ svg_context_t *ctx = zp;
+
+ if (ctx->error)
+ return;
+
+ if (ctx->head)
+ ctx->head = ctx->head->up;
+}
+
+static inline int is_svg_space(int c)
+{
+ return c == ' ' || c == '\t' || c == '\r' || c == '\n';
+}
+
+static void on_text(void *zp, const char *buf, int len)
+{
+ svg_context_t *ctx = zp;
+ char *atts[3];
+ int i;
+
+ if (ctx->error)
+ return;
+
+ for (i = 0; i < len; i++)
+ {
+ if (!is_svg_space(buf[i]))
+ {
+ char *tmp = svg_alloc(ctx, len + 1);
+ if (!tmp)
+ {
+ ctx->error = "out of memory";
+ return;
+ }
+
+ atts[0] = "";
+ atts[1] = tmp;
+ atts[2] = NULL;
+
+ memcpy(tmp, buf, len);
+ tmp[len] = 0;
+ on_open_tag(zp, "", atts);
+ on_close_tag(zp, "");
+ svg_free(ctx, tmp);
+ return;
+ }
+ }
+}
+
+int
+svg_open_xml_parser(svg_context_t *ctx)
+{
+ XML_Parser xp;
+
+ /* xp = XML_ParserCreateNS(NULL, ns); */
+ xp = XML_ParserCreate(NULL);
+ if (!xp)
+ return gs_throw(-1, "xml error: could not create expat parser");
+
+ XML_SetUserData(xp, ctx);
+ XML_SetParamEntityParsing(xp, XML_PARAM_ENTITY_PARSING_NEVER);
+ XML_SetStartElementHandler(xp, on_open_tag);
+ XML_SetEndElementHandler(xp, on_close_tag);
+ XML_SetCharacterDataHandler(xp, on_text);
+
+ ctx->root = NULL;
+ ctx->head = NULL;
+ ctx->error = NULL;
+ ctx->parser = xp;
+
+ return 0;
+}
+
+int
+svg_feed_xml_parser(svg_context_t *ctx, char *buf, int len)
+{
+ XML_Parser xp = ctx->parser;
+ int code = XML_Parse(xp, buf, len, 0);
+ if (code == 0)
+ {
+ ctx->root = NULL;
+ ctx->head = NULL;
+ ctx->error = NULL;
+ ctx->parser = NULL;
+ gs_throw3(-1, "xml error: %s (line %d, column %d)",
+ XML_ErrorString(XML_GetErrorCode(xp)),
+ XML_GetCurrentLineNumber(xp),
+ XML_GetCurrentColumnNumber(xp));
+ XML_ParserFree(xp);
+ return -1;
+ }
+ return 0;
+}
+
+svg_item_t *
+svg_close_xml_parser(svg_context_t *ctx)
+{
+ XML_Parser xp = ctx->parser;
+ svg_item_t *root = ctx->root;
+
+ int code = XML_Parse(xp, "", 0, 1); /* finish parsing */
+ if (code == 0)
+ {
+ gs_throw3(-1, "xml error: %s (line %d, column %d)",
+ XML_ErrorString(XML_GetErrorCode(xp)),
+ XML_GetCurrentLineNumber(xp),
+ XML_GetCurrentColumnNumber(xp));
+ root = NULL;
+ }
+
+ ctx->root = NULL;
+ ctx->head = NULL;
+ ctx->error = NULL;
+ ctx->parser = NULL;
+
+ XML_ParserFree(xp);
+
+ return root;
+}
+
+svg_item_t *
+svg_next(svg_item_t *item)
+{
+ return item->next;
+}
+
+svg_item_t *
+svg_down(svg_item_t *item)
+{
+ return item->down;
+}
+
+char *
+svg_tag(svg_item_t *item)
+{
+ return item->name;
+}
+
+char *
+svg_att(svg_item_t *item, const char *att)
+{
+ int i;
+ for (i = 0; item->atts[i]; i += 2)
+ if (!strcmp(item->atts[i], att))
+ return item->atts[i + 1];
+ return NULL;
+}
+
+void
+svg_free_item(svg_context_t *ctx, svg_item_t *item)
+{
+ svg_item_t *next;
+ while (item)
+ {
+ next = item->next;
+ if (item->down)
+ svg_free_item(ctx, item->down);
+ svg_free(ctx, item);
+ item = next;
+ }
+}
+
+static void indent(int n)
+{
+ while (n--)
+ printf(" ");
+}
+
+void
+svg_debug_item(svg_item_t *item, int level)
+{
+ int i;
+
+ while (item)
+ {
+ indent(level);
+
+ if (strlen(item->name) == 0)
+ printf("%s\n", item->atts[1]);
+ else
+ {
+ printf("<%s", item->name);
+
+ for (i = 0; item->atts[i]; i += 2)
+ printf(" %s=\"%s\"", item->atts[i], item->atts[i+1]);
+
+ if (item->down)
+ {
+ printf(">\n");
+ svg_debug_item(item->down, level + 1);
+ indent(level);
+ printf("</%s>\n", item->name);
+ }
+ else
+ printf(" />\n");
+ }
+
+ item = item->next;
+ }
+}
+
diff --git a/tools/GOT/README b/tools/GOT/README
new file mode 100644
index 000000000..61aae74d7
--- /dev/null
+++ b/tools/GOT/README
@@ -0,0 +1,35 @@
+Graphical Object Tagging (GOT)
+
+The bitrgbtags is a non-standard printer device that supports tagging
+graphical objects according to type, where types are: text, image,
+vector and unspecified. The type is encoded as a byte and interleaved
+in the framebuffer. Each pixel has a tag.
+
+limitations and oddities:
+ o GOT doesn't band. In fact the the device prototype disables banding.
+ o GOT always has 24 bits of color with 3 components.
+ o GOT uses a global variable to maintain its state.
+ o GOT currently breaks raster operations.
+ o GOT hasn't been tested much.
+
+tools (dotags.sh and friends)
+
+ dotags.sh <pcl_file> produces
+
+ o bit.tmp - bitrgb file with pixel tags for object types.
+ o bit_detagged.tmp.ppm - the file stripped of tags and converted to
+ ppmraw output.
+ o bit.tmp.ppm - detagged bit file converted to ppmraw output.
+ o tag.tmp.ppm - a color coded by object type version of the output
+ unknown - white
+ untouched - yellow
+ text - red
+ image - green
+ path - blue
+
+ dotags.sh will display the output file and tag using imagemagick.
+
+ dotags.sh uses the helper C programs tagimage.c and detag.c
+
+ dotags.sh should only be run in tools/tags after the bittagrgb device
+ has been compiled into ../../main/obj/pcl6 executable.
diff --git a/tools/GOT/detag.c b/tools/GOT/detag.c
new file mode 100644
index 000000000..6151e43e6
--- /dev/null
+++ b/tools/GOT/detag.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+/* detag bit rgb and produce ppmraw output */
+
+int
+main() {
+ printf("P6\n");
+ printf("612 792\n");
+ printf("255\n");
+ while (!feof(stdin)) {
+ getchar();
+ putchar(getchar());
+ putchar(getchar());
+ putchar(getchar());
+ }
+ return 0;
+}
+
diff --git a/tools/GOT/dotags.sh b/tools/GOT/dotags.sh
new file mode 100755
index 000000000..14e461a26
--- /dev/null
+++ b/tools/GOT/dotags.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# run the file in tools/tags subdirectory.
+# limitations:
+# only produces one page of output
+# this script assumes 72 bitrgbtags was run with 72 dpi
+# files produced:
+# bit.tmp - bitrgb file with pixel tags for object types
+# bit_detagged.tmp.ppm - the file stripped of tags
+# bit.tmp.ppm - detagged bit file converted to ppmraw output
+# tag.tmp.ppm - just the tags color coded see tagimage.c for mapping.
+
+FILES=$*
+
+for x in $FILES
+do
+ ../../main/obj/pcl6 -dNOPAUSE -sDEVICE=bitrgbtags -sOutputFile=bit.tmp $x
+ make detag
+ ./detag < bit.tmp > bit_detagged.tmp.ppm
+ make tagimage
+ ./tagimage < bit.tmp > tag.tmp.ppm
+ display bit_detagged.tmp.ppm tag.tmp.ppm
+done
+
diff --git a/tools/GOT/tagimage.c b/tools/GOT/tagimage.c
new file mode 100644
index 000000000..a502f5448
--- /dev/null
+++ b/tools/GOT/tagimage.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+
+#define UNKNOWN_TAG 0x1
+#define TEXT_TAG 0x2
+#define IMAGE_TAG 0x4
+#define PATH_TAG 0x8
+#define UNTOUCHED_TAG 0x10
+
+const char red[] = { 0xff, 0x00, 0x00 };
+const char green[] = { 0x00, 0xff, 0x00 };
+const char blue[] = { 0x00, 0x00, 0xff };
+const char white[] = { 0xff, 0xff, 0xff };
+const char black[] = { 0x00, 0x00, 0x00 };
+const char yellow[] = { 0xff, 0xff, 0x00 };
+
+static const char *
+tag2color(int tag)
+{
+ switch (tag) {
+ case UNKNOWN_TAG:
+ return white;
+ case TEXT_TAG:
+ return red;
+ case IMAGE_TAG:
+ return green;
+ case PATH_TAG:
+ return blue;
+ case UNTOUCHED_TAG:
+ return yellow;
+ default:
+ return black;
+ }
+}
+
+int
+main()
+{
+ printf("P6\n");
+ printf("612 792\n");
+ printf("255\n");
+ while (!feof(stdin)) {
+ int ch = getchar();
+ char *color = tag2color(ch);
+ putchar(color[0]); putchar(color[1]); putchar(color[2]);
+ getchar(); getchar(); getchar();
+ }
+ return 0;
+}
diff --git a/tools/bitfont.pcl b/tools/bitfont.pcl
new file mode 100644
index 000000000..c1545926b
--- /dev/null
+++ b/tools/bitfont.pcl
Binary files differ
diff --git a/tools/bitfonts.pxl b/tools/bitfonts.pxl
new file mode 100644
index 000000000..d8a217448
--- /dev/null
+++ b/tools/bitfonts.pxl
Binary files differ
diff --git a/tools/bug-list.txt b/tools/bug-list.txt
new file mode 100644
index 000000000..0aa27741d
--- /dev/null
+++ b/tools/bug-list.txt
@@ -0,0 +1,103 @@
+0001 AOK C420 p 9 PatternBrushError Update - (useciecolor = no).
+0016 AOK C703 p 1 ColorError - (useciecolor = no).
+0025 NF C705 p 36 see pxl/pxcet.txt
+0035 NF C206 p 2 Error Message Difference.
+0041 OPEN C316 HP doesn't print zero length dots in dashed lines
+0042 NF C318 p 33 see pxl/pxcet.txt.
+0043 NF C326 p 25 see pxl/pxcet.txt.
+0044 OPEN C327 p 5 banding rop problem.
+0045 OPEN C327 P 6 rop difference.
+0046 OPEN C328 p 22 rop difference.
+0052 OPEN 16-09 p 13 HMI font selection interaction.
+0053 FIXED verified in r2685, r2700
+0056 NF 19-10 p 10 font selection lineprinter instead of courier.
+This requires redesigning the alias facility in the shared language
+dictionary which will be a considerable amount of work.
+0060 FIXED 20-01 p 36 'V' from Park Avenue font is missing.
+0061 NF 20-02 p 2 Unstyled character substitution is not supported.
+0062 OPEN 20-07 p 9 symbol set selection.
+0063 NF 20-07 p 18 char color black instead of red.
+0064 OPEN 21-06 p 10 adaptive raster extra black missing.
+0065 NF 21-07 P 8 HP error as printed on the test page.
+0066 OPEN 21-09 p 22 Direct by plane missing black raster fill 0.
+0067 OPEN 21-10 P 10 raster height no width range testing.
+0068 OPEN 21-11 p 7 raster height no width range testing.
+0069 OPEN 21-12 p 5 raster height no width range testing.
+0070 OPEN 21-12 p 16 CMY raster missing data black vs. white zero fill same as 66
+0071 OPEN 22-05 p 13 HP not supporting 3bit per index ? double check.
+0072 NF 22-08 p 7 The 4600 moves the pattern anchor incorrectly when print direction is 180.
+0073 OPEN 22-09 p 15 overlay off page?
+0076 OPEN 22-18 p 5 palette selection error.
+0077 OPEN 22-22 p 5 raster scaling height leading to text reflow.
+0078 OPEN 23-02 p 11 transparency-rop error.
+0079 OPEN 23-08 p 6 pattern white zero instead of black zero.
+0082 OPEN 25-01 p 8 macro is offset by a tab width.
+0083 OPEN 25-04 p 18 macro fg text color wrong.
+0084 OPEN 25-05 p HP kicks page after exiting macro we don't
+0085 OPEN 25-05 p 11 underline of spaces vs not.
+0087 OPEN 25-06 p 37 cap difference on entry to macro.
+0088 OPEN 27-02 p 1 backspace beyond printable area should be blocked.
+0089 OPEN 27-03 p 1 HT too small
+0092 OPEN 28-03 p 2 arc scaling at the extreme scale factors.
+0093 OPEN 28-04 p 10 possible HP scaling error.
+0094 OPEN 28-04 p 17 polygon fills missing, winding.
+0095 OPEN 28-04 p 18 polygon arc join error
+0096 FIXED verified r2697 r2700
+0097 OPEN 28-06 p 6 pu subpolygon fill missing
+0098 OPEN 28-06 p 8 butt or triangle join rounding
+0099 FIXED 28-07 p 6 lost line
+0100 OPEN 28-08 p 8 character scaling.
+0102 OPEN 28-10 p 5 -- missing polyline segment.
+0103 OPEN 28-10 p 11 rectangle missing on 4600?
+0105 OPEN 29-03 p 10 graphics
+0106 OPEN 29-05 p 6 graphics
+0107 OPEN 29-07 p 14 cross hatch alignment
+0108 OPEN ? regression polygon close
+0109 OPEN 29-11 p 1 polygon fill extreme scaling
+0110 OPEN 29-11 p 2 polygon fill
+0111 OPEN 30-01 p 1 hpgl LB
+0114 OPEN 30-03 p 7 Symbol Set glyphs
+0117 OPEN 30-07 p 1 hpgl label bitmaps CP rotation.
+0122 OPEN 30-15 p 1 hpgl LB ScalableOrBitmapFontstErr
+0123 OPEN 30-16 p 23 hpgl LB LabelOrigintErr
+0124 OPEN 30-17 p 2 hpgl LB AbsoluteDirectionErr
+0125 OPEN 30-18 p 1 hpgl LB RelativeDirectionErr
+0128 OPEN 30-20 p 6 hpgl LB - scaling artifact test.
+0131 OPEN 30-22 p 2 hpgl LB Extra Space Err.
+0137 OPEN 30-25 p 2 hpgl LB DV
+0139 OPEN 30-27 p 20 HT tab size.
+0140 OPEN 31-02 p 2 LA line join attributes rounding.
+0141 OPEN 31-03 p 5 Fill wrong. dashed triangle not filled vs filled.
+0142 OPEN 31-06 p 5 HP no fills on stick/arc fonts.
+0143 OPEN 31-07 P 2 hatch fill arg rounding.?
+0144 OPEN 31-08 P 2 hp fill issues with RT defined patterns.
+0145 OPEN 31-09 p 5 same as 142.
+0146 OPEN 31-10_P 1 hatch pattern fill ? pen scaling.
+0147 OPEN 31-12 p 6 symbol mode
+0148 OPEN 32-02 p 2 IW scaling LB
+0150 OPEN 32-04 p 6 char scaling.
+0151 OPEN 32-05 p 1 hpgl LB
+0152 OPEN 32-06 p 2 LB symbol mode line missing.
+0153 OPEN 32-07 p 4 LB placement.
+0156 OPEN 34-03 p 1 OK? color transfer function perhaps.
+0157 OPEN 34-04 p 1 Fill differences
+0158 FIXED 35-01 p 1 PD circle PD
+0159 OPEN 35-02 p 6 scaling picture frame interaction.
+0160 FIXED 36-01 p 10 verified r2687 r2700
+0161 FIXED same as 0160 verified r2687 r2700
+0162 DeviceDependent Device must support number of pages, no raster devices do this.
+0163 FIXED 36-02 p 20 verified r2685 r2700
+0163 OPEN 36-02 p 22 macro returning -1 is leaking char size out of the macro
+0321 NF C705 p 19 passthrough missing wedges (see pxcet.txt).
+0322 FIXED r2680 C425 p 33 Set Char Bold
+0323 FIXED r2680 C426 p 42 Set Char Bold
+0431 OPEN C705 p 49 text white source transparency
+0433 NF C605 p 1-4 vivid treatment is device dependent
+0434 NF C705 p 3 merge control in passthrough context (see pxcet.txt).
+0438 OPEN 30-19 p 22 LB char size
+0439 OPEN 30-23 p 13 char size placement.
+0440 OPEN 33-01 p 9 polygon fill difference MC or winding.
+0451 OPEN 20-01 p 27 define symbol set char complement - char requirements test.
+0452 OPEN 30-19 p 9 LB negative character width, we apply, hp is positive
+0453 OPEN 25-05 p 37 MC 17 our black text vs HP's green
+0454 OPEN 25-04 p 23 black white HP vs gray output
diff --git a/tools/cat_url.py b/tools/cat_url.py
new file mode 100755
index 000000000..b9dbdcce4
--- /dev/null
+++ b/tools/cat_url.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+
+# print a url's to stdout
+
+from urllib import *
+from urlparse import *
+
+debug = 0
+
+def error(msg):
+ print sys.argv[0], "error: ", msg
+ print "\t", sys.argv[0], "http://host[:port]/path"
+ print "\t", sys.argv[0], "ftp://username:password@host/dir/file"
+ print "\t", sys.argv[0], "file:/usr/dict/words"
+ sys.exit(1)
+
+try:
+ for url in sys.argv[1:]:
+
+ scheme, netloc, url, params, query, fragment = urlparse(url)
+ if debug:
+ print "scheme", "=", scheme
+ print "netloc", "=", netloc
+ print "url", "=", url
+ print "params", "=", params
+ print "query", "=", query
+ print "fragment", "=", fragment
+
+except:
+ error("all arguments must be urls")
+
+
+for url in sys.argv[1:]:
+ try:
+ fn, h = urlretrieve(url)
+ except:
+ error("Couldn't retrive url")
+
+ fp = open(fn, 'rb')
+ sys.stdout.write(fp.read())
+ fp.close()
diff --git a/tools/check_deps.py b/tools/check_deps.py
new file mode 100755
index 000000000..1d425f0b5
--- /dev/null
+++ b/tools/check_deps.py
@@ -0,0 +1,134 @@
+#!/usr/bin/python
+
+import os, string
+
+# not used may use later
+def get_line_directives_table(file):
+ # not intended to be portable or useful outside of gs universe.
+ CPP_FLAGS="-I../gs/src/ -I../pl/ -I../pcl -I../pxl -I../main/obj -DDEBUG"
+ CPP="gcc -E"
+ CPP_COMMAND=CPP + " " + CPP_FLAGS + " " + file
+ CPP_IN=os.popen(CPP_COMMAND, 'r')
+ lines = []
+ while (1):
+ line = CPP_IN.readline()
+ if not line:
+ break;
+ # chop newline
+ line = line[:-1]
+
+ # check again for line since we might have chopped the only
+ # character. check for lines starting with # and ending with
+ # 1 (see cpp docs).
+
+ if line and line[0] == "#" and line[-1] == "1":
+ # second field 1:-1 leaves out enclosing quotes.
+ lines.append(os.path.basename(string.splitfields(line)[2][1:-1]))
+ for line in lines:
+ print line
+
+def get_includes(file, skip_system_files=1):
+ includes = []
+ for line in fileinput.input(file):
+ if line[0:len("#include")] == "#include":
+ myin = string.splitfields(line)[1]
+ if skip_system_files and myin[0] == '<' and myin[-1] == '>':
+ print "skipping system header " + myin
+ continue
+ else:
+ includes.append(myin[1:-1])
+ return includes
+
+def find_all_files(dir, pattern):
+ lines=[]
+ FIND_COMMAND = "find " + dir + " -name " + pattern
+ for line in os.popen(FIND_COMMAND).readlines():
+ lines.append(line[:-1])
+ return lines
+
+
+import fileinput
+
+
+def find_target(makefile, target):
+ parsed_target = []
+ parsing_target = 0
+ fp = open(makefile)
+ for line in fp.readlines():
+ if line.find(target) >= 0 and not parsing_target:
+ parsing_target = 1
+ parsed_target.append(line)
+ continue
+ if parsing_target:
+ if line[0] not in string.whitespace:
+ break
+ parsed_target.append(line)
+ fp.close()
+ return makefile, parsed_target
+
+# return the filename and the targets from all the makefiles that
+# contain the target.
+def find_targets(target, makefiles):
+ # target is a c file - want .$(OBJ) file
+ target = target[:-1] + "$(OBJ):"
+ target = os.path.basename(target)
+ filename = None
+ parsed_targets = []
+ # list of lines
+ for line in fileinput.input(makefiles):
+ if line.find(')' + target) >= 0:
+ parsed_targets.append(find_target(fileinput.filename(), target))
+ fileinput.close()
+ return parsed_targets
+
+import re
+
+def get_deps_from_target(target):
+ # find .h files sans definition.
+ reg=re.compile('\.h')
+ for line in target:
+ for h in reg.findall(line):
+ print "naked .h found in " + target[0][0:target[0].index(":")]
+ # not quite right.
+ reg=re.compile('[A-Za-z0-9]+_+h')
+ deps=[]
+ for line in target:
+ targ_list=reg.findall(line)
+ for targ in targ_list:
+ deps.append(targ)
+ return deps
+
+def compare_lists(c_file, makefile, from_makefile, from_source):
+ canon_from_source = []
+ for x in from_source:
+ canon_from_source.append(x.replace('.', '_'))
+
+# print canon_from_source
+# print from_makefile
+
+ for mline in from_makefile:
+ if mline not in canon_from_source:
+ print mline + " from " + makefile + " not in " + c_file
+ for sline in canon_from_source:
+ if sline not in from_makefile:
+ print sline + " from " + c_file + " not in " + makefile
+
+if __name__ == '__main__':
+# headers=get_line_directives_table("../pcl/pcjob.c")
+# print headers
+ C_FILES=find_all_files("../", "\\*.c")
+ MAKEFILES=find_all_files("../", "\\*.mak")
+ for c_file in C_FILES:
+ target_list = find_targets(c_file, MAKEFILES)
+ for (f, t) in target_list:
+# print "found target for " + c_file + " in " + f
+# print "target is "
+# print t
+ compare_lists(c_file, f, get_deps_from_target(t), get_includes(c_file))
+ else:
+ "no target for " + c_file
+# C_FILES=find_all_files("../", "*.c")
+# MAKE_FILES=find_all_files("../", "*.mak")
+# H_FILES=find_all_files("../", "*.h")
+
+
diff --git a/tools/clusterpush.sh b/tools/clusterpush.sh
new file mode 100755
index 000000000..7843f60e2
--- /dev/null
+++ b/tools/clusterpush.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+# helper script to syncronize a working tree with the regression cluster
+
+HOST=atfxsw01@tticluster.com
+DEST=$USER
+
+# try to use the same directory name on the cluster
+TARGET=`basename $PWD`
+if test -z "$TARGET"; then
+ if test -d gs; then
+ TARGET='ghostpcl'
+ else
+ TARGET='gs'
+ fi
+fi
+
+# try get the current revision
+REV=`svn info | grep Revision | cut -d ' ' -f 2`
+if test -z "$REV"; then
+ REV='unknown'
+fi
+
+echo "Pushing to $DEST/$TARGET on the cluster..."
+rsync -avz \
+ --exclude .svn --exclude .git \
+ --exclude bin --exclude obj --exclude debugobj \
+ --exclude sobin --exclude soobj \
+ --exclude main/obj --exclude main/debugobj \
+ --exclude language_switch/obj --exclude language_switch/obj \
+ --exclude xps/obj --exclude xps/debugobj \
+ --exclude svg/obj --exclude xps/debugobj \
+ --exclude ufst --exclude ufst-obj \
+ ./* $HOST:$DEST/$TARGET
+if test $? != 0; then
+ echo "$0 aborted."
+ exit 1
+fi
+
+echo -n "Copying regression baseline..."
+if test -d src; then
+ LATEST='gs'
+else
+ LATEST=`ssh $HOST 'for file in \`ls regression |\
+ egrep ghostpcl-r[0-9]+\+[0-9]+ | sort -r | head\`; do\
+ if test -r regression/$file/reg_baseline.txt; then\
+ echo $file; break;\
+ fi;\
+ done'`
+fi
+if test -z "$LATEST"; then echo "$0 aborted."; exit 1; fi
+echo " from $LATEST..."
+ssh $HOST "cp regression/$LATEST/reg_baseline.txt $DEST/$TARGET/"
+if test $? != 0; then
+ echo "$0 aborted."
+ exit 1
+fi
+
+echo "Queuing regression test..."
+echo "cd $DEST/$TARGET && run_regression" | ssh $HOST
+if test $? != 0; then
+ echo "$0 aborted."
+ exit 1
+fi
+
+REPORT=`ssh $HOST ls $DEST/$TARGET \| egrep '^regression-[0-9]+.log$' \| sort -r \| head -1`
+echo "Pulling $REPORT..."
+scp -q $HOST:$DEST/$TARGET/$REPORT .
+if test $? != 0; then
+ echo "$0 aborted."
+ exit 1
+fi
+cat $REPORT
+if test $? != 0; then
+ echo "$0 aborted."
+ exit 1
+fi
diff --git a/tools/cmpi/Makefile b/tools/cmpi/Makefile
new file mode 100644
index 000000000..4f7ee26dd
--- /dev/null
+++ b/tools/cmpi/Makefile
@@ -0,0 +1,187 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+
+
+
+prefix = /usr/local
+exec_prefix = ${prefix}
+INSTALL = /usr/bin/install -c
+EXEEXT =
+WINDRES =
+REZ =
+SETFILE =
+NM = nm
+srcdir = .
+top_srcdir = ../..
+top_builddir = ../../
+LDFLAGS_GUI =
+CXX = g++
+CXXFLAGS = -pthread -Wall -Wundef -Wno-ctor-dtor-privacy -O2 -fno-strict-aliasing
+CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -I${top_builddir}lib/wx/include/gtk2-ansi-release-static-2.7 -I${top_srcdir}/include -DXTHREADS -pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/X11R6/include -I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
+LDFLAGS = -pthread -L/usr/X11R6/lib
+WX_LIB_FLAVOUR =
+TOOLKIT = GTK
+TOOLKIT_LOWERCASE = gtk
+TOOLKIT_VERSION = 2
+TOOLCHAIN_FULLNAME = gtk2-ansi-release-static-2.7
+EXTRALIBS = -pthread -L/usr/X11R6/lib -lz -ldl
+EXTRALIBS_GUI = -Wl,--export-dynamic -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lgthread-2.0 -lglib-2.0 -lXinerama -lXxf86vm -lpng -lz -ljpeg
+HOST_SUFFIX =
+SAMPLES_RPATH_FLAG =
+SAMPLES_RPATH_POSTLINK =
+
+### Variables: ###
+
+DESTDIR =
+WX_RELEASE = 2.7
+WX_VERSION = $(WX_RELEASE).0
+LIBDIRNAME = $(top_builddir)lib
+IMAGE_CXXFLAGS = -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
+ $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) \
+ -I$(srcdir) $(__DLLFLAG_p) -I$(srcdir)/../../samples $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = \
+ $(__cmpi_os2_lib_res) \
+ cmpi_cmpi.o \
+ $(__cmpi___win32rc)
+
+### Conditionally set variables: ###
+
+#CXXC = $(CXX)
+CXXC = $(top_builddir)./bk-deps $(CXX)
+#PORTNAME = base
+PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION)
+#WXBASEPORT = _carbon
+#WXDEBUGFLAG = d
+#WXDEBUGFLAG = d
+#WXUNICODEFLAG = u
+#WXUNIVNAME = univ
+EXTRALIBS_FOR_BASE = $(EXTRALIBS)
+#EXTRALIBS_FOR_BASE = $(EXTRALIBS) $(EXTRALIBS_GUI)
+EXTRALIBS_FOR_GUI = $(EXTRALIBS_GUI)
+#EXTRALIBS_FOR_GUI =
+#__cmpi___mac_setfilecmd = \
+# $(SETFILE) -a C cmpi$(EXEEXT)
+#__cmpi___mac_rezcmd = $(__MACOSX_RESOURCES_p_1)
+#__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
+#__WXUNIV_DEFINE_p_1 = -d __WXUNIVERSAL__
+#__WXUNIV_DEFINE_p_2 = --define __WXUNIVERSAL__
+#__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
+#__EXCEPTIONS_DEFINE_p_1 = -d wxNO_EXCEPTIONS
+#__EXCEPTIONS_DEFINE_p_2 = --define wxNO_EXCEPTIONS
+#__RTTI_DEFINE_p = -DwxNO_RTTI
+#__RTTI_DEFINE_p_1 = -d wxNO_RTTI
+#__RTTI_DEFINE_p_2 = --define wxNO_RTTI
+#__THREAD_DEFINE_p = -DwxNO_THREADS
+#__THREAD_DEFINE_p_1 = -d wxNO_THREADS
+#__THREAD_DEFINE_p_2 = --define wxNO_THREADS
+#__DLLFLAG_p = -DWXUSINGDLL
+#__DLLFLAG_p_1 = -d WXUSINGDLL
+#__DLLFLAG_p_2 = --define WXUSINGDLL
+COND_PLATFORM_OS2_1___cmpi___os2_emxbindcmd = $(NM) cmpi$(EXEEXT) | if grep -q \
+ pmwin.763 ; then emxbind -ep cmpi$(EXEEXT) ; fi
+#__cmpi___os2_emxbindcmd = $(COND_PLATFORM_OS2_1___cmpi___os2_emxbindcmd)
+#__RCDEFDIR_p = -i \
+# $(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
+#__RCDEFDIR_p_1 = --include-dir \
+# $(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
+#__cmpi_os2_lib_res = \
+# $(top_srcdir)/include/wx/os2/wx.res
+#__cmpi_bundle___depname = cmpi_bundle
+#____cmpi_BUNDLE_TGT_REF_DEP = \
+# cmpi.app/Contents/PkgInfo
+#____cmpi_BUNDLE_TGT_REF_DEP = cmpi.app/Contents/PkgInfo
+COND_MONOLITHIC_0___WXLIB_CORE_p = \
+ -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX)
+__WXLIB_CORE_p = $(COND_MONOLITHIC_0___WXLIB_CORE_p)
+COND_MONOLITHIC_0___WXLIB_BASE_p = \
+ -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+__WXLIB_BASE_p = $(COND_MONOLITHIC_0___WXLIB_BASE_p)
+#__cmpi___win32rc = cmpi_cmpi_rc.o
+COND_MONOLITHIC_1___WXLIB_MONO_p = \
+ -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+#__WXLIB_MONO_p = $(COND_MONOLITHIC_1___WXLIB_MONO_p)
+#__LIB_JPEG_p \
+# = \
+# -lwxjpeg$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+#__LIB_PNG_p \
+# = \
+# -lwxpng$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+#__LIB_ZLIB_p = \
+# -lwxzlib$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+#__LIB_ODBC_p = \
+# -lwxodbc$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p = \
+ -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+#__LIB_REGEX_p = $(COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p)
+#__LIB_EXPAT_p = \
+# -lwxexpat$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1 = $(REZ) -d __DARWIN__ -t APPL -d \
+ __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) \
+ $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) -i $(srcdir) $(__DLLFLAG_p_1) -i \
+ $(srcdir)/../../samples $(__RCDEFDIR_p) -i $(top_srcdir)/include -o \
+ cmpi$(EXEEXT) Carbon.r sample.r
+#__MACOSX_RESOURCES_p_1 = $(COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1)
+
+### Targets: ###
+
+all: cmpi$(EXEEXT) $(__cmpi_bundle___depname)
+
+install: all
+
+uninstall:
+
+install-strip: install
+
+clean:
+ rm -rf ./.deps ./.pch
+ rm -f ./*.o
+ rm -f cmpi$(EXEEXT)
+ rm -rf cmpi.app
+
+distclean: clean
+ rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
+
+cmpi$(EXEEXT): $(IMAGE_OBJECTS) $(__cmpi___win32rc)
+ $(CXX) -o $@ $(IMAGE_OBJECTS) $(LDFLAGS) -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_ODBC_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE)
+ $(__cmpi___mac_rezcmd)
+ $(__cmpi___mac_setfilecmd)
+ $(__cmpi___os2_emxbindcmd)
+ $(SAMPLES_RPATH_POSTLINK)
+
+cmpi.app/Contents/PkgInfo: cmpi$(EXEEXT) $(top_srcdir)/src/mac/carbon/Info.plist.in $(top_srcdir)/src/mac/carbon/wxmac.icns
+ mkdir -p cmpi.app/Contents
+ mkdir -p cmpi.app/Contents/MacOS
+ mkdir -p cmpi.app/Contents/Resources
+
+
+ sed -e "s/IDENTIFIER/`echo $(srcdir) | sed -e 's,\.\./,,g' | sed -e 's,/,.,g'`/" \
+ -e "s/EXECUTABLE/cmpi/" \
+ -e "s/VERSION/$(WX_VERSION)/" \
+ $(top_srcdir)/src/mac/carbon/Info.plist.in >cmpi.app/Contents/Info.plist
+
+
+ echo -n "APPL????" >cmpi.app/Contents/PkgInfo
+
+
+ ln -f cmpi$(EXEEXT) cmpi.app/Contents/MacOS/cmpi
+
+
+ cp -f $(top_srcdir)/src/mac/carbon/wxmac.icns cmpi.app/Contents/Resources/wxmac.icns
+
+#cmpi_bundle: $(____cmpi_BUNDLE_TGT_REF_DEP)
+
+cmpi_cmpi.o: $(srcdir)/cmpi.cpp
+ $(CXXC) -c -o $@ $(IMAGE_CXXFLAGS) $(srcdir)/cmpi.cpp
+
+cmpi_cmpi_rc.o: $(srcdir)/cmpi.rc
+ $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_2) $(__EXCEPTIONS_DEFINE_p_2) $(__RTTI_DEFINE_p_2) $(__THREAD_DEFINE_p_2) --include-dir $(srcdir) $(__DLLFLAG_p_2) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include
+
+
+# Include dependency info, if present:
+-include .deps/*.d
+
+.PHONY: all install uninstall clean distclean cmpi_bundle
diff --git a/tools/cmpi/Makefile.in b/tools/cmpi/Makefile.in
new file mode 100644
index 000000000..123cd2e52
--- /dev/null
+++ b/tools/cmpi/Makefile.in
@@ -0,0 +1,187 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+
+@MAKE_SET@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+INSTALL = @INSTALL@
+EXEEXT = @EXEEXT@
+WINDRES = @WINDRES@
+REZ = @REZ@
+SETFILE = @SETFILE@
+NM = @NM@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @top_builddir@
+LDFLAGS_GUI = @LDFLAGS_GUI@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+WX_LIB_FLAVOUR = @WX_LIB_FLAVOUR@
+TOOLKIT = @TOOLKIT@
+TOOLKIT_LOWERCASE = @TOOLKIT_LOWERCASE@
+TOOLKIT_VERSION = @TOOLKIT_VERSION@
+TOOLCHAIN_FULLNAME = @TOOLCHAIN_FULLNAME@
+EXTRALIBS = @EXTRALIBS@
+EXTRALIBS_GUI = @EXTRALIBS_GUI@
+HOST_SUFFIX = @HOST_SUFFIX@
+SAMPLES_RPATH_FLAG = @SAMPLES_RPATH_FLAG@
+SAMPLES_RPATH_POSTLINK = @SAMPLES_RPATH_POSTLINK@
+
+### Variables: ###
+
+DESTDIR =
+WX_RELEASE = 2.7
+WX_VERSION = $(WX_RELEASE).0
+LIBDIRNAME = $(top_builddir)lib
+IMAGE_CXXFLAGS = -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
+ $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) \
+ -I$(srcdir) $(__DLLFLAG_p) -I$(srcdir)/../../samples $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = \
+ $(__cmpi_os2_lib_res) \
+ cmpi_cmpi.o \
+ $(__cmpi___win32rc)
+
+### Conditionally set variables: ###
+
+@COND_DEPS_TRACKING_0@CXXC = $(CXX)
+@COND_DEPS_TRACKING_1@CXXC = $(top_builddir)./bk-deps $(CXX)
+@COND_USE_GUI_0@PORTNAME = base
+@COND_USE_GUI_1@PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION)
+@COND_TOOLKIT_MAC@WXBASEPORT = _carbon
+@COND_BUILD_DEBUG_DEBUG_FLAG_DEFAULT@WXDEBUGFLAG = d
+@COND_DEBUG_FLAG_1@WXDEBUGFLAG = d
+@COND_UNICODE_1@WXUNICODEFLAG = u
+@COND_WXUNIV_1@WXUNIVNAME = univ
+@COND_MONOLITHIC_0@EXTRALIBS_FOR_BASE = $(EXTRALIBS)
+@COND_MONOLITHIC_1@EXTRALIBS_FOR_BASE = $(EXTRALIBS) $(EXTRALIBS_GUI)
+@COND_MONOLITHIC_0@EXTRALIBS_FOR_GUI = $(EXTRALIBS_GUI)
+@COND_MONOLITHIC_1@EXTRALIBS_FOR_GUI =
+@COND_PLATFORM_MAC_1@__cmpi___mac_setfilecmd = \
+@COND_PLATFORM_MAC_1@ $(SETFILE) -a C cmpi$(EXEEXT)
+@COND_PLATFORM_MAC_1@__cmpi___mac_rezcmd = $(__MACOSX_RESOURCES_p_1)
+@COND_WXUNIV_1@__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
+@COND_WXUNIV_1@__WXUNIV_DEFINE_p_1 = -d __WXUNIVERSAL__
+@COND_WXUNIV_1@__WXUNIV_DEFINE_p_2 = --define __WXUNIVERSAL__
+@COND_USE_EXCEPTIONS_0@__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
+@COND_USE_EXCEPTIONS_0@__EXCEPTIONS_DEFINE_p_1 = -d wxNO_EXCEPTIONS
+@COND_USE_EXCEPTIONS_0@__EXCEPTIONS_DEFINE_p_2 = --define wxNO_EXCEPTIONS
+@COND_USE_RTTI_0@__RTTI_DEFINE_p = -DwxNO_RTTI
+@COND_USE_RTTI_0@__RTTI_DEFINE_p_1 = -d wxNO_RTTI
+@COND_USE_RTTI_0@__RTTI_DEFINE_p_2 = --define wxNO_RTTI
+@COND_USE_THREADS_0@__THREAD_DEFINE_p = -DwxNO_THREADS
+@COND_USE_THREADS_0@__THREAD_DEFINE_p_1 = -d wxNO_THREADS
+@COND_USE_THREADS_0@__THREAD_DEFINE_p_2 = --define wxNO_THREADS
+@COND_SHARED_1@__DLLFLAG_p = -DWXUSINGDLL
+@COND_SHARED_1@__DLLFLAG_p_1 = -d WXUSINGDLL
+@COND_SHARED_1@__DLLFLAG_p_2 = --define WXUSINGDLL
+COND_PLATFORM_OS2_1___cmpi___os2_emxbindcmd = $(NM) cmpi$(EXEEXT) | if grep -q \
+ pmwin.763 ; then emxbind -ep cmpi$(EXEEXT) ; fi
+@COND_PLATFORM_OS2_1@__cmpi___os2_emxbindcmd = $(COND_PLATFORM_OS2_1___cmpi___os2_emxbindcmd)
+@COND_TOOLKIT_MSW@__RCDEFDIR_p = -i \
+@COND_TOOLKIT_MSW@ $(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
+@COND_TOOLKIT_MSW@__RCDEFDIR_p_1 = --include-dir \
+@COND_TOOLKIT_MSW@ $(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
+@COND_PLATFORM_OS2_1@__cmpi_os2_lib_res = \
+@COND_PLATFORM_OS2_1@ $(top_srcdir)/include/wx/os2/wx.res
+@COND_PLATFORM_MACOSX_1@__cmpi_bundle___depname = cmpi_bundle
+@COND_TOOLKIT_COCOA@____cmpi_BUNDLE_TGT_REF_DEP = \
+@COND_TOOLKIT_COCOA@ cmpi.app/Contents/PkgInfo
+@COND_TOOLKIT_MAC@____cmpi_BUNDLE_TGT_REF_DEP = cmpi.app/Contents/PkgInfo
+COND_MONOLITHIC_0___WXLIB_CORE_p = \
+ -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_0@__WXLIB_CORE_p = $(COND_MONOLITHIC_0___WXLIB_CORE_p)
+COND_MONOLITHIC_0___WXLIB_BASE_p = \
+ -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_0@__WXLIB_BASE_p = $(COND_MONOLITHIC_0___WXLIB_BASE_p)
+@COND_PLATFORM_WIN32_1@__cmpi___win32rc = cmpi_cmpi_rc.o
+COND_MONOLITHIC_1___WXLIB_MONO_p = \
+ -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_MONOLITHIC_1@__WXLIB_MONO_p = $(COND_MONOLITHIC_1___WXLIB_MONO_p)
+@COND_USE_GUI_1_WXUSE_LIBJPEG_BUILTIN@__LIB_JPEG_p \
+@COND_USE_GUI_1_WXUSE_LIBJPEG_BUILTIN@ = \
+@COND_USE_GUI_1_WXUSE_LIBJPEG_BUILTIN@ -lwxjpeg$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_USE_GUI_1_WXUSE_LIBPNG_BUILTIN@__LIB_PNG_p \
+@COND_USE_GUI_1_WXUSE_LIBPNG_BUILTIN@ = \
+@COND_USE_GUI_1_WXUSE_LIBPNG_BUILTIN@ -lwxpng$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_WXUSE_ZLIB_BUILTIN@__LIB_ZLIB_p = \
+@COND_WXUSE_ZLIB_BUILTIN@ -lwxzlib$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_WXUSE_ODBC_BUILTIN@__LIB_ODBC_p = \
+@COND_WXUSE_ODBC_BUILTIN@ -lwxodbc$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p = \
+ -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+@COND_WXUSE_REGEX_BUILTIN@__LIB_REGEX_p = $(COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p)
+@COND_WXUSE_EXPAT_BUILTIN@__LIB_EXPAT_p = \
+@COND_WXUSE_EXPAT_BUILTIN@ -lwxexpat$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
+COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1 = $(REZ) -d __DARWIN__ -t APPL -d \
+ __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) \
+ $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) -i $(srcdir) $(__DLLFLAG_p_1) -i \
+ $(srcdir)/../../samples $(__RCDEFDIR_p) -i $(top_srcdir)/include -o \
+ cmpi$(EXEEXT) Carbon.r sample.r
+@COND_TOOLKIT_MAC@__MACOSX_RESOURCES_p_1 = $(COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1)
+
+### Targets: ###
+
+all: cmpi$(EXEEXT) $(__cmpi_bundle___depname)
+
+install: all
+
+uninstall:
+
+install-strip: install
+
+clean:
+ rm -rf ./.deps ./.pch
+ rm -f ./*.o
+ rm -f cmpi$(EXEEXT)
+ rm -rf cmpi.app
+
+distclean: clean
+ rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
+
+cmpi$(EXEEXT): $(IMAGE_OBJECTS) $(__cmpi___win32rc)
+ $(CXX) -o $@ $(IMAGE_OBJECTS) $(LDFLAGS) -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_ODBC_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE)
+ $(__cmpi___mac_rezcmd)
+ $(__cmpi___mac_setfilecmd)
+ $(__cmpi___os2_emxbindcmd)
+ $(SAMPLES_RPATH_POSTLINK)
+
+cmpi.app/Contents/PkgInfo: cmpi$(EXEEXT) $(top_srcdir)/src/mac/carbon/Info.plist.in $(top_srcdir)/src/mac/carbon/wxmac.icns
+ mkdir -p cmpi.app/Contents
+ mkdir -p cmpi.app/Contents/MacOS
+ mkdir -p cmpi.app/Contents/Resources
+
+
+ sed -e "s/IDENTIFIER/`echo $(srcdir) | sed -e 's,\.\./,,g' | sed -e 's,/,.,g'`/" \
+ -e "s/EXECUTABLE/cmpi/" \
+ -e "s/VERSION/$(WX_VERSION)/" \
+ $(top_srcdir)/src/mac/carbon/Info.plist.in >cmpi.app/Contents/Info.plist
+
+
+ echo -n "APPL????" >cmpi.app/Contents/PkgInfo
+
+
+ ln -f cmpi$(EXEEXT) cmpi.app/Contents/MacOS/cmpi
+
+
+ cp -f $(top_srcdir)/src/mac/carbon/wxmac.icns cmpi.app/Contents/Resources/wxmac.icns
+
+@COND_PLATFORM_MACOSX_1@cmpi_bundle: $(____cmpi_BUNDLE_TGT_REF_DEP)
+
+cmpi_cmpi.o: $(srcdir)/cmpi.cpp
+ $(CXXC) -c -o $@ $(IMAGE_CXXFLAGS) $(srcdir)/cmpi.cpp
+
+cmpi_cmpi_rc.o: $(srcdir)/cmpi.rc
+ $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_2) $(__EXCEPTIONS_DEFINE_p_2) $(__RTTI_DEFINE_p_2) $(__THREAD_DEFINE_p_2) --include-dir $(srcdir) $(__DLLFLAG_p_2) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include
+
+
+# Include dependency info, if present:
+@IF_GNU_MAKE@-include .deps/*.d
+
+.PHONY: all install uninstall clean distclean cmpi_bundle
diff --git a/tools/cmpi/README b/tools/cmpi/README
new file mode 100644
index 000000000..d4723cecd
--- /dev/null
+++ b/tools/cmpi/README
@@ -0,0 +1,41 @@
+This collection is a 0.9 version of a fuzzy image comparison GUI
+and command line (batch) tool.
+
+It has only been tested with PPM files, and still has some 'warts'
+and some TBI features, but is stable enough (I hope) to be useful.
+
+I've built this on Windows with VS 2005 -- it probably will build
+on other versions, but I haven't tried it.
+
+This directory is made to be put into the "samples" directory of
+wxWidgets, so FIRST you have to get wxWidgets 2.7.0 or 2.6.3 and
+build the 'base' and 'core' modules.
+
+On Windows, the base and core modules are built by the 'project'.
+
+On linux, I recommend getting the wxWidgets source and doing:
+ ./autoconf
+ ./configure --disable-shared
+ make
+
+This will build the .a libraries. Then cd to samples/cmpi
+and try 'make'. If you didn't get 2.7.0 then it will probably
+fail -- you need to add 'cmpi' to the list of SAMPLE_SUBDIRS in
+configure.in and re-run autoconf, then configure to get the
+right Makefile in cmpi derived from Makefile.in.
+
+If the build doesn't work, then dig into it. Ralph and I are
+busy on other stuff, but if you beg for help, you might get
+lucky (Ralph for linux or Mac, me for Windows). ;-)
+
+The usage is similar to gs/toolbin/cmpi.py except the command
+line interface has -w# and -c# fuzzy switches (and it aborts if
+you don't give it the two .ppm files as input).
+
+Note that there is also a -b switch to run it in 'batch' mode
+so that the difference count gets appended to a log file
+(cmpi.log by default) which is handy for gathering stats or
+doing regressions.
+
+For the PS CET, I found -w3 -c20 to be reasonable settings.
+
diff --git a/tools/cmpi/cmpi.bkl b/tools/cmpi/cmpi.bkl
new file mode 100755
index 000000000..d34acf4ef
--- /dev/null
+++ b/tools/cmpi/cmpi.bkl
@@ -0,0 +1,21 @@
+<?xml version="1.0" ?>
+<!-- $Id: cmpi.bkl,v 1.4 2005/05/22 15:37:40 JS Exp $ -->
+
+<makefile>
+
+ <include file="../../build/bakefiles/common_samples.bkl"/>
+
+ <exe id="cmpi" template="wx_sample" template_append="wx_append">
+ <sources>cmpi.cpp</sources>
+ <wx-lib>core</wx-lib>
+ <wx-lib>base</wx-lib>
+ <win32-res>cmpi.rc</win32-res>
+ </exe>
+
+ <wx-data id="data">
+ <files>
+ horse.pnm
+ </files>
+ </wx-data>
+
+</makefile>
diff --git a/tools/cmpi/cmpi.cpp b/tools/cmpi/cmpi.cpp
new file mode 100755
index 000000000..09a20c4cf
--- /dev/null
+++ b/tools/cmpi/cmpi.cpp
@@ -0,0 +1,1034 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name: samples/cmpi/cmpi.cpp
+// Purpose: Compare images with 'fuzzy' options
+// Author: Ray Johnston
+// Modified by:
+// Created: 2006
+// RCS-ID: $Id:$
+// Copyright: (c) 2006 Artifex Software Inc.
+// License: AFPL
+///////////////////////////////////////////////////////////////////////////////
+
+#include <math.h>
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/image.h"
+#include "wx/file.h"
+#include "wx/filename.h"
+#include "wx/filefn.h"
+#include "wx/mstream.h"
+#include "wx/wfstream.h"
+#include "wx/pen.h"
+#include "wx/progdlg.h"
+#include "wx/msgdlg.h"
+
+// derived classes
+
+class MyFrame;
+class MyApp;
+
+// MyCanvas
+
+class MyCanvas: public wxScrolledWindow
+{
+public:
+ MyCanvas() {}
+ MyCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size );
+ ~MyCanvas();
+ void OnPaint( wxPaintEvent &event );
+ bool ProcessArgs(int argc, wxChar **argv, wxStatusBar *S);
+ void update_bitmap();
+ void goto_diff_rect_focus();
+ bool pixel_differs( unsigned char **base_rows, unsigned char **compare_rows, int pixel,
+ int i_pix_window, int color_tolerance);
+ void prune_pending_list( int row );
+ bool load_image_files( wxChar *basefilename, wxChar *comparefilename );
+
+ wxImage base_image, compare_image, diff_image, *current_image, *prev_image;
+ wxStatusBar *frame_status_bar;
+ wxChar *basefn, *comparefn;
+ wxBitmap *current_bitmap;
+ float current_zoom, prev_zoom;
+ int i_pix_window;
+ int i_rect_separation;
+ int *neighbor_pix, *neighbor_row, neighbor_count;
+ int color_tolerance;
+ int diff_count;
+ bool batch_mode;
+ unsigned char *alpha;
+ bool mask_on, prev_mask;
+ bool highlight_on;
+
+ typedef struct diff_rect_s {
+ int left, top, right, bottom;
+ struct diff_rect_s *next, *prev;
+ } diff_rect;
+
+ diff_rect *diff_list_head, *diff_list_tail, *diff_list_pending;
+ diff_rect *diff_rect_focus;
+ int diff_list_count, i_diff_rect_focus;
+
+protected:
+
+private:
+ DECLARE_DYNAMIC_CLASS(MyCanvas)
+ DECLARE_EVENT_TABLE()
+};
+
+
+// MyFrame
+
+
+class MyFrame: public wxFrame
+{
+public:
+ MyFrame();
+
+ bool ProcessArgs(int argc, wxChar **argv);
+ void OnAbout( wxCommandEvent &event );
+ void OnHelp( wxCommandEvent &event );
+ void OnNewImages( wxCommandEvent &event );
+ void OnQuit( wxCommandEvent &event );
+ void OnHiLiteToggle( wxCommandEvent &event );
+ void OnMaskToggle( wxCommandEvent &event );
+ void OnView_Image( wxCommandEvent &event );
+ void OnGoTo( wxCommandEvent &event );
+ void OnZoom( wxCommandEvent &event );
+ void OnSettings( wxCommandEvent &event );
+
+ MyCanvas *m_canvas;
+ wxStatusBar *status_bar;
+
+private:
+ DECLARE_DYNAMIC_CLASS(MyFrame)
+ DECLARE_EVENT_TABLE()
+};
+
+
+// MyApp
+
+class MyApp: public wxApp
+{
+public:
+ virtual bool OnInit();
+};
+
+// main program
+
+IMPLEMENT_APP(MyApp)
+
+// MyCanvas
+
+IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxScrolledWindow)
+
+BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
+ EVT_PAINT(MyCanvas::OnPaint)
+END_EVENT_TABLE()
+
+MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id,
+ const wxPoint &pos, const wxSize &size )
+ : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER )
+{
+ SetBackgroundColour(* wxWHITE);
+ current_bitmap = (wxBitmap *)NULL;
+ current_image = (wxImage *)NULL;
+ prev_image = current_image;
+ frame_status_bar = (wxStatusBar *)NULL;
+ neighbor_count = 0;
+ neighbor_pix = neighbor_row = NULL;
+}
+
+// Called when zoom factor changes to create bitmap of correct size
+void
+MyCanvas::update_bitmap()
+{
+ int current_scroll_x, current_scroll_y, sx, sy, client_width_pixels, client_height_rows;
+
+ if ((current_image == prev_image) && (current_zoom == prev_zoom) && (mask_on == prev_mask))
+ return;
+
+ if (current_bitmap) {
+ delete current_bitmap;
+ }
+ GetClientSize( &client_width_pixels, &client_height_rows );
+ GetViewStart( &current_scroll_x, &current_scroll_y );
+ /* Keep center of focus constant as we zoom in and out */
+ /* These calculations could be chained, but this is easier for debugging */
+ sx = current_scroll_x + ( client_width_pixels / 2 );
+ sy = current_scroll_y + ( client_height_rows / 2 );
+ sx = sx * ( current_zoom / prev_zoom );
+ sy = sy * ( current_zoom / prev_zoom );
+ sx = sx - ( client_width_pixels / 2 );
+ sy = sy - ( client_height_rows / 2 );
+ sx = ( sx < 0 ) ? 0 : sx;
+ sy = ( sy < 0 ) ? 0 : sy;
+ prev_image = current_image;
+ prev_zoom = current_zoom;
+ prev_mask = mask_on;
+ current_bitmap = new wxBitmap(
+ current_image->Scale( current_image->GetWidth() * current_zoom,
+ current_image->GetHeight() * current_zoom)
+ );
+ SetScrollbars( 1, 1, current_bitmap->GetWidth(), current_bitmap->GetHeight(), sx, sy );
+
+ wxChar *fn;
+ char *hdr;
+ if (current_image == &base_image) {
+ hdr = "Base Image: ";
+ fn = basefn;
+ } else if (current_image == &compare_image) {
+ hdr = "Compare Image: ";
+ fn = comparefn;
+ } else {
+ hdr = "Diff Image";
+ fn = _T("");
+ }
+#if wxUSE_STATUSBAR
+ frame_status_bar->SetStatusText(wxString(hdr, wxConvUTF8), 0);
+ frame_status_bar->SetStatusText(wxString(fn, wxConvUTF8), 1);
+#endif // wxUSE_STATUSBAR
+ Refresh();
+}
+
+void
+MyCanvas::goto_diff_rect_focus( )
+{
+ int scroll_units_pixels, scroll_units_rows, client_width_pixels, client_height_rows;
+
+ /* make the center of the current diff rect be at the center of the window */
+ int i_rect_center_pixel = ( diff_rect_focus->left + diff_rect_focus->right ) / 2;
+ int i_rect_center_row = ( diff_rect_focus->top + diff_rect_focus->bottom ) / 2;
+
+ GetScrollPixelsPerUnit( &scroll_units_pixels, &scroll_units_rows );
+ GetClientSize( &client_width_pixels, &client_height_rows );
+
+ int scroll_to_pixel = ( (current_zoom * i_rect_center_pixel) - ( client_width_pixels / 2 ) );
+ int scroll_to_row = ( current_zoom * i_rect_center_row - ( client_height_rows / 2 ) );
+
+ Scroll( scroll_to_pixel / scroll_units_pixels, scroll_to_row / scroll_units_rows );
+ Refresh();
+}
+
+
+#define MAX_PIXWINDOW 8
+
+bool
+MyCanvas::pixel_differs( unsigned char **base_rows, unsigned char **compare_rows, int pixel, int i_pw, int color_tolerance)
+{
+
+ /* rows are pointers to the data to be compared */
+ /* the current pixel is in ***_rows[i_pw][3*i_pw] */
+ /* color_tolerance is an absolute diff in each channel R, G, B */
+ int p3 = (pixel * 3); /* center pixel offset in row */
+ int i;
+ bool base_differs = true; /* default to differing */
+
+ /* This row in _rows is i_pw */
+ /* Check pixels from the center out */
+ unsigned char *cp, *bp = base_rows [i_pw] + p3; /* reference is base */
+ for (i=0; i<neighbor_count; i++) {
+ cp = compare_rows [i_pw + neighbor_row[i]] + p3 + (3 * neighbor_pix[i]);
+ if (abs(bp[0] - cp[0]) <= color_tolerance &&
+ abs(bp[1] - cp[1]) <= color_tolerance &&
+ abs(bp[2] - cp[2]) <= color_tolerance ) {
+ if (i == 0)
+ return false; /* matches at current pixel */
+ base_differs = false;
+ break; /* found a match */
+ }
+ }
+ if (base_differs)
+ return true; /* bail out now */
+ /* Need to make sure that this isn't a missing feature */
+ cp = compare_rows [i_pw] + p3; /* reference is compare */
+ for (i=0; i<neighbor_count; i++) {
+ bp = base_rows [i_pw + neighbor_row[i]] + p3 + (3 * neighbor_pix[i]);
+ if (abs(bp[0] - cp[0]) <= color_tolerance &&
+ abs(bp[1] - cp[1]) <= color_tolerance &&
+ abs(bp[2] - cp[2]) <= color_tolerance ) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void
+MyCanvas::prune_pending_list( int row )
+{
+ diff_rect *diff_pending_scan;
+ diff_rect *diff_pending_scan_base = diff_list_pending;
+
+ /* First anneal any rects on the pending list that are close enough */
+ /* This is done first since this list is active for every row */
+ while ( (diff_pending_scan_base != NULL) && (diff_pending_scan_base->next != NULL) ) {
+ diff_pending_scan = diff_pending_scan_base->next;
+ while (diff_pending_scan != NULL) {
+ if ( ( diff_pending_scan_base->right >= (diff_pending_scan->left - i_rect_separation) ) &&
+ ( diff_pending_scan_base->left <= (diff_pending_scan->right + i_rect_separation) ) ) {
+ /* merge the _scan rect into the _base rect and delete the _scan element */
+ diff_pending_scan_base->left = diff_pending_scan_base->left < diff_pending_scan->left ?
+ diff_pending_scan_base->left : diff_pending_scan->left;
+ diff_pending_scan_base->right = diff_pending_scan_base->right > diff_pending_scan->right ?
+ diff_pending_scan_base->right : diff_pending_scan->right;
+ diff_pending_scan_base->top = diff_pending_scan_base->top < diff_pending_scan->top ?
+ diff_pending_scan_base->top : diff_pending_scan->top;
+ diff_pending_scan_base->bottom = diff_pending_scan_base->bottom > diff_pending_scan->bottom ?
+ diff_pending_scan_base->bottom : diff_pending_scan->bottom;
+ /* delete the diff_pending_scan rectangle from the list */
+ diff_pending_scan->prev->next = diff_pending_scan->next;
+ if (diff_pending_scan->next != NULL)
+ diff_pending_scan->next->prev = diff_pending_scan->prev;
+ diff_rect *prev = diff_pending_scan->prev;
+ free( diff_pending_scan );
+ diff_pending_scan = prev;
+ }
+ diff_pending_scan = diff_pending_scan->next;
+ }
+ diff_pending_scan_base = diff_pending_scan_base->next;
+ }
+ /* Remove any pending differences that will be too far above the current row */
+ /* Before adding it, we need to make sure we can't simply anneal to an existing diff */
+ diff_pending_scan = diff_list_pending;
+
+ while (diff_pending_scan != NULL) {
+ if (diff_pending_scan->bottom <= (row - i_rect_separation)) {
+ bool diff_pending_merged = false;
+ diff_rect *diff_list_scan = diff_list_head;
+
+ while (diff_list_scan != NULL) {
+ if ( ( diff_list_scan->bottom >= diff_pending_scan->top - i_rect_separation ) &&
+ ( ( diff_list_scan->right >= (diff_pending_scan->left - i_rect_separation) ) &&
+ ( diff_list_scan->left <= (diff_pending_scan->right + i_rect_separation) )
+ )
+ ) {
+ /* merge the diff_pending_scan rect into the diff_list_scan rect */
+ diff_list_scan->left = diff_list_scan->left < diff_pending_scan->left ?
+ diff_list_scan->left : diff_pending_scan->left;
+ diff_list_scan->right = diff_list_scan->right > diff_pending_scan->right ?
+ diff_list_scan->right : diff_pending_scan->right;
+ diff_list_scan->top = diff_list_scan->top < diff_pending_scan->top ?
+ diff_list_scan->top : diff_pending_scan->top;
+ diff_list_scan->bottom = diff_list_scan->bottom > diff_pending_scan->bottom ?
+ diff_list_scan->bottom : diff_pending_scan->bottom;
+
+ /* delete the diff_pending_scan rectangle from the list */
+ if (diff_pending_scan->prev != NULL)
+ diff_pending_scan->prev->next = diff_pending_scan->next;
+ else
+ diff_list_pending = diff_pending_scan->next;
+ if (diff_pending_scan->next != NULL)
+ diff_pending_scan->next->prev = diff_pending_scan->prev;
+ diff_rect *next = diff_pending_scan->next;
+ free( diff_pending_scan );
+ diff_pending_scan = next;
+ diff_pending_merged = true;
+ break;
+ }
+ diff_list_scan = diff_list_scan->next;
+ }
+
+ if ( ! diff_pending_merged ) {
+ /* move this rect from the pending list to the end of the diff_list */
+ if (diff_pending_scan->prev != NULL)
+ /* not the first on the pending list */
+ diff_pending_scan->prev->next = diff_pending_scan->next;
+ else
+ diff_list_pending = diff_pending_scan->next;
+ if (diff_pending_scan->next != NULL)
+ /* wasn't the last on the pending list */
+ diff_pending_scan->next->prev = diff_pending_scan->prev;
+ /* now put this on the diff_list at the tail */
+ if (diff_list_tail == NULL) {
+ diff_list_tail = diff_list_head = diff_pending_scan;
+ diff_pending_scan->prev = NULL;
+ } else {
+ diff_list_tail->next = diff_pending_scan;
+ diff_pending_scan->prev = diff_list_tail;
+ diff_list_tail = diff_pending_scan;
+ }
+ diff_pending_scan = diff_pending_scan->next;
+ diff_list_tail->next = NULL;
+ diff_list_count++;
+ /* finished moving a rect from 'pending' to the diff_list */
+ } /* end if ! diff_pending_merged */
+ } else {
+ diff_pending_scan = diff_pending_scan->next;
+ } /* end if diff_pending rect ends too far above current row */
+ } /* end while diff_pending_scan != NULL */
+}
+
+bool
+MyCanvas::load_image_files( wxChar *basefilename, wxChar *comparefilename )
+{
+ char str[256];
+ int i, percent_done = 0;
+
+ wxProgressDialog *wxPD = new wxProgressDialog(wxT("Loading and Analyzing Images"),
+ wxT("________________________________________________________________"),
+ 100, 0, wxPD_AUTO_HIDE );
+ sprintf(str, "Loading baseline image file: %-64s", basefilename);
+ wxPD->Update( 0, wxString(str, wxConvUTF8));
+ if ( ! base_image.LoadFile( basefilename, wxBITMAP_TYPE_ANY ) ) {
+ wxLogError(wxT("Can't load baseline image"));
+ return false;
+ }
+ else {
+ sprintf(str, "Loading compare image file: %-64s", basefilename);
+ wxPD->Update( 25, wxString(str, wxConvUTF8));
+ if ( ! compare_image.LoadFile( comparefilename, wxBITMAP_TYPE_ANY )){
+ wxLogError(wxT("Can't load compare image"));
+ return false;
+ }
+ }
+ if (compare_image.GetWidth() != base_image.GetWidth() ||
+ compare_image.GetHeight() != base_image.GetHeight()) {
+ wxLogError(wxT("compare image geometry doesn't match base image"));
+ return false;
+ }
+
+
+ basefn = basefilename;
+ comparefn = comparefilename;
+ current_image = &base_image;
+ base_image.SetAlpha ();
+ compare_image.SetAlpha ();
+ memset (base_image.GetAlpha(), 255, base_image.GetWidth() * base_image.GetHeight());
+ memset (compare_image.GetAlpha(), 255, base_image.GetWidth() * base_image.GetHeight());
+
+ // Compute 'fit' zoom factor
+ int frameW, frameH;
+ DoGetClientSize(&frameW, &frameH);
+ float WRatio = (float)frameW / (float)(base_image.GetWidth());
+ float HRatio = (float)frameH / (float)(base_image.GetHeight());
+ current_zoom = WRatio < HRatio ? WRatio : HRatio;
+ prev_zoom = current_zoom; /* save the value for scroll positioning when zooming */
+
+ // Gather differences
+ unsigned char *base_data = base_image.GetData();
+ unsigned char *compare_data = compare_image.GetData();
+ bool differs;
+ int pixel, row;
+ int image_width = base_image.GetWidth();
+ int image_height = base_image.GetHeight();
+ unsigned char *diff_data = (unsigned char *)malloc(image_width * image_height *3);
+ unsigned char *p_base_rows[MAX_PIXWINDOW];
+ unsigned char *p_compare_rows[MAX_PIXWINDOW];
+
+ diff_list_head = diff_list_tail = diff_list_pending = (diff_rect *)NULL;
+ diff_rect_focus = NULL;
+ i_diff_rect_focus = 0;
+ diff_list_count = 0;
+ alpha = (unsigned char *)calloc(image_height * image_width, 1);
+ mask_on = false;
+ highlight_on = false;
+ prev_mask = mask_on;
+ memset(diff_data, 255, image_width * image_height * 3);
+ memset(alpha, 30, image_width * image_height);
+
+ /* generate the list of neighbors dynamically */
+ neighbor_count = 1;
+ for (i=1; i <= i_pix_window; i++)
+ neighbor_count += 8 * i;
+ neighbor_pix = (int *)calloc(neighbor_count, sizeof(int));
+ neighbor_row = (int *)calloc(neighbor_count, sizeof(int));
+ neighbor_count = 1;
+ for (i=1; i <= i_pix_window; i++) {
+ for (row = -i; row < i; row++, neighbor_count++) { /* lower right, up */
+ neighbor_pix[neighbor_count] = i;
+ neighbor_row[neighbor_count] = row;
+ }
+ for (pixel = i; pixel > -i; pixel--, neighbor_count++) { /* upper right, left */
+ neighbor_pix[neighbor_count] = pixel;
+ neighbor_row[neighbor_count] = i;
+ }
+ for (row = i; row > -i; row--, neighbor_count++) { /* lower right, up */
+ neighbor_pix[neighbor_count] = -i;
+ neighbor_row[neighbor_count] = row;
+ }
+ for (pixel = -i; pixel < i; pixel++, neighbor_count++) { /* upper right, left */
+ neighbor_pix[neighbor_count] = pixel;
+ neighbor_row[neighbor_count] = -i;
+ }
+ }
+
+ for (row=0; row < image_height; row++) {
+
+ if ( 25 + ((row * 75)/ image_height) > percent_done ) {
+ /* update progress dialog */
+ percent_done = 25 + ( ( row * 75 )/ image_height );
+ sprintf(str, " Analyzing Differences: %d %%", percent_done);
+ wxPD->Update( percent_done, wxString(str, wxConvUTF8));
+ }
+
+ int i;
+ for (i = -i_pix_window; i <= i_pix_window; i++) {
+ int row_offset = (row + i) * image_width * 3;
+ p_base_rows[i+i_pix_window] = base_data + row_offset;
+ p_compare_rows[i+i_pix_window] = compare_data + row_offset;
+ }
+
+ for (pixel=0; pixel < image_width; pixel++) {
+ if ( (pixel < i_pix_window) || (pixel >= (image_width - i_pix_window)) ||
+ (row < i_pix_window) || (row >= (image_height - i_pix_window)) ) {
+ /* Need to copy a range of data to our "window" filling in rows and */
+ /* columns outside of the image */
+ // ------------------------------------------------------------- //
+ //
+ // THIS SECTION T.B.I. BUT IT ONLY AFFECTS DIFFERENCES AT THE
+ // EDGE OF THE IMAGES, SO WE LEAVE IT FOR LATER.
+ //
+ // The approach is to copy the data to a 'window' of rows that
+ // is 1+2*i_pix_window square and pass those row pointers to
+ // pixel_differs()
+
+ /* Now call the comparator on the window we just filled in */
+
+ differs = false;
+ }
+ else {
+ differs = pixel_differs( p_base_rows, p_compare_rows, pixel, i_pix_window, color_tolerance);
+ }
+ if (differs) {
+ unsigned char *d = diff_data + 3 * (pixel + (row * image_width));
+ d[0] = d[1] = d[2] = 0;
+ alpha[pixel + (row * image_width)] = 255;
+ diff_count++;
+
+ /* Now maintain the list of diff_rects */
+ bool diff_processed = false;
+ diff_rect *diff_rect_scan = diff_list_pending;
+
+ while (diff_rect_scan != NULL) {
+ /* we already know that any rects still on the pending list are */
+ /* within the row i_rect_separation distance -- just check the pixel distance */
+ if ( (pixel >= (diff_rect_scan->left - i_rect_separation)) &&
+ (pixel <= (diff_rect_scan->right + i_rect_separation)) ) {
+ /* update thebottom to the current row. Set right and left if past current pixel */
+ diff_rect_scan->right = (pixel > diff_rect_scan->right) ? pixel : diff_rect_scan->right ;
+ diff_rect_scan->left = (pixel < diff_rect_scan->left) ? pixel : diff_rect_scan->left ;
+ diff_rect_scan->bottom = row;
+ diff_processed = true;
+ break;
+ }
+ /* if not at end of list, advance to next */
+ if (diff_rect_scan->next == NULL) {
+ break; /* exit loop with _scan at tail of list */
+ /* the above exit at end of list will have diff_processed == false */
+ }
+ diff_rect_scan = diff_rect_scan->next;
+ }
+ if ( ! diff_processed ) {
+ /* This difference wasn't on the 'pending' list -- add a new rect at the head */
+ diff_rect *diff_rect_new = (diff_rect *)calloc(1, sizeof(diff_rect));
+ diff_rect_new->right = diff_rect_new->left = pixel;
+ diff_rect_new->bottom = diff_rect_new->top = row;
+ diff_rect_new->next = diff_list_pending;
+ if (diff_list_pending != NULL) {
+ diff_list_pending->prev = diff_rect_new; /* link back to new head of list */
+ }
+ diff_list_pending = diff_rect_new; /* new head of list */
+ }
+ } /* finished handling a pixel that differs */
+ } /* end of pixels in a row */
+
+ prune_pending_list( row );
+ } /* end of rows in image */
+
+ /* Move any rects still pending to the diff_list */
+ prune_pending_list( row + i_rect_separation + 1 ); /* far enoungh beyond all pending */
+
+ wxPD->Close();
+ wxPD->Destroy();
+ diff_image.Create(image_width, image_height, diff_data, NULL, false);
+ free(neighbor_pix);
+ free(neighbor_row);
+
+ return true;
+}
+
+bool
+MyCanvas::ProcessArgs(int argc=0, wxChar **argv=NULL, wxStatusBar *status_bar=NULL)
+{
+
+ int atarg = 1;
+ char *logfilename = "cmpi.log";
+
+ frame_status_bar = status_bar;
+ i_pix_window = 3; /* Default is sort of loose */
+ color_tolerance = 5; /* also for color variations */
+ diff_count = 0;
+ i_rect_separation = 3 * i_pix_window;
+
+ batch_mode = false;
+ while ((atarg < argc) && (argv[atarg][0] == '-')) {
+ /* process options */
+ switch(argv[atarg][1]) {
+ case 'b':
+ batch_mode = true;
+ break;
+ case 'c':
+ sscanf((char *)argv[atarg]+2, "%d", &color_tolerance);
+ if (color_tolerance < 0)
+ color_tolerance = 0;
+ break;
+ case 'l':
+ if (argv[atarg]+2 != 0)
+ logfilename = (char *)argv[atarg]+2;
+ else {
+ atarg++;
+ logfilename = (char *)argv[atarg];
+ }
+ break;
+ case 'r':
+ sscanf((char *)argv[atarg]+2, "%d", &i_rect_separation);
+ if (i_rect_separation < 0)
+ i_rect_separation = 0;
+ break;
+ case 'w':
+ sscanf((char *)argv[atarg]+2, "%d", &i_pix_window);
+ if (i_pix_window < 0)
+ i_pix_window = 0;
+ break;
+ default:
+ wxLogError(wxT("Unknown option"));
+ }
+ atarg++;
+ }
+ if (argc - atarg < 2) {
+ wxLogError(wxT("Two filename arguments are required"));
+ return false;
+ }
+ if ( ! load_image_files( argv[atarg], argv[atarg+1] ) )
+ return false;
+
+ if (batch_mode) {
+ char str[256], basename[256];
+ wxFile logFile;
+
+ if (wxFileExists(logfilename))
+ logFile.Open(logfilename, wxFile::write_append);
+ else
+ logFile.Create(logfilename);
+
+ logFile.SeekEnd();
+
+ /* find the "basename .p?m" from the base image name */
+ int end = strlen(argv[atarg]) - 1;
+ while ( argv[atarg][end--] != '.' && end > 0 )
+ ;
+ if ( end == 0 )
+ end = strlen(argv[atarg]) - 1;
+ int start = end++;
+ while ( argv[atarg][start] != '/' && argv[atarg][start] != '\\' &&
+ argv[atarg][start] != ':' && start > 0 )
+ start--;
+ strncpy(basename, argv[atarg]+start, end-start);
+ basename[end-start] = 0;
+ sprintf(str, "%s\tDifference count: %d\n", basename, diff_count);
+ logFile.Write(wxString(str, wxConvUTF8));
+ logFile.Close();
+ return false;
+ }
+
+#if wxUSE_STATUSBAR
+ char str[32];
+ sprintf( str, "Rect Count: %-10d", diff_list_count);
+ frame_status_bar->SetStatusText(wxString(str, wxConvUTF8), 2);
+ sprintf( str, "Diff Count: %-10d", diff_count);
+ frame_status_bar->SetStatusText(wxString(str, wxConvUTF8), 3);
+#endif // wxUSE_STATUSBAR
+
+ update_bitmap();
+
+ return true;
+}
+
+MyCanvas::~MyCanvas()
+{
+ base_image.Destroy();
+ compare_image.Destroy();
+ delete current_bitmap;
+}
+
+void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) )
+{
+ wxPaintDC dc( this );
+ PrepareDC( dc );
+
+ if (current_bitmap && current_bitmap->Ok()) {
+ diff_rect *diff_rect_scan;
+
+ dc.DrawBitmap( *current_bitmap, 0, 0 );
+
+ /* now outline the difference rects */
+ if ( highlight_on ) {
+ dc.SetBrush( *wxTRANSPARENT_BRUSH );
+
+ for (diff_rect_scan = diff_list_head; diff_rect_scan != NULL; diff_rect_scan = diff_rect_scan->next) {
+ int w = current_zoom * (diff_rect_scan->right - diff_rect_scan->left + 1);
+ int h = current_zoom * (diff_rect_scan->bottom - diff_rect_scan->top + 1);
+ bool focus = diff_rect_scan == diff_rect_focus;
+
+ dc.SetPen( wxPen( focus ? *wxBLUE : *wxRED, focus ? 4 : 2, wxSOLID ) );
+ dc.DrawRectangle( current_zoom * diff_rect_scan->left, current_zoom * diff_rect_scan->top,
+ (w <= 0) ? 1 : w, (h <= 0) ? 1 : h );
+ } /* end for diff_rect_scan */
+ } /* end if highlight_on */
+ }
+}
+
+// MyFrame
+
+enum
+{
+ ID_QUIT = wxID_EXIT,
+ ID_ABOUT = wxID_ABOUT,
+ ID_HELP = wxID_HELP,
+ ID_NEW = 100,
+ ID_BASE = 101,
+ ID_COMPARE = 102,
+ ID_DIFF = 103,
+ ID_HILITE = 104,
+ ID_MASK = 105,
+ ID_GOTO_NEXT = 106,
+ ID_GOTO_PREV = 107,
+ ID_ZOOM_FIT = 108,
+ ID_ZOOM_1 = 109,
+ ID_ZOOM_IN = 110,
+ ID_ZOOM_OUT = 111,
+ ID_PIXEL_WINDOW = 112,
+ ID_COLOR_TOLERANCE = 113,
+};
+
+IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
+
+BEGIN_EVENT_TABLE(MyFrame,wxFrame)
+ EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
+ EVT_MENU (ID_HELP, MyFrame::OnHelp)
+ EVT_MENU (ID_QUIT, MyFrame::OnQuit)
+ EVT_MENU (ID_NEW, MyFrame::OnNewImages)
+ EVT_MENU (ID_BASE, MyFrame::OnView_Image)
+ EVT_MENU (ID_COMPARE, MyFrame::OnView_Image)
+ EVT_MENU (ID_DIFF, MyFrame::OnView_Image)
+ EVT_MENU (ID_HILITE, MyFrame::OnHiLiteToggle)
+ EVT_MENU (ID_MASK, MyFrame::OnMaskToggle)
+ EVT_MENU (ID_GOTO_NEXT, MyFrame::OnGoTo)
+ EVT_MENU (ID_GOTO_PREV, MyFrame::OnGoTo)
+ EVT_MENU (ID_ZOOM_FIT, MyFrame::OnZoom)
+ EVT_MENU (ID_ZOOM_1, MyFrame::OnZoom)
+ EVT_MENU (ID_ZOOM_IN, MyFrame::OnZoom)
+ EVT_MENU (ID_ZOOM_OUT, MyFrame::OnZoom)
+ EVT_MENU (ID_PIXEL_WINDOW, MyFrame::OnSettings)
+ EVT_MENU (ID_COLOR_TOLERANCE, MyFrame::OnSettings)
+END_EVENT_TABLE()
+
+MyFrame::MyFrame()
+ : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("cmpi - fuzzy image comparator"),
+ wxPoint(20,20), wxSize(1200,900) )
+{
+ status_bar = (wxStatusBar *)NULL;
+ wxMenuBar *menu_bar = new wxMenuBar();
+ wxMenu *menuFile = new wxMenu;
+ menuFile->Append( ID_NEW, _T("&Open Image Files...\tCtrl-O"));
+
+ menuFile->AppendSeparator();
+ menuFile->Append( ID_QUIT, _T("E&xit\tCtrl-Q"));
+ menu_bar->Append(menuFile, _T("&File"));
+
+ wxMenu *menuView = new wxMenu;
+ menuView->Append( ID_BASE, _T("&Base Image\tb"));
+ menuView->Append( ID_COMPARE, _T("&Compare Image\tc"));
+ menuView->Append( ID_DIFF, _T("&Diff Image\td"));
+ menuView->AppendSeparator();
+ menuView->Append( ID_HILITE, _T("&Highlight Toggle\th"));
+ menuView->Append( ID_MASK, _T("&Mask Toggle Image\tm"));
+ menuView->AppendSeparator();
+ menuView->Append( ID_GOTO_NEXT, _T("&Next Difference\tn"));
+ menuView->Append( ID_GOTO_PREV, _T("&Previous Difference\tp"));
+ menuView->AppendSeparator();
+ menuView->Append( ID_ZOOM_FIT, _T("Zoom &Fit in Window\tf"));
+ menuView->Append( ID_ZOOM_1, _T("Zoom &1:1\t1"));
+ menuView->Append( ID_ZOOM_IN, _T("Zoom &In\t+"));
+ menuView->Append( ID_ZOOM_OUT, _T("Zoom &Out\t-"));
+ menu_bar->Append(menuView, _T("&View"));
+
+ wxMenu *menuSettings = new wxMenu;
+ menuSettings->Append( ID_PIXEL_WINDOW, _T("Pixel &Window ...\tCtrl-W"));
+ menuSettings->Append( ID_COLOR_TOLERANCE, _T("Color &Tolerance...\tCtrl-T"));
+ menu_bar->Append(menuSettings, _T("&Settings"));
+
+ wxMenu *menuHelp = new wxMenu;
+ menuHelp->Append( ID_ABOUT, _T("&About..."));
+ menuHelp->Append( ID_HELP, _T("&Help\tF1"));
+ menu_bar->Append(menuHelp, _T("&Help"));
+
+ SetMenuBar( menu_bar );
+
+#if wxUSE_STATUSBAR
+ status_bar = CreateStatusBar(4);
+ int widths[] = { 150, -1, 200, 200 };
+ SetStatusWidths( 4, widths );
+#endif // wxUSE_STATUSBAR
+
+ m_canvas = new MyCanvas( this, wxID_ANY, wxPoint(0,0), wxSize(10,10) );
+}
+
+bool MyFrame::ProcessArgs(int argc, wxChar **argv)
+{
+ if (!m_canvas->ProcessArgs(argc, argv, status_bar))
+ Close();
+ return true;
+}
+
+void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
+{
+ Close( true );
+}
+
+void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
+{
+ (void)wxMessageBox( _T("cmpi - Image Comparison tool with fuzzy compare -- Version 0.9\n")
+ _T("Artifex Software (c) 2006"),
+ _T("Written by Ray Johnston"),
+ wxICON_INFORMATION | wxOK );
+}
+
+void MyFrame::OnHelp( wxCommandEvent &WXUNUSED(event) )
+{
+ (void)wxMessageBox( _T(
+ "usage: cmpi [-w#] [-c#] [-r#] [-l logfilename] baseline.ppm compare.ppm\n"
+ "\n"
+ " w# is pixel distance from the reference location 0 to 3\n"
+ " c# is the color tolerance (same for all components)\n"
+ " r# is the max rect separation used to collect adjacent\n"
+ " or nearby pixels into rectangular regions\n"
+ "\n"
+ "Hotkeys are:\n"
+ "\n"
+ " b display baseline image\n"
+ " c display compare image\n"
+ " d display diff image\n"
+ " f fit page to window\n"
+ " h highlight on/off toggle\n"
+ " m mask on/off toggle (only for base or compare images)\n"
+ " n next difference rectangle - center on screen, highlight blue\n"
+ " p previous difference rectangle - center on screen, highlight blue\n"
+ " 1 set zoom to 1:1\n"
+ " - zoom out\n"
+ " + zoom in\n"
+ "\n"
+ " ctrl-q quit\n"
+ ),
+ _T("Usage:"),
+ wxICON_INFORMATION | wxOK );
+}
+
+void MyFrame::OnNewImages( wxCommandEvent &WXUNUSED(event) )
+{
+#if wxUSE_FILEDLG
+ unsigned int i;
+ wxString filename = wxFileSelector(_T("Select base image file"));
+ if ( !filename )
+ return;
+
+ wxChar *basefilename = (wxChar *)calloc(filename.Len(), sizeof(wxChar));
+ for ( i=0; i < filename.Len(); i++)
+ basefilename[i] = filename.GetChar(i);
+ basefilename[i] = 0;
+
+ filename = wxFileSelector(_T("Select compare image file"));
+ if ( !filename )
+ return;
+
+ wxChar *comparefilename = (wxChar *)calloc(filename.Len(), sizeof(wxChar));
+ for ( i=0; i < filename.Len(); i++)
+ comparefilename[i] = filename.GetChar(i);
+ comparefilename[i] = 0;
+
+ m_canvas->load_image_files(basefilename, comparefilename);
+
+#endif // wxUSE_FILEDLG
+}
+
+void MyFrame::OnView_Image( wxCommandEvent &event )
+{
+ MyCanvas *m = m_canvas;
+
+ switch (event.GetId()) {
+ case ID_COMPARE:
+ m->current_image = &m->compare_image;
+ break;
+ case ID_DIFF:
+ m->current_image = &m->diff_image;
+ break;
+ case ID_BASE:
+ default:
+ m->current_image = &m->base_image;
+ break;
+ }
+ m->update_bitmap();
+}
+
+
+void MyFrame::OnMaskToggle( wxCommandEvent &WXUNUSED(event) )
+{
+ MyCanvas *m = m_canvas;
+
+ if ((m->current_image == &m->base_image) || (m->current_image == &m->compare_image)) {
+ if ( ! m->mask_on ) {
+ memcpy(m->base_image.GetAlpha(), m->alpha, m->base_image.GetWidth() * m->base_image.GetHeight());
+ memcpy(m->compare_image.GetAlpha(), m->alpha, m->base_image.GetWidth() * m->base_image.GetHeight());
+ m->mask_on = true;
+ } else {
+ memset (m->base_image.GetAlpha(), 255, m->base_image.GetWidth() * m->base_image.GetHeight());
+ memset (m->compare_image.GetAlpha(), 255, m->base_image.GetWidth() * m->base_image.GetHeight());
+ m->mask_on = false;
+ }
+ m->update_bitmap();
+ }
+}
+
+void MyFrame::OnHiLiteToggle( wxCommandEvent &WXUNUSED(event) )
+{
+ m_canvas->highlight_on = ! m_canvas->highlight_on;
+ m_canvas->Refresh();
+}
+
+void MyFrame::OnZoom( wxCommandEvent &event )
+{
+ MyCanvas *m = m_canvas;
+ double log_2, log2_zoom;
+ float WRatio, HRatio;
+ int frameW, frameH;
+
+ switch (event.GetId()) {
+ case ID_ZOOM_IN:
+ log_2 = log(2.0);
+ log2_zoom = log(m->current_zoom) / log_2;
+
+ log2_zoom = ceil(log2_zoom + 0.00001);
+ m->current_zoom = exp(log2_zoom * log_2);
+ break;
+ case ID_ZOOM_OUT:
+ log_2 = log(2.0);
+ log2_zoom = log(m->current_zoom) / log_2;
+
+ log2_zoom = floor(log2_zoom - 0.00001);
+ m->current_zoom = exp(log2_zoom * log_2);
+ break;
+ case ID_ZOOM_FIT:
+ // Compute 'fit' zoom factor
+ DoGetClientSize(&frameW, &frameH);
+ WRatio = (float)frameW / (float)(m->base_image.GetWidth());
+ HRatio = (float)frameH / (float)(m->base_image.GetHeight());
+ m->current_zoom = WRatio < HRatio ? WRatio : HRatio;
+ break;
+ case ID_ZOOM_1:
+ default:
+ m->current_zoom = 1.0;
+ }
+ // Now scale the bitmap from the image
+ m->update_bitmap();
+}
+
+void MyFrame::OnGoTo( wxCommandEvent &event )
+{
+ MyCanvas *m = m_canvas;
+
+ if (m->diff_rect_focus == NULL) {
+ m->diff_rect_focus = m->diff_list_head;
+ m->i_diff_rect_focus = 1; /* first rect */
+ }
+ else {
+ switch (event.GetId()) {
+ case ID_GOTO_NEXT:
+ if (m->diff_rect_focus->next != NULL) {
+ m->diff_rect_focus = m->diff_rect_focus->next;
+ m->i_diff_rect_focus++;
+ }
+ break;
+ case ID_GOTO_PREV:
+ if (m->diff_rect_focus->prev != NULL) {
+ m->diff_rect_focus = m->diff_rect_focus->prev;
+ m->i_diff_rect_focus--;
+ }
+ break;
+ default: /* 't' Center on current focus rect */
+ break;
+ }
+ }
+#if wxUSE_STATUSBAR
+ char str[32];
+ sprintf( str, "At: %d / %-10d", m->i_diff_rect_focus, m->diff_list_count);
+ status_bar->SetStatusText(wxString(str, wxConvUTF8), 2);
+#endif // wxUSE_STATUSBAR
+ m->goto_diff_rect_focus(); /* Make this one the center */
+
+}
+
+void MyFrame::OnSettings( wxCommandEvent &event )
+{
+ MyCanvas *m = m_canvas;
+
+#if 0000 /* TBI */
+
+ wxMessageDialog *settings_dlg;
+
+ settings_dlg = new WxMessageDialog(this, _T("Change Difference Settings\n"),
+ _T("Pixel Window Color Tolerance\n"),
+ wxCANCEL | wxOK );
+
+ m_spin_pix_win = new wxSpinButton( settings_dlg, ID_SPIN_PIX_WIN, wxPoint( 20, 40 ) );
+ m_spin_pix_win->SetRange( 0, MAX_PIXWINDOW );
+ m_spin_pix_win->SetValue( m->i_pix_window );
+
+ m_spin_col_tol = new wxSpinButton( settings_dlg, ID_SPIN_COL_TOL, wxPoint( 20, 80 ) );
+ m_spin_col_tol->SetRange( 0, 255 );
+ m_spin_col_tol->SetValue( m->color_tolerance );
+
+
+ switch (event.GetId()) {
+ case ID_PIXEL_WINDOW:
+ settings_dlg.SetFocus( m_spin_pix_win );
+ break;
+ case ID_COLOR_TOLERANCE:
+ settings_dlg.SetFocus( m_spin_col_tol );
+ break;
+ default:
+ break;
+ }
+
+ /* on "Find Diffs" BUtton */
+ if ( m_spin_window.GetValue != m->i_pix_window ||
+ m_spin_tolerance.GetValue != m->color_tolerance )
+
+#endif // 0000
+}
+
+//-----------------------------------------------------------------------------
+// MyApp
+//-----------------------------------------------------------------------------
+
+bool MyApp::OnInit()
+{
+
+#if wxUSE_PNM
+ wxImage::AddHandler( new wxPNMHandler );
+#endif
+
+ MyFrame *frame = new MyFrame();
+ frame->Show( true );
+
+ return frame->ProcessArgs(MyApp::argc, MyApp::argv);
+}
diff --git a/tools/cmpi/cmpi.dsp b/tools/cmpi/cmpi.dsp
new file mode 100755
index 000000000..d684ed3be
--- /dev/null
+++ b/tools/cmpi/cmpi.dsp
@@ -0,0 +1,480 @@
+# Microsoft Developer Studio Project File - Name="cmpi" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=cmpi - Win32 Debug
+!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 "cmpi.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 "cmpi.mak" CFG="cmpi - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "cmpi - Win32 DLL Universal Unicode Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Universal Unicode Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Universal Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Universal Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Unicode Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Unicode Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 DLL Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Universal Unicode Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Universal Unicode Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Universal Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Universal Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Unicode Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Unicode Debug" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "cmpi - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "cmpi - Win32 DLL Universal Unicode Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswunivudll"
+# PROP BASE Intermediate_Dir "vc_mswunivudll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswunivudll"
+# PROP Intermediate_Dir "vc_mswunivudll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswunivudll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\mswunivu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswunivudll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\mswunivu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswunivu" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswunivu" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivudll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmswuniv26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivudll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Universal Unicode Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswunivuddll"
+# PROP BASE Intermediate_Dir "vc_mswunivuddll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswunivuddll"
+# PROP Intermediate_Dir "vc_mswunivuddll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivuddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswunivud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivuddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswunivud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswunivud" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswunivud" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivuddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmswuniv26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivuddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Universal Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswunivdll"
+# PROP BASE Intermediate_Dir "vc_mswunivdll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswunivdll"
+# PROP Intermediate_Dir "vc_mswunivdll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswunivdll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\mswuniv" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswunivdll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\mswuniv" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /i ".\..\..\lib\vc_dll\mswuniv" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /i ".\..\..\lib\vc_dll\mswuniv" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivdll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmswuniv26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivdll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Universal Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswunivddll"
+# PROP BASE Intermediate_Dir "vc_mswunivddll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswunivddll"
+# PROP Intermediate_Dir "vc_mswunivddll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswunivd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswunivd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_dll\mswunivd" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_dll\mswunivd" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmswuniv26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Unicode Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswudll"
+# PROP BASE Intermediate_Dir "vc_mswudll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswudll"
+# PROP Intermediate_Dir "vc_mswudll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswudll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\mswu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswudll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\mswu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswu" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswu" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswudll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmsw26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswudll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Unicode Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswuddll"
+# PROP BASE Intermediate_Dir "vc_mswuddll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswuddll"
+# PROP Intermediate_Dir "vc_mswuddll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswuddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswuddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswud" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_dll\mswud" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswuddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmsw26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswuddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswdll"
+# PROP BASE Intermediate_Dir "vc_mswdll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswdll"
+# PROP Intermediate_Dir "vc_mswdll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswdll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\msw" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswdll\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_dll\msw" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /i ".\..\..\lib\vc_dll\msw" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /i ".\..\..\lib\vc_dll\msw" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswdll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswdll\cmpi.exe" /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswddll"
+# PROP BASE Intermediate_Dir "vc_mswddll\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswddll"
+# PROP Intermediate_Dir "vc_mswddll\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswddll\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_dll\mswd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "WXUSINGDLL" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_dll\mswd" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_dll\mswd" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+# ADD LINK32 wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswddll\cmpi.exe" /debug /libpath:".\..\..\lib\vc_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Universal Unicode Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswunivu"
+# PROP BASE Intermediate_Dir "vc_mswunivu\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswunivu"
+# PROP Intermediate_Dir "vc_mswunivu\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswunivu\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\mswunivu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswunivu\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\mswunivu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswunivu" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswunivu" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivu\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmswuniv26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivu\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Universal Unicode Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswunivud"
+# PROP BASE Intermediate_Dir "vc_mswunivud\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswunivud"
+# PROP Intermediate_Dir "vc_mswunivud\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivud\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswunivud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivud\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswunivud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswunivud" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswunivud" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivud\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmswuniv26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivud\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Universal Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswuniv"
+# PROP BASE Intermediate_Dir "vc_mswuniv\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswuniv"
+# PROP Intermediate_Dir "vc_mswuniv\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswuniv\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\mswuniv" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswuniv\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\mswuniv" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /i ".\..\..\lib\vc_lib\mswuniv" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /d "__WXUNIVERSAL__" /i ".\..\..\lib\vc_lib\mswuniv" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswuniv\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmswuniv26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswuniv\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Universal Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswunivd"
+# PROP BASE Intermediate_Dir "vc_mswunivd\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswunivd"
+# PROP Intermediate_Dir "vc_mswunivd\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivd\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswunivd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswunivd\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswunivd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXUNIVERSAL__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_lib\mswunivd" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXUNIVERSAL__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_lib\mswunivd" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmswuniv26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivd\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmswuniv26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswunivd\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Unicode Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_mswu"
+# PROP BASE Intermediate_Dir "vc_mswu\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_mswu"
+# PROP Intermediate_Dir "vc_mswu\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_mswu\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\mswu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_mswu\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\mswu" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswu" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswu" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswu\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmsw26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswu\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Unicode Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswud"
+# PROP BASE Intermediate_Dir "vc_mswud\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswud"
+# PROP Intermediate_Dir "vc_mswud\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswud\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswud\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswud" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_UNICODE" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswud" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /d "_UNICODE" /i ".\..\..\lib\vc_lib\mswud" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswud\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmsw26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswud\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "vc_msw"
+# PROP BASE Intermediate_Dir "vc_msw\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "vc_msw"
+# PROP Intermediate_Dir "vc_msw\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MD /Fdvc_msw\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\msw" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MD /Fdvc_msw\cmpi.pdb /O2 /GR /EHsc /I ".\..\..\lib\vc_lib\msw" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "__WXMSW__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "__WXMSW__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "__WXMSW__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "__WXMSW__" /i ".\..\..\lib\vc_lib\msw" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "__WXMSW__" /i ".\..\..\lib\vc_lib\msw" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_msw\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_msw\cmpi.exe" /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "vc_mswd"
+# PROP BASE Intermediate_Dir "vc_mswd\cmpi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "vc_mswd"
+# PROP Intermediate_Dir "vc_mswd\cmpi"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswd\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD CPP /nologo /FD /MDd /Zi /Gm /GZ /Fdvc_mswd\cmpi.pdb /Od /GR /EHsc /I ".\..\..\lib\vc_lib\mswd" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /c
+# ADD BASE MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD MTL /nologo /D "WIN32" /D "_DEBUG" /D "__WXMSW__" /D "__WXDEBUG__" /D "_WINDOWS" /D "NOPCH" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_lib\mswd" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+# ADD RSC /l 0x409 /d "_DEBUG" /d "__WXMSW__" /d "__WXDEBUG__" /i ".\..\..\lib\vc_lib\mswd" /i ".\..\..\include" /i "." /d "_WINDOWS" /i ".\..\..\samples" /d NOPCH
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswd\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+# ADD LINK32 wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib /nologo /machine:i386 /out:"vc_mswd\cmpi.exe" /debug /libpath:".\..\..\lib\vc_lib" /subsystem:windows
+
+!ENDIF
+
+# Begin Target
+
+# Name "cmpi - Win32 DLL Universal Unicode Release"
+# Name "cmpi - Win32 DLL Universal Unicode Debug"
+# Name "cmpi - Win32 DLL Universal Release"
+# Name "cmpi - Win32 DLL Universal Debug"
+# Name "cmpi - Win32 DLL Unicode Release"
+# Name "cmpi - Win32 DLL Unicode Debug"
+# Name "cmpi - Win32 DLL Release"
+# Name "cmpi - Win32 DLL Debug"
+# Name "cmpi - Win32 Universal Unicode Release"
+# Name "cmpi - Win32 Universal Unicode Debug"
+# Name "cmpi - Win32 Universal Release"
+# Name "cmpi - Win32 Universal Debug"
+# Name "cmpi - Win32 Unicode Release"
+# Name "cmpi - Win32 Unicode Debug"
+# Name "cmpi - Win32 Release"
+# Name "cmpi - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\cmpi.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmpi.rc
+# End Source File
+# End Group
+# End Target
+# End Project
+
diff --git a/tools/cmpi/cmpi.dsw b/tools/cmpi/cmpi.dsw
new file mode 100755
index 000000000..374d267fc
--- /dev/null
+++ b/tools/cmpi/cmpi.dsw
@@ -0,0 +1,46 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+Project: "cmpi"=cmpi.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+Begin Project Dependency
+Project_Dep_Name core
+End Project Dependency
+Begin Project Dependency
+Project_Dep_Name base
+End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "core"=..\..\build\msw\wx_core.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "base"=..\..\build\msw\wx_base.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/tools/cmpi/cmpi.pro b/tools/cmpi/cmpi.pro
new file mode 100755
index 000000000..af6f60043
--- /dev/null
+++ b/tools/cmpi/cmpi.pro
@@ -0,0 +1,17 @@
+# this is the project file for the cmpi wxWindows sample
+
+# we generate the VC++ IDE project file, comment this line
+# to generate a makefile for (n)make
+TEMPLATE = vc6app
+
+# wx is mandatory for wxWindows projects
+CONFIG = wx
+
+# the configurations of wxWindows we want to use: the value below is the
+# default one; possible other values are {Debug|Release}Unicode[Dll]
+#WXCONFIGS = Debug Release DebugDll ReleaseDll
+
+# project files
+SOURCES = cmpi.cpp
+RC_FILE = cmpi.rc
+TARGET = cmpi
diff --git a/tools/cmpi/cmpi.rc b/tools/cmpi/cmpi.rc
new file mode 100755
index 000000000..132b52a24
--- /dev/null
+++ b/tools/cmpi/cmpi.rc
@@ -0,0 +1,3 @@
+/* mondrian ICON "mondrian.ico" */
+#include "wx/msw/wx.rc"
+
diff --git a/tools/cmpi/cmpi.sln b/tools/cmpi/cmpi.sln
new file mode 100755
index 000000000..30215eaa1
--- /dev/null
+++ b/tools/cmpi/cmpi.sln
@@ -0,0 +1,134 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cmpi", "cmpi.vcproj", "{A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}"
+ ProjectSection(ProjectDependencies) = postProject
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22} = {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C} = {3E4A4B49-0B18-4E0D-A78C-636FB479113C}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "core", "..\..\build\msw\wx_core.vcproj", "{3E4A4B49-0B18-4E0D-A78C-636FB479113C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "base", "..\..\build\msw\wx_base.vcproj", "{EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ DLL Debug|Win32 = DLL Debug|Win32
+ DLL Release|Win32 = DLL Release|Win32
+ DLL Unicode Debug|Win32 = DLL Unicode Debug|Win32
+ DLL Unicode Release|Win32 = DLL Unicode Release|Win32
+ DLL Universal Debug|Win32 = DLL Universal Debug|Win32
+ DLL Universal Release|Win32 = DLL Universal Release|Win32
+ DLL Universal Unicode Debug|Win32 = DLL Universal Unicode Debug|Win32
+ DLL Universal Unicode Release|Win32 = DLL Universal Unicode Release|Win32
+ Release|Win32 = Release|Win32
+ Unicode Debug|Win32 = Unicode Debug|Win32
+ Unicode Release|Win32 = Unicode Release|Win32
+ Universal Debug|Win32 = Universal Debug|Win32
+ Universal Release|Win32 = Universal Release|Win32
+ Universal Unicode Debug|Win32 = Universal Unicode Debug|Win32
+ Universal Unicode Release|Win32 = Universal Unicode Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Debug|Win32.Build.0 = Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Unicode Debug|Win32.ActiveCfg = DLL Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Unicode Debug|Win32.Build.0 = DLL Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Unicode Release|Win32.ActiveCfg = DLL Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Unicode Release|Win32.Build.0 = DLL Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Debug|Win32.ActiveCfg = DLL Universal Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Debug|Win32.Build.0 = DLL Universal Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Release|Win32.ActiveCfg = DLL Universal Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Release|Win32.Build.0 = DLL Universal Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Unicode Debug|Win32.ActiveCfg = DLL Universal Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Unicode Debug|Win32.Build.0 = DLL Universal Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Unicode Release|Win32.ActiveCfg = DLL Universal Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.DLL Universal Unicode Release|Win32.Build.0 = DLL Universal Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Release|Win32.ActiveCfg = Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Release|Win32.Build.0 = Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Unicode Debug|Win32.Build.0 = Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Unicode Release|Win32.Build.0 = Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Debug|Win32.ActiveCfg = Universal Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Debug|Win32.Build.0 = Universal Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Release|Win32.ActiveCfg = Universal Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Release|Win32.Build.0 = Universal Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Unicode Debug|Win32.ActiveCfg = Universal Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Unicode Debug|Win32.Build.0 = Universal Unicode Debug|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Unicode Release|Win32.ActiveCfg = Universal Unicode Release|Win32
+ {A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}.Universal Unicode Release|Win32.Build.0 = Universal Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Debug|Win32.Build.0 = Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Unicode Debug|Win32.ActiveCfg = DLL Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Unicode Debug|Win32.Build.0 = DLL Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Unicode Release|Win32.ActiveCfg = DLL Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Unicode Release|Win32.Build.0 = DLL Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Debug|Win32.ActiveCfg = DLL Universal Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Debug|Win32.Build.0 = DLL Universal Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Release|Win32.ActiveCfg = DLL Universal Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Release|Win32.Build.0 = DLL Universal Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Unicode Debug|Win32.ActiveCfg = DLL Universal Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Unicode Debug|Win32.Build.0 = DLL Universal Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Unicode Release|Win32.ActiveCfg = DLL Universal Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.DLL Universal Unicode Release|Win32.Build.0 = DLL Universal Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Release|Win32.ActiveCfg = Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Release|Win32.Build.0 = Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Unicode Debug|Win32.Build.0 = Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Unicode Release|Win32.Build.0 = Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Debug|Win32.ActiveCfg = Universal Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Debug|Win32.Build.0 = Universal Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Release|Win32.ActiveCfg = Universal Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Release|Win32.Build.0 = Universal Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Unicode Debug|Win32.ActiveCfg = Universal Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Unicode Debug|Win32.Build.0 = Universal Unicode Debug|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Unicode Release|Win32.ActiveCfg = Universal Unicode Release|Win32
+ {3E4A4B49-0B18-4E0D-A78C-636FB479113C}.Universal Unicode Release|Win32.Build.0 = Universal Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Debug|Win32.Build.0 = Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Debug|Win32.Build.0 = DLL Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Release|Win32.ActiveCfg = DLL Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Release|Win32.Build.0 = DLL Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Unicode Debug|Win32.ActiveCfg = DLL Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Unicode Debug|Win32.Build.0 = DLL Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Unicode Release|Win32.ActiveCfg = DLL Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Unicode Release|Win32.Build.0 = DLL Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Debug|Win32.ActiveCfg = DLL Universal Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Debug|Win32.Build.0 = DLL Universal Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Release|Win32.ActiveCfg = DLL Universal Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Release|Win32.Build.0 = DLL Universal Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Unicode Debug|Win32.ActiveCfg = DLL Universal Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Unicode Debug|Win32.Build.0 = DLL Universal Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Unicode Release|Win32.ActiveCfg = DLL Universal Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.DLL Universal Unicode Release|Win32.Build.0 = DLL Universal Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Release|Win32.ActiveCfg = Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Release|Win32.Build.0 = Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Unicode Debug|Win32.Build.0 = Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Unicode Release|Win32.Build.0 = Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Debug|Win32.ActiveCfg = Universal Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Debug|Win32.Build.0 = Universal Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Release|Win32.ActiveCfg = Universal Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Release|Win32.Build.0 = Universal Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Unicode Debug|Win32.ActiveCfg = Universal Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Unicode Debug|Win32.Build.0 = Universal Unicode Debug|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Unicode Release|Win32.ActiveCfg = Universal Unicode Release|Win32
+ {EDF9D6F4-E48F-4CDD-9D89-CE91E902CA22}.Universal Unicode Release|Win32.Build.0 = Universal Unicode Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/tools/cmpi/cmpi.suo b/tools/cmpi/cmpi.suo
new file mode 100755
index 000000000..ca5c8d550
--- /dev/null
+++ b/tools/cmpi/cmpi.suo
Binary files differ
diff --git a/tools/cmpi/cmpi.vcp b/tools/cmpi/cmpi.vcp
new file mode 100755
index 000000000..26c1705ec
--- /dev/null
+++ b/tools/cmpi/cmpi.vcp
@@ -0,0 +1,1826 @@
+# Microsoft eMbedded Visual Tools Project File - Name="cmpi" - Package Owner=<4>
+# Microsoft eMbedded Visual Tools Generated Build File, Format Version 6.02
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (WCE x86) Application" 0x8301
+# TARGTYPE "Win32 (WCE MIPSIV) Application" 0x9601
+# TARGTYPE "Win32 (WCE ARMV4I) Application" 0xa501
+# TARGTYPE "Win32 (WCE MIPSIV_FP) Application" 0x9201
+# TARGTYPE "Win32 (WCE emulator) Application" 0xa601
+# TARGTYPE "Win32 (WCE MIPSII) Application" 0xa101
+# TARGTYPE "Win32 (WCE ARMV4T) Application" 0xa401
+# TARGTYPE "Win32 (WCE MIPSII_FP) Application" 0xa201
+# TARGTYPE "Win32 (WCE MIPS16) Application" 0x8901
+# TARGTYPE "Win32 (WCE SH3) Application" 0x8101
+# TARGTYPE "Win32 (WCE ARMV4) Application" 0xa301
+# TARGTYPE "Win32 (WCE ARM) Application" 0x8501
+# TARGTYPE "Win32 (WCE SH4) Application" 0x8601
+
+CFG=cmpi - Win32 (WCE ARM) Debug
+!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 "cmpi.vcn".
+!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 "cmpi.vcn" CFG="cmpi - Win32 (WCE ARM) Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "cmpi - Win32 (WCE emulator) DLL Release" (based on "Win32 (WCE emulator) Application")
+!MESSAGE "cmpi - Win32 (WCE emulator) DLL Debug" (based on "Win32 (WCE emulator) Application")
+!MESSAGE "cmpi - Win32 (WCE emulator) Release" (based on "Win32 (WCE emulator) Application")
+!MESSAGE "cmpi - Win32 (WCE emulator) Debug" (based on "Win32 (WCE emulator) Application")
+!MESSAGE "cmpi - Win32 (WCE x86) DLL Release" (based on "Win32 (WCE x86) Application")
+!MESSAGE "cmpi - Win32 (WCE x86) DLL Debug" (based on "Win32 (WCE x86) Application")
+!MESSAGE "cmpi - Win32 (WCE x86) Release" (based on "Win32 (WCE x86) Application")
+!MESSAGE "cmpi - Win32 (WCE x86) Debug" (based on "Win32 (WCE x86) Application")
+!MESSAGE "cmpi - Win32 (WCE SH4) DLL Release" (based on "Win32 (WCE SH4) Application")
+!MESSAGE "cmpi - Win32 (WCE SH4) DLL Debug" (based on "Win32 (WCE SH4) Application")
+!MESSAGE "cmpi - Win32 (WCE SH4) Release" (based on "Win32 (WCE SH4) Application")
+!MESSAGE "cmpi - Win32 (WCE SH4) Debug" (based on "Win32 (WCE SH4) Application")
+!MESSAGE "cmpi - Win32 (WCE SH3) DLL Release" (based on "Win32 (WCE SH3) Application")
+!MESSAGE "cmpi - Win32 (WCE SH3) DLL Debug" (based on "Win32 (WCE SH3) Application")
+!MESSAGE "cmpi - Win32 (WCE SH3) Release" (based on "Win32 (WCE SH3) Application")
+!MESSAGE "cmpi - Win32 (WCE SH3) Debug" (based on "Win32 (WCE SH3) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV_FP) DLL Release" (based on "Win32 (WCE MIPSIV_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV_FP) DLL Debug" (based on "Win32 (WCE MIPSIV_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV_FP) Release" (based on "Win32 (WCE MIPSIV_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV_FP) Debug" (based on "Win32 (WCE MIPSIV_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV) DLL Release" (based on "Win32 (WCE MIPSIV) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV) DLL Debug" (based on "Win32 (WCE MIPSIV) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV) Release" (based on "Win32 (WCE MIPSIV) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSIV) Debug" (based on "Win32 (WCE MIPSIV) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII_FP) DLL Release" (based on "Win32 (WCE MIPSII_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII_FP) DLL Debug" (based on "Win32 (WCE MIPSII_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII_FP) Release" (based on "Win32 (WCE MIPSII_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII_FP) Debug" (based on "Win32 (WCE MIPSII_FP) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII) DLL Release" (based on "Win32 (WCE MIPSII) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII) DLL Debug" (based on "Win32 (WCE MIPSII) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII) Release" (based on "Win32 (WCE MIPSII) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPSII) Debug" (based on "Win32 (WCE MIPSII) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPS16) DLL Release" (based on "Win32 (WCE MIPS16) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPS16) DLL Debug" (based on "Win32 (WCE MIPS16) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPS16) Release" (based on "Win32 (WCE MIPS16) Application")
+!MESSAGE "cmpi - Win32 (WCE MIPS16) Debug" (based on "Win32 (WCE MIPS16) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4T) DLL Release" (based on "Win32 (WCE ARMV4T) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4T) DLL Debug" (based on "Win32 (WCE ARMV4T) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4T) Release" (based on "Win32 (WCE ARMV4T) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4T) Debug" (based on "Win32 (WCE ARMV4T) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4I) DLL Release" (based on "Win32 (WCE ARMV4I) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4I) DLL Debug" (based on "Win32 (WCE ARMV4I) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4I) Release" (based on "Win32 (WCE ARMV4I) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4I) Debug" (based on "Win32 (WCE ARMV4I) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4) DLL Release" (based on "Win32 (WCE ARMV4) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4) DLL Debug" (based on "Win32 (WCE ARMV4) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4) Release" (based on "Win32 (WCE ARMV4) Application")
+!MESSAGE "cmpi - Win32 (WCE ARMV4) Debug" (based on "Win32 (WCE ARMV4) Application")
+!MESSAGE "cmpi - Win32 (WCE ARM) DLL Release" (based on "Win32 (WCE ARM) Application")
+!MESSAGE "cmpi - Win32 (WCE ARM) DLL Debug" (based on "Win32 (WCE ARM) Application")
+!MESSAGE "cmpi - Win32 (WCE ARM) Release" (based on "Win32 (WCE ARM) Application")
+!MESSAGE "cmpi - Win32 (WCE ARM) Debug" (based on "Win32 (WCE ARM) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+# PROP ATL_Project 2
+
+!IF "$(CFG)" == "cmpi - Win32 (WCE emulator) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_emulator"
+# PROP BASE Intermediate_Dir "evc_wincedll_emulator\cmpi"
+# PROP BASE CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_emulator"
+# PROP Intermediate_Dir "evc_wincedll_emulator\cmpi"
+# PROP CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wincedll_emulator\cmpi.pdb /O2 /I ".\..\..\lib\evc_emulator_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wincedll_emulator\cmpi.pdb /O2 /I ".\..\..\lib\evc_emulator_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wincedll_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_emulator_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wincedll_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_emulator_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE emulator) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_emulator"
+# PROP BASE Intermediate_Dir "evc_winceddll_emulator\cmpi"
+# PROP BASE CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_emulator"
+# PROP Intermediate_Dir "evc_winceddll_emulator\cmpi"
+# PROP CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winceddll_emulator\cmpi.pdb /Od /I ".\..\..\lib\evc_emulator_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winceddll_emulator\cmpi.pdb /Od /I ".\..\..\lib\evc_emulator_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winceddll_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_emulator_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winceddll_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_emulator_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE emulator) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_emulator"
+# PROP BASE Intermediate_Dir "evc_wince_emulator\cmpi"
+# PROP BASE CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_emulator"
+# PROP Intermediate_Dir "evc_wince_emulator\cmpi"
+# PROP CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wince_emulator\cmpi.pdb /O2 /I ".\..\..\lib\evc_emulator_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wince_emulator\cmpi.pdb /O2 /I ".\..\..\lib\evc_emulator_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wince_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_emulator_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wince_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_emulator_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE emulator) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_emulator"
+# PROP BASE Intermediate_Dir "evc_winced_emulator\cmpi"
+# PROP BASE CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_emulator"
+# PROP Intermediate_Dir "evc_winced_emulator\cmpi"
+# PROP CPU_ID "{32E52003-403E-442D-BE48-DE10F8C6131D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_emulator_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winced_emulator\cmpi.pdb /Od /I ".\..\..\lib\evc_emulator_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winced_emulator\cmpi.pdb /Od /I ".\..\..\lib\evc_emulator_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winced_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_emulator_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winced_emulator\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_emulator_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE x86) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_x86"
+# PROP BASE Intermediate_Dir "evc_wincedll_x86\cmpi"
+# PROP BASE CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_x86"
+# PROP Intermediate_Dir "evc_wincedll_x86\cmpi"
+# PROP CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wincedll_x86\cmpi.pdb /O2 /I ".\..\..\lib\evc_x86_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wincedll_x86\cmpi.pdb /O2 /I ".\..\..\lib\evc_x86_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wincedll_x86\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_x86_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wincedll_x86\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_x86_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE x86) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_x86"
+# PROP BASE Intermediate_Dir "evc_winceddll_x86\cmpi"
+# PROP BASE CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_x86"
+# PROP Intermediate_Dir "evc_winceddll_x86\cmpi"
+# PROP CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winceddll_x86\cmpi.pdb /Od /I ".\..\..\lib\evc_x86_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winceddll_x86\cmpi.pdb /Od /I ".\..\..\lib\evc_x86_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winceddll_x86\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_x86_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winceddll_x86\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_x86_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE x86) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_x86"
+# PROP BASE Intermediate_Dir "evc_wince_x86\cmpi"
+# PROP BASE CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_x86"
+# PROP Intermediate_Dir "evc_wince_x86\cmpi"
+# PROP CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wince_x86\cmpi.pdb /O2 /I ".\..\..\lib\evc_x86_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Fdevc_wince_x86\cmpi.pdb /O2 /I ".\..\..\lib\evc_x86_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wince_x86\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_x86_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_wince_x86\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_x86_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE x86) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_x86"
+# PROP BASE Intermediate_Dir "evc_winced_x86\cmpi"
+# PROP BASE CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_x86"
+# PROP Intermediate_Dir "evc_winced_x86\cmpi"
+# PROP CPU_ID "{D6518FF3-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_x86_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=cl.exe
+# ADD BASE CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winced_x86\cmpi.pdb /Od /I ".\..\..\lib\evc_x86_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "_i386_" /D "i_386_" /D "_X86_" /D "x86" /Gs8192 /GF /Zi /Fdevc_winced_x86\cmpi.pdb /Od /I ".\..\..\lib\evc_x86_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winced_x86\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_x86_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) $(CEx86Corelibc) /MACHINE:IX86 /nodefaultlib:"OLDNAMES.lib" /out:"evc_winced_x86\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_x86_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH4) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_sh4"
+# PROP BASE Intermediate_Dir "evc_wincedll_sh4\cmpi"
+# PROP BASE CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_sh4"
+# PROP Intermediate_Dir "evc_wincedll_sh4\cmpi"
+# PROP CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Fdevc_wincedll_sh4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh4_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Fdevc_wincedll_sh4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh4_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_wincedll_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh4_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_wincedll_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh4_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH4) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_sh4"
+# PROP BASE Intermediate_Dir "evc_winceddll_sh4\cmpi"
+# PROP BASE CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_sh4"
+# PROP Intermediate_Dir "evc_winceddll_sh4\cmpi"
+# PROP CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Zi /Fdevc_winceddll_sh4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh4_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Zi /Fdevc_winceddll_sh4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh4_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_winceddll_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh4_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_winceddll_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh4_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH4) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_sh4"
+# PROP BASE Intermediate_Dir "evc_wince_sh4\cmpi"
+# PROP BASE CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_sh4"
+# PROP Intermediate_Dir "evc_wince_sh4\cmpi"
+# PROP CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Fdevc_wince_sh4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh4_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Fdevc_wince_sh4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh4_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_wince_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh4_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_wince_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh4_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH4) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_sh4"
+# PROP BASE Intermediate_Dir "evc_winced_sh4\cmpi"
+# PROP BASE CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_sh4"
+# PROP Intermediate_Dir "evc_winced_sh4\cmpi"
+# PROP CPU_ID "{D6519021-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH4" /D "_SH4_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh4_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Zi /Fdevc_winced_sh4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh4_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH4" /D "_SH4_" /Qsh4 /Zi /Fdevc_winced_sh4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh4_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_winced_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh4_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH4 /out:"evc_winced_sh4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh4_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH3) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_sh3"
+# PROP BASE Intermediate_Dir "evc_wincedll_sh3\cmpi"
+# PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_sh3"
+# PROP Intermediate_Dir "evc_wincedll_sh3\cmpi"
+# PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Fdevc_wincedll_sh3\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh3_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Fdevc_wincedll_sh3\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh3_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_wincedll_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh3_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_wincedll_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh3_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH3) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_sh3"
+# PROP BASE Intermediate_Dir "evc_winceddll_sh3\cmpi"
+# PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_sh3"
+# PROP Intermediate_Dir "evc_winceddll_sh3\cmpi"
+# PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Zi /Fdevc_winceddll_sh3\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh3_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Zi /Fdevc_winceddll_sh3\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh3_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_winceddll_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh3_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_winceddll_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh3_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH3) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_sh3"
+# PROP BASE Intermediate_Dir "evc_wince_sh3\cmpi"
+# PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_sh3"
+# PROP Intermediate_Dir "evc_wince_sh3\cmpi"
+# PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Fdevc_wince_sh3\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh3_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Fdevc_wince_sh3\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_sh3_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_wince_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh3_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_wince_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_sh3_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE SH3) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_sh3"
+# PROP BASE Intermediate_Dir "evc_winced_sh3\cmpi"
+# PROP BASE CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_sh3"
+# PROP Intermediate_Dir "evc_winced_sh3\cmpi"
+# PROP CPU_ID "{D6519020-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "SHx" /D "SH3" /D "_SH3_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_sh3_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=shcl.exe
+# ADD BASE CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Zi /Fdevc_winced_sh3\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh3_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "SHx" /D "SH3" /D "_SH3_" /Zi /Fdevc_winced_sh3\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_sh3_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_winced_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh3_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:SH3 /align:4096 /out:"evc_winced_sh3\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_sh3_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV_FP) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_mipsiv_fp"
+# PROP BASE Intermediate_Dir "evc_wincedll_mipsiv_fp\cmpi"
+# PROP BASE CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_mipsiv_fp"
+# PROP Intermediate_Dir "evc_wincedll_mipsiv_fp\cmpi"
+# PROP CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Fdevc_wincedll_mipsiv_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_fp_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Fdevc_wincedll_mipsiv_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_fp_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wincedll_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_fp_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wincedll_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_fp_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV_FP) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_mipsiv_fp"
+# PROP BASE Intermediate_Dir "evc_winceddll_mipsiv_fp\cmpi"
+# PROP BASE CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_mipsiv_fp"
+# PROP Intermediate_Dir "evc_winceddll_mipsiv_fp\cmpi"
+# PROP CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Zi /Fdevc_winceddll_mipsiv_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_fp_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Zi /Fdevc_winceddll_mipsiv_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_fp_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winceddll_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_fp_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winceddll_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_fp_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV_FP) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_mipsiv_fp"
+# PROP BASE Intermediate_Dir "evc_wince_mipsiv_fp\cmpi"
+# PROP BASE CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_mipsiv_fp"
+# PROP Intermediate_Dir "evc_wince_mipsiv_fp\cmpi"
+# PROP CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Fdevc_wince_mipsiv_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_fp_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Fdevc_wince_mipsiv_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_fp_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wince_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_fp_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wince_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_fp_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV_FP) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_mipsiv_fp"
+# PROP BASE Intermediate_Dir "evc_winced_mipsiv_fp\cmpi"
+# PROP BASE CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_mipsiv_fp"
+# PROP Intermediate_Dir "evc_winced_mipsiv_fp\cmpi"
+# PROP CPU_ID "{046A430D-7770-48AB-89B5-24C2D300B03F}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_fp_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Zi /Fdevc_winced_mipsiv_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_fp_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /D "MIPSIV_FP" /QMmips4 /QMn32 /QMFPE- /Zi /Fdevc_winced_mipsiv_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_fp_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winced_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_fp_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winced_mipsiv_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_fp_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_mipsiv"
+# PROP BASE Intermediate_Dir "evc_wincedll_mipsiv\cmpi"
+# PROP BASE CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_mipsiv"
+# PROP Intermediate_Dir "evc_wincedll_mipsiv\cmpi"
+# PROP CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Fdevc_wincedll_mipsiv\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Fdevc_wincedll_mipsiv\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wincedll_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wincedll_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_mipsiv"
+# PROP BASE Intermediate_Dir "evc_winceddll_mipsiv\cmpi"
+# PROP BASE CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_mipsiv"
+# PROP Intermediate_Dir "evc_winceddll_mipsiv\cmpi"
+# PROP CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Zi /Fdevc_winceddll_mipsiv\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Zi /Fdevc_winceddll_mipsiv\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winceddll_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winceddll_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_mipsiv"
+# PROP BASE Intermediate_Dir "evc_wince_mipsiv\cmpi"
+# PROP BASE CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_mipsiv"
+# PROP Intermediate_Dir "evc_wince_mipsiv\cmpi"
+# PROP CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Fdevc_wince_mipsiv\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Fdevc_wince_mipsiv\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsiv_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wince_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_wince_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsiv_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSIV) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_mipsiv"
+# PROP BASE Intermediate_Dir "evc_winced_mipsiv\cmpi"
+# PROP BASE CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_mipsiv"
+# PROP Intermediate_Dir "evc_winced_mipsiv\cmpi"
+# PROP CPU_ID "{0B2FE524-26C5-4194-8CEF-B1582DEB5A98}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsiv_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Zi /Fdevc_winced_mipsiv\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "_MIPS64" /D "R4000" /D "MIPSIV" /QMmips4 /QMn32 /QMFPE /Zi /Fdevc_winced_mipsiv\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsiv_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winced_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPSFPU /out:"evc_winced_mipsiv\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsiv_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII_FP) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_mipsii_fp"
+# PROP BASE Intermediate_Dir "evc_wincedll_mipsii_fp\cmpi"
+# PROP BASE CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_mipsii_fp"
+# PROP Intermediate_Dir "evc_wincedll_mipsii_fp\cmpi"
+# PROP CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Fdevc_wincedll_mipsii_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_fp_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Fdevc_wincedll_mipsii_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_fp_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wincedll_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_fp_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wincedll_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_fp_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII_FP) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_mipsii_fp"
+# PROP BASE Intermediate_Dir "evc_winceddll_mipsii_fp\cmpi"
+# PROP BASE CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_mipsii_fp"
+# PROP Intermediate_Dir "evc_winceddll_mipsii_fp\cmpi"
+# PROP CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Zi /Fdevc_winceddll_mipsii_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_fp_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Zi /Fdevc_winceddll_mipsii_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_fp_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winceddll_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_fp_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winceddll_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_fp_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII_FP) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_mipsii_fp"
+# PROP BASE Intermediate_Dir "evc_wince_mipsii_fp\cmpi"
+# PROP BASE CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_mipsii_fp"
+# PROP Intermediate_Dir "evc_wince_mipsii_fp\cmpi"
+# PROP CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Fdevc_wince_mipsii_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_fp_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Fdevc_wince_mipsii_fp\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_fp_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wince_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_fp_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wince_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_fp_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII_FP) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_mipsii_fp"
+# PROP BASE Intermediate_Dir "evc_winced_mipsii_fp\cmpi"
+# PROP BASE CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_mipsii_fp"
+# PROP Intermediate_Dir "evc_winced_mipsii_fp\cmpi"
+# PROP CPU_ID "{D8AC856C-B213-4895-9E83-9EC51A55201E}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_fp_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Zi /Fdevc_winced_mipsii_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_fp_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPSII_FP" /QMmips2 /QMFPE- /Zi /Fdevc_winced_mipsii_fp\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_fp_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winced_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_fp_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winced_mipsii_fp\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_fp_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_mipsii"
+# PROP BASE Intermediate_Dir "evc_wincedll_mipsii\cmpi"
+# PROP BASE CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_mipsii"
+# PROP Intermediate_Dir "evc_wincedll_mipsii\cmpi"
+# PROP CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Fdevc_wincedll_mipsii\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Fdevc_wincedll_mipsii\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wincedll_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wincedll_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_mipsii"
+# PROP BASE Intermediate_Dir "evc_winceddll_mipsii\cmpi"
+# PROP BASE CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_mipsii"
+# PROP Intermediate_Dir "evc_winceddll_mipsii\cmpi"
+# PROP CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Zi /Fdevc_winceddll_mipsii\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Zi /Fdevc_winceddll_mipsii\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winceddll_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winceddll_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_mipsii"
+# PROP BASE Intermediate_Dir "evc_wince_mipsii\cmpi"
+# PROP BASE CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_mipsii"
+# PROP Intermediate_Dir "evc_wince_mipsii\cmpi"
+# PROP CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Fdevc_wince_mipsii\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Fdevc_wince_mipsii\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mipsii_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wince_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_wince_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mipsii_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPSII) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_mipsii"
+# PROP BASE Intermediate_Dir "evc_winced_mipsii\cmpi"
+# PROP BASE CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_mipsii"
+# PROP Intermediate_Dir "evc_winced_mipsii\cmpi"
+# PROP CPU_ID "{689DDC64-9D9D-11D5-96F8-00207802C01C}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mipsii_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Zi /Fdevc_winced_mipsii\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /QMmips2 /QMFPE /Zi /Fdevc_winced_mipsii\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mipsii_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winced_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS /out:"evc_winced_mipsii\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mipsii_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPS16) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_mips16"
+# PROP BASE Intermediate_Dir "evc_wincedll_mips16\cmpi"
+# PROP BASE CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_mips16"
+# PROP Intermediate_Dir "evc_wincedll_mips16\cmpi"
+# PROP CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Fdevc_wincedll_mips16\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mips16_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Fdevc_wincedll_mips16\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mips16_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_wincedll_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mips16_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_wincedll_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mips16_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPS16) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_mips16"
+# PROP BASE Intermediate_Dir "evc_winceddll_mips16\cmpi"
+# PROP BASE CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_mips16"
+# PROP Intermediate_Dir "evc_winceddll_mips16\cmpi"
+# PROP CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Zi /Fdevc_winceddll_mips16\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mips16_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Zi /Fdevc_winceddll_mips16\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mips16_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_winceddll_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mips16_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_winceddll_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mips16_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPS16) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_mips16"
+# PROP BASE Intermediate_Dir "evc_wince_mips16\cmpi"
+# PROP BASE CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_mips16"
+# PROP Intermediate_Dir "evc_wince_mips16\cmpi"
+# PROP CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Fdevc_wince_mips16\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mips16_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Fdevc_wince_mips16\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_mips16_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_wince_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mips16_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_wince_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_mips16_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE MIPS16) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_mips16"
+# PROP BASE Intermediate_Dir "evc_winced_mips16\cmpi"
+# PROP BASE CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_mips16"
+# PROP Intermediate_Dir "evc_winced_mips16\cmpi"
+# PROP CPU_ID "{D6519013-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_mips16_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clmips.exe
+# ADD BASE CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Zi /Fdevc_winced_mips16\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mips16_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "MIPS" /D "_MIPS_" /D "R4000" /D "MIPSII" /D "MIPS16" /D "_MIPS16_" /D "MIPS16SUPPORT" /QMmips16 /Zi /Fdevc_winced_mips16\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_mips16_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_winced_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mips16_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:MIPS16 /ALIGN:4096 /out:"evc_winced_mips16\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_mips16_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4T) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_armv4t"
+# PROP BASE Intermediate_Dir "evc_wincedll_armv4t\cmpi"
+# PROP BASE CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_armv4t"
+# PROP Intermediate_Dir "evc_wincedll_armv4t\cmpi"
+# PROP CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clthumb.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Fdevc_wincedll_armv4t\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4t_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Fdevc_wincedll_armv4t\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4t_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wincedll_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4t_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wincedll_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4t_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4T) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_armv4t"
+# PROP BASE Intermediate_Dir "evc_winceddll_armv4t\cmpi"
+# PROP BASE CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_armv4t"
+# PROP Intermediate_Dir "evc_winceddll_armv4t\cmpi"
+# PROP CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clthumb.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Zi /Fdevc_winceddll_armv4t\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4t_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Zi /Fdevc_winceddll_armv4t\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4t_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winceddll_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4t_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winceddll_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4t_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4T) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_armv4t"
+# PROP BASE Intermediate_Dir "evc_wince_armv4t\cmpi"
+# PROP BASE CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_armv4t"
+# PROP Intermediate_Dir "evc_wince_armv4t\cmpi"
+# PROP CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clthumb.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Fdevc_wince_armv4t\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4t_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Fdevc_wince_armv4t\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4t_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wince_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4t_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wince_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4t_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4T) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_armv4t"
+# PROP BASE Intermediate_Dir "evc_winced_armv4t\cmpi"
+# PROP BASE CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_armv4t"
+# PROP Intermediate_Dir "evc_winced_armv4t\cmpi"
+# PROP CPU_ID "{F52316A9-3B7C-4FE7-A67F-68350B41240D}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4t_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clthumb.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Zi /Fdevc_winced_armv4t\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4t_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "THUMB" /D "_THUMB_" /D "ARMV4T" /QRarch4T /QRinterwork-return /Zi /Fdevc_winced_armv4t\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4t_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winced_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4t_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winced_armv4t\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4t_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4I) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_armv4i"
+# PROP BASE Intermediate_Dir "evc_wincedll_armv4i\cmpi"
+# PROP BASE CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_armv4i"
+# PROP Intermediate_Dir "evc_wincedll_armv4i\cmpi"
+# PROP CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Fdevc_wincedll_armv4i\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4i_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Fdevc_wincedll_armv4i\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4i_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wincedll_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4i_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wincedll_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4i_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4I) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_armv4i"
+# PROP BASE Intermediate_Dir "evc_winceddll_armv4i\cmpi"
+# PROP BASE CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_armv4i"
+# PROP Intermediate_Dir "evc_winceddll_armv4i\cmpi"
+# PROP CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Zi /Fdevc_winceddll_armv4i\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4i_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Zi /Fdevc_winceddll_armv4i\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4i_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winceddll_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4i_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winceddll_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4i_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4I) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_armv4i"
+# PROP BASE Intermediate_Dir "evc_wince_armv4i\cmpi"
+# PROP BASE CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_armv4i"
+# PROP Intermediate_Dir "evc_wince_armv4i\cmpi"
+# PROP CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Fdevc_wince_armv4i\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4i_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Fdevc_wince_armv4i\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4i_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wince_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4i_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_wince_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4i_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4I) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_armv4i"
+# PROP BASE Intermediate_Dir "evc_winced_armv4i\cmpi"
+# PROP BASE CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_armv4i"
+# PROP Intermediate_Dir "evc_winced_armv4i\cmpi"
+# PROP CPU_ID "{DC70F430-E78B-494F-A9D5-62ADC56443B8}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4I" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4i_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Zi /Fdevc_winced_armv4i\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4i_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4I" /QRarch4T /QRinterwork-return /Zi /Fdevc_winced_armv4i\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4i_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winced_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4i_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /MACHINE:THUMB /out:"evc_winced_armv4i\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4i_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_armv4"
+# PROP BASE Intermediate_Dir "evc_wincedll_armv4\cmpi"
+# PROP BASE CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_armv4"
+# PROP Intermediate_Dir "evc_wincedll_armv4\cmpi"
+# PROP CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Fdevc_wincedll_armv4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Fdevc_wincedll_armv4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wincedll_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wincedll_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_armv4"
+# PROP BASE Intermediate_Dir "evc_winceddll_armv4\cmpi"
+# PROP BASE CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_armv4"
+# PROP Intermediate_Dir "evc_winceddll_armv4\cmpi"
+# PROP CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Zi /Fdevc_winceddll_armv4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Zi /Fdevc_winceddll_armv4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winceddll_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winceddll_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_armv4"
+# PROP BASE Intermediate_Dir "evc_wince_armv4\cmpi"
+# PROP BASE CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_armv4"
+# PROP Intermediate_Dir "evc_wince_armv4\cmpi"
+# PROP CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Fdevc_wince_armv4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Fdevc_wince_armv4\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_armv4_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wince_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wince_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_armv4_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARMV4) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_armv4"
+# PROP BASE Intermediate_Dir "evc_winced_armv4\cmpi"
+# PROP BASE CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_armv4"
+# PROP Intermediate_Dir "evc_winced_armv4\cmpi"
+# PROP CPU_ID "{ECBEA43D-CD7B-4852-AD55-D4227B5D624B}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /D "ARMV4" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_armv4_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Zi /Fdevc_winced_armv4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /D "ARMV4" /Zi /Fdevc_winced_armv4\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_armv4_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winced_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winced_armv4\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_armv4_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARM) DLL Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wincedll_arm"
+# PROP BASE Intermediate_Dir "evc_wincedll_arm\cmpi"
+# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wincedll_arm"
+# PROP Intermediate_Dir "evc_wincedll_arm\cmpi"
+# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_dll\wince" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /Fdevc_wincedll_arm\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_arm_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /Fdevc_wincedll_arm\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_arm_dll\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wincedll_arm\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_arm_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wincedll_arm\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_arm_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARM) DLL Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winceddll_arm"
+# PROP BASE Intermediate_Dir "evc_winceddll_arm\cmpi"
+# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winceddll_arm"
+# PROP Intermediate_Dir "evc_winceddll_arm\cmpi"
+# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_dll\winced" /i ".\..\..\include" /i "." /d "WXUSINGDLL" /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /Zi /Fdevc_winceddll_arm\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_arm_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /Zi /Fdevc_winceddll_arm\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_arm_dll\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "WXUSINGDLL" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winceddll_arm\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_arm_dll" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winceddll_arm\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_arm_dll" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARM) Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "evc_wince_arm"
+# PROP BASE Intermediate_Dir "evc_wince_arm\cmpi"
+# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "evc_wince_arm"
+# PROP Intermediate_Dir "evc_wince_arm\cmpi"
+# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "__WXWINCE__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_lib\wince" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /Fdevc_wince_arm\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_arm_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /Fdevc_wince_arm\cmpi.pdb /M$(CECrtMT) /O2 /I ".\..\..\lib\evc_arm_lib\wince" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "__WXWINCE__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wince_arm\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_arm_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26.lib wxjpeg.lib wxpng.lib wxzlib.lib wxexpat.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_wince_arm\cmpi.exe" /entry:"WinMainCRTStartup" /libpath:".\..\..\lib\evc_arm_lib" /subsystem:windows
+
+!ELSEIF "$(CFG)" == "cmpi - Win32 (WCE ARM) Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "evc_winced_arm"
+# PROP BASE Intermediate_Dir "evc_winced_arm\cmpi"
+# PROP BASE CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP BASE Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "evc_winced_arm"
+# PROP Intermediate_Dir "evc_winced_arm\cmpi"
+# PROP CPU_ID "{D6518FFC-710F-11D3-99F2-00105A0DF099}"
+# PROP Platform_ID "{8A9A2F80-6887-11D3-842E-005004848CBA}"
+# PROP Target_Dir ""
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+# ADD RSC /l 0x409 /d UNDER_CE=$(CEVersion) /d _WIN32_WCE=$(CEVersion) /d "UNICODE" /d "_UNICODE" /d "$(CePlatform)" /D "ARM" /D "_ARM_" /d "DEBUG" /d "__WXWINCE__" /d "__WXDEBUG__" /d "wxNO_EXCEPTIONS" /d "wxNO_RTTI" /d "_UNICODE" /i ".\..\..\lib\evc_arm_lib\winced" /i ".\..\..\include" /i "." /i ".\..\..\samples" /d "NOPCH" /r
+CPP=clarm.exe
+# ADD BASE CPP /nologo /D "ARM" /D "_ARM_" /Zi /Fdevc_winced_arm\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_arm_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+# ADD CPP /nologo /D "ARM" /D "_ARM_" /Zi /Fdevc_winced_arm\cmpi.pdb /M$(CECrtMTDebug) /Od /I ".\..\..\lib\evc_arm_lib\winced" /I ".\..\..\include" /W4 /I "." /I ".\..\..\samples" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /c
+MTL=midl.exe
+# ADD BASE MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+# ADD MTL /nologo /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "UNICODE" /D "_UNICODE" /D "$(CePlatform)" /D "DEBUG" /D "__WXWINCE__" /D "__WXDEBUG__" /D "wxNO_EXCEPTIONS" /D "wxNO_RTTI" /D "_UNICODE" /D "NOPCH" /mktyplib203 /o "NUL" /win32
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winced_arm\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_arm_lib" /subsystem:windows
+# ADD LINK32 coredll.lib wxwince26d.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxexpatd.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib winsock.lib wininet.lib /nologo /base:"0x00010000" /stack:0x10000,0x1000 /nodefaultlib:"$(CENoDefaultLib)" /subsystem:$(CESubsystem) /align:"4096" /MACHINE:ARM /out:"evc_winced_arm\cmpi.exe" /entry:"WinMainCRTStartup" /debug /libpath:".\..\..\lib\evc_arm_lib" /subsystem:windows
+
+!ENDIF
+
+# Begin Target
+
+# Name "cmpi - Win32 (WCE emulator) DLL Release"
+# Name "cmpi - Win32 (WCE emulator) DLL Debug"
+# Name "cmpi - Win32 (WCE emulator) Release"
+# Name "cmpi - Win32 (WCE emulator) Debug"
+# Name "cmpi - Win32 (WCE x86) DLL Release"
+# Name "cmpi - Win32 (WCE x86) DLL Debug"
+# Name "cmpi - Win32 (WCE x86) Release"
+# Name "cmpi - Win32 (WCE x86) Debug"
+# Name "cmpi - Win32 (WCE SH4) DLL Release"
+# Name "cmpi - Win32 (WCE SH4) DLL Debug"
+# Name "cmpi - Win32 (WCE SH4) Release"
+# Name "cmpi - Win32 (WCE SH4) Debug"
+# Name "cmpi - Win32 (WCE SH3) DLL Release"
+# Name "cmpi - Win32 (WCE SH3) DLL Debug"
+# Name "cmpi - Win32 (WCE SH3) Release"
+# Name "cmpi - Win32 (WCE SH3) Debug"
+# Name "cmpi - Win32 (WCE MIPSIV_FP) DLL Release"
+# Name "cmpi - Win32 (WCE MIPSIV_FP) DLL Debug"
+# Name "cmpi - Win32 (WCE MIPSIV_FP) Release"
+# Name "cmpi - Win32 (WCE MIPSIV_FP) Debug"
+# Name "cmpi - Win32 (WCE MIPSIV) DLL Release"
+# Name "cmpi - Win32 (WCE MIPSIV) DLL Debug"
+# Name "cmpi - Win32 (WCE MIPSIV) Release"
+# Name "cmpi - Win32 (WCE MIPSIV) Debug"
+# Name "cmpi - Win32 (WCE MIPSII_FP) DLL Release"
+# Name "cmpi - Win32 (WCE MIPSII_FP) DLL Debug"
+# Name "cmpi - Win32 (WCE MIPSII_FP) Release"
+# Name "cmpi - Win32 (WCE MIPSII_FP) Debug"
+# Name "cmpi - Win32 (WCE MIPSII) DLL Release"
+# Name "cmpi - Win32 (WCE MIPSII) DLL Debug"
+# Name "cmpi - Win32 (WCE MIPSII) Release"
+# Name "cmpi - Win32 (WCE MIPSII) Debug"
+# Name "cmpi - Win32 (WCE MIPS16) DLL Release"
+# Name "cmpi - Win32 (WCE MIPS16) DLL Debug"
+# Name "cmpi - Win32 (WCE MIPS16) Release"
+# Name "cmpi - Win32 (WCE MIPS16) Debug"
+# Name "cmpi - Win32 (WCE ARMV4T) DLL Release"
+# Name "cmpi - Win32 (WCE ARMV4T) DLL Debug"
+# Name "cmpi - Win32 (WCE ARMV4T) Release"
+# Name "cmpi - Win32 (WCE ARMV4T) Debug"
+# Name "cmpi - Win32 (WCE ARMV4I) DLL Release"
+# Name "cmpi - Win32 (WCE ARMV4I) DLL Debug"
+# Name "cmpi - Win32 (WCE ARMV4I) Release"
+# Name "cmpi - Win32 (WCE ARMV4I) Debug"
+# Name "cmpi - Win32 (WCE ARMV4) DLL Release"
+# Name "cmpi - Win32 (WCE ARMV4) DLL Debug"
+# Name "cmpi - Win32 (WCE ARMV4) Release"
+# Name "cmpi - Win32 (WCE ARMV4) Debug"
+# Name "cmpi - Win32 (WCE ARM) DLL Release"
+# Name "cmpi - Win32 (WCE ARM) DLL Debug"
+# Name "cmpi - Win32 (WCE ARM) Release"
+# Name "cmpi - Win32 (WCE ARM) Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\cmpi.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\cmpi.rc
+# End Source File
+# End Group
+# End Target
+# End Project
+
diff --git a/tools/cmpi/cmpi.vcproj b/tools/cmpi/cmpi.vcproj
new file mode 100755
index 000000000..da85a29c4
--- /dev/null
+++ b/tools/cmpi/cmpi.vcproj
@@ -0,0 +1,1907 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="cmpi"
+ ProjectGUID="{A0E1A7CA-DF68-43C5-8418-EC1152FFEA1E}"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Unicode Release|Win32"
+ OutputDirectory=".\vc_mswu"
+ IntermediateDirectory=".\vc_mswu\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,_UNICODE,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswu/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswu,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswu\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswu\cmpi/"
+ ObjectFile=".\vc_mswu\cmpi/"
+ ProgramDataBaseFileName="vc_mswu\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,_UNICODE,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswu;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswu\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ ProgramDatabaseFile=".\vc_mswu/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswu/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Unicode Release|Win32"
+ OutputDirectory=".\vc_mswudll"
+ IntermediateDirectory=".\vc_mswudll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswudll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswu,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;WXUSINGDLL;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswudll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswudll\cmpi/"
+ ObjectFile=".\vc_mswudll\cmpi/"
+ ProgramDataBaseFileName="vc_mswudll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswu;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswudll\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ ProgramDatabaseFile=".\vc_mswudll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswudll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Debug|Win32"
+ OutputDirectory=".\vc_mswddll"
+ IntermediateDirectory=".\vc_mswddll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswddll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswd,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;WXUSINGDLL;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswddll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswddll\cmpi/"
+ ObjectFile=".\vc_mswddll\cmpi/"
+ ProgramDataBaseFileName="vc_mswddll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXDEBUG__,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswd;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswddll\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswddll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswddll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Release|Win32"
+ OutputDirectory=".\vc_mswdll"
+ IntermediateDirectory=".\vc_mswdll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswdll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\msw,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;WXUSINGDLL;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswdll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswdll\cmpi/"
+ ObjectFile=".\vc_mswdll\cmpi/"
+ ProgramDataBaseFileName="vc_mswdll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\msw;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswdll\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ ProgramDatabaseFile=".\vc_mswdll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswdll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Universal Unicode Debug|Win32"
+ OutputDirectory=".\vc_mswunivuddll"
+ IntermediateDirectory=".\vc_mswunivuddll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivuddll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswunivud,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXUNIVERSAL__;__WXDEBUG__;WXUSINGDLL;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivuddll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivuddll\cmpi/"
+ ObjectFile=".\vc_mswunivuddll\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivuddll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswunivud;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivuddll\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswunivuddll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivuddll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Universal Release|Win32"
+ OutputDirectory=".\vc_mswunivdll"
+ IntermediateDirectory=".\vc_mswunivdll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,__WXUNIVERSAL__,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivdll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswuniv,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;__WXUNIVERSAL__;WXUSINGDLL;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivdll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivdll\cmpi/"
+ ObjectFile=".\vc_mswunivdll\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivdll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,__WXUNIVERSAL__,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswuniv;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivdll\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ ProgramDatabaseFile=".\vc_mswunivdll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivdll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Universal Unicode Release|Win32"
+ OutputDirectory=".\vc_mswunivudll"
+ IntermediateDirectory=".\vc_mswunivudll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,__WXUNIVERSAL__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivudll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswunivu,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;__WXUNIVERSAL__;WXUSINGDLL;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivudll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivudll\cmpi/"
+ ObjectFile=".\vc_mswunivudll\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivudll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,__WXUNIVERSAL__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswunivu;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivudll\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ ProgramDatabaseFile=".\vc_mswunivudll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivudll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\vc_mswd"
+ IntermediateDirectory=".\vc_mswd\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswd/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswd,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswd\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswd\cmpi/"
+ ObjectFile=".\vc_mswd\cmpi/"
+ ProgramDataBaseFileName="vc_mswd\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXDEBUG__,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswd;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswd\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswd/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswd/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Universal Unicode Debug|Win32"
+ OutputDirectory=".\vc_mswunivud"
+ IntermediateDirectory=".\vc_mswunivud\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,_UNICODE,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivud/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswunivud,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXUNIVERSAL__;__WXDEBUG__;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivud\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivud\cmpi/"
+ ObjectFile=".\vc_mswunivud\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivud\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,_UNICODE,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswunivud;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivud\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswunivud/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivud/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Universal Unicode Release|Win32"
+ OutputDirectory=".\vc_mswunivu"
+ IntermediateDirectory=".\vc_mswunivu\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,__WXUNIVERSAL__,_UNICODE,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivu/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswunivu,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;__WXUNIVERSAL__;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivu\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivu\cmpi/"
+ ObjectFile=".\vc_mswunivu\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivu\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,__WXUNIVERSAL__,_UNICODE,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswunivu;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26u_core.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivu\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ ProgramDatabaseFile=".\vc_mswunivu/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivu/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Unicode Debug|Win32"
+ OutputDirectory=".\vc_mswuddll"
+ IntermediateDirectory=".\vc_mswuddll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswuddll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswud,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;WXUSINGDLL;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswuddll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswuddll\cmpi/"
+ ObjectFile=".\vc_mswuddll\cmpi/"
+ ProgramDataBaseFileName="vc_mswuddll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXDEBUG__,_UNICODE,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswud;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswuddll\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswuddll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswuddll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="DLL Universal Debug|Win32"
+ OutputDirectory=".\vc_mswunivddll"
+ IntermediateDirectory=".\vc_mswunivddll\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,WXUSINGDLL,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivddll/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswunivd,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXUNIVERSAL__;__WXDEBUG__;WXUSINGDLL;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivddll\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivddll\cmpi/"
+ ObjectFile=".\vc_mswunivddll\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivddll\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,WXUSINGDLL,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_dll\mswunivd;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivddll\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_dll"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswunivddll/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivddll/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\vc_msw"
+ IntermediateDirectory=".\vc_msw\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_msw/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\msw,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_msw\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_msw\cmpi/"
+ ObjectFile=".\vc_msw\cmpi/"
+ ProgramDataBaseFileName="vc_msw\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\msw;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_msw\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ ProgramDatabaseFile=".\vc_msw/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_msw/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Unicode Debug|Win32"
+ OutputDirectory=".\vc_mswud"
+ IntermediateDirectory=".\vc_mswud\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_UNICODE,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswud/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswud,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswud\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswud\cmpi/"
+ ObjectFile=".\vc_mswud\cmpi/"
+ ProgramDataBaseFileName="vc_mswud\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXDEBUG__,_UNICODE,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswud;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmsw26ud_core.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswud\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswud/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswud/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Universal Debug|Win32"
+ OutputDirectory=".\vc_mswunivd"
+ IntermediateDirectory=".\vc_mswunivd\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswunivd/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="0"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswunivd,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;_DEBUG;__WXMSW__;__WXUNIVERSAL__;__WXDEBUG__;_WINDOWS;NOPCH"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswunivd\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswunivd\cmpi/"
+ ObjectFile=".\vc_mswunivd\cmpi/"
+ ProgramDataBaseFileName="vc_mswunivd\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG,__WXMSW__,__WXUNIVERSAL__,__WXDEBUG__,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswunivd;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26d_core.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswunivd\cmpi.exe"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile=".\vc_mswunivd/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswunivd/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Universal Release|Win32"
+ OutputDirectory=".\vc_mswuniv"
+ IntermediateDirectory=".\vc_mswuniv\cmpi"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="WIN32,__WXMSW__,__WXUNIVERSAL__,_WINDOWS,NOPCH"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName=".\vc_mswuniv/cmpi.tlb"
+ HeaderFileName=""
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalOptions="/EHsc "
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswuniv,.\..\..\include,.,.\..\..\samples"
+ PreprocessorDefinitions="WIN32;__WXMSW__;__WXUNIVERSAL__;_WINDOWS;NOPCH"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\vc_mswuniv\cmpi/cmpi.pch"
+ AssemblerListingLocation=".\vc_mswuniv\cmpi/"
+ ObjectFile=".\vc_mswuniv\cmpi/"
+ ProgramDataBaseFileName="vc_mswuniv\cmpi.pdb"
+ WarningLevel="4"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="__WXMSW__,__WXUNIVERSAL__,_WINDOWS,NOPCH"
+ Culture="1033"
+ AdditionalIncludeDirectories=".\..\..\lib\vc_lib\mswuniv;.\..\..\include;.;.\..\..\samples"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="wxmswuniv26_core.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
+ OutputFile="vc_mswuniv\cmpi.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories=".\..\..\lib\vc_lib"
+ ProgramDatabaseFile=".\vc_mswuniv/cmpi.pdb"
+ SubSystem="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ SuppressStartupBanner="true"
+ OutputFile=".\vc_mswuniv/cmpi.bsc"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="cmpi.cpp"
+ >
+ <FileConfiguration
+ Name="Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="cmpi.rc"
+ >
+ <FileConfiguration
+ Name="Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Unicode Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="DLL Universal Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Unicode Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Debug|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Universal Release|Win32"
+ >
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions=""
+ AdditionalIncludeDirectories=""
+ />
+ </FileConfiguration>
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/tools/cmpi/cmpi.vcw b/tools/cmpi/cmpi.vcw
new file mode 100755
index 000000000..2485410fa
--- /dev/null
+++ b/tools/cmpi/cmpi.vcw
@@ -0,0 +1,17 @@
+Microsoft eMbedded Visual Tools Workspace File, Format Version 4.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "cmpi"=cmpi.vcp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/tools/cmpi/descrip.mms b/tools/cmpi/descrip.mms
new file mode 100755
index 000000000..a9ff6adee
--- /dev/null
+++ b/tools/cmpi/descrip.mms
@@ -0,0 +1,47 @@
+#*****************************************************************************
+# *
+# Make file for VMS *
+# Author : J.Jansen (joukj@hrem.stm.tudelft.nl) *
+# Date : 10 November 1999 *
+# *
+#*****************************************************************************
+.first
+ define wx [--.include.wx]
+
+.ifdef __WXMOTIF__
+CXX_DEFINE = /define=(__WXMOTIF__=1)/name=(as_is,short)\
+ /assume=(nostdnew,noglobal_array_new)
+.else
+.ifdef __WXGTK__
+CXX_DEFINE = /define=(__WXGTK__=1)/float=ieee/name=(as_is,short)/ieee=denorm\
+ /assume=(nostdnew,noglobal_array_new)
+.else
+CXX_DEFINE =
+.endif
+.endif
+
+.suffixes : .cpp
+
+.cpp.obj :
+ cxx $(CXXFLAGS)$(CXX_DEFINE) $(MMS$TARGET_NAME).cpp
+
+all :
+.ifdef __WXMOTIF__
+ $(MMS)$(MMSQUALIFIERS) cmpi.exe
+.else
+.ifdef __WXGTK__
+ $(MMS)$(MMSQUALIFIERS) cmpi_gtk.exe
+.endif
+.endif
+
+.ifdef __WXMOTIF__
+cmpi.exe : cmpi.obj
+ cxxlink cmpi,[--.lib]vms/opt
+.else
+.ifdef __WXGTK__
+cmpi_gtk.exe : cmpi.obj
+ cxxlink/exec=cmpi_gtk.exe cmpi,[--.lib]vms_gtk/opt
+.endif
+.endif
+
+cmpi.obj : cmpi.cpp
diff --git a/tools/cmpi/makefile.bcc b/tools/cmpi/makefile.bcc
new file mode 100755
index 000000000..afc692537
--- /dev/null
+++ b/tools/cmpi/makefile.bcc
@@ -0,0 +1,229 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+.autodepend
+
+!ifndef BCCDIR
+!ifndef MAKEDIR
+!error Your Borland compiler does not define MAKEDIR. Please define the BCCDIR variable, e.g. BCCDIR=d:\bc4
+!endif
+BCCDIR = $(MAKEDIR)\..
+!endif
+
+!include ../../build/msw/config.bcc
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+### Variables: ###
+
+WX_RELEASE_NODOT = 26
+OBJS = \
+ bcc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
+LIBDIRNAME = .\..\..\lib\bcc_$(LIBTYPE_SUFFIX)$(CFG)
+SETUPHDIR = \
+ $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
+IMAGE_CXXFLAGS = $(__RUNTIME_LIBS_7) -I$(BCCDIR)\include $(__DEBUGINFO) \
+ $(__OPTIMIZEFLAG_2) $(__THREADSFLAG_6) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
+ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
+ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \
+ -I$(SETUPHDIR) -I.\..\..\include -I. $(__DLLFLAG_p) -I.\..\..\samples -DNOPCH \
+ $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = \
+ $(OBJS)\cmpi_cmpi.obj
+
+### Conditionally set variables: ###
+
+!if "$(USE_GUI)" == "0"
+PORTNAME = base
+!endif
+!if "$(USE_GUI)" == "1"
+PORTNAME = msw
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
+WXDEBUGFLAG = d
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+WXDEBUGFLAG = d
+!endif
+!if "$(UNICODE)" == "1"
+WXUNICODEFLAG = u
+!endif
+!if "$(WXUNIV)" == "1"
+WXUNIVNAME = univ
+!endif
+!if "$(SHARED)" == "1"
+WXDLLFLAG = dll
+!endif
+!if "$(SHARED)" == "0"
+LIBTYPE_SUFFIX = lib
+!endif
+!if "$(SHARED)" == "1"
+LIBTYPE_SUFFIX = dll
+!endif
+!if "$(MONOLITHIC)" == "0"
+EXTRALIBS_FOR_BASE =
+!endif
+!if "$(MONOLITHIC)" == "1"
+EXTRALIBS_FOR_BASE =
+!endif
+!if "$(BUILD)" == "debug"
+__OPTIMIZEFLAG_2 = -Od
+!endif
+!if "$(BUILD)" == "release"
+__OPTIMIZEFLAG_2 = -O2
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREADSFLAG_5 =
+!endif
+!if "$(USE_THREADS)" == "1"
+__THREADSFLAG_5 = mt
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREADSFLAG_6 =
+!endif
+!if "$(USE_THREADS)" == "1"
+__THREADSFLAG_6 = -tWM
+!endif
+!if "$(RUNTIME_LIBS)" == "dynamic"
+__RUNTIME_LIBS_7 = -tWR
+!endif
+!if "$(RUNTIME_LIBS)" == "static"
+__RUNTIME_LIBS_7 =
+!endif
+!if "$(RUNTIME_LIBS)" == "dynamic"
+__RUNTIME_LIBS_8 = i
+!endif
+!if "$(RUNTIME_LIBS)" == "static"
+__RUNTIME_LIBS_8 =
+!endif
+!if "$(WXUNIV)" == "1"
+__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
+!endif
+!if "$(WXUNIV)" == "1"
+__WXUNIV_DEFINE_p_1 = -d__WXUNIVERSAL__
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
+__DEBUG_DEFINE_p = -D__WXDEBUG__
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+__DEBUG_DEFINE_p = -D__WXDEBUG__
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
+__DEBUG_DEFINE_p_1 = -d__WXDEBUG__
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+__DEBUG_DEFINE_p_1 = -d__WXDEBUG__
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONS_DEFINE_p_1 = -dwxNO_EXCEPTIONS
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTI_DEFINE_p = -DwxNO_RTTI
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTI_DEFINE_p_1 = -dwxNO_RTTI
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREAD_DEFINE_p = -DwxNO_THREADS
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREAD_DEFINE_p_1 = -dwxNO_THREADS
+!endif
+!if "$(UNICODE)" == "1"
+__UNICODE_DEFINE_p = -D_UNICODE
+!endif
+!if "$(UNICODE)" == "1"
+__UNICODE_DEFINE_p_1 = -d_UNICODE
+!endif
+!if "$(MSLU)" == "1"
+__MSLU_DEFINE_p = -DwxUSE_UNICODE_MSLU=1
+!endif
+!if "$(MSLU)" == "1"
+__MSLU_DEFINE_p_1 = -dwxUSE_UNICODE_MSLU=1
+!endif
+!if "$(SHARED)" == "1"
+__DLLFLAG_p = -DWXUSINGDLL
+!endif
+!if "$(SHARED)" == "1"
+__DLLFLAG_p_1 = -dWXUSINGDLL
+!endif
+!if "$(MONOLITHIC)" == "0"
+__WXLIB_CORE_p = \
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib
+!endif
+!if "$(MONOLITHIC)" == "0"
+__WXLIB_BASE_p = \
+ wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+!if "$(MONOLITHIC)" == "1"
+__WXLIB_MONO_p = \
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib
+!endif
+!if "$(MSLU)" == "1"
+__UNICOWS_LIB_p = unicows.lib
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default"
+__DEBUGINFO = -v
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default"
+__DEBUGINFO = -v-
+!endif
+!if "$(DEBUG_INFO)" == "0"
+__DEBUGINFO = -v-
+!endif
+!if "$(DEBUG_INFO)" == "1"
+__DEBUGINFO = -v
+!endif
+
+
+all: $(OBJS)
+$(OBJS):
+ -if not exist $(OBJS) mkdir $(OBJS)
+
+### Targets: ###
+
+all: $(OBJS)\cmpi.exe data
+
+clean:
+ -if exist $(OBJS)\*.obj del $(OBJS)\*.obj
+ -if exist $(OBJS)\*.res del $(OBJS)\*.res
+ -if exist $(OBJS)\*.csm del $(OBJS)\*.csm
+ -if exist $(OBJS)\cmpi.exe del $(OBJS)\cmpi.exe
+ -if exist $(OBJS)\cmpi.tds del $(OBJS)\cmpi.tds
+ -if exist $(OBJS)\cmpi.ilc del $(OBJS)\cmpi.ilc
+ -if exist $(OBJS)\cmpi.ild del $(OBJS)\cmpi.ild
+ -if exist $(OBJS)\cmpi.ilf del $(OBJS)\cmpi.ilf
+ -if exist $(OBJS)\cmpi.ils del $(OBJS)\cmpi.ils
+
+$(OBJS)\cmpi.exe: $(IMAGE_OBJECTS) $(OBJS)\cmpi_cmpi.res
+ ilink32 -Tpe -q $(LDFLAGS) -L$(BCCDIR)\lib -L$(BCCDIR)\lib\psdk $(__DEBUGINFO) -L$(LIBDIRNAME) -aa @&&|
+ c0w32.obj $(IMAGE_OBJECTS),$@,, $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) ole2w32.lib oleacc.lib odbc32.lib import32.lib cw32$(__THREADSFLAG_5)$(__RUNTIME_LIBS_8).lib,, $(OBJS)\cmpi_cmpi.res
+|
+
+data:
+ if not exist $(OBJS) mkdir $(OBJS)
+ for %f in (horse.pnm) do if not exist $(OBJS)\%f copy .\%f $(OBJS)
+
+$(OBJS)\cmpi_cmpi.obj: .\cmpi.cpp
+ $(CXX) -q -c -P -o$@ $(IMAGE_CXXFLAGS) $**
+
+$(OBJS)\cmpi_cmpi.res: .\cmpi.rc
+ brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) -i$(SETUPHDIR) -i.\..\..\include -i. $(__DLLFLAG_p_1) -i.\..\..\samples -dNOPCH $**
+
diff --git a/tools/cmpi/makefile.dmc b/tools/cmpi/makefile.dmc
new file mode 100755
index 000000000..bbbc10a84
--- /dev/null
+++ b/tools/cmpi/makefile.dmc
@@ -0,0 +1,49 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+include ../../build/msw/config.dmc
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+### Variables: ###
+
+WX_RELEASE_NODOT = 26
+OBJS = dmc_mswd$(CFG)
+LIBTYPE_SUFFIX = lib
+LIBDIRNAME = .\..\..\lib\dmc_$(LIBTYPE_SUFFIX)$(CFG)
+SETUPHDIR = $(LIBDIRNAME)\mswd
+IMAGE_CXXFLAGS = -g -o+none -D_WIN32_WINNT=0x0400 -D__WXMSW__ -D__WXDEBUG__ \
+ -I$(SETUPHDIR) -I.\..\..\include -w- -I. -WA -I.\..\..\samples -DNOPCH -Ar -Ae \
+ $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = \
+ $(OBJS)\cmpi_cmpi.obj
+
+### Targets: ###
+
+all : $(OBJS)\cmpi.exe data
+
+clean :
+ -if exist $(OBJS)\*.obj del $(OBJS)\*.obj
+ -if exist $(OBJS)\*.res del $(OBJS)\*.res
+ -if exist $(OBJS)\*.sym del $(OBJS)\*.sym
+ -if exist $(OBJS)\cmpi.exe del $(OBJS)\cmpi.exe
+ -if exist $(OBJS)\cmpi.map del $(OBJS)\cmpi.map
+
+$(OBJS)\cmpi.exe : $(IMAGE_OBJECTS) $(OBJS)\cmpi_cmpi.res
+ link /NOLOGO /SILENT /NOI /DELEXECUTABLE /EXETYPE:NT $(LDFLAGS) /DEBUG /CODEVIEW /su:windows:4.0 $(IMAGE_OBJECTS),$@,$(OBJS)\cmpi.map, $(LIBDIRNAME)\ wxmsw$(WX_RELEASE_NODOT)d$(WX_LIB_FLAVOUR)_core.lib wxbase$(WX_RELEASE_NODOT)d$(WX_LIB_FLAVOUR).lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib ,, $(OBJS)\cmpi_cmpi.res
+
+data :
+ if not exist $(OBJS) mkdir $(OBJS)
+ for %f in (horse.pnm) do if not exist $(OBJS)\%f copy .\%f $(OBJS)
+
+$(OBJS)\cmpi_cmpi.obj : .\cmpi.cpp
+ $(CXX) -mn -c -cpp -o$@ $(IMAGE_CXXFLAGS) .\cmpi.cpp
+
+$(OBJS)\cmpi_cmpi.res : .\cmpi.rc
+ rcc .\cmpi.rc -o$@ -D_WIN32_WINNT=0x0400 -D__WXMSW__ -D__WXDEBUG__ -I$(SETUPHDIR) -I.\..\..\include -I. -I.\..\..\samples -DNOPCH -32 -v-
+
diff --git a/tools/cmpi/makefile.dms b/tools/cmpi/makefile.dms
new file mode 100755
index 000000000..2a684ca67
--- /dev/null
+++ b/tools/cmpi/makefile.dms
@@ -0,0 +1,201 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+.LONGCOMMANDLINE: dmc link lib smake
+
+!include ../../build/msw/config.dms
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+### Conditionally set variables: ###
+
+!if "$(USE_GUI)" == "0"
+PORTNAME = base
+!endif
+!if "$(USE_GUI)" == "1"
+PORTNAME = msw
+!endif
+!if "$(BUILD)" == "debug"
+!if "$(DEBUG_FLAG)" == "default"
+WXDEBUGFLAG = d
+!endif
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+WXDEBUGFLAG = d
+!endif
+!if "$(UNICODE)" == "1"
+WXUNICODEFLAG = u
+!endif
+!if "$(WXUNIV)" == "1"
+WXUNIVNAME = univ
+!endif
+!if "$(SHARED)" == "1"
+WXDLLFLAG = dll
+!endif
+!if "$(SHARED)" == "0"
+LIBTYPE_SUFFIX = lib
+!endif
+!if "$(SHARED)" == "1"
+LIBTYPE_SUFFIX = dll
+!endif
+!if "$(MONOLITHIC)" == "0"
+EXTRALIBS_FOR_BASE =
+!endif
+!if "$(MONOLITHIC)" == "1"
+EXTRALIBS_FOR_BASE =
+!endif
+!if "$(BUILD)" == "debug"
+!if "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_0 = -g
+!endif
+!endif
+!if "$(BUILD)" == "release"
+!if "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_0 =
+!endif
+!endif
+!if "$(DEBUG_INFO)" == "0"
+__DEBUGINFO_0 =
+!endif
+!if "$(DEBUG_INFO)" == "1"
+__DEBUGINFO_0 = -g
+!endif
+!if "$(BUILD)" == "debug"
+!if "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_1 = /DEBUG /CODEVIEW
+!endif
+!endif
+!if "$(BUILD)" == "release"
+!if "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_1 =
+!endif
+!endif
+!if "$(DEBUG_INFO)" == "0"
+__DEBUGINFO_1 =
+!endif
+!if "$(DEBUG_INFO)" == "1"
+__DEBUGINFO_1 = /DEBUG /CODEVIEW
+!endif
+!if "$(BUILD)" == "debug"
+__OPTIMIZEFLAG_2 = -o+none
+!endif
+!if "$(BUILD)" == "release"
+__OPTIMIZEFLAG_2 = -o
+!endif
+!if "$(RUNTIME_LIBS)" == "dynamic"
+__RUNTIME_LIBS_5 = -ND
+!endif
+!if "$(RUNTIME_LIBS)" == "static"
+__RUNTIME_LIBS_5 =
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTIFLAG_6 =
+!endif
+!if "$(USE_RTTI)" == "1"
+__RTTIFLAG_6 = -Ar
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONSFLAG_7 =
+!endif
+!if "$(USE_EXCEPTIONS)" == "1"
+__EXCEPTIONSFLAG_7 = -Ae
+!endif
+!if "$(MONOLITHIC)" == "0"
+__WXLIB_CORE_p = \
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib
+!endif
+!if "$(MONOLITHIC)" == "0"
+__WXLIB_BASE_p = \
+ wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+!if "$(MONOLITHIC)" == "1"
+__WXLIB_MONO_p = \
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib
+!endif
+!if "$(MSLU)" == "1"
+__UNICOWS_LIB_p = unicows.lib
+!endif
+!if "$(WXUNIV)" == "1"
+__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
+!endif
+!if "$(BUILD)" == "debug"
+!if "$(DEBUG_FLAG)" == "default"
+__DEBUG_DEFINE_p = -D__WXDEBUG__
+!endif
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+__DEBUG_DEFINE_p = -D__WXDEBUG__
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTI_DEFINE_p = -DwxNO_RTTI
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREAD_DEFINE_p = -DwxNO_THREADS
+!endif
+!if "$(UNICODE)" == "1"
+__UNICODE_DEFINE_p = -D_UNICODE
+!endif
+!if "$(MSLU)" == "1"
+__MSLU_DEFINE_p = -DwxUSE_UNICODE_MSLU=1
+!endif
+!if "$(SHARED)" == "1"
+__DLLFLAG_p = -DWXUSINGDLL
+!endif
+
+### Variables: ###
+
+WX_RELEASE_NODOT = 26
+OBJS = dmc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
+LIBDIRNAME = .\..\..\lib\dmc_$(LIBTYPE_SUFFIX)$(CFG)
+SETUPHDIR = $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
+IMAGE_CXXFLAGS = $(__DEBUGINFO_0) $(__OPTIMIZEFLAG_2) $(__RUNTIME_LIBS_5) -D_WIN32_WINNT=0x0400 -D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) -I$(SETUPHDIR) -I.\..\..\include -w- -I. $(__DLLFLAG_p) -WA -I.\..\..\samples -DNOPCH $(__RTTIFLAG_6) $(__EXCEPTIONSFLAG_7) $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = $(OBJS)\cmpi_cmpi.obj
+
+
+all : $(OBJS)
+$(OBJS) :
+ -if not exist $(OBJS) mkdir $(OBJS)
+
+### Targets: ###
+
+
+all : $(OBJS)\cmpi.exe data
+
+clean :
+ -if exist $(OBJS)\*.obj del $(OBJS)\*.obj
+ -if exist $(OBJS)\*.res del $(OBJS)\*.res
+ -if exist $(OBJS)\*.sym del $(OBJS)\*.sym
+ -if exist $(OBJS)\cmpi.exe del $(OBJS)\cmpi.exe
+ -if exist $(OBJS)\cmpi.map del $(OBJS)\cmpi.map
+
+$(OBJS)\cmpi.exe : $(IMAGE_OBJECTS) $(OBJS)\cmpi_cmpi.res
+ link /NOLOGO /SILENT /NOI /DELEXECUTABLE /EXETYPE:NT $(LDFLAGS) $(__DEBUGINFO_1) /su:windows:4.0 $(IMAGE_OBJECTS),$@,$(OBJS)\cmpi.map, $(LIBDIRNAME)\ $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib ,, $(OBJS)\cmpi_cmpi.res
+
+data : .\horse.pnm
+ if not exist $(OBJS) mkdir $(OBJS)
+ echo copy .\%%1 $(OBJS)\%%1 > dmars_smake_copy_data.bat
+ !dmars_smake_copy_data.bat $**
+ del dmars_smake_copy_data.bat
+
+$(OBJS)\cmpi_cmpi.obj : .\cmpi.cpp
+ $(CXX) -mn -c -cpp -o$@ $(IMAGE_CXXFLAGS) .\cmpi.cpp
+
+$(OBJS)\cmpi_cmpi.res : .\cmpi.rc
+ rcc .\cmpi.rc -o$@ -D_WIN32_WINNT=0x0400 -D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) -I$(SETUPHDIR) -I.\..\..\include -I. $(__DLLFLAG_p) -I.\..\..\samples -DNOPCH -32 -v-
diff --git a/tools/cmpi/makefile.dos b/tools/cmpi/makefile.dos
new file mode 100755
index 000000000..1f14ef122
--- /dev/null
+++ b/tools/cmpi/makefile.dos
@@ -0,0 +1,17 @@
+#
+# File: makefile.dos
+# Author: Julian Smart
+# Created: 1998
+# Updated:
+#
+# Makefile : Builds 16-bit sample, VC++ 1.5
+# Use FINAL=1 argument to nmake to build final version with no debugging
+# info
+
+WXDIR = $(WXWIN)
+
+TARGET=cmpi
+OBJECTS = $(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.msc
+
diff --git a/tools/cmpi/makefile.gcc b/tools/cmpi/makefile.gcc
new file mode 100755
index 000000000..29605c519
--- /dev/null
+++ b/tools/cmpi/makefile.gcc
@@ -0,0 +1,227 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+include ../../build/msw/config.gcc
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+### Variables: ###
+
+CPPDEPS = -MT$@ -MF$@.d -MD
+WX_RELEASE_NODOT = 26
+OBJS = \
+ gcc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
+LIBDIRNAME = .\..\..\lib\gcc_$(LIBTYPE_SUFFIX)$(CFG)
+SETUPHDIR = \
+ $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
+IMAGE_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG_2) $(__THREADSFLAG) \
+ $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \
+ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
+ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \
+ -I$(SETUPHDIR) -I.\..\..\include -W -Wall -I. $(__DLLFLAG_p) -I.\..\..\samples \
+ -DNOPCH $(__RTTIFLAG_5) $(__EXCEPTIONSFLAG_6) -Wno-ctor-dtor-privacy \
+ $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = \
+ $(OBJS)\cmpi_cmpi.o \
+ $(OBJS)\cmpi_cmpi_rc.o
+
+### Conditionally set variables: ###
+
+ifeq ($(GCC_VERSION),2.95)
+GCCFLAGS = -fvtable-thunks
+endif
+ifeq ($(USE_GUI),0)
+PORTNAME = base
+endif
+ifeq ($(USE_GUI),1)
+PORTNAME = msw
+endif
+ifeq ($(BUILD),debug)
+ifeq ($(DEBUG_FLAG),default)
+WXDEBUGFLAG = d
+endif
+endif
+ifeq ($(DEBUG_FLAG),1)
+WXDEBUGFLAG = d
+endif
+ifeq ($(UNICODE),1)
+WXUNICODEFLAG = u
+endif
+ifeq ($(WXUNIV),1)
+WXUNIVNAME = univ
+endif
+ifeq ($(SHARED),1)
+WXDLLFLAG = dll
+endif
+ifeq ($(SHARED),0)
+LIBTYPE_SUFFIX = lib
+endif
+ifeq ($(SHARED),1)
+LIBTYPE_SUFFIX = dll
+endif
+ifeq ($(MONOLITHIC),0)
+EXTRALIBS_FOR_BASE =
+endif
+ifeq ($(MONOLITHIC),1)
+EXTRALIBS_FOR_BASE =
+endif
+ifeq ($(BUILD),debug)
+__OPTIMIZEFLAG_2 = -O0
+endif
+ifeq ($(BUILD),release)
+__OPTIMIZEFLAG_2 = -O2
+endif
+ifeq ($(USE_RTTI),0)
+__RTTIFLAG_5 = -fno-rtti
+endif
+ifeq ($(USE_RTTI),1)
+__RTTIFLAG_5 =
+endif
+ifeq ($(USE_EXCEPTIONS),0)
+__EXCEPTIONSFLAG_6 = -fno-exceptions
+endif
+ifeq ($(USE_EXCEPTIONS),1)
+__EXCEPTIONSFLAG_6 =
+endif
+ifeq ($(WXUNIV),1)
+__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
+endif
+ifeq ($(WXUNIV),1)
+__WXUNIV_DEFINE_p_1 = --define __WXUNIVERSAL__
+endif
+ifeq ($(BUILD),debug)
+ifeq ($(DEBUG_FLAG),default)
+__DEBUG_DEFINE_p = -D__WXDEBUG__
+endif
+endif
+ifeq ($(DEBUG_FLAG),1)
+__DEBUG_DEFINE_p = -D__WXDEBUG__
+endif
+ifeq ($(BUILD),debug)
+ifeq ($(DEBUG_FLAG),default)
+__DEBUG_DEFINE_p_1 = --define __WXDEBUG__
+endif
+endif
+ifeq ($(DEBUG_FLAG),1)
+__DEBUG_DEFINE_p_1 = --define __WXDEBUG__
+endif
+ifeq ($(USE_EXCEPTIONS),0)
+__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
+endif
+ifeq ($(USE_EXCEPTIONS),0)
+__EXCEPTIONS_DEFINE_p_1 = --define wxNO_EXCEPTIONS
+endif
+ifeq ($(USE_RTTI),0)
+__RTTI_DEFINE_p = -DwxNO_RTTI
+endif
+ifeq ($(USE_RTTI),0)
+__RTTI_DEFINE_p_1 = --define wxNO_RTTI
+endif
+ifeq ($(USE_THREADS),0)
+__THREAD_DEFINE_p = -DwxNO_THREADS
+endif
+ifeq ($(USE_THREADS),0)
+__THREAD_DEFINE_p_1 = --define wxNO_THREADS
+endif
+ifeq ($(UNICODE),1)
+__UNICODE_DEFINE_p = -D_UNICODE
+endif
+ifeq ($(UNICODE),1)
+__UNICODE_DEFINE_p_1 = --define _UNICODE
+endif
+ifeq ($(MSLU),1)
+__MSLU_DEFINE_p = -DwxUSE_UNICODE_MSLU=1
+endif
+ifeq ($(MSLU),1)
+__MSLU_DEFINE_p_1 = --define wxUSE_UNICODE_MSLU=1
+endif
+ifeq ($(SHARED),1)
+__DLLFLAG_p = -DWXUSINGDLL
+endif
+ifeq ($(SHARED),1)
+__DLLFLAG_p_1 = --define WXUSINGDLL
+endif
+ifeq ($(MONOLITHIC),0)
+__WXLIB_CORE_p = \
+ -lwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core
+endif
+ifeq ($(MONOLITHIC),0)
+__WXLIB_BASE_p = \
+ -lwxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)
+endif
+ifeq ($(MONOLITHIC),1)
+__WXLIB_MONO_p = \
+ -lwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)
+endif
+ifeq ($(USE_GUI),1)
+__LIB_TIFF_p = -lwxtiff$(WXDEBUGFLAG)
+endif
+ifeq ($(USE_GUI),1)
+__LIB_JPEG_p = -lwxjpeg$(WXDEBUGFLAG)
+endif
+ifeq ($(USE_GUI),1)
+__LIB_PNG_p = -lwxpng$(WXDEBUGFLAG)
+endif
+ifeq ($(MSLU),1)
+__UNICOWS_LIB_p = -lunicows
+endif
+ifeq ($(BUILD),debug)
+ifeq ($(DEBUG_INFO),default)
+__DEBUGINFO = -g
+endif
+endif
+ifeq ($(BUILD),release)
+ifeq ($(DEBUG_INFO),default)
+__DEBUGINFO =
+endif
+endif
+ifeq ($(DEBUG_INFO),0)
+__DEBUGINFO =
+endif
+ifeq ($(DEBUG_INFO),1)
+__DEBUGINFO = -g
+endif
+ifeq ($(USE_THREADS),0)
+__THREADSFLAG =
+endif
+ifeq ($(USE_THREADS),1)
+__THREADSFLAG = -mthreads
+endif
+
+
+all: $(OBJS)
+$(OBJS):
+ -if not exist $(OBJS) mkdir $(OBJS)
+
+### Targets: ###
+
+all: $(OBJS)\cmpi.exe data
+
+clean:
+ -if exist $(OBJS)\*.o del $(OBJS)\*.o
+ -if exist $(OBJS)\*.d del $(OBJS)\*.d
+ -if exist $(OBJS)\cmpi.exe del $(OBJS)\cmpi.exe
+
+$(OBJS)\cmpi.exe: $(IMAGE_OBJECTS) $(OBJS)\cmpi_cmpi_rc.o
+ $(CXX) -o $@ $(IMAGE_OBJECTS) $(LDFLAGS) $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--subsystem,windows -mwindows $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32
+
+data:
+ if not exist $(OBJS) mkdir $(OBJS)
+ for %%f in (horse.pnm) do if not exist $(OBJS)\%%f copy .\%%f $(OBJS)
+
+$(OBJS)\cmpi_cmpi.o: ./cmpi.cpp
+ $(CXX) -c -o $@ $(IMAGE_CXXFLAGS) $(CPPDEPS) $<
+
+$(OBJS)\cmpi_cmpi_rc.o: ./cmpi.rc
+ windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) --include-dir $(SETUPHDIR) --include-dir ./../../include --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples --define NOPCH
+
+.PHONY: all clean data
+
+
+# Dependencies tracking:
+-include $(OBJS)/*.d
diff --git a/tools/cmpi/makefile.sc b/tools/cmpi/makefile.sc
new file mode 100755
index 000000000..4a884055e
--- /dev/null
+++ b/tools/cmpi/makefile.sc
@@ -0,0 +1,6 @@
+#Makefile from wxHatch for Symantec/Digital Mars compiler
+WXDIR=..\..
+TARGET=cmpi
+OBJECTS = $(TARGET).obj
+EXTRALIBS =
+include $(WXDIR)\src\makeprog.sc
diff --git a/tools/cmpi/makefile.unx b/tools/cmpi/makefile.unx
new file mode 100755
index 000000000..7a1c26290
--- /dev/null
+++ b/tools/cmpi/makefile.unx
@@ -0,0 +1,35 @@
+#
+# File: Makefile for samples
+# Author: Robert Roebling
+# Created: 1999
+# Updated:
+# Copyright: (c) 1998 Robert Roebling
+#
+# This makefile requires a Unix version of wxWindows
+# to be installed on your system. This is most often
+# done typing "make install" when using the complete
+# sources of wxWindows or by installing the two
+# RPM packages wxGTK.XXX.rpm and wxGTK-devel.XXX.rpm
+# under Linux.
+#
+
+CXX = $(shell wx-config --cxx)
+
+PROGRAM = cmpi
+
+OBJECTS = $(PROGRAM).o
+
+# implementation
+
+.SUFFIXES: .o .cpp
+
+.cpp.o :
+ $(CXX) -c `wx-config --cxxflags` -o $@ $<
+
+all: $(PROGRAM)
+
+$(PROGRAM): $(OBJECTS)
+ $(CXX) -o $(PROGRAM) $(OBJECTS) `wx-config --libs`
+
+clean:
+ rm -f *.o $(PROGRAM)
diff --git a/tools/cmpi/makefile.va b/tools/cmpi/makefile.va
new file mode 100755
index 000000000..71a4ead15
--- /dev/null
+++ b/tools/cmpi/makefile.va
@@ -0,0 +1,45 @@
+#
+# File: makefile.va
+# Author: David Webster
+# Created: 1999
+# Updated:
+# Copyright: (c) David Webster
+# Licence: wxWindows Licence
+#
+# Makefile : Builds sample (VisualAgeC++ V3.0, OS/2 PM)
+# Use FINAL=1 argument to nmake to build final version with no debug info.
+
+# Set WXDIR for your system
+WXDIR=$(WXWIN)
+
+!include $(WXDIR)\src\makeva.env
+
+#
+# Define which program this is and what it's path is and where to output to
+#
+PROGRAM=cmpi
+THISDIR=$(WXWIN)\samples\$(PROGRAM)
+OPATH=$(THISDIR)\$D
+
+#
+# Make sure output directory is available
+#
+!if [md $(OPATH)]
+!endif
+
+#
+# Standard definitions
+#
+PROGRC=$(THISDIR)\$(PROGRAM).rcO
+OBJECTS=$(OPATH)\$(PROGRAM).obj
+PROGRES=$(OPATH)\$(PROGRAM).res
+PROGTARGET=E:\TEMP\$(PROGRAM).exe
+
+.cpp{$OPATH}.obj:
+ @echo $<
+ icc @<<
+$(CPPFLAGS) /Fo$@ /Tp $<
+<<
+
+!include $(WXDIR)\src\makeprog.va
+
diff --git a/tools/cmpi/makefile.vc b/tools/cmpi/makefile.vc
new file mode 100755
index 000000000..23a6db51b
--- /dev/null
+++ b/tools/cmpi/makefile.vc
@@ -0,0 +1,304 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+!include <../../build/msw/config.vc>
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+### Variables: ###
+
+WX_RELEASE_NODOT = 26
+OBJS = \
+ vc_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)$(DIR_SUFFIX_CPU)
+LIBDIRNAME = .\..\..\lib\vc$(DIR_SUFFIX_CPU)_$(LIBTYPE_SUFFIX)$(CFG)
+SETUPHDIR = \
+ $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
+IMAGE_CXXFLAGS = /M$(__RUNTIME_LIBS_8)$(__DEBUGRUNTIME_3) /DWIN32 \
+ $(__DEBUGINFO_0) /Fd$(OBJS)\cmpi.pdb $(____DEBUGRUNTIME_2_p) \
+ $(__OPTIMIZEFLAG_4) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \
+ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \
+ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__MSLU_DEFINE_p) \
+ /I$(SETUPHDIR) /I.\..\..\include /W4 /I. $(__DLLFLAG_p) /D_WINDOWS \
+ /I.\..\..\samples /DNOPCH $(__RTTIFLAG_9) $(__EXCEPTIONSFLAG_10) $(CPPFLAGS) \
+ $(CXXFLAGS)
+IMAGE_OBJECTS = \
+ $(OBJS)\cmpi_cmpi.obj \
+ $(OBJS)\cmpi_cmpi.res
+
+### Conditionally set variables: ###
+
+!if "$(USE_GUI)" == "0"
+PORTNAME = base
+!endif
+!if "$(USE_GUI)" == "1"
+PORTNAME = msw
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
+WXDEBUGFLAG = d
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+WXDEBUGFLAG = d
+!endif
+!if "$(UNICODE)" == "1"
+WXUNICODEFLAG = u
+!endif
+!if "$(WXUNIV)" == "1"
+WXUNIVNAME = univ
+!endif
+!if "$(TARGET_CPU)" == "amd64"
+DIR_SUFFIX_CPU = _amd64
+!endif
+!if "$(TARGET_CPU)" == "amd64"
+DIR_SUFFIX_CPU = _amd64
+!endif
+!if "$(TARGET_CPU)" == "ia64"
+DIR_SUFFIX_CPU = _ia64
+!endif
+!if "$(TARGET_CPU)" == "ia64"
+DIR_SUFFIX_CPU = _ia64
+!endif
+!if "$(SHARED)" == "1"
+WXDLLFLAG = dll
+!endif
+!if "$(SHARED)" == "0"
+LIBTYPE_SUFFIX = lib
+!endif
+!if "$(SHARED)" == "1"
+LIBTYPE_SUFFIX = dll
+!endif
+!if "$(TARGET_CPU)" == "amd64"
+LINK_TARGET_CPU = /MACHINE:AMD64
+!endif
+!if "$(TARGET_CPU)" == "amd64"
+LINK_TARGET_CPU = /MACHINE:AMD64
+!endif
+!if "$(TARGET_CPU)" == "ia64"
+LINK_TARGET_CPU = /MACHINE:IA64
+!endif
+!if "$(TARGET_CPU)" == "ia64"
+LINK_TARGET_CPU = /MACHINE:IA64
+!endif
+!if "$(MONOLITHIC)" == "0"
+EXTRALIBS_FOR_BASE =
+!endif
+!if "$(MONOLITHIC)" == "1"
+EXTRALIBS_FOR_BASE =
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_0 = /Zi
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_0 =
+!endif
+!if "$(DEBUG_INFO)" == "0"
+__DEBUGINFO_0 =
+!endif
+!if "$(DEBUG_INFO)" == "1"
+__DEBUGINFO_0 = /Zi
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_1 = /DEBUG
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default"
+__DEBUGINFO_1 =
+!endif
+!if "$(DEBUG_INFO)" == "0"
+__DEBUGINFO_1 =
+!endif
+!if "$(DEBUG_INFO)" == "1"
+__DEBUGINFO_1 = /DEBUG
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default"
+____DEBUGRUNTIME_2_p = /D_DEBUG
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default"
+____DEBUGRUNTIME_2_p =
+!endif
+!if "$(DEBUG_RUNTIME_LIBS)" == "0"
+____DEBUGRUNTIME_2_p =
+!endif
+!if "$(DEBUG_RUNTIME_LIBS)" == "1"
+____DEBUGRUNTIME_2_p = /D_DEBUG
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default"
+____DEBUGRUNTIME_2_p_1 = /d _DEBUG
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default"
+____DEBUGRUNTIME_2_p_1 =
+!endif
+!if "$(DEBUG_RUNTIME_LIBS)" == "0"
+____DEBUGRUNTIME_2_p_1 =
+!endif
+!if "$(DEBUG_RUNTIME_LIBS)" == "1"
+____DEBUGRUNTIME_2_p_1 = /d _DEBUG
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default"
+__DEBUGRUNTIME_3 = d
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default"
+__DEBUGRUNTIME_3 =
+!endif
+!if "$(DEBUG_RUNTIME_LIBS)" == "0"
+__DEBUGRUNTIME_3 =
+!endif
+!if "$(DEBUG_RUNTIME_LIBS)" == "1"
+__DEBUGRUNTIME_3 = d
+!endif
+!if "$(BUILD)" == "debug"
+__OPTIMIZEFLAG_4 = /Od
+!endif
+!if "$(BUILD)" == "release"
+__OPTIMIZEFLAG_4 = /O2
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREADSFLAG_7 = L
+!endif
+!if "$(USE_THREADS)" == "1"
+__THREADSFLAG_7 = T
+!endif
+!if "$(RUNTIME_LIBS)" == "dynamic"
+__RUNTIME_LIBS_8 = D
+!endif
+!if "$(RUNTIME_LIBS)" == "static"
+__RUNTIME_LIBS_8 = $(__THREADSFLAG_7)
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTIFLAG_9 =
+!endif
+!if "$(USE_RTTI)" == "1"
+__RTTIFLAG_9 = /GR
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONSFLAG_10 =
+!endif
+!if "$(USE_EXCEPTIONS)" == "1"
+__EXCEPTIONSFLAG_10 = /EHsc
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0"
+__NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1"
+__NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0"
+__NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__
+!endif
+!if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1"
+__NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__
+!endif
+!if "$(WXUNIV)" == "1"
+__WXUNIV_DEFINE_p = /D__WXUNIVERSAL__
+!endif
+!if "$(WXUNIV)" == "1"
+__WXUNIV_DEFINE_p_1 = /d __WXUNIVERSAL__
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
+__DEBUG_DEFINE_p = /D__WXDEBUG__
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+__DEBUG_DEFINE_p = /D__WXDEBUG__
+!endif
+!if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default"
+__DEBUG_DEFINE_p_1 = /d __WXDEBUG__
+!endif
+!if "$(DEBUG_FLAG)" == "1"
+__DEBUG_DEFINE_p_1 = /d __WXDEBUG__
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONS_DEFINE_p = /DwxNO_EXCEPTIONS
+!endif
+!if "$(USE_EXCEPTIONS)" == "0"
+__EXCEPTIONS_DEFINE_p_1 = /d wxNO_EXCEPTIONS
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTI_DEFINE_p = /DwxNO_RTTI
+!endif
+!if "$(USE_RTTI)" == "0"
+__RTTI_DEFINE_p_1 = /d wxNO_RTTI
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREAD_DEFINE_p = /DwxNO_THREADS
+!endif
+!if "$(USE_THREADS)" == "0"
+__THREAD_DEFINE_p_1 = /d wxNO_THREADS
+!endif
+!if "$(UNICODE)" == "1"
+__UNICODE_DEFINE_p = /D_UNICODE
+!endif
+!if "$(UNICODE)" == "1"
+__UNICODE_DEFINE_p_1 = /d _UNICODE
+!endif
+!if "$(MSLU)" == "1"
+__MSLU_DEFINE_p = /DwxUSE_UNICODE_MSLU=1
+!endif
+!if "$(MSLU)" == "1"
+__MSLU_DEFINE_p_1 = /d wxUSE_UNICODE_MSLU=1
+!endif
+!if "$(SHARED)" == "1"
+__DLLFLAG_p = /DWXUSINGDLL
+!endif
+!if "$(SHARED)" == "1"
+__DLLFLAG_p_1 = /d WXUSINGDLL
+!endif
+!if "$(MONOLITHIC)" == "0"
+__WXLIB_CORE_p = \
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib
+!endif
+!if "$(MONOLITHIC)" == "0"
+__WXLIB_BASE_p = \
+ wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+!if "$(MONOLITHIC)" == "1"
+__WXLIB_MONO_p = \
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib
+!endif
+!if "$(USE_GUI)" == "1"
+__LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib
+!endif
+!if "$(MSLU)" == "1"
+__UNICOWS_LIB_p = unicows.lib
+!endif
+
+
+all: $(OBJS)
+$(OBJS):
+ -if not exist $(OBJS) mkdir $(OBJS)
+
+### Targets: ###
+
+all: $(OBJS)\cmpi.exe data
+
+clean:
+ -if exist $(OBJS)\*.obj del $(OBJS)\*.obj
+ -if exist $(OBJS)\*.res del $(OBJS)\*.res
+ -if exist $(OBJS)\*.pch del $(OBJS)\*.pch
+ -if exist $(OBJS)\cmpi.exe del $(OBJS)\cmpi.exe
+ -if exist $(OBJS)\cmpi.ilk del $(OBJS)\cmpi.ilk
+ -if exist $(OBJS)\cmpi.pdb del $(OBJS)\cmpi.pdb
+
+$(OBJS)\cmpi.exe: $(IMAGE_OBJECTS) $(OBJS)\cmpi_cmpi.res
+ link /NOLOGO /OUT:$@ $(LDFLAGS) $(__DEBUGINFO_1) $(LINK_TARGET_CPU) /LIBPATH:$(LIBDIRNAME) /SUBSYSTEM:WINDOWS @<<
+ $(IMAGE_OBJECTS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__UNICOWS_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib
+<<
+
+data:
+ if not exist $(OBJS) mkdir $(OBJS)
+ for %f in (horse.pnm) do if not exist $(OBJS)\%f copy .\%f $(OBJS)
+
+$(OBJS)\cmpi_cmpi.obj: .\cmpi.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(IMAGE_CXXFLAGS) $**
+
+$(OBJS)\cmpi_cmpi.res: .\cmpi.rc
+ rc /fo$@ /d WIN32 $(____DEBUGRUNTIME_2_p_1) $(__NO_VC_CRTDBG_p_1) /d __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) $(__MSLU_DEFINE_p_1) /i $(SETUPHDIR) /i .\..\..\include /i . $(__DLLFLAG_p_1) /d _WINDOWS /i .\..\..\samples /d NOPCH $**
+
diff --git a/tools/cmpi/makefile.wat b/tools/cmpi/makefile.wat
new file mode 100755
index 000000000..c2bc73c4e
--- /dev/null
+++ b/tools/cmpi/makefile.wat
@@ -0,0 +1,257 @@
+# =========================================================================
+# This makefile was generated by
+# Bakefile 0.2.0 (http://bakefile.sourceforge.net)
+# Do not modify, all changes will be overwritten!
+# =========================================================================
+
+!include ../../build/msw/config.wat
+
+# -------------------------------------------------------------------------
+# Do not modify the rest of this file!
+# -------------------------------------------------------------------------
+
+# Speed up compilation a bit:
+!ifdef __LOADDLL__
+! loaddll wcc wccd
+! loaddll wccaxp wccdaxp
+! loaddll wcc386 wccd386
+! loaddll wpp wppdi86
+! loaddll wppaxp wppdaxp
+! loaddll wpp386 wppd386
+! loaddll wlink wlink
+! loaddll wlib wlibd
+!endif
+
+# We need these variables in some bakefile-made rules:
+WATCOM_CWD = $+ $(%cdrive):$(%cwd) $-
+
+### Conditionally set variables: ###
+
+PORTNAME =
+!ifeq USE_GUI 0
+PORTNAME = base
+!endif
+!ifeq USE_GUI 1
+PORTNAME = msw
+!endif
+WXDEBUGFLAG =
+!ifeq BUILD debug
+!ifeq DEBUG_FLAG default
+WXDEBUGFLAG = d
+!endif
+!endif
+!ifeq DEBUG_FLAG 1
+WXDEBUGFLAG = d
+!endif
+WXUNICODEFLAG =
+!ifeq UNICODE 1
+WXUNICODEFLAG = u
+!endif
+WXUNIVNAME =
+!ifeq WXUNIV 1
+WXUNIVNAME = univ
+!endif
+WXDLLFLAG =
+!ifeq SHARED 1
+WXDLLFLAG = dll
+!endif
+LIBTYPE_SUFFIX =
+!ifeq SHARED 0
+LIBTYPE_SUFFIX = lib
+!endif
+!ifeq SHARED 1
+LIBTYPE_SUFFIX = dll
+!endif
+EXTRALIBS_FOR_BASE =
+!ifeq MONOLITHIC 0
+EXTRALIBS_FOR_BASE =
+!endif
+!ifeq MONOLITHIC 1
+EXTRALIBS_FOR_BASE =
+!endif
+__DEBUGINFO_0 =
+!ifeq BUILD debug
+!ifeq DEBUG_INFO default
+__DEBUGINFO_0 = -d2
+!endif
+!endif
+!ifeq BUILD release
+!ifeq DEBUG_INFO default
+__DEBUGINFO_0 = -d0
+!endif
+!endif
+!ifeq DEBUG_INFO 0
+__DEBUGINFO_0 = -d0
+!endif
+!ifeq DEBUG_INFO 1
+__DEBUGINFO_0 = -d2
+!endif
+__DEBUGINFO_1 =
+!ifeq BUILD debug
+!ifeq DEBUG_INFO default
+__DEBUGINFO_1 = debug all
+!endif
+!endif
+!ifeq BUILD release
+!ifeq DEBUG_INFO default
+__DEBUGINFO_1 =
+!endif
+!endif
+!ifeq DEBUG_INFO 0
+__DEBUGINFO_1 =
+!endif
+!ifeq DEBUG_INFO 1
+__DEBUGINFO_1 = debug all
+!endif
+__OPTIMIZEFLAG_2 =
+!ifeq BUILD debug
+__OPTIMIZEFLAG_2 = -od
+!endif
+!ifeq BUILD release
+__OPTIMIZEFLAG_2 = -ot -ox
+!endif
+__THREADSFLAG_5 =
+!ifeq USE_THREADS 0
+__THREADSFLAG_5 =
+!endif
+!ifeq USE_THREADS 1
+__THREADSFLAG_5 = -bm
+!endif
+__RUNTIME_LIBS_6 =
+!ifeq RUNTIME_LIBS dynamic
+__RUNTIME_LIBS_6 = -br
+!endif
+!ifeq RUNTIME_LIBS static
+__RUNTIME_LIBS_6 =
+!endif
+__RTTIFLAG_7 =
+!ifeq USE_RTTI 0
+__RTTIFLAG_7 =
+!endif
+!ifeq USE_RTTI 1
+__RTTIFLAG_7 = -xr
+!endif
+__EXCEPTIONSFLAG_8 =
+!ifeq USE_EXCEPTIONS 0
+__EXCEPTIONSFLAG_8 =
+!endif
+!ifeq USE_EXCEPTIONS 1
+__EXCEPTIONSFLAG_8 = -xs
+!endif
+__WXLIB_CORE_p =
+!ifeq MONOLITHIC 0
+__WXLIB_CORE_p = &
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib
+!endif
+__WXLIB_BASE_p =
+!ifeq MONOLITHIC 0
+__WXLIB_BASE_p = &
+ wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+__WXLIB_MONO_p =
+!ifeq MONOLITHIC 1
+__WXLIB_MONO_p = &
+ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib
+!endif
+__LIB_TIFF_p =
+!ifeq USE_GUI 1
+__LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib
+!endif
+__LIB_JPEG_p =
+!ifeq USE_GUI 1
+__LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib
+!endif
+__LIB_PNG_p =
+!ifeq USE_GUI 1
+__LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib
+!endif
+__WXUNIV_DEFINE_p =
+!ifeq WXUNIV 1
+__WXUNIV_DEFINE_p = -d__WXUNIVERSAL__
+!endif
+__DEBUG_DEFINE_p =
+!ifeq BUILD debug
+!ifeq DEBUG_FLAG default
+__DEBUG_DEFINE_p = -d__WXDEBUG__
+!endif
+!endif
+!ifeq DEBUG_FLAG 1
+__DEBUG_DEFINE_p = -d__WXDEBUG__
+!endif
+__EXCEPTIONS_DEFINE_p =
+!ifeq USE_EXCEPTIONS 0
+__EXCEPTIONS_DEFINE_p = -dwxNO_EXCEPTIONS
+!endif
+__RTTI_DEFINE_p =
+!ifeq USE_RTTI 0
+__RTTI_DEFINE_p = -dwxNO_RTTI
+!endif
+__THREAD_DEFINE_p =
+!ifeq USE_THREADS 0
+__THREAD_DEFINE_p = -dwxNO_THREADS
+!endif
+__UNICODE_DEFINE_p =
+!ifeq UNICODE 1
+__UNICODE_DEFINE_p = -d_UNICODE
+!endif
+__DLLFLAG_p =
+!ifeq SHARED 1
+__DLLFLAG_p = -dWXUSINGDLL
+!endif
+
+### Variables: ###
+
+WX_RELEASE_NODOT = 26
+OBJS = &
+ wat_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WXDLLFLAG)$(CFG)
+LIBDIRNAME = .\..\..\lib\wat_$(LIBTYPE_SUFFIX)$(CFG)
+SETUPHDIR = &
+ $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)
+IMAGE_CXXFLAGS = $(__DEBUGINFO_0) $(__OPTIMIZEFLAG_2) $(__THREADSFLAG_5) &
+ $(__RUNTIME_LIBS_6) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) &
+ $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) &
+ $(__UNICODE_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\..\include -wx -wcd=549 &
+ -wcd=656 -wcd=657 -wcd=667 -i=. $(__DLLFLAG_p) -i=.\..\..\samples -dNOPCH &
+ $(__RTTIFLAG_7) $(__EXCEPTIONSFLAG_8) $(CPPFLAGS) $(CXXFLAGS)
+IMAGE_OBJECTS = &
+ $(OBJS)\cmpi_cmpi.obj
+
+
+all : $(OBJS)
+$(OBJS) :
+ -if not exist $(OBJS) mkdir $(OBJS)
+
+### Targets: ###
+
+all : .SYMBOLIC $(OBJS)\cmpi.exe data
+
+clean : .SYMBOLIC
+ -if exist $(OBJS)\*.obj del $(OBJS)\*.obj
+ -if exist $(OBJS)\*.res del $(OBJS)\*.res
+ -if exist $(OBJS)\*.lbc del $(OBJS)\*.lbc
+ -if exist $(OBJS)\*.ilk del $(OBJS)\*.ilk
+ -if exist $(OBJS)\*.pch del $(OBJS)\*.pch
+ -if exist $(OBJS)\cmpi.exe del $(OBJS)\cmpi.exe
+
+$(OBJS)\cmpi.exe : $(IMAGE_OBJECTS) $(OBJS)\cmpi_cmpi.res
+ @%create $(OBJS)\cmpi.lbc
+ @%append $(OBJS)\cmpi.lbc option quiet
+ @%append $(OBJS)\cmpi.lbc name $^@
+ @%append $(OBJS)\cmpi.lbc option caseexact
+ @%append $(OBJS)\cmpi.lbc $(LDFLAGS) $(__DEBUGINFO_1) libpath $(LIBDIRNAME) system nt_win ref '_WinMain@16'
+ @for %i in ($(IMAGE_OBJECTS)) do @%append $(OBJS)\cmpi.lbc file %i
+ @for %i in ( $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib ) do @%append $(OBJS)\cmpi.lbc library %i
+ @%append $(OBJS)\cmpi.lbc option resource=$(OBJS)\cmpi_cmpi.res
+ @for %i in () do @%append $(OBJS)\cmpi.lbc option stack=%i
+ wlink @$(OBJS)\cmpi.lbc
+
+data : .SYMBOLIC
+ if not exist $(OBJS) mkdir $(OBJS)
+ for %f in (horse.pnm) do if not exist $(OBJS)\%f copy .\%f $(OBJS)
+
+$(OBJS)\cmpi_cmpi.obj : .AUTODEPEND .\cmpi.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(IMAGE_CXXFLAGS) $<
+
+$(OBJS)\cmpi_cmpi.res : .AUTODEPEND .\cmpi.rc
+ wrc -q -ad -bt=nt -r -fo=$^@ -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\..\include -i=. $(__DLLFLAG_p) -i=.\..\..\samples -dNOPCH $<
+
diff --git a/tools/colorcirc.xps b/tools/colorcirc.xps
new file mode 100644
index 000000000..991248aed
--- /dev/null
+++ b/tools/colorcirc.xps
Binary files differ
diff --git a/tools/docov.pl b/tools/docov.pl
new file mode 100755
index 000000000..a265cf2af
--- /dev/null
+++ b/tools/docov.pl
@@ -0,0 +1,129 @@
+#!/usr/bin/perl -w
+
+# script to see if new test files increase code coverage.
+
+# compile code with gcc options -fprofile-arcs -ftest-coverage.
+# place baseline and candidate test in the relative subdirectories oldtests
+# and newtests repectively.
+# run this script.
+
+use FILE::Find;
+use strict;
+
+# old and new test file locations (relative, recursive, can be sym
+# links).
+my $baseline_tests='oldtests';
+my $testcase_candidates='newtests';
+
+# subdir of all covered files (recursive)
+my $cfiles="../../";
+
+# hash - key is c file covered, value percent coverage.
+my %baseline_coverage=();
+my %new_tests_plus_baseline_coverage=();
+
+# file to hold %baseline_coverage.
+my $base="baseline.txt";
+
+# commands to run on test files.
+my @args= ( ["./pcl6", "-n", "-sDEVICE=ppmraw", "-sOutputFile=/dev/null", "-r300", "-dNOPAUSE" ],
+ ["./pcl6", "-n", "-sDEVICE=pbmraw", "-sOutputFile=/dev/null", "-r300", "-dNOPAUSE" ], );
+
+
+# parse gcov output
+sub get_coverage_for_a_source_file {
+ my $test = shift(@_);
+ my $source_file; my $percent;
+ open (PIPE, "gcov $test 2>&1|") || die "gcov pipe failed $!";
+ while (<PIPE>) {
+ if (/^File \'(.*)\'/) { $source_file = $1; }
+ if (/^Lines executed:(\d+\.\d+)\%/) { $percent = $1; }
+ }
+ return ($source_file, $percent);
+}
+
+sub clear_coverage {
+ # yikes
+ unlink glob("*.gcov");
+ unlink glob("*.gcda");
+}
+
+sub print_coverage_increase {
+ my $test_file = shift(@_);
+ my $total = 0;
+ while (my($f, $p) = each(%baseline_coverage)) {
+ exists $new_tests_plus_baseline_coverage{$f} ||
+ die "internal error: regenerate baseline with recompiled code\n";
+ my $np = $new_tests_plus_baseline_coverage{$f};
+ if ( $np > $p ) {
+ print "test file: $test_file caused coverage increase for $f increased from $p to $np\n";
+ $total++;
+ }
+ }
+ print "test file: $test_file changed coverage for $total files\n";
+}
+
+sub proc_new_coverage {
+ if (/^.*\.c\z/s) {
+ my $cf = $File::Find::name;
+ print "$cf\r";
+ my($f, $p) = get_coverage_for_a_source_file $cf;
+ $new_tests_plus_baseline_coverage{$f} = $p if (defined($f) && defined($p));
+ }
+}
+
+sub proc_run_tests {
+ if (-f $_) {
+ my $f = $File::Find::name;
+ map(print("@$_ $f\n"), @args);
+ map(system(@$_, $f), @args);
+ }
+}
+
+sub proc_run_new_tests {
+ if (-f $_) {
+ my $f = $File::Find::name;
+ clear_coverage;
+ map(print("@$_ $f\n"), @args);
+ map(system(@$_, $f), @args);
+ File::Find::find({ wanted => \&proc_new_coverage, no_chdir => 1 }, $cfiles);
+ print_coverage_increase $f;
+
+ }
+}
+
+sub proc_baseline_coverage {
+ if (/^.*\.c\z/s) {
+ print "$File::Find::name\r";
+ my($s, $p) = get_coverage_for_a_source_file $File::Find::name;
+ print(BASE "$s $p\n") if (defined($s) && defined($p));
+ }
+}
+
+
+sub build_baseline {
+ open(BASE, ">>$base");
+ File::Find::find({ wanted => \&proc_run_tests, no_chdir => 1 }, $baseline_tests);
+ File::Find::find({ wanted => \&proc_baseline_coverage, no_chdir => 1 }, $cfiles);
+ close(BASE);
+}
+
+sub do_new_tests {
+ File::Find::find({ wanted => \&proc_run_new_tests, no_chdir => 1 }, $testcase_candidates);
+}
+
+build_baseline unless (-e $base);
+
+open(BASE, $base) || die "open (BASELINE, $base)";
+
+# read the baseline
+%baseline_coverage=();
+while (<BASE>) {
+ chomp;
+ my ($source_file, $percent) = split(/ /);
+ $baseline_coverage{$source_file} = $percent;
+}
+
+close(BASE);
+
+do_new_tests;
diff --git a/tools/fills.pcl b/tools/fills.pcl
new file mode 100644
index 000000000..1fa8e67f5
--- /dev/null
+++ b/tools/fills.pcl
@@ -0,0 +1 @@
+%-12345X*c3G*c180H&a0p720v720H*c180v3P&a90p720v720H*c360v3P&a180p720v720H*c540v3P&a270p720v720H*c720v3P%-12345X \ No newline at end of file
diff --git a/tools/fontpage.pcl b/tools/fontpage.pcl
new file mode 100644
index 000000000..720d407eb
--- /dev/null
+++ b/tools/fontpage.pcl
@@ -0,0 +1 @@
+A \ No newline at end of file
diff --git a/tools/fonts.pcl b/tools/fonts.pcl
new file mode 100644
index 000000000..abb25e846
--- /dev/null
+++ b/tools/fonts.pcl
Binary files differ
diff --git a/tools/fonts.pxl b/tools/fonts.pxl
new file mode 100644
index 000000000..c95b3a6bf
--- /dev/null
+++ b/tools/fonts.pxl
Binary files differ
diff --git a/tools/frs96.pxl b/tools/frs96.pxl
new file mode 100644
index 000000000..a92baabf2
--- /dev/null
+++ b/tools/frs96.pxl
Binary files differ
diff --git a/tools/gl-chars.pcl b/tools/gl-chars.pcl
new file mode 100644
index 000000000..7bce6c7ac
--- /dev/null
+++ b/tools/gl-chars.pcl
Binary files differ
diff --git a/tools/gl2_chars.pl b/tools/gl2_chars.pl
new file mode 100644
index 000000000..2c1d4a909
--- /dev/null
+++ b/tools/gl2_chars.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/env perl -w
+
+# these can be changed.
+$chars_per_line=4;
+$lines_per_page=5;
+
+$font_size_plu=(2 * 1016);
+
+# height and width of paper in gl/2 plotter units minus enough for
+# fonts.
+$plu_height=(1016 * 11) - $font_size_plu;
+$plu_width=(1016 * 8.5) - $font_size_plu;
+
+# use this if control character should print associated character and
+# not perform their associated funtion.
+$transparent_data_command="TD1;";
+
+# uncomment first scale command a comment the second for stick font.
+# Comment first scale command and uncomment the second for arc fonts.
+# stick font pitch 3 characters per inch
+
+# the 2,0 selection fixed space 3,.5 select 1/2 char per inch.
+#$scale_command="SD2,0,3,.5";
+#$scale_command="SD2,0,3,.5";
+# the 2,1 select proportion 4 selects font height
+$scale_command="SD2,1,4,144;";
+# $scale_command="SD4,144,2,1,7,4101;";
+
+# stroke weight - use the 9999 weight value to take on the current pen
+# width
+$stroke_weight="SD6,9999;";
+#$stroke_weight="";
+# the rest should not need to be changed.
+$line_height=$plu_height/$lines_per_page;
+$col_width=$plu_width/$chars_per_line;
+
+# draw a plus sign - used at the origin of each character
+$horizontal_tick="PA;PD;PW1;PR-4,0,8,0,-4,0;PW0;PA;";
+$vertical_tick="PA;PD;PW1;PR0,-4,0,8,0,-4;PW0;PA;";
+
+$header="\033E\033%1BINSP1;PW0;$scale_command$transparent_data_command$stroke_weight";
+$trailer="\033%1A\033E";
+
+for( $sym=32; $sym < 256; $sym++ ) {
+ # calculate position
+ $line = int( ($sym-32) / $chars_per_line );
+ $ypos = $plu_height - (( $line % $lines_per_page ) * $line_height);
+ $xpos = (($sym-32) % $chars_per_line) * $col_width;
+
+ if ( (($sym-32) % ($lines_per_page * $chars_per_line)) == 0 ) {
+ # don't need a trailer on the first page.
+ if ( ($sym-32) != 0 ) {
+ print $trailer;
+ }
+ print $header;
+ }
+ # print the tick marks and character
+ print "PU$xpos,$ypos;$horizontal_tick,$vertical_tick";
+ printf "LB%c\003", $sym;
+}
+
+# done - no harm if printed twice
+print $trailer
diff --git a/tools/grashopp.pcl b/tools/grashopp.pcl
new file mode 100644
index 000000000..f87db8d4a
--- /dev/null
+++ b/tools/grashopp.pcl
@@ -0,0 +1,8 @@
+%-12345X@PJL COMMENT HP LaserJet 5P/5MP Driver
+@PJL COMMENT1.01
+@PJL DEFAULT MPTRAY=FIRST
+%-12345X@PJL SET RESOLUTION=600
+@PJL SET PAGEPROTECT=AUTO
+@PJL ENTER LANGUAGE=PCL
+%0AE&u600D%0BSP1TR0LA1,4,2,1WU0PW0UL2,12.5,12.5,12.5,12.5,12.5,12.5,12.5,12.5;UL5,40,25,10,25;UL6,35,15,10,15,10,15;LT0,8.5,1LT%0A&l1X&l7H&l1o2a1e48F*r0F*p0x0Y*c7623x5876Y*c0T*t600R%0BPUIP0,0,1016,1016;SC0,600,0,600MC1,90PE=<kuÁOÒ;PM0PELcÁ¿KcÁ¿;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁAÔ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁsÕ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁe×;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁWÙ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁIÛ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁ}Ü;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<kuÁoÞ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FT11,1FPPE=<kuÁaà;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FT11,2FPPE=<kuÁUâ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁGä;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁyå;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁkç;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ]é;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁOë;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<kuÁCí;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FT11,2FPPE=<kuÁuî;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FT11,3FPPE=<kuÁgð;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁYò;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁKô;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ}õ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁq÷;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁcù;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<kuÁUû;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁIý;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ{þ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁm@À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ_BÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁQDÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁCFÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁwGÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<kuÁiIÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ[KÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁMMÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ?OÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁsPÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁeRÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁWTÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁIVÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<kuÁ{WÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁmYÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁa[À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁS]À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁE_À;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁy`À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁkbÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ]dÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<kuÁOfÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁAhÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁsiÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁgkÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁYmÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁKoÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ}pÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁorÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<kuÁatÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁUvÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁGxÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁyyÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁm{À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ_}À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁQ?Á;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁCAÁ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁuBÁ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<kuÁiDÁ;PM0PELcÁ¿KcÁ¿;PM1PE;PM2FPMC1,240PE=<aÑgDÁ;PM0PEGcÁ¿¿VqÀHcÁ¿¿UqÀ;PM2FTFPMC1,90PE=<kuÁOÒ;PM0PELcÁ¿KcÁ¿;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁAÔ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁsÕ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁe×;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁWÙ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁIÛ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁ}Ü;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<kuÁoÞ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FT11,2FPPE=<kuÁaà;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FT11,3FPPE=<kuÁUâ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁGä;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁyå;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁkç;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ]é;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁOë;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<kuÁCí;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FT11,3FPPE=<kuÁuî;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FT11,4FPPE=<kuÁgð;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁYò;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁKô;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ}õ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁq÷;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁcù;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<kuÁUû;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁIý;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ{þ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁm@À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ_BÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁQDÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁCFÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁwGÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,6FPPE=<kuÁiIÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ[KÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁMMÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ?OÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁsPÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁeRÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁWTÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁIVÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<kuÁ{WÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁmYÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁa[À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁS]À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁE_À;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁy`À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁkbÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ]dÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<kuÁOfÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁAhÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁsiÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁgkÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁYmÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁKoÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ}pÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁorÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<kuÁatÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁUvÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁGxÀ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁyyÀ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2FPPE=<kuÁm{À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁ_}À;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁQ?Á;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁCAÁ;PM0PELcÁ¿¿qÀKcÁ¿¿rÀ;PM2FPPE=<kuÁuBÁ;PM0PELcÁ¿¿sÀKcÁ¿¿tÀ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<kuÁiDÁ;PM0PELcÁ¿KcÁ¿;PM1PE;PM2FPMC1,240PE=<OFÀKý;PM0PEÎîÐîÒîÒìÔîÔìÔêÔîÖìÔìÔìÖìÔîÒîÒîÐðÓÊÍÌÉÌÇÌÇÌËÌÍÌÓÈÉ÷ËùÏ÷Ñ÷ÓõÕ÷×õ×óÙóÙõÛóÛõÛóÙóÛõÙóÚÆÖÆÒÈÒÆÒÆÒÆÔÈÚÆ;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<}EÀmû;PM0PEÈÆÈÆÊÆÈÄÊÆÈÆÊÆÈÆÇÁÉÃÅÁÇÁÉÁÇÃÅÁÉÁÌØÌØÌÚÌØÌÚÊÚÌØÌÚÎÆÌÊÌÈÌÈÎÈÎÈÌÊÌÆÍÅÍÃËÅËÁÍÃËÃËÁËÃÈÊÆÊÆÌÈÈÈÌÆÊÈÊÆÊÎÂÎÄÌÄÎÆÎÆÎÆÎÆÌÆËÃÍÁÍÁÍÁËÁÍ¿ËÁÍ¿ÄÈÆÈÄÈÆÈÆÈÄÊÄÈÆÈÎÂÎÆÎÆÐÆÎÆÎÈÎÆÎÈÑÅÑÃÍÁÏÁË¿ÍÁË¿ÏÃÆÊÄÈÆÈÆÈÄÊÄÈÆÈÆÊÐÂÎÄÎÈÎÊÎÊÎÊÎÊÎÈÏÃÏÃÏÃÏÅÏÃÏÃÍÃÏÃÍáÍãÍáÍãËáÏáËãÍãÍáÍãÍáËáÏãËáÍãÍá;PM2FPPE=<_FÀAú;PM0PEÁÎÁÎÃÌÁÎÁÎÃοÐÄÎÂÉÄÉÂÉÂËÄÇÂËÂÉÄÉÐâÐäÎâÐäÎâÐäÐâÐäÅÎÃÎÃÎÁÌÁÐÁοÌÃÐÆËÄÍÄËÄËÆÍÄËÄËÄËÇÓÉÓÇÓÉÓÇÓÉÓÉÓÇÕÉÓÉÓÇÓÉÓÇÓÉÓÇÓÉÓ;PM2FPMC1,90PE=<OjÁ_wÀ;PM0PE¿|Æ¿{Æ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<qiÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<QiÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<shÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ShÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<sgÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<UgÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ufÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<UfÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<ueÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<WeÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<wdÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<YdÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ycÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<YcÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<{bÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<[bÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FT11,2FPPE=<{aÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<[aÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<}`Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<]`Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<?`Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<__Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<?_Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<_^Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FT11,1FPPE=<A^Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<a]Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<A]Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<c\Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<C\Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<e[Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<E[Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<eZÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<EZÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FT11,8FPPE=<gYÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<GYÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<gXÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<IXÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<iWÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<KWÁ_wÀ;PM0PE¿|Æâ¿¿{Æá¿;PM2FPPE=<iVÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<KVÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FT11,7FPPE=<kUÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<MUÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<mTÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<MTÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<oSÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<OSÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<oRÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ORÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FT11,6FPPE=<qQÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<QQÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<sPÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<SPÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<sOÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<UOÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<uNÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<UNÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FPPE=<uMÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<WMÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<wLÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<YLÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<yKÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<YKÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<yJÁ_wÀ;PM0PE¿|Æ¿{Æ;PM1PE;PM2FPMC1,240PE=<{JÁAuÀ;PM0PEwÀÄqÀÄiÀÂaÀ¿]À¿UÀÂOÀÁKÀ¿EÀ¿AÀ¿ý¿ùÂ÷ÂóÂñÂíÄíÆëÆéÈéÈéÌéÎëÐéÒíÒíØïØñÜõà÷âûæAÀèúßöåòéòíðíðíðïòëôçöåüß@ÀÙDÀÏLÀÉTÀÂZÀÌBÀÈBÀÊBÀÈBÀÈBÀÊ@ÀÊBÀÈBÀÊBÀÈ@ÀÊBÀÊBÀÈBÀÈBÀÊ@ÀÈBÀÈ;PM2FTFPMC1,90PE=<OjÁ_wÀ;PM0PE¿|Æ¿{Æ;PM1PE;PM2FT11,4FPPM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<qiÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<QiÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<shÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ShÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<sgÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<UgÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ufÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<UfÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FT11,5FPPE=<ueÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<WeÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<wdÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<YdÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ycÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<YcÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<{bÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<[bÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FT11,2FPPE=<{aÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<[aÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<}`Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<]`Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<?`Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<__Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<?_Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<_^Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FT11,1FPPE=<A^Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<a]Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<A]Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<c\Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<C\Á_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<e[Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<E[Á_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<eZÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<EZÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FT11,8FPPE=<gYÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<GYÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<gXÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<IXÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<iWÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<KWÁ_wÀ;PM0PE¿|Æâ¿¿{Æá¿;PM2FPPE=<iVÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<KVÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FT11,7FPPE=<kUÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<MUÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<mTÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<MTÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<oSÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<OSÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<oRÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<ORÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FPPE=<qQÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<QQÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<sPÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<SPÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<sOÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<UOÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<uNÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<UNÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FT11,6FPPE=<uMÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<WMÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<wLÁ_wÀ;PM0PE¿|ÆÞ¿¿{ÆÝ¿;PM2FPPE=<YLÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<yKÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<YKÁ_wÀ;PM0PE¿|Æà¿¿{Æß¿;PM2FPPE=<yJÁ_wÀ;PM0PE¿|Æ¿{Æ;PM1PE;PM2FPMC1,240PE=<AKÁAuÀ;PM0PEPÀÐTÀÒTÀÔXÀÔZÀÖZÀÖZÀÚZÀÚ\ÀÜ\ÀÜZÀàZÀâXÀäXÀäVÀèTÀêRÀìNÀîJÀðHÀôFÀô@ÀúüüøüòBÀîDÀèFÀâJÀÜNÀÔPÀÐRÀÆXÀÃÔÅÐÉÌÍÆËÈÍÆÍÈÍÊÍÐÑÒÕÔÑØÑÚÍÚÉÚÁÜËÁÑÍÕ×ÝÛÝÝãÛåÕéËáÅ×ÅÍÉÉÏÁÙÃãÃñÇCÀÝWÀåSÀéQÀïKÀõIÀûEÀ?ÀAÀCÀ?ÀIÀûKÀùQÀ÷UÀñWÀñYÀï]Àë_ÀéaÀécÀåeÀãeÀãgÀágÀßiÀÝgÀÝiÀÝgÀÛgÀÙgÀÛcÀÙcÀÙaÀÙ_ÀÙBÀÈBÀÊBÀÈ@ÀÆBÀÈBÀÈBÀÈBÀÆBÀÈBÀÈBÀÊBÀÈBÀÌ@ÀÊBÀÊBÀÎ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,8FPMC1,90PE=<ykÀU\À;PM0PEfÃ?ÇÑÉgÃ~ÆÔÌ;PM2FT11,2FPPE=<MlÀa\À;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<alÀm\À;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<ulÀy\À;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<KmÀE]À;PM0PEhÃ}ÆÓËgÃ@ÇÔÊ;PM2FPPE=<_mÀO]À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<smÀ[]À;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<GnÀg]À;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<[nÀs]À;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FT11,1FPPE=<qnÀ?^À;PM0PEhÃ?ÇÓÉgÃ~ÆÔÌ;PM2FPPE=<EoÀK^À;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<YoÀW^À;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<moÀc^À;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<ApÀo^À;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<WpÀ{^À;PM0PEhÃ}ÆÓËgÃ@ÇÔÊ;PM2FPPE=<kpÀE_À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<?qÀQ_À;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<SqÀ]_À;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FPPE=<gqÀi_À;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FPPE=<}qÀu_À;PM0PEhÃ?ÇÓÉgÃ@ÇÔÊ;PM2FPPE=<QrÀ?`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<erÀK`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<yrÀW`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<MsÀc`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<asÀo`À;PM0PEhÃ?ÇÕÉeÃ~ÆÔÌ;PM2FPPE=<usÀ{`À;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<ItÀGaÀ;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<_tÀSaÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<stÀ_aÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<GuÀkaÀ;PM0PEhÃ}ÆÕËeÃ@ÇÔÊ;PM2FPPE=<[uÀuaÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<ouÀAbÀ;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FPPE=<EvÀMbÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<YvÀYbÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FT11,7FPPE=<mvÀebÀ;PM0PEhÃ?ÇÕÉeÃ~ÆÔÌ;PM2FPPE=<AwÀqbÀ;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<UwÀ}bÀ;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<kwÀIcÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<?xÀUcÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<SxÀacÀ;PM0PEhÃ}ÆÕËeÃ@ÇÔÊ;PM2FPPE=<gxÀkcÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<{xÀwcÀ;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FT11,6FPPE=<QyÀCdÀ;PM0PEhÃ?ÇÓËeÃ@ÇÒÌ;PM2FPPE=<cyÀOdÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<wyÀ[dÀ;PM0PEfÃ?ÇÓÉgÃ@ÇÖÊ;PM2FPPE=<MzÀedÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<azÀqdÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<uzÀ}dÀ;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<I{ÀIeÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<]{ÀUeÀ;PM0PEfÃ?ÇÓÉgÃ~ÆÖÌ;PM2FPPE=<s{ÀaeÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<G|ÀmeÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<[|ÀyeÀ;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<o|ÀEfÀ;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<C}ÀQfÀ;PM0PEfÃ}ÆÓËgÃ@ÇÖÊ;PM2FPPE=<Y}À[fÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<m}ÀgfÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<A~ÀsfÀ;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<U~À?gÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<i~ÀKgÀ;PM0PEfÃ?ÇÓÉgÃ~ÆÖÌ;PM2FT11,8FPPE=<??ÁWgÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<S?ÁcgÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<g?ÁogÀ;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<{?Á{gÀ;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPMC1,240PE=<_kÀs]À;PM0PEã[Àë_Àó]Àù[À?À[ÀCÀYÀGÀUÀIÀOÀIÀMÀIÀEÀEÀ?ÀEÀùAÀïùçóÝíÓÇÂË¿É¿ÇÂÉÂË¿ÇÂÉ¿TÀìNÀòHÀøBÀ@À@ÀFÀúJÀøLÀôPÀôTÀòTÀòTÀòTÀôTÀôPÀøNÀúLÀÎÅÎÅÌÃÌÅÎÅÎÅÌÅÎÅ;PM2FTFPMC1,90PE=<ykÀU\À;PM0PEfÃ?ÇÑÉgÃ~ÆÔÌ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<MlÀa\À;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<alÀm\À;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<ulÀy\À;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<KmÀE]À;PM0PEhÃ}ÆÓËgÃ@ÇÔÊ;PM2FPPE=<_mÀO]À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<smÀ[]À;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<GnÀg]À;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<[nÀs]À;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<qnÀ?^À;PM0PEhÃ?ÇÓÉgÃ~ÆÔÌ;PM2FPPE=<EoÀK^À;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<YoÀW^À;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<moÀc^À;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<ApÀo^À;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<WpÀ{^À;PM0PEhÃ}ÆÓËgÃ@ÇÔÊ;PM2FPPE=<kpÀE_À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<?qÀQ_À;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<SqÀ]_À;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FT11,1FPPE=<gqÀi_À;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FPPE=<}qÀu_À;PM0PEhÃ?ÇÓÉgÃ@ÇÔÊ;PM2FPPE=<QrÀ?`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<erÀK`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<yrÀW`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<MsÀc`À;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<asÀo`À;PM0PEhÃ?ÇÕÉeÃ~ÆÔÌ;PM2FPPE=<usÀ{`À;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FT11,2FPPE=<ItÀGaÀ;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<_tÀSaÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<stÀ_aÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<GuÀkaÀ;PM0PEhÃ}ÆÕËeÃ@ÇÔÊ;PM2FPPE=<[uÀuaÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<ouÀAbÀ;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FPPE=<EvÀMbÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<YvÀYbÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FT11,7FPPE=<mvÀebÀ;PM0PEhÃ?ÇÕÉeÃ~ÆÔÌ;PM2FPPE=<AwÀqbÀ;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<UwÀ}bÀ;PM0PEfÃ}ÆÓËgÃ~ÆÖÌ;PM2FPPE=<kwÀIcÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<?xÀUcÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<SxÀacÀ;PM0PEhÃ}ÆÕËeÃ@ÇÔÊ;PM2FPPE=<gxÀkcÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<{xÀwcÀ;PM0PEfÃ?ÇÓËgÃ@ÇÖÌ;PM2FT11,6FPPE=<QyÀCdÀ;PM0PEhÃ?ÇÓËeÃ@ÇÒÌ;PM2FPPE=<cyÀOdÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<wyÀ[dÀ;PM0PEfÃ?ÇÓÉgÃ@ÇÖÊ;PM2FPPE=<MzÀedÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<azÀqdÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<uzÀ}dÀ;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<I{ÀIeÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<]{ÀUeÀ;PM0PEfÃ?ÇÓÉgÃ~ÆÖÌ;PM2FPPE=<s{ÀaeÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<G|ÀmeÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FT11,3FPPE=<[|ÀyeÀ;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<o|ÀEfÀ;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPPE=<C}ÀQfÀ;PM0PEfÃ}ÆÓËgÃ@ÇÖÊ;PM2FPPE=<Y}À[fÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<m}ÀgfÀ;PM0PEhÃ?ÇÓËgÃ@ÇÔÌ;PM2FPPE=<A~ÀsfÀ;PM0PEhÃ?ÇÕËeÃ@ÇÔÌ;PM2FPPE=<U~À?gÀ;PM0PEfÃ?ÇÓËeÃ@ÇÔÌ;PM2FPPE=<i~ÀKgÀ;PM0PEfÃ?ÇÓÉgÃ~ÆÖÌ;PM2FT11,8FPPE=<??ÁWgÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<S?ÁcgÀ;PM0PEhÃ}ÆÓËgÃ~ÆÔÌ;PM2FPPE=<g?ÁogÀ;PM0PEhÃ}ÆÕËeÃ~ÆÔÌ;PM2FPPE=<{?Á{gÀ;PM0PEfÃ}ÆÓËeÃ~ÆÔÌ;PM2FPMC1,240PE=<]kÀM]À;PM0PEÅ]ÀÅ]ÀÅ[ÀÃ]ÀÅ]ÀÅ[ÀÅ]ÀÅ[ÀÅ]ÀÅ[ÀÅ[ÀÅ]ÀÅ[ÀÇ]ÀÅ[ÀÇ[ÀÅ[ÀÇ[ÀÇ[ÀÇ[ÀÇ[ÀÉ]ÀÇ[ÀÉ[ÀÇ[ÀË[ÀÉ[ÀË[ÀË[ÀË[ÀË[ÀË[ÀË¿ËÂË¿ËÂË¿ËÂË¿ËÂÌ^ÀÌ\ÀÌ^ÀÊ\ÀÌ\ÀÊ^ÀÊ\ÀÊ^ÀÈ\ÀÊ\ÀÈ\ÀÊ^ÀÈ\ÀÆ^ÀÈ\ÀÈ\ÀÆ\ÀÈ\ÀÆ^ÀÆ\ÀÆ\ÀÆ\ÀÄ\ÀÆ^ÀÆZÀÄ\ÀÄ^ÀÄZÀÆ\ÀÂ\ÀÆ\ÀÄ\ÀÈÈÔÊÒÌÈÐÂÈ¿ÊÄÊÄÈÄÆ¿ÄÿÉÄÍÄËÈÉÆÉÆÇÆÇÂÇÂÇ;PM2FT11,2FPPE=<AlÀ}\À;PM0PEÅ]ÀÅ]ÀÅ]ÀÅ[ÀÅ]ÀÅ]ÀÅ[ÀÅ]ÀÅ]ÀÅ[ÀÅ]ÀÅ[ÀÇ]ÀÅ[ÀÅ[ÀÇ[ÀÅ]ÀÉ[ÀÅ]ÀÇ[ÀÉ[ÀÇ[ÀÉ[ÀÇ]ÀË[ÀÉ[ÀÉ[ÀÉ[ÀË[ÀË]ÀÍ[ÀÍ[ÀÏÂÉÁÉÁÑ¿Ì^ÀÌ\ÀÌ^ÀÊ^ÀÌ\ÀÊ^ÀÊ^ÀÊ\ÀÈ^ÀÊ\ÀÈ^ÀÆ^ÀÊ^ÀÆ^ÀÈ\ÀÆ^ÀÆ\ÀÆ^ÀÆ\ÀÆ^ÀÆ\ÀÆ^ÀÄ\ÀÆ^ÀÄ\ÀÄ\ÀÄ\ÀÆ\ÀÂ^ÀÆZÀÄ\ÀÂ\ÀÈÈÎÈÎÊÎÌÆÈÆÊÈÈÄÆÆÄÄÁ¿Ç¿Ñ¿Ù¿ÉÂÁ¿É;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<EmÀS[À;PM0PE~ÀÏÐRÁÎRÁÒRÁÐRÁÒRÁÒRÁÒRÁÒTÁÔRÁÒRÁÔRÁÔRÁÒTÁÒRÁÔRÁÒRÁÒRÁÐTÁÒRÁÎPÁÐTÁÎRÁÌRÁÌRÁÌRÁÊPÁÆTÁÈPÁÄRÁÄPÁÂRÁ¿PÁÓ¿Ó¿Ó¿Ó¿Ó¿Ó¿Ñ¿Ó¿ÁOÁÁQÁÅOÁÅQÁÅOÁÉQÁÇQÁËOÁËQÁËQÁÍQÁÍQÁÍOÁÏQÁÑQÁÏQÁÏOÁÑSÁÑOÁÑQÁÑQÁÑQÁÑQÁÑOÁÑSÁÑOÁÏQÁÑQÁÍOÁÏQÁÍQÁÏQÁÒ¿;PM2FT11,2FPPE=<upÀO_À;PM0PEÌöÎäÌÚÊÐÌÆÌÄÌÂÌÂÌÂÌÂ̿οοÌÁοпÐÂÎÄÎÈÎÈÎÊÊÌÊÌÊÐÆæÆ@ÀÈ\ÀÌtÀÎLÁÎ^ÁÒrÁÒ@ÂÒNÂÔZÂÔdÂÖjÂÖnÂÖrÂÖrÂÖrÂÖnÂÖfÂÔ`ÂÔTÂÔJÂÒzÁÐjÁÐVÁÎ@ÁÌlÀÈPÀÈöÄÖÄÅ¿ëÃMÀË¿ËÁËÁË¿ËÁË¿Ë¿ËÁÍQÁÍQÁÍOÁÍQÁÍQÁÍQÁÍQÁÍOÁÍQÁÍQÁÏQÁÍQÁËQÁÏOÁÍQÁÍQÁÍQÁÍQÁÍOÁÍQÁÍQÁÏQÁËOÁÍQÁÏQÁÍQÁËOÁÏQÁÍQÁÍQÁÍQÁÍOÁËÉÍÇÍÇÍÇËÇÏÅÍÅÍÃñÃáÍÓ×ÇÙÁáÂßÂá¿ß;PM2FT11,6FPPE=<}Ô{dÀ;PM0PEwÀZÁwÀ`ÁsÀbÁuÀfÁqÀlÁqÀnÁoÀpÁoÀtÁoÀtÁmÀzÁmÀxÁkÀ|ÁmÀ|ÁkÀ~ÁkÀ~ÁkÀ~ÁkÀ~ÁkÀ~ÁkÀ~ÁkÀ|ÁkÀ|ÁkÀzÁmÀvÁmÀxÁmÀtÁoÀpÁoÀnÁoÀjÁsÀfÁqÀdÁuÀ^ÁsÀZÁÔÊØÈÖÈÔÈÖÈÖÈÖÈÖÈtÀ[ÁrÀ_ÁrÀeÁrÀkÁrÀkÁrÀqÁpÀuÁpÀwÁpÀ{ÁpÀ}ÁnÀ?ÂpÀAÂnÀCÂpÀCÂnÀCÂpÀEÂpÀEÂpÀEÂpÀCÂrÀEÂpÀAÂrÀ?ÂrÀ?ÂtÀ}ÁtÀ{ÁtÀuÁvÀuÁvÀqÁxÀmÁxÀiÁzÀcÁzÀaÁßÒßÐßÒßÎßÒÝÐáÐÝÐ;PM2FT11,2FPPM0PEwÀZÁwÀ`ÁsÀbÁuÀfÁsÀlÁqÀnÁqÀpÁoÀtÁmÀtÁoÀzÁmÀxÁoÀ|ÁkÀ|ÁmÀ~ÁkÀ~ÁmÀ~ÁkÀ~ÁmÀ~ÁkÀ~ÁmÀ|ÁkÀ|ÁmÀzÁmÀvÁmÀxÁoÀtÁoÀpÁoÀnÁqÀjÁqÀfÁsÀdÁuÀ^ÁuÀZÁÔÈÐÄÎÄÊ¿ÌÂÎÄÐÂÒÈtÀ[ÁtÀ_ÁpÀcÁpÀeÁpÀkÁnÀmÁlÀqÁlÀqÁlÀuÁlÀwÁlÀyÁjÀ{ÁlÀ}ÁjÀ{ÁjÀ}ÁlÀ?ÂjÀ}ÁlÀ}ÁlÀ}ÁlÀ?ÂlÀ{ÁnÀyÁpÀyÁnÀwÁpÀuÁrÀsÁrÀoÁtÀoÁvÀiÁxÀgÁxÀcÁzÀ_Á×ÌËÄÃÁÂÿÃÃÁËÂ×Ì;PM2FT11,6FPPE=<?ÑwfÀ;PM0PEßÐáÐßÎáÒßÐßÎáÒßÐÑØÓØÑÚÓØÑØÓÚÑÚÑØÂÎÂÐÈÌØÂÌÑÎÑÎÑÎÑÌÑÎÑÎÑÎÑÄÐÆÊÈÆÈÂÊ¿È¿Ê¿ÈÂÚßÚáÚßØáÚßÚáÚßÚß;PM2FT11,4FPPE=<QÓmeÀ;PM0PEÑÔÍÖÑÔÏÔÏÔÏÔÏÖÏÔÏÖÏÔÑÔÍÔÑÔÏÖÏÔÏÔÑÄÇÉÃÍÉËØÝØÝÖÝÖßÖÝØÝÖÝØÝÎÇÐÅÎÇÎÅÎÅÎÅÐÇÎÅ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,7FPPE=<{Î?Ù;PM0PEYÀû[Àû[Àù]Àõ_Àõ_Àñ_ÀóaÀïcÀïaÀëeÀícÀécÀéeÀçcÀçeÀåcÀãeÀåcÀácÀácÀáaÀß_ÀßaÀß_ÀÝ]ÀÝ]ÀÝ[ÀÝ[ÀÛWÀÛWÀÛUÀÛ×ÎãÒíÒïÖïÔëÔãÒ×Ì\ÀÜ^ÀÞbÀÞdÀÞdÀàhÀàhÀâlÀâlÀâlÀäpÀænÀäpÀæpÀèpÀæpÀêpÀèpÀênÀênÀìnÀêlÀîlÀìhÀîhÀìfÀîbÀðbÀî^Àî^ÀðXÀðVÀðÄËÈÏÊÓÊÓÌÓÊÑÆÏÄË;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<SÉI?À;PM0PEcÀìeÀìiÀìkÀèkÀêoÀèoÀèsÀæsÀæuÀæuÀæwÀäwÀæyÀäyÀæwÀäyÀäwÀäyÀäwÀæwÀäuÀæuÀæsÀæsÀèoÀæoÀèmÀêkÀêgÀêgÀìaÀì?ÀôYÀòsÀòKÁòaÁðuÁðGÂðWÂîiÂìuÂî?ÃìMÃìSÃêYÃê_ÃêcÃècÃèeÃècÃæ]Ãæ[ÃèSÃäIÃä?ÃäuÂägÂâWÂâEÂâuÁà]ÁàIÁàqÀàÏáÏßÍßÍÝÏÝÍÛÍÙÏÛÍÙÏ×Ñ×ÑÙÑÕÕ×ÓÕ××nÀÝFÁÝZÁÝlÁß|ÁÝLÂá\ÂßhÂßrÂß~ÂáFÃáNÃáTÃãVÃãZÃã\Ãã\Ãå\ÃãXÃçTÃåNÃçHÃç~ÂçtÂéjÂë^ÂëNÂé@ÂínÁí\ÁíJÁïrÀïfÀéfÀélÀçlÀçpÀçpÀåtÀåtÀåxÀãvÀãzÀãzÀãzÀã|Àã|Àá|Àá|Àã|Àá|ÀãzÀãzÀãzÀãxÀãvÀãtÀåtÀårÀånÀçnÀçjÀçhÀédÀéÌäÌâÌäÌâÌäÌâÌäÌâ;PM2FPMC1,90PE=<KjÀ_ë;PM0PEiËhÃÄÊjËgÃÃÉ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<GjÀUë;PM0PEiËhÃÂÊlËgÃÃÉ;PM2FPPE=<CjÀKë;PM0PEkËhÃÄÊlËeÃÃË;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPPE=<?jÀ?ë;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<{iÀuê;PM0PEkËhÃÄÊlËgÃÃÉ;PM2FPPE=<wiÀkê;PM0PEkËhÃÄÊlËeÃÃË;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<siÀ_ê;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<oiÀUê;PM0PEkËhÃÄÊjËgÃÁÉ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPPE=<miÀKê;PM0PEiËhÃÄÊlËgÃÅÉ;PM2FPPE=<giÀAê;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<ciÀué;PM0PEkËfÃÄÌjËgÃÁÉ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<aiÀké;PM0PEiËhÃÄÊjËeÃÃË;PM2FPPE=<]iÀ_é;PM0PEiËfÃÂÌnËgÃÅÉ;PM2FPPE=<WiÀUé;PM0PEmËhÃÄÈlËeÃÁÉ;PM2FPPE=<UiÀKé;PM0PEkËfÃÆÌjËgÃÃÉ;PM2FPPE=<QiÀAé;PM0PEiËhÃÂÊlËeÃÃË;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<MiÀuè;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<IiÀkè;PM0PEkËhÃÄÊlËgÃÃÉ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<EiÀaè;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<AiÀUè;PM0PEkËfÃÄÊlËeÃÃÉ;PM2FPPE=<}hÀKè;PM0PEkËfÃÄÌlËgÃÃÉ;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<yhÀAè;PM0PEkËhÃÄÊlËgÃÃÉ;PM2FPPE=<uhÀwç;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<qhÀkç;PM0PEkËfÃÂÌnËgÃÃÉ;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<mhÀaç;PM0PEmËhÃÆÊjËgÃÁÉ;PM2FPPE=<khÀWç;PM0PEiËhÃÄÊjËgÃÃÉ;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<ghÀMç;PM0PEiËhÃÂÊnËeÃÅË;PM2FPPE=<ahÀAç;PM0PEmËfÃÄÌlËgÃÁÉ;PM2FPPE=<_hÀwæ;PM0PEkËhÃÄÊlËeÃÃË;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<[hÀkæ;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<WhÀaæ;PM0PEkËhÃÄÈlËeÃÃÉ;PM2FPPE=<ShÀWæ;PM0PEkËfÃÄÌlËgÃÃÉ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<OhÀMæ;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<KhÀAæ;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<GhÀwå;PM0PEkËhÃÄÊlËgÃÃÉ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<ChÀmå;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<?hÀaå;PM0PEkËfÃÄÊlËeÃÃÉ;PM2FPPE=<{gÀWå;PM0PEkËfÃÂÌnËgÃÃÉ;PM2FPPE=<wgÀMå;PM0PEmËhÃÄÊlËgÃÁÉ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<ugÀCå;PM0PEkËhÃÆÊjËeÃÃË;PM2FPPE=<qgÀwä;PM0PEiËfÃÂÌnËgÃÅÉ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<kgÀmä;PM0PEmËhÃÄÊlËeÃÁË;PM2FPPE=<igÀaä;PM0PEkËfÃÄÊlËgÃÃÇ;PM2FPPE=<egÀYä;PM0PEkËhÃÄÊlËeÃÃË;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<agÀMä;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<]gÀCä;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<YgÀwã;PM0PEkËfÃÄÌlËgÃÃÉ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<UgÀmã;PM0PEkËhÃÄÊlËgÃÃÉ;PM2FPPE=<QgÀcã;PM0PEkËhÃÂÊnËgÃÃÉ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<MgÀYã;PM0PEmËhÃÆÊlËeÃÃË;PM2FPPE=<IgÀMã;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<EgÀCã;PM0PEkËhÃÂÊnËgÃÃÉ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,3FPPE=<AgÀyâ;PM0PEmËhÃÄÊlËeÃÁË;PM2FPPE=<?gÀmâ;PM0PEkËfÃÆÌlËgÃÅÉ;PM2FPMC1,240PE=<]iÀoè;PM0PEÈÔÊÒÈÐÈÎÈÒÈÐÊÒÈÒÍÊËÊÉÈÅÈÅÈÅÊÅÈÅÈÍÖËÖÇÖÅÖÃÖÃÖÅÖÁØÍÌÍÌËÌÇÆÛçÙáÙá×Û××ÙÕÛÑßÑåÏëËóËùÉEÀÉOÀÉ[ÀÇiÀÉöÇöÅôÅöÉöÅöÇöÇöÇôÇöÇöÇôÇöÅöÉôÅöÇ;PM2FTFPMC1,90PE=<KjÀ_ë;PM0PEiËhÃÄÊjËgÃÃÉ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPPE=<GjÀUë;PM0PEiËhÃÂÊlËgÃÃÉ;PM2FPPE=<CjÀKë;PM0PEkËhÃÄÊlËeÃÃË;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,5FPPE=<?jÀ?ë;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<{iÀuê;PM0PEkËhÃÄÊlËgÃÃÉ;PM2FPPE=<wiÀkê;PM0PEkËhÃÄÊlËeÃÃË;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,6FPPE=<siÀ_ê;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<oiÀUê;PM0PEkËhÃÄÊjËgÃÁÉ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPPE=<miÀKê;PM0PEiËhÃÄÊlËgÃÅÉ;PM2FPPE=<giÀAê;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<ciÀué;PM0PEkËfÃÄÌjËgÃÁÉ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<aiÀké;PM0PEiËhÃÄÊjËeÃÃË;PM2FPPE=<]iÀ_é;PM0PEiËfÃÂÌnËgÃÅÉ;PM2FPPE=<WiÀUé;PM0PEmËhÃÄÈlËeÃÁÉ;PM2FPPE=<UiÀKé;PM0PEkËfÃÆÌjËgÃÃÉ;PM2FPPE=<QiÀAé;PM0PEiËhÃÂÊlËeÃÃË;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<MiÀuè;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<IiÀkè;PM0PEkËhÃÄÊlËgÃÃÉ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<EiÀaè;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<AiÀUè;PM0PEkËfÃÄÊlËeÃÃÉ;PM2FPPE=<}hÀKè;PM0PEkËfÃÄÌlËgÃÃÉ;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<yhÀAè;PM0PEkËhÃÄÊlËgÃÃÉ;PM2FPPE=<uhÀwç;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<qhÀkç;PM0PEkËfÃÂÌnËgÃÃÉ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<mhÀaç;PM0PEmËhÃÆÊjËgÃÁÉ;PM2FPPE=<khÀWç;PM0PEiËhÃÄÊjËgÃÃÉ;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<ghÀMç;PM0PEiËhÃÂÊnËeÃÅË;PM2FPPE=<ahÀAç;PM0PEmËfÃÄÌlËgÃÁÉ;PM2FPPE=<_hÀwæ;PM0PEkËhÃÄÊlËeÃÃË;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<[hÀkæ;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<WhÀaæ;PM0PEkËhÃÄÈlËeÃÃÉ;PM2FPPE=<ShÀWæ;PM0PEkËfÃÄÌlËgÃÃÉ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<OhÀMæ;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<KhÀAæ;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<GhÀwå;PM0PEkËhÃÄÊlËgÃÃÉ;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<ChÀmå;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<?hÀaå;PM0PEkËfÃÄÊlËeÃÃÉ;PM2FPPE=<{gÀWå;PM0PEkËfÃÂÌnËgÃÃÉ;PM2FPPE=<wgÀMå;PM0PEmËhÃÄÊlËgÃÁÉ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<ugÀCå;PM0PEkËhÃÆÊjËeÃÃË;PM2FPPE=<qgÀwä;PM0PEiËfÃÂÌnËgÃÅÉ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<kgÀmä;PM0PEmËhÃÄÊlËeÃÁË;PM2FPPE=<igÀaä;PM0PEkËfÃÄÊlËgÃÃÇ;PM2FPPE=<egÀYä;PM0PEkËhÃÄÊlËeÃÃË;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<agÀMä;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<]gÀCä;PM0PEkËhÃÄÊlËeÃÃË;PM2FPPE=<YgÀwã;PM0PEkËfÃÄÌlËgÃÃÉ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<UgÀmã;PM0PEkËhÃÄÊlËgÃÃÉ;PM2FPPE=<QgÀcã;PM0PEkËhÃÂÊnËgÃÃÉ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<MgÀYã;PM0PEmËhÃÆÊlËeÃÃË;PM2FPPE=<IgÀMã;PM0PEkËfÃÄÌlËgÃÃÉ;PM2FPPE=<EgÀCã;PM0PEkËhÃÂÊnËgÃÃÉ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,6FPPE=<AgÀyâ;PM0PEmËhÃÄÊlËeÃÁË;PM2FPPE=<?gÀmâ;PM0PEkËfÃÆÌlËgÃÅÉ;PM2FPPE=<cÍcIÀ;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<OÍmHÀ;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2FPPE=<{ÌyGÀ;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<iÌEGÀ;PM0PE]VÀvÞÔô^VÀuÞÓó;PM2FPPE=<UÌQFÀ;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<CÌ[EÀ;PM0PE]VÀtÞÒô^VÀuÞÑñ;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<qËiDÀ;PM0PE]VÀvÞÔö^VÀuÞÓõ;PM2FPPE=<]ËsCÀ;PM0PE]VÀvÞÔò^VÀsÞÓó;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<IË?CÀ;PM0PE]VÀtÞÒö^VÀsÞÑõ;PM2FPPE=<wÊIBÀ;PM0PE]VÀtÞÔô^VÀuÞÓñ;PM2FPPE=<cÊWAÀ;PM0PE]VÀvÞÒö^VÀuÞÑõ;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<QÊa@À;PM0PE]VÀvÞÔò^VÀsÞÓó;PM2FPPE=<}Ém?À;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2FPPE=<iÉyþ;PM0PE]VÀvÞÒô^VÀuÞÑó;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<WÉEþ;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<EÉOý;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2FPPE=<qÈ[ü;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<_Ègû;PM0PE]VÀvÞÔô^VÀuÞÓó;PM2FPPE=<KÈsú;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2FPPE=<wÇ}ù;PM0PE]VÀtÞÒô^VÀsÞÑó;PM2FPPE=<eÇIù;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<QÇUø;PM0PE]VÀvÞÒô^VÀuÞÑó;PM2FPPE=<?Ça÷;PM0PE]VÀvÞÔô^VÀuÞÓó;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<kÆmö;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2FPPE=<WÆwõ;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2FPPE=<EÆCõ;PM0PE]VÀvÞÒò^VÀsÞÑó;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<sÅOô;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2FPPE=<_Å[ó;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<MÅeò;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<yÄqñ;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2FPPE=<eÄ}ð;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<SÄIð;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2FPPE=<?ÄSï;PM0PE]VÀtÞÒô^VÀuÞÑñ;PM2FPPE=<mÃaî;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,3FPPE=<YÃkí;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2FPPE=<EÃwì;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPMC1,240PE=<QËOCÀ;PM0PEÆÐÂÌ¿ÊÁÈÁÆÁÈÂÌÈÒ?ÀÒCÀÒEÀÖGÀÖIÀØKÀØKÀÚMÀÚOÀÜQÀÚOÀÜQÀÞSÀÞQÀÜQÀÞSÀÜQÀÞQÀÞQÀÜOÀÞOÀÜMÀÜMÀÚIÀÚIÀÚGÀØEÀÖAÀÖ?ÀÔýÔûÒ÷ÐIÀÖGÀÔCÀÎAÀÐAÀÎ?ÀÌ?ÀÌ?ÀÐýÎýÒ?ÀÔ?ÀÚAÀÚAÀâEÀèGÀîËÌÑÌÓÊ×ÈÙÊÛÆÛÆÝÆÛÄÛÄÛÂ×ÂÕÂÓÂÏÂË¿ýÌAÀÎCÀÌGÀÐKÀÌKÀÎOÀÐOÀÎQÀÎQÀÎQÀÎSÀÎQÀÎOÀÌQÀÎMÀÌIÀÌIÀÌEÀÌCÀÊ?ÀÊûÊõÈñÈíÆåÆßÆÙÂÓÄËÂÿÄÁôÅöÇôÇöÇôÉôÇöÇöÉôÇöÉöÉöÉöÉöÉöËöÉöÉöËöËøËöËöËøËøËöÍøËöÍúËöÍøÍøÍøÍNÀÛJÀÝLÀÛJÀÛJÀÛJÀÝJÀÛJÀÛJÀÛLÀÛLÀÛNÀÛNÀÙPÀÛRÀÙTÀÛNÀÕPÀÕPÀ×PÀ×NÀÕRÀ×NÀ×PÀ×RÀ×PÀ×PÀ×PÀÕPÀÕRÀÕPÀÕRÀÕäÉäËæËèËêËìÍîÍðÍðÍòÏðÍôÏôÏôÏôÏöÑôÍôÑöÏôÑòÏôÏòÑðÑðÏîÏìÏîÑêÏæÏæÏäÏ;PM2FTFPMC1,90PE=<cÍcIÀ;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<OÍmHÀ;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2FPPE=<{ÌyGÀ;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<iÌEGÀ;PM0PE]VÀvÞÔô^VÀuÞÓó;PM2FPPE=<UÌQFÀ;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<CÌ[EÀ;PM0PE]VÀtÞÒô^VÀuÞÑñ;PM2RF6,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<qËiDÀ;PM0PE]VÀvÞÔö^VÀuÞÓõ;PM2FPPE=<]ËsCÀ;PM0PE]VÀvÞÔò^VÀsÞÓó;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<IË?CÀ;PM0PE]VÀtÞÒö^VÀsÞÑõ;PM2FPPE=<wÊIBÀ;PM0PE]VÀtÞÔô^VÀuÞÓñ;PM2FPPE=<cÊWAÀ;PM0PE]VÀvÞÒö^VÀuÞÑõ;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<QÊa@À;PM0PE]VÀvÞÔò^VÀsÞÓó;PM2FPPE=<}Ém?À;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2FPPE=<iÉyþ;PM0PE]VÀvÞÒô^VÀuÞÑó;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<WÉEþ;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<EÉOý;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2FPPE=<qÈ[ü;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<_Ègû;PM0PE]VÀvÞÔô^VÀuÞÓó;PM2FPPE=<KÈsú;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2FPPE=<wÇ}ù;PM0PE]VÀtÞÒô^VÀsÞÑó;PM2FPPE=<eÇIù;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<QÇUø;PM0PE]VÀvÞÒô^VÀuÞÑó;PM2FPPE=<?Ça÷;PM0PE]VÀvÞÔô^VÀuÞÓó;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<kÆmö;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2FPPE=<WÆwõ;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2FPPE=<EÆCõ;PM0PE]VÀvÞÒò^VÀsÞÑó;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<sÅOô;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2FPPE=<_Å[ó;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<MÅeò;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<yÄqñ;PM0PE]VÀtÞÔô^VÀsÞÓó;PM2FPPE=<eÄ}ð;PM0PE]VÀtÞÒö^VÀuÞÑó;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<SÄIð;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2FPPE=<?ÄSï;PM0PE]VÀtÞÒô^VÀuÞÑñ;PM2FPPE=<mÃaî;PM0PE]VÀvÞÔô^VÀsÞÓõ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<YÃkí;PM0PE]VÀtÞÔö^VÀuÞÓó;PM2FPPE=<EÃwì;PM0PE]VÀvÞÒô^VÀsÞÑõ;PM2FPPE=<uãiNÀ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FT11,3FPPE=<[ã_MÀ;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2FPPE=<AãWLÀ;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2FT11,2FPPE=<eâOKÀ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPPE=<KâEJÀ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPPE=<qá}HÀ;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2FT11,1FPPE=<WáuGÀ;PM0PEoMÁ~òÜHÀnMÁ}òÙGÀ;PM2FPPE=<}àmFÀ;PM0PEmMÁ~òÚHÀpMÁ{òÛIÀ;PM2FPPE=<aàcEÀ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FPPE=<Gà[DÀ;PM0PEoMÁ|òÚJÀpMÁ{òÙIÀ;PM2FPPE=<mßQCÀ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPPE=<SßIBÀ;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2FPPE=<yÞAAÀ;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<]Þy?À;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPPE=<CÞoþ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPPE=<iÝgý;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<OÝ_ü;PM0PEoMÁ~òÜHÀpMÁ{òÛIÀ;PM2FPPE=<sÜUû;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<YÜMú;PM0PEoMÁ|òÜJÀnMÁ{òÙIÀ;PM2FPPE=<?ÜCù;PM0PEmMÁ|òÚHÀpMÁ{òÛGÀ;PM2FPPE=<cÛ{÷;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<IÛsö;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2FPPE=<oÚkõ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<UÚaô;PM0PEoMÁ|òÜHÀnMÁ{òÙGÀ;PM2FPIW0,0,6352,4896PE=<{ÙYó;PM0PEmMÁ|òÚJÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<_ÙQò;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPIWIW0,0,6352,4896PE=<EÙIñ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<kØ?ð;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<QØwî;PM0PEoMÁ|òÜJÀnMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<w×mí;PM0PEmMÁ|òÚHÀpMÁ{òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<[×eì;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPIWIW0,0,6352,4896PE=<A×]ë;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<gÖUê;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPIWIW0,0,6352,4896PE=<MÖKé;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<sÕCè;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<WÕ{æ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPIWIW0,0,6352,4896PE=<}Ôqå;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<cÔiä;PM0PEoMÁ|òÚJÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<IÔ_ã;PM0PEoMÁ|òÜHÀnMÁ{òÙGÀ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPIWIW0,0,6352,4896PE=<oÓWâ;PM0PEmMÁ|òÚJÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<SÓOá;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,4FPIWIW0,0,6352,4896PE=<yÒGà;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<_Ò}Þ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<EÒuÝ;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2RF5,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPIWIW0,0,6352,4896PE=<kÑmÜ;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<OÑeÛ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<uÐ[Ú;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2RF6,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,6FPIWIW0,0,6352,4896PE=<[ÐSÙ;PM0PEoMÁ|òÚJÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<AÐIØ;PM0PEoMÁ|òÜJÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<eÏA×;PM0PEoMÁ~òpMÁ}ò;PM1PE;PM2FPIWMC1,240PE=<yÏw×;PM0PEKÀãKÀçKÀãIÀåMÀåKÀåMÀåMÀãOÀåOÀåOÀåSÀãSÀåSÀåUÀãYÀãYÀã[Àå]ÀãaÀãaÀãeÀágÀãiÀãmÀßoÀãsÀáuÀáyÀß{ÀáAÁßCÁßÏËÅÕ¿ÛÄßÈÝÌÝÌÙÈÏÕË×ÇÛÉÛÅÝÃÝÁßÁÝ¿ß¿ÝÂÛÂÛÄÙÄÕÄÓÄÏÆóÚõØõÖ÷ØùÖùÔùÖûÒûÔûÒùÐùÒûÎùÐ÷Î÷ÌõÎóÌóÊïÌïÊëÈéÊåÈãÆßÆÝÆÙÄÕÆÏÂÍÄÇÂ?ÀÈCÀÈKÀÈKÀÊQÀÊSÀÊYÀÊYÀÊ]ÀÊ_ÀÌ_ÀÌaÀÊcÀÌeÀÌaÀÊeÀÊcÀÌaÀÌ_ÀÊ_ÀÊ]ÀÊ[ÀÊWÀÌUÀÈQÀÊMÀÈIÀÈEÀÈýÆûÆõÆíÆëÄíÆëÆíÆïÈñÈóÈóÈ÷Ê÷ÊûÌ?ÀÊAÀÌCÀÎGÀÌKÀÐOÀÎSÀÐYÀÐ]ÀÐaÀÒeÀÒkÀÔqÀÔwÀÔ{ÀÖCÁØIÁÖOÁØUÁÚ]ÁØeÁÚØèÖàÎÞÌÜÊØÊÔÊÔÊÐVÁß\ÁáfÁÝlÁßtÁÝzÁÝ~ÁÝFÂÝHÂÝLÂÝRÂÛTÂÝVÂÛZÂÛZÂÝ\ÂÝ\ÂÝ\ÂÝ^ÂÝZÂÝ\ÂßXÂßVÂßTÂáNÂßLÂãJÂãBÂã~ÁãxÁçrÁçjÁçêÉìÉìÉîËðÍîÍîÍîÍìÍêÏêÏäÏäÏÞÏÚÏÖÍúÒBÀÒHÀØPÀØTÀÚ^ÀÞ`ÀÞfÀâjÀânÀæpÀätÀèxÀèxÀêzÀêzÀî|Àì|ÀîzÀìzÀðxÀîvÀðtÀðpÀîpÀðhÀîfÀð`Àî\ÀîVÀîPÀìHÀêÂË¿ÏÂÏÂÍ;PM2FTFPMC1,90PE=<uãiNÀ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<[ã_MÀ;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2FPPE=<AãWLÀ;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<eâOKÀ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPPE=<KâEJÀ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPPE=<qá}HÀ;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<WáuGÀ;PM0PEoMÁ~òÜHÀnMÁ}òÙGÀ;PM2FPPE=<}àmFÀ;PM0PEmMÁ~òÚHÀpMÁ{òÛIÀ;PM2FPPE=<aàcEÀ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<Gà[DÀ;PM0PEoMÁ|òÚJÀpMÁ{òÙIÀ;PM2FPPE=<mßQCÀ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPPE=<SßIBÀ;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2FPPE=<yÞAAÀ;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<]Þy?À;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPPE=<CÞoþ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPPE=<iÝgý;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<OÝ_ü;PM0PEoMÁ~òÜHÀpMÁ{òÛIÀ;PM2FPPE=<sÜUû;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<YÜMú;PM0PEoMÁ|òÜJÀnMÁ{òÙIÀ;PM2FPPE=<?ÜCù;PM0PEmMÁ|òÚHÀpMÁ{òÛGÀ;PM2FPPE=<cÛ{÷;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<IÛsö;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2FPPE=<oÚkõ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<UÚaô;PM0PEoMÁ|òÜHÀnMÁ{òÙGÀ;PM2FPIW0,0,6352,4896PE=<{ÙYó;PM0PEmMÁ|òÚJÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<_ÙQò;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPIWIW0,0,6352,4896PE=<EÙIñ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<kØ?ð;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<QØwî;PM0PEoMÁ|òÜJÀnMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<w×mí;PM0PEmMÁ|òÚHÀpMÁ{òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<[×eì;PM0PEoMÁ|òÚJÀpMÁ}òÙGÀ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPIWIW0,0,6352,4896PE=<A×]ë;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<gÖUê;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPIWIW0,0,6352,4896PE=<MÖKé;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<sÕCè;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<WÕ{æ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPIWIW0,0,6352,4896PE=<}Ôqå;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<cÔiä;PM0PEoMÁ|òÚJÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<IÔ_ã;PM0PEoMÁ|òÜHÀnMÁ{òÙGÀ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPIWIW0,0,6352,4896PE=<oÓWâ;PM0PEmMÁ|òÚJÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<SÓOá;PM0PEoMÁ~òÚHÀpMÁ}òÙGÀ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPIWIW0,0,6352,4896PE=<yÒGà;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<_Ò}Þ;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2FPIWIW0,0,6352,4896PE=<EÒuÝ;PM0PEoMÁ|òÜJÀnMÁ}òÙGÀ;PM2RF6,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,6FPIWIW0,0,6352,4896PE=<kÑmÜ;PM0PEmMÁ~òÚHÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<OÑeÛ;PM0PEoMÁ~òÚHÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<uÐ[Ú;PM0PEoMÁ|òÚHÀpMÁ{òÙGÀ;PM2RF7,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,7FPIWIW0,0,6352,4896PE=<[ÐSÙ;PM0PEoMÁ|òÚJÀpMÁ{òÙIÀ;PM2FPIWIW0,0,6352,4896PE=<AÐIØ;PM0PEoMÁ|òÜJÀpMÁ}òÛGÀ;PM2FPIWIW0,0,6352,4896PE=<eÏA×;PM0PEoMÁ~òpMÁ}ò;PM1PE;PM2FPIWMC1,240PE=<YRÀMvÀ;PM0PESÀxÁOÀxÁEÀzÁ?ÀzÁùzÁó|Áï~Áé~Áã~Áá@ÂÝBÂÙ@Â×BÂÕDÂÑDÂÓDÂÏFÂÑHÂÏFÂÏHÂÓJÂÓJÂÓHÂ×LÂ×LÂÝLÂßLÂãNÂçNÂíPÂóPÂ÷N¿ÎÎÈÔÆØÁØÃØÇÒÉÌÏTÀeÂLÀcÂFÀ]Â@À[ÂúYÂôSÂðSÂìQÂæMÂäMÂàKÂÜIÂÚGÂØIÂÖEÂÔGÂÖEÂÔGÂÒEÂÖIÂÔGÂÖKÂØIÂÚMÂÜOÂàQÂâSÂæUÂìYÂî[Âô_ÂúcÂÁ¿ÃÊÇÒËÚËÞÏäÏæÑèÑèÏèÑæÍâËàËØÇÒÃÈ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<eOÀq|À;PM0PEEÀNÂAÀPÂûRÂùPÂõRÂñTÂïRÂéTÂéVÂåTÂãVÂãTÂßVÂßVÂÝVÂÛTÂÛVÂÛXÂÛTÂÛVÂÛTÂÛVÂÛTÂÝRÂßTÂáRÂáRÂãRÂçPÂéPÂëNÂïLÂËÅÍÅËÅÍÅËÅÍÅËÅÍÅäuÀàyÀÞ{ÀÞ?ÁÜCÁÚEÁØIÁØMÁØMÁÖOÁÔSÁÔSÁÔWÁÒUÁÒYÁÒ[ÁÐ[ÁÐ[ÁÐ[ÁÒ]ÁÎ]ÁÐ]ÁÒ]ÁÎ[ÁÒ[ÁÐ[ÁÒ[ÁÐWÁÒYÁÔUÁÒUÁÔSÁÖSÀÔOÀÔMÀÔKÀÔIÀÔGÀÔCÀÔCÀÔ?ÀÔAÀÔýÖýÔûÔùÔùÔùÖ÷ÖõÖùÖõÖõÖ÷ÖõØ÷Ø÷Ø÷ØùØ÷ØùÚûÚûÚý;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPMC1,90PE=<}WÀucÀ;PM0PEZÂPÀÄËYÂOÀÃÌ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<yWÀAdÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<sWÀMdÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<oWÀ[dÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<iWÀgdÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2FPPE=<eWÀudÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2FPPE=<aWÀAeÀ;PM0PEZÂNÀÄËYÂMÀÃÌ;PM2FPPE=<]WÀMeÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<WWÀ[eÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<SWÀgeÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<OWÀseÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FPPE=<IWÀAfÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<EWÀMfÀ;PM0PEZÂPÀÄÍWÂOÀÅÎ;PM2FPPE=<?WÀ[fÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<{VÀgfÀ;PM0PEZÂNÀÂËWÂMÀÃÌ;PM2FPPE=<wVÀsfÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<sVÀAgÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<mVÀMgÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<iVÀYgÀ;PM0PEZÂNÀÄËYÂOÀÃÎ;PM2FPPE=<eVÀggÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<_VÀsgÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2FPPE=<[VÀAhÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<UVÀMhÀ;PM0PEXÂNÀÄËYÂMÀÁÌ;PM2FPPE=<SVÀYhÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FT11,1FPPE=<MVÀghÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<IVÀshÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<CVÀ?iÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FPPE=<?VÀMiÀ;PM0PEZÂPÀÄËYÂOÀÃÌ;PM2FPPE=<{UÀYiÀ;PM0PEZÂPÀÄÍWÂOÀÅÎ;PM2FPPE=<uUÀgiÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<qUÀsiÀ;PM0PEZÂNÀÄËYÂMÀÃÌ;PM2FPPE=<mUÀ?jÀ;PM0PEZÂNÀÄËYÂOÀÃÎ;PM2FPPE=<iUÀMjÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<cUÀYjÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2FPPE=<_UÀejÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FPPE=<YUÀsjÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<UUÀ?kÀ;PM0PEZÂPÀÄÍYÂOÀÃÎ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPPE=<QUÀMkÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<KUÀYkÀ;PM0PEXÂNÀÄËWÂMÀÃÌ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,5FPPE=<GUÀekÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<CUÀskÀ;PM0PEZÂPÀÄËYÂOÀÃÌ;PM2FPPE=<?UÀ?lÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<yTÀKlÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,6FPPE=<uTÀYlÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<oTÀelÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2FPPE=<kTÀslÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2FPPE=<gTÀ?mÀ;PM0PEZÂNÀÄËYÂMÀÃÌ;PM2FPPE=<cTÀKmÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,7FPPE=<]TÀYmÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<YTÀemÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2FPPE=<UTÀqmÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FPPE=<OTÀ?nÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2RF8,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,8FPPE=<KTÀKnÀ;PM0PEZÂPÀÄÍWÂOÀÅÎ;PM2FPPE=<ETÀYnÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF1,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,1FPPE=<ATÀenÀ;PM0PEZÂNÀÂËWÂMÀÃÌ;PM2FPPE=<}SÀqnÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<ySÀ?oÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<sSÀKoÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF2,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,2FPPE=<oSÀWoÀ;PM0PEZÂNÀÄËYÂOÀÃÎ;PM2FPPE=<kSÀeoÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<eSÀqoÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2RF3,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,3FPPE=<aSÀ?pÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPMC1,240PE=<cSÀCiÀ;PM0PEÁÓÁÕ¿ÑÁÓÁÕÁÕÅÕÅÙÌÝÊßÈÝÈßÆßÆßÆßÈáÉÇËÃÉ¿Ç¿ÅØÅØÅØÅÚÅØÅØÅÚÇØÅØÅØÅØÅØÅØÅØÅÚÅØÅØÃØÅØÅØÃÚÅØÅØÃÚÃØÅØÅØÃØÅÚÃØÅØÃØÎÎÎÊÎÈÐÄÎÆÐÄÐÆÎÆÄÙÄÙÂ×Ä×ÄÙÄ×Ä×ÂÙÄ×ÄÙÄ×Ä×ÄÙÄ×ÄÙÄÙ;PM2FTFPMC1,90PE=<}WÀucÀ;PM0PEZÂPÀÄËYÂOÀÃÌ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<yWÀAdÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<sWÀMdÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<oWÀ[dÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<iWÀgdÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2FPPE=<eWÀudÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2FPPE=<aWÀAeÀ;PM0PEZÂNÀÄËYÂMÀÃÌ;PM2FPPE=<]WÀMeÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<WWÀ[eÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<SWÀgeÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<OWÀseÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FPPE=<IWÀAfÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<EWÀMfÀ;PM0PEZÂPÀÄÍWÂOÀÅÎ;PM2FPPE=<?WÀ[fÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<{VÀgfÀ;PM0PEZÂNÀÂËWÂMÀÃÌ;PM2FPPE=<wVÀsfÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<sVÀAgÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<mVÀMgÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<iVÀYgÀ;PM0PEZÂNÀÄËYÂOÀÃÎ;PM2FPPE=<eVÀggÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<_VÀsgÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2FPPE=<[VÀAhÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<UVÀMhÀ;PM0PEXÂNÀÄËYÂMÀÁÌ;PM2FPPE=<SVÀYhÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<MVÀghÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<IVÀshÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<CVÀ?iÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<?VÀMiÀ;PM0PEZÂPÀÄËYÂOÀÃÌ;PM2FPPE=<{UÀYiÀ;PM0PEZÂPÀÄÍWÂOÀÅÎ;PM2FPPE=<uUÀgiÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<qUÀsiÀ;PM0PEZÂNÀÄËYÂMÀÃÌ;PM2FPPE=<mUÀ?jÀ;PM0PEZÂNÀÄËYÂOÀÃÎ;PM2FPPE=<iUÀMjÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,6FPPE=<cUÀYjÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2FPPE=<_UÀejÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FPPE=<YUÀsjÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<UUÀ?kÀ;PM0PEZÂPÀÄÍYÂOÀÃÎ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPPE=<QUÀMkÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<KUÀYkÀ;PM0PEXÂNÀÄËWÂMÀÃÌ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPPE=<GUÀekÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<CUÀskÀ;PM0PEZÂPÀÄËYÂOÀÃÌ;PM2FPPE=<?UÀ?lÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPPE=<yTÀKlÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<uTÀYlÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<oTÀelÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2FPPE=<kTÀslÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2FPPE=<gTÀ?mÀ;PM0PEZÂNÀÄËYÂMÀÃÌ;PM2FPPE=<cTÀKmÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,2FPPE=<]TÀYmÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2FPPE=<YTÀemÀ;PM0PEZÂPÀÄÍYÂMÀÃÌ;PM2FPPE=<UTÀqmÀ;PM0PEZÂNÀÄËWÂOÀÅÎ;PM2FPPE=<OTÀ?nÀ;PM0PEXÂPÀÆËYÂOÀÃÌ;PM2RF3,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,3FPPE=<KTÀKnÀ;PM0PEZÂPÀÄÍWÂOÀÅÎ;PM2FPPE=<ETÀYnÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF4,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,4FPPE=<ATÀenÀ;PM0PEZÂNÀÂËWÂMÀÃÌ;PM2FPPE=<}SÀqnÀ;PM0PEXÂNÀÆËYÂOÀÃÎ;PM2FPPE=<ySÀ?oÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<sSÀKoÀ;PM0PEXÂPÀÆÍYÂMÀÃÌ;PM2RF5,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPPE=<oSÀWoÀ;PM0PEZÂNÀÄËYÂOÀÃÎ;PM2FPPE=<kSÀeoÀ;PM0PEZÂPÀÄËWÂOÀÅÌ;PM2FPPE=<eSÀqoÀ;PM0PEXÂPÀÆÍYÂOÀÃÎ;PM2RF6,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,6FPPE=<aSÀ?pÀ;PM0PEZÂPÀÄÍWÂMÀÅÌ;PM2FPMC1,240PE=<IãSIÁ;PM0PEgÀlÂiÀlÂkÀlÂkÀnÂoÀlÂoÀlÂoÀlÂqÀlÂsÀnÂsÀjÂqÀlÂsÀnÂqÀjÂsÀlÂsÀlÂqÀlÂoÀlÂoÀjÂoÀlÂkÀlÂkÀlÂiÀjÂgÀlÂeÀlÂaÀlÂ_ÀjÂ_ÀlÂYÀjÂWÀlÂSÀjÂQÀjÂKÀlÂËÎÕÆ×ÂÝÅÙÉÕÍÍÍ¿ÑHÀmÂLÀmÂRÀmÂTÀkÂXÀmÂ\ÀkÂ`ÀmÂdÀkÂdÀkÂhÀkÂlÀkÂlÀkÂnÀkÂrÀiÂrÀkÂvÀiÂtÀkÂvÀiÂxÀkÂxÀkÂxÀiÂxÀiÂxÀiÂzÀkÂvÀiÂxÀiÂvÀiÂvÀiÂtÀiÂrÀiÂpÀkÂpÀiÂÈÅÊ¿Ì¿ÎÆÌÆÊÊÆÈ¿Ê;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<oãYIÁ;PM0PEkÀrÂmÀpÂoÀrÂoÀpÂsÀpÂsÀnÂqÀnÂsÀnÂuÀnÂsÀnÂuÀnÂuÀlÂsÀlÂsÀlÂuÀlÂqÀjÂqÀlÂqÀjÂmÀlÂmÀjÂkÀlÂiÀjÂiÀjÂeÀjÂaÀjÂ_ÀjÂ_ÀlÂYÀjÂWÀjÂSÀjÂQÀjÂKÀlÂÉÌÉÆËÁÍÇÉÍÇÍÅÑÄÑHÀmÂLÀmÂRÀmÂTÀkÂXÀmÂ\ÀkÂ`ÀmÂdÀkÂdÀkÂhÀkÂlÀkÂlÀkÂnÀkÂrÀiÂrÀkÂvÀiÂtÀkÂvÀiÂxÀkÂxÀkÂxÀiÂxÀiÂxÀiÂzÀkÂvÀiÂxÀiÂvÀiÂvÀiÂtÀiÂrÀiÂpÀkÂpÀiÂÌÉÎÆÊÌÁÔ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<CïU\À;PM0PEÆ×ÈÛÊÝÌÛÌÝÊÝÎÛÌÝÌÛÌ×Î×ÌÓÌÑÊËÊËÊÃÖÇØÉØÅÖÇÔÁÔÂÐÆÊÎÌÖÌÖÎÖÎØÎØÎØÎØÎØÎØÎÚÌØÊÚÌØÈØÆØÆØÁÔÏÐ×ÌÝÆßÂÛÁÕÉÍÏÇ×É×Ç×ËÕÉ×Ë×ÇÕË×ËÍÉÊÇÜËèËîÍìÑæÕØ×ÈÙÄÝÁÝÅÙÉÓÍËÏ¿Ó;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<QdÀwSÀ;PM0PE_ÂüËÁÑÇÛÍÝÓãÕéÙëÝíÝñÝïÝóÛñÙñÕïÓíËéÇÕÂÍÈÉÐÅÒÁØÃØ¿ÚÁØKÃPÜËBÀËDÀËLÀÇJÀÉNÀÉNÀÇLÀÇHÀÉHÀÇBÀÉüÉôÉîËäËØÍÐåÎÝÐ×ÎÑÎÑÌÍÊÑÊÑÄÑÆÏÈÍÌÏÌÑÎ×ÐÝÎåÌWÄêÔÅÔÇÔÇÖÉÖËÔËÖÍØËÖÍÖËÖËÔËÖÉÔÉÖÅÒÅÆÏÁË¿ËÈËêÝìÓêÏäËàÉÖËÎÏ¿×ÅáÃßÁáÂßÂáÆáÆáÆáÊßÈáÊßÈßÊßÈÝÊÝÆÝÔ[ÀÒ_ÀÒ_ÀÒcÀÐcÀÐcÀÎeÀÎeÀÌeÀÎeÀÌcÀÊcÀÌaÀÊ_ÀÈ_ÀÊ[ÀÈWÀÊUÀÆSÀÈMÀÈKÀÈEÀÆAÀÈûÆ÷ÆñÈëÆãÈÝÆ×ÈÏÆÅðÝäßÜÝÔÝÒÕÐÍÒÃÖÊüæ@ÀêFÀêFÀìHÀìJÀìFÀêFÀê@ÀèüäöâìÜäØÜÒÎÌ¿Æ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,2FPMC1,90PE=<YòISÀ;PM0PEÄIÀÊGÀÒEÀÚAÀÞ?Àäûê÷îóôíøéüã@ÀÝBÀÙFÀÑHÀÉJÀÃJÀÄHÀÊFÀÒBÀÚ@ÀÞüäøêôîîôêøäüÞ@ÀÚBÀÒFÀÊHÀÄJÀÃJÀÉHÀÑFÀÙBÀÝ@Àãüéøíôóî÷êûä?ÀÞAÀÚEÀÒGÀÊIÀÄIÀÃGÀÉEÀÑAÀÙ?ÀÝûã÷éóííóé÷ãûÝ?ÀÙAÀÑEÀÉGÀÃIÀ;PM1PEÊ¿ÄGÀÊGÀÒCÀØAÀÞýäûêõîñòïøçúã@ÀÝBÀ×DÀÑFÀËJÀÁHÀÂHÀÌDÀÒBÀØþÞüäöèòððòèöäüÞþØBÀÒDÀÌHÀÂHÀÁJÀËFÀÑDÀ×BÀÝþãüçöïôñîõèûäýÞAÀØCÀÒGÀÌGÀÄIÀÃEÀËCÀÑAÀ×?ÀÝùã÷çñííóéõãûÝý×AÀÑCÀÉEÀÃIÀ;PM1PE;PM2FPPE=<OòISÀ;PM0PEÄGÀÊGÀÒCÀØAÀÞýäûêõîñòïøçúã@ÀÝBÀ×DÀÑFÀËJÀÁHÀÂHÀÌDÀÒBÀØþÞüäöèòððòèöäüÞþØBÀÒDÀÌHÀÂHÀÁJÀËFÀÑDÀ×BÀÝþãüçöïôñîõèûäýÞAÀØCÀÒGÀÌGÀÄIÀÃEÀËCÀÑAÀ×?ÀÝùã÷çñííóéõãûÝý×AÀÑCÀÉEÀÃIÀ;PM1PEÌ¿ÂGÀÌEÀÐAÀØAÀÞýäùèõîñòíöçúáþÝ@À×DÀÑFÀÉHÀÃHÀÄFÀÊBÀÒBÀØþÞúâöèòîîòèöâúÞþØBÀÒBÀÊFÀÄHÀÃHÀÉFÀÑDÀ×@ÀÝþáúçöíòñîõèùäýÞAÀØAÀÐEÀÊGÀÄGÀÃEÀÉCÀÏ?À×ýÝùãõçñííñçõãùÝý×?ÀÏCÀËEÀÁGÀ;PM1PE;PM2FPPE=<CòISÀ;PM0PEÂGÀÌEÀÐAÀØAÀÞýäùèõîñòíöçúáþÝ@À×DÀÑFÀÉHÀÃHÀÄFÀÊBÀÒBÀØþÞúâöèòîîòèöâúÞþØBÀÒBÀÊFÀÄHÀÃHÀÉFÀÑDÀ×@ÀÝþáúçöíòñîõèùäýÞAÀØAÀÐEÀÊGÀÄGÀÃEÀÉCÀÏ?À×ýÝùãõçñííñçõãùÝý×?ÀÏCÀËEÀÁGÀ;PM1PEÌ¿ÂEÀÌCÀÐAÀØ?ÀÞýâ÷èõìñòëöçøáüÝ@ÀÕBÀÑDÀÉHÀÃFÀÄDÀÊBÀÒ@ÀÖþÞøâöèòììòèöâøÞþÖ@ÀÒBÀÊDÀÄFÀÃHÀÉDÀÑBÀÕ@ÀÝüáøçöëòñìõè÷âýÞ?ÀØAÀÐCÀÊEÀÄGÀÃCÀÉAÀÏ?À×ûÝ÷áõçñëëñçõá÷Ýû×?ÀÏAÀËCÀÁGÀ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,3FPPE=<wñISÀ;PM0PEÂEÀÌCÀÐAÀØ?ÀÞýâ÷èõìñòëöçøáüÝ@ÀÕBÀÑDÀÉHÀÃFÀÄDÀÊBÀÒ@ÀÖþÞøâöèòììòèöâøÞþÖ@ÀÒBÀÊDÀÄFÀÃHÀÉDÀÑBÀÕ@ÀÝüáøçöëòñìõè÷âýÞ?ÀØAÀÐCÀÊEÀÄGÀÃCÀÉAÀÏ?À×ûÝ÷áõçñëëñçõá÷Ýû×?ÀÏAÀËCÀÁGÀ;PM1PEÊ¿ÄEÀÊAÀÒAÀÖýÜûâ÷èóìïðíöåøáúÝþÕBÀÏDÀËFÀÃFÀÄBÀÌBÀÐþÖüÞøâôæðîîðæôâøÞüÖþÐBÀÌBÀÄFÀÃFÀËDÀÏBÀÕþÝúáøåöíðïìóè÷àûÞýÖAÀÒAÀÊEÀÄEÀÃCÀÉAÀÑýÕùÝ÷ßõçïëëïçõá÷ÛùÕýÑAÀÉCÀÃEÀ;PM1PE;PM2FT11,2FPPE=<mñISÀ;PM0PEÄEÀÊAÀÒAÀÖýÜûâ÷èóìïðíöåøáúÝþÕBÀÏDÀËFÀÃFÀÄBÀÌBÀÐþÖüÞøâôæðîîðæôâøÞüÖþÐBÀÌBÀÄFÀÃFÀËDÀÏBÀÕþÝúáøåöíðïìóè÷àûÞýÖAÀÒAÀÊEÀÄEÀÃCÀÉAÀÑýÕùÝ÷ßõçïëëïçõá÷ÛùÕýÑAÀÉCÀÃEÀ;PM1PEÌ¿ÄCÀÊAÀÐ?ÀÖýÜùâ÷æóìïðéôçößüÛü×BÀÏBÀÉDÀÃDÀÄBÀÊ@ÀÐþØúÜøàôèîêìðèôàøÜúØþÐ@ÀÊBÀÄDÀÃDÀÉBÀÏBÀ×üÛüßöçôëîíîóæ÷âùÚýØ?ÀÐAÀÊCÀÄCÀÃAÀÉAÀÏû×ûÙõáóåïíëíåóáõÛûÕûÏAÀÉAÀÃCÀ;PM1PE;PM2FPPE=<añISÀ;PM0PEÄCÀÊAÀÐ?ÀÖýÜùâ÷æóìïðéôçößüÛü×BÀÏBÀÉDÀÃDÀÄBÀÊ@ÀÐþØúÜøàôèîêìðèôàøÜúØþÐ@ÀÊBÀÄDÀÃDÀÉBÀÏBÀ×üÛüßöçôëîíîóæ÷âùÚýØ?ÀÐAÀÊCÀÄCÀÃAÀÉAÀÏû×ûÙõáóåïíëíåóáõÛûÕûÏAÀÉAÀÃCÀ;PM1PEÊ¿ÄAÀÊAÀÐ?ÀÖûÜùâõäñìïîéôåöáøÙþÕþÑBÀÇDÀÃBÀÄBÀÈ@ÀÒüÖúÚöâòæðêêðæòâöÚúÖüÒ@ÀÈBÀÄBÀÃDÀÇBÀÑþÕþÙøáöåòéðïêñæõâùÜûÔ?ÀÒAÀÊAÀÂCÀÁAÀÉýÑýÓ÷ÛõáóåíéëïãñáõÛ÷ÕýÏýÉAÀÃCÀ;PM1PE;PM2FPPE=<WñISÀ;PM0PEÄAÀÊAÀÐ?ÀÖûÜùâõäñìïîéôåöáøÙþÕþÑBÀÇDÀÃBÀÄBÀÈ@ÀÒüÖúÚöâòæðêêðæòâöÚúÖüÒ@ÀÈBÀÄBÀÃDÀÇBÀÑþÕþÙøáöåòéðïêñæõâùÜûÔ?ÀÒAÀÊAÀÂCÀÁAÀÉýÑýÓ÷ÛõáóåíéëïãñáõÛ÷ÕýÏýÉAÀÃCÀ;PM1PEÌ¿ÄAÀÊ?ÀÐýÖûÚ÷âóäóêëîéòåößøÛüÕþÏ@ÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜôàôæìêêìæôàôÜøÖüÐþÈ@ÀÄBÀÃBÀÇ@ÀÏþÕüÛøßöåòéîëêóäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁ?ÀÉýÏûÕ÷ÛõßñãíééíãñáõÙ÷ÕûÏýÉ?ÀÃAÀ;PM1PE;PM2FPPE=<KñISÀ;PM0PEÄAÀÊ?ÀÐýÖûÚ÷âóäóêëîéòåößøÛüÕþÏ@ÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜôàôæìêêìæôàôÜøÖüÐþÈ@ÀÄBÀÃBÀÇ@ÀÏþÕüÛøßöåòéîëêóäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁ?ÀÉýÏûÕ÷ÛõßñãíééíãñáõÙ÷ÕûÏýÉ?ÀÃAÀ;PM1PEÌ¿Ä?ÀÈ?ÀÐûÖùÚ÷àóäñêíîçðãößöÛüÓüÏþÉBÀÃ@ÀÄ@ÀÊüÐúÔøÜôàòäìèêîäòàôÜøÔúÐüÊ@ÀÄ@ÀÃBÀÉþÏüÓüÛößöãðéìëêñäóâ÷ÚùÖûÎ?ÀÊ?ÀÄAÀÃýÉûÍûÕõÙõáïãíééëãïßõÙõÕûÏûÇýÃAÀ;PM1PE;PM2FT11,3FPPE=<?ñISÀ;PM0PEÄ?ÀÈ?ÀÐûÖùÚ÷àóäñêíîçðãößöÛüÓüÏþÉBÀÃ@ÀÄ@ÀÊüÐúÔøÜôàòäìèêîäòàôÜøÔúÐüÊ@ÀÄ@ÀÃBÀÉþÏüÓüÛößöãðéìëêñäóâ÷ÚùÖûÎ?ÀÊ?ÀÄAÀÃýÉûÍûÕõÙõáïãíééëãïßõÙõÕûÏûÇýÃAÀ;PM1PEÌ¿Ä?ÀÈýÐûÔ÷Ü÷ÞñäïèíìåðãôßøÙøÕüÍþÉ@ÀÃ@ÀÄþÊüÎøÖøÚòàðäîææîäðàòÚøÖøÎüÊþÄ@ÀÃ@ÀÉþÍüÕøÙøßôãðåìíèïäñÞ÷Ú÷ÖûÎýÊ?ÀÄ?ÀÃýÉûÍ÷Õ÷ÙóÝïãëççëãïÝóÛ÷Ó÷ÏûÇýÃ?À;PM1PE;PM2FPPE=<sðISÀ;PM0PEÄ?ÀÈýÐûÔ÷Ü÷ÞñäïèíìåðãôßøÙøÕüÍþÉ@ÀÃ@ÀÄþÊüÎøÖøÚòàðäîææîäðàòÚøÖøÎüÊþÄ@ÀÃ@ÀÉþÍüÕøÙøßôãðåìíèïäñÞ÷Ú÷ÖûÎýÊ?ÀÄ?ÀÃýÉûÍ÷Õ÷ÙóÝïãëççëãïÝóÛ÷Ó÷ÏûÇýÃ?À;PM1PEÊ¿ÄýÈýÐùÔ÷ÚõÞñäïèéìçîãôÝôÙúÕúÍþÉþÁþÂþÊúÎøÖöÚòÞðäêèèêäðÞòÚöÖøÎúÊþÂþÁþÉþÍúÕúÙôÝôãîçìéæïäñÞõÜ÷ÔùÐýÈýÄýÃýÇùÏùÓóÛóÝíãëåçëãíÝóÙóÓùÏùÇýÃý;PM1PE;PM2FT11,2FPPE=<iðISÀ;PM0PEÄýÈýÐùÔ÷ÚõÞñäïèéìçîãôÝôÙúÕúÍþÉþÁþÂþÊúÎøÖöÚòÞðäêèèêäðÞòÚöÖøÎúÊþÂþÁþÉþÍúÕúÙôÝôãîçìéæïäñÞõÜ÷ÔùÐýÈýÄýÃýÇùÏùÓóÛóÝíãëåçëãíÝóÙóÓùÏùÇýÃý;PM1PEÌ¿ÂûÊûÎùÔ÷ÚóÞñäíæëêåîáòÝöÛöÑúÏüÇþÃüÄüÈúÐøÒôÜòÞîâìææìâîÞòÜôÒøÐúÈüÄüÃþÇüÏúÑöÛöÝòáìåìëæíäñÞóÚ÷ÒùÐûÈûÄýÃûÇùÏõÑõÙñÝíãéååëãëÝñÙõÓõÍùÉûÁý;PM1PE;PM2FPPE=<]ðISÀ;PM0PEÂûÊûÎùÔ÷ÚóÞñäíæëêåîáòÝöÛöÑúÏüÇþÃüÄüÈúÐøÒôÜòÞîâìææìâîÞòÜôÒøÐúÈüÄüÃþÇüÏúÑöÛöÝòáìåìëæíäñÞóÚ÷ÒùÐûÈûÄýÃûÇùÏõÑõÙñÝíãéååëãëÝñÙõÓõÍùÉûÁý;PM1PEÌ¿ÂûÊùÎ÷ÔõÚóÜñâíæéêãîãðÛôÙöÓøÍüÇüÃüÄúÈøÎöÔôÚòÜîäêääêäîÜòÚôÔöÎøÈúÄüÃüÇüÍøÓöÙôÛðãîãêéäíäñÜóÚõÔ÷ÎùÈûÄûÃûÇ÷ÍõÓóÙïÛíãéãåéáíÛïÙóÓõÍ÷ÉûÁû;PM1PE;PM2FT11,3FPPE=<QðISÀ;PM0PEÂûÊùÎ÷ÔõÚóÜñâíæéêãîãðÛôÙöÓøÍüÇüÃüÄúÈøÎöÔôÚòÜîäêääêäîÜòÚôÔöÎøÈúÄüÃüÇüÍøÓöÙôÛðãîãêéäíäñÜóÚõÔ÷ÎùÈûÄûÃûÇ÷ÍõÓóÙïÛíãéãåéáíÛïÙóÓõÍ÷ÉûÁû;PM1PEÊ¿ÄùÈùÎ÷ÔõØñÞïâëäçêåìáðÝò×öÑøÏøÇüÃúÄúÈøÐöÒòØðÞìâèææèâìÞðØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðáìåêçäëâïÞñØõÔ÷ÎùÈùÄûÃ÷Ç÷ÍõÓñ×ïÝëáéããéáëÝï×ñÓõÍ÷Ç÷Ãû;PM1PE;PM2FT11,2FPPE=<GðISÀ;PM0PEÄùÈùÎ÷ÔõØñÞïâëäçêåìáðÝò×öÑøÏøÇüÃúÄúÈøÐöÒòØðÞìâèææèâìÞðØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðáìåêçäëâïÞñØõÔ÷ÎùÈùÄûÃ÷Ç÷ÍõÓñ×ïÝëáéããéáëÝï×ñÓõÍ÷Ç÷Ãû;PM1PEÌ¿ÂùÊ÷ÎõÒóØñÞíàëäçèåìßðÛð×ôÓøÍøÇúÃúÄøÈöÎôÔòØîÜìàèææèàìÜîØòÔôÎöÈøÄúÃúÇøÍøÓô×ðÛðßìåæçæëàíÞñØóÒõÎ÷ÊùÂùÁ÷É÷ÍóÑï×ïÝëßçåãåßëÝï×ïÑóÍ÷É÷Áù;PM1PE;PM2FT11,3FPPE=<{ïISÀ;PM0PEÂùÊ÷ÎõÒóØñÞíàëäçèåìßðÛð×ôÓøÍøÇúÃúÄøÈöÎôÔòØîÜìàèææèàìÜîØòÔôÎöÈøÄúÃúÇøÍøÓô×ðÛðßìåæçæëàíÞñØóÒõÎ÷ÊùÂùÁ÷É÷ÍóÑï×ïÝëßçåãåßëÝï×ïÑóÍ÷É÷Áù;PM1PEÊ¿Ä÷È÷ÎõÒñØïÜíàëäçèãêßîÛð×ôÑöÍøÇøÁøÂøÈöÎòÒðØîÜìàèääèàìÜîÖðÔòÎöÈøÂøÁøÇøÍöÓòÕòÛîßêãèçäëàíÜïÖñÔõÎ÷È÷Â÷Á÷ÇõÍóÓïÕíÛéßçããçßéÛí×ñÑñÍõÇ÷Ã÷;PM1PE;PM2FPPE=<qïISÀ;PM0PEÄ÷È÷ÎõÒñØïÜíàëäçèãêßîÛð×ôÑöÍøÇøÁøÂøÈöÎòÒðØîÜìàèääèàìÜîÖðÔòÎöÈøÂøÁøÇøÍöÓòÕòÛîßêãèçäëàíÜïÖñÔõÎ÷È÷Â÷Á÷ÇõÍóÓïÕíÛéßçããçßéÛí×ñÑñÍõÇ÷Ã÷;PM1PEÌ¿ÄõÈõÌõÔïÖïÜíàéâåèãèÝîÛð×òÑôÍöÇøÁöÂöÈöÎðÒðØîÜêÞæääæÞêÜîØðÒðÎöÈöÂöÁøÇöÍôÑò×ðÛîÝèãèåâéàíÚïØïÒõÎõÈõÂ÷ÁõÇóÍñÑï×íÙçßçááçßçÛíÕïÓñËóÇõÃ÷;PM1PE;PM2FT11,2FPPE=<eïISÀ;PM0PEÄõÈõÌõÔïÖïÜíàéâåèãèÝîÛð×òÑôÍöÇøÁöÂöÈöÎðÒðØîÜêÞæääæÞêÜîØðÒðÎöÈöÂöÁøÇöÍôÑò×ðÛîÝèãèåâéàíÚïØïÒõÎõÈõÂ÷ÁõÇóÍñÑï×íÙçßçááçßçÛíÕïÓñËóÇõÃ÷;PM1PEÌ¿ÂõÈóÎóÒñÖíÚëàéâãæãêÝìÙî×òÑòËöÉöÁöÂôÊôÌòÒîØìÚêÞääääÞêÚìØîÒòÌôÊôÂöÁöÉöËòÑò×îÙìÝêãäãäéÞëÜíÖñÒóÎóÈõÂõÁõÇñÍñÑíÕëÛéÝåãáãßéÙëÕíÑñÍñÇõÁõ;PM1PE;PM2FPPE=<YïISÀ;PM0PEÂõÈóÎóÒñÖíÚëàéâãæãêÝìÙî×òÑòËöÉöÁöÂôÊôÌòÒîØìÚêÞääääÞêÚìØîÒòÌôÊôÂöÁöÉöËòÑò×îÙìÝêãäãäéÞëÜíÖñÒóÎóÈõÂõÁõÇñÍñÑíÕëÛéÝåãáãßéÙëÕíÑñÍñÇõÁõ;PM1PEÌ¿ÂóÈõÎïÐïØíØëÞçâåæßèÝìÙìÕðÑòËôÉöÁôÂöÊðÌðÒîÖìÚèÞäàâæÞèÚìÖîÒðÌðÊöÂôÁöÉôËòÑðÕìÙìÝèáäãäçÞëØíØïÐïÎõÈóÂõÁóÇñÍïÏë×ë×çÝåãáãÝç×ë×ëÏïÍñÇóÁõ;PM1PE;PM2FT11,3FPPE=<MïISÀ;PM0PEÂóÈõÎïÐïØíØëÞçâåæßèÝìÙìÕðÑòËôÉöÁôÂöÊðÌðÒîÖìÚèÞäàâæÞèÚìÖîÒðÌðÊöÂôÁöÉôËòÑðÕìÙìÝèáäãäçÞëØíØïÐïÎõÈóÂõÁóÇñÍïÏë×ë×çÝåãáãÝç×ë×ëÏïÍñÇóÁõ;PM1PEÊ¿ÂóÊñÌñÒíÔíÚéÜåâãäáèÝêÙìÓðÑðËòÇöÁôÂòÈòÌîÒîÔêÚæÞäââäÞæÚêÔîÒîÌòÈòÂôÁöÇòËðÑðÓìÙêÝèáäãàåÞéÚíÔíÒñÌñÈóÄõÃñÇïËïÑëÓéÙçÝãßáãÛçÙéÓëÑïËïÉñÁõ;PM1PE;PM2FPPE=<CïISÀ;PM0PEÂóÊñÌñÒíÔíÚéÜåâãäáèÝêÙìÓðÑðËòÇöÁôÂòÈòÌîÒîÔêÚæÞäââäÞæÚêÔîÒîÌòÈòÂôÁöÇòËðÑðÓìÙêÝèáäãàåÞéÚíÔíÒñÌñÈóÄõÃñÇïËïÑëÓéÙçÝãßáãÛçÙéÓëÑïËïÉñÁõ;PM1PEÌ¿ÂñÈñÎïÐíÔëÚçÜåàãäßèÝè×ìÕîÏîÍôÅòÁòÂòÆðÎîÐìÖèØæÞäààäÞæØèÖìÐîÎðÆòÂòÁòÅôÍîÏîÕì×èÝèßâãâåÜçÚëÔíÐïÎñÆñÄñÃóÅíÍíÏëÓçÙçÛãáßáÛçÙçÓëÏíÍíÇóÁñ;PM1PE;PM2FPPE=<wîISÀ;PM0PEÂñÈñÎïÐíÔëÚçÜåàãäßèÝè×ìÕîÏîÍôÅòÁòÂòÆðÎîÐìÖèØæÞäààäÞæØèÖìÐîÎðÆòÂòÁòÅôÍîÏîÕì×èÝèßâãâåÜçÚëÔíÐïÎñÆñÄñÃóÅíÍíÏëÓçÙçÛãáßáÛçÙçÓëÏíÍíÇóÁñ;PM1PEÌ¿ÂïÆñÌíÒíÔéÚçÚåàãâÝèÛæÙìÓìÏðËðÇòÁðÂòÈîÌîÐêÔèÚæÜâÞàäÜæÚèÔêÐîÌîÈòÂðÁòÇðËðÏìÓìÙæÛèßàáàåÜçÚéÔíÐíÌñÈïÂñÁïÇïËëÏëÓåÙçÛáßßßÙçÙåÓëÑëËïÅïÁñ;PM1PE;PM2FPPE=<kîISÀ;PM0PEÂïÆñÌíÒíÔéÚçÚåàãâÝèÛæÙìÓìÏðËðÇòÁðÂòÈîÌîÐêÔèÚæÜâÞàäÜæÚèÔêÐîÌîÈòÂðÁòÇðËðÏìÓìÙæÛèßàáàåÜçÚéÔíÐíÌñÈïÂñÁïÇïËëÏëÓåÙçÛáßßßÙçÙåÓëÑëËïÅïÁñ;PM1PEÊ¿ÂïÈïÌíÐëÔçØçÜåÞßâßæÛæ×êÓìÏîËîÅòÃðÄðÆîÌìÐèÔèØæÜààààÜæØèÔèÐìÌîÆðÄðÃòÅîËîÏìÓê×æÛæßâßÞåÜçØçÔëÐíÌïÈïÂñÁíÇíËëÏéÓå×åÛáÝÝáÛå×åÓéÏëËíÇíÁñ;PM1PE;PM2FT11,2FPPE=<aîISÀ;PM0PEÂïÈïÌíÐëÔçØçÜåÞßâßæÛæ×êÓìÏîËîÅòÃðÄðÆîÌìÐèÔèØæÜààààÜæØèÔèÐìÌîÆðÄðÃòÅîËîÏìÓê×æÛæßâßÞåÜçØçÔëÐíÌïÈïÂñÁíÇíËëÏéÓå×åÛáÝÝáÛå×åÓéÏëËíÇíÁñ;PM1PEÌ¿ÂïÈíÊëÒéÒéØåÚãÞßâÝäÛæÕèÓìÏìËîÅðÃðÄîÆìÌêÐêÔæÖäÜàÞÞàÜäÖæÔêÐêÌìÆîÄðÃðÅîËìÏìÓèÕæÛäÝâßÜãÜåØéÒéÒëÊíÈïÂïÁíÇëÉëÑçÑå×ãÛáÛÝáÙã×åÑçÑëÉëÇíÁï;PM1PE;PM2FT11,3FPPE=<UîISÀ;PM0PEÂïÈíÊëÒéÒéØåÚãÞßâÝäÛæÕèÓìÏìËîÅðÃðÄîÆìÌêÐêÔæÖäÜàÞÞàÜäÖæÔêÐêÌìÆîÄðÃðÅîËìÏìÓèÕæÛäÝâßÜãÜåØéÒéÒëÊíÈïÂïÁíÇëÉëÑçÑå×ãÛáÛÝáÙã×åÑçÑëÉëÇíÁï;PM1PEÊ¿ÄíÆëÌíÎçÔçÖåÜáÜáàÛäÙä×êÑèÏìÉìÇðÁîÂìÈîÊèÐèÒæØâÚâÜÜâÚâØæÒèÐèÊîÈìÂîÁðÇìÉìÏèÑê×äÙäÛàáÜáÚåØçÒçÐíÌëÆíÂïÁëÅëËçÏéÑã×ãÙßÛÛßÛãÕãÓéÍçËëÅëÃï;PM1PE;PM2FPPE=<KîISÀ;PM0PEÄíÆëÌíÎçÔçÖåÜáÜáàÛäÙä×êÑèÏìÉìÇðÁîÂìÈîÊèÐèÒæØâÚâÜÜâÚâØæÒèÐèÊîÈìÂîÁðÇìÉìÏèÑê×äÙäÛàáÜáÚåØçÒçÐíÌëÆíÂïÁëÅëËçÏéÑã×ãÙßÛÛßÛãÕãÓéÍçËëÅëÃï;PM1PEÌ¿ÄíÆéÌéÎéÒåÖãÚáÜßàÛâÙäÕèÓèÍêÉìÇîÁîÂêÈêÊêÎæÔäÖâÚàÜÜàÚâÖäÔæÎêÊêÈêÂîÁîÇìÉêÍèÓèÕäÙâÛàßÚáÜãÔåÔéÎéÌéÆíÂíÁëÅéËçÍçÓãÓáÛßÙÛßÙáÕãÑçÍçËéÅëÃí;PM1PE;PM2FPPE=<?îISÀ;PM0PEÄíÆéÌéÎéÒåÖãÚáÜßàÛâÙäÕèÓèÍêÉìÇîÁîÂêÈêÊêÎæÔäÖâÚàÜÜàÚâÖäÔæÎêÊêÈêÂîÁîÇìÉêÍèÓèÕäÙâÛàßÚáÜãÔåÔéÎéÌéÆíÂíÁëÅéËçÍçÓãÓáÛßÙÛßÙáÕãÑçÍçËéÅëÃí;PM1PEÌ¿ÂëÆéÊéÐçÒãÖãØáÜÝÞÝâ×äÓæÓèÍêËêÅìÁìÂêÆêÌèÎäÔäÔâØÞÞÞÞØâÔäÔäÎèÌêÆêÂìÁìÅêËêÍèÓæÓä×âÝÞÝÜáØãÖãÒçÎéÌéÆëÂëÁéÅéËçÍåÑãÕá×ÝÛÛÝ×áÕãÑåÏçÉéÅéÁë;PM1PE;PM2FPPE=<síISÀ;PM0PEÂëÆéÊéÐçÒãÖãØáÜÝÞÝâ×äÓæÓèÍêËêÅìÁìÂêÆêÌèÎäÔäÔâØÞÞÞÞØâÔäÔäÎèÌêÆêÂìÁìÅêËêÍèÓæÓä×âÝÞÝÜáØãÖãÒçÎéÌéÆëÂëÁéÅéËçÍåÑãÕá×ÝÛÛÝ×áÕãÑåÏçÉéÅéÁë;PM1PEÌ¿ÂéÆéÊçÐåÐåÖáØáÜÛÜÛà×äÕäÏæÍêËèÅìÁêÂêÆèÌæÎæÐâÖâØÜÜÜÜØâÖâÐæÎæÌèÆêÂêÁìÅèËêÍæÏäÕä×àÛÜÛÜáØáÖåÐåÎçÌéÆéÂëÁçÅéËåÍãÏãÕß×ÛÛÛÛ×ßÕãÏãÏåÉéÅçÁë;PM1PE;PM2FPPE=<gíISÀ;PM0PEÂéÆéÊçÐåÐåÖáØáÜÛÜÛà×äÕäÏæÍêËèÅìÁêÂêÆèÌæÎæÐâÖâØÜÜÜÜØâÖâÐæÎæÌèÆêÂêÁìÅèËêÍæÏäÕä×àÛÜÛÜáØáÖåÐåÎçÌéÆéÂëÁçÅéËåÍãÏãÕß×ÛÛÛÛ×ßÕãÏãÏåÉéÅçÁë;PM1PEÊ¿ÂéÆçÊåÎçÒáÔáØßÚÛÞÛÞ×äÓâÏæÍæÉêÅêÁêÂèÆæÊèÎâÐâÔàØÜÜÜÜØàÔâÐâÎèÊæÆèÂêÁêÅêÉæÍæÏâÓä×ÞÛÞÛÚßØáÔáÐçÐåÈçÆéÄéÃéÅåÇåÏáÏãÓÝ×ÝÙÙÝ×ÝÓãÑáÍåÉåÅéÁé;PM1PE;PM2FPPE=<]íISÀ;PM0PEÂéÆçÊåÎçÒáÔáØßÚÛÞÛÞ×äÓâÏæÍæÉêÅêÁêÂèÆæÊèÎâÐâÔàØÜÜÜÜØàÔâÐâÎèÊæÆèÂêÁêÅêÉæÍæÏâÓä×ÞÛÞÛÚßØáÔáÐçÐåÈçÆéÄéÃéÅåÇåÏáÏãÓÝ×ÝÙÙÝ×ÝÓãÑáÍåÉåÅéÁé;PM1PEÌ¿ÂçÆåÊçÎãÐáÔáØÝØÛÞÙÞÕâÓàÑæËæÉæÅêÁèÂæÆèÊäÌâÒâÔÞÖÜÚÚÜÖÞÔâÒâÌäÊèÆæÂèÁêÅæÉæËäÑâÓâÕÞÙÞÛØÝØáÔáÐãÎçÈåÆçÄéÃåÅåÇåÍßÏáÓÝ×Ý××Ý×ÝÓáÏáÍãÉåÅåÁé;PM1PE;PM2FPPE=<QíISÀ;PM0PEÂçÆåÊçÎãÐáÔáØÝØÛÞÙÞÕâÓàÑæËæÉæÅêÁèÂæÆèÊäÌâÒâÔÞÖÜÚÚÜÖÞÔâÒâÌäÊèÆæÂèÁêÅæÉæËäÑâÓâÕÞÙÞÛØÝØáÔáÐãÎçÈåÆçÄéÃåÅåÇåÍßÏáÓÝ×Ý××Ý×ÝÓáÏáÍãÉåÅåÁé;PM1PEÌ¿ÂçÆåÊãÌãÐáÔßÖÛÚÛÚÙÞÕàÓâÏäËäÉæÅèÁèÂæÆäÊäÌâÐàÔÜÖÜÚÚÜÖÜÔàÐâÌäÊäÆæÂèÁèÅæÉäËäÏâÓàÕÞÙÚÛÚÛÖßÔáÐãÌãÊåÆçÂçÁåÅãÉãËáÏßÓÝÕÙÙÙÙÕÝÓßÏáËãÉãÅåÁç;PM1PE;PM2FPPE=<EíISÀ;PM0PEÂçÆåÊãÌãÐáÔßÖÛÚÛÚÙÞÕàÓâÏäËäÉæÅèÁèÂæÆäÊäÌâÐàÔÜÖÜÚÚÜÖÜÔàÐâÌäÊäÆæÂèÁèÅæÉäËäÏâÓàÕÞÙÚÛÚÛÖßÔáÐãÌãÊåÆçÂçÁåÅãÉãËáÏßÓÝÕÙÙÙÙÕÝÓßÏáËãÉãÅåÁç;PM1PEÌ¿ÂåÄåÊãÎßÎáÒÝÖÝØÙÜ×ÜÕÞÑâÏâÍäÇæÅæÁæÂæÆäÈàÎâÐÞÒÞÖÚØØÚÖÞÒÞÐâÎàÈäÆæÂæÁæÅæÇäÍâÏâÑÞÕÜ×ÚÙÚÝÖÝÒáÎßÎãÊåÄåÂåÁåÃãÉáÍáÍÝÑÛÕÛÙ×ÙÕÛÑÝÍáÍáÉãÃåÁå;PM1PE;PM2FPPE=<yìISÀ;PM0PEÂåÄåÊãÎßÎáÒÝÖÝØÙÜ×ÜÕÞÑâÏâÍäÇæÅæÁæÂæÆäÈàÎâÐÞÒÞÖÚØØÚÖÞÒÞÐâÎàÈäÆæÂæÁæÅæÇäÍâÏâÑÞÕÜ×ÚÙÚÝÖÝÒáÎßÎãÊåÄåÂåÁåÃãÉáÍáÍÝÑÛÕÛÙ×ÙÕÛÑÝÍáÍáÉãÃåÁå;PM1PEÊ¿ÂãÆãÈãÌáÐÝÒÝÔÝØ×Ú×ÜÓÞÑàÏâËâÉäÃæÃäÄäÄäÊâÌÞÐÞÒÞÔØØØØÔÞÒÞÐÞÌâÊäÄäÄäÃæÃäÉâËâÏàÑÞÓÜ×Ú×ØÝÔÝÒÝÎáÌãÊãÆãÂåÁãÅáÉáËßÍÝÑÛÓÙ××ÙÓÛÑÝÏßËáÇáÅãÁå;PM1PE;PM2FT11,2FPPE=<oìISÀ;PM0PEÂãÆãÈãÌáÐÝÒÝÔÝØ×Ú×ÜÓÞÑàÏâËâÉäÃæÃäÄäÄäÊâÌÞÐÞÒÞÔØØØØÔÞÒÞÐÞÌâÊäÄäÄäÃæÃäÉâËâÏàÑÞÓÜ×Ú×ØÝÔÝÒÝÎáÌãÊãÆãÂåÁãÅáÉáËßÍÝÑÛÓÙ××ÙÓÛÑÝÏßËáÇáÅãÁå;PM1PEÊ¿ÄãÄáÈáÌßÐßÐÛÖÛÖÙÚÕÚÓÞÑÞÍâËàÉäÃäÁäÂâÄâÊàÌàÎÜÒÜÔÚÖÖÚÔÜÒÜÎàÌàÊâÄâÂäÁäÃäÉàËâÍÞÑÞÓÚÕÚÙÖÛÖÛÐßÐßÌáÈáÄãÂãÁãÃßÇáËÝÏÝÏÙÕÙÕÕÙÕÙÏÝÏÝËáÇßÃãÃã;PM1PE;PM2FT11,3FPPE=<eìISÀ;PM0PEÄãÄáÈáÌßÐßÐÛÖÛÖÙÚÕÚÓÞÑÞÍâËàÉäÃäÁäÂâÄâÊàÌàÎÜÒÜÔÚÖÖÚÔÜÒÜÎàÌàÊâÄâÂäÁäÃäÉàËâÍÞÑÞÓÚÕÚÙÖÛÖÛÐßÐßÌáÈáÄãÂãÁãÃßÇáËÝÏÝÏÙÕÙÕÕÙÕÙÏÝÏÝËáÇßÃãÃã;PM1PEÌ¿ÂáÆáÈßÌßÎÝÒÛÒÙÖ×ÚÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÒÜÎÞÊàÊàÆâ¿â¿äÅàÉâÉÞÍÞÑÜÓÚÕØ×ØÙÒÛÒÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÑÙÑÙ×Õ×ÑÙÑÛÍÝËÝÇáÅßÁã;PM1PE;PM2FPPE=<YìISÀ;PM0PEÂáÆáÈßÌßÎÝÒÛÒÙÖ×ÚÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÒÜÎÞÊàÊàÆâ¿â¿äÅàÉâÉÞÍÞÑÜÓÚÕØ×ØÙÒÛÒÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÑÙÑÙ×Õ×ÑÙÑÛÍÝËÝÇáÅßÁã;PM1PEÌ¿¿áÆßÈÝÌßÎÛÐÛÔÙÔÕØÕÚÓÚÏÞÍÞËàÅàÅâÁâÂàÆÞÆàÌÜÎÜÐÚÔÖÖÖÖÔÚÐÜÎÜÌàÆÞÆàÂâÁâÅàÅàËÞÍÞÏÚÓÚÕØÕÔÙÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÝÍÙÏÙÓ×ÓÓ×ÓÙÏÙÍÝËÝÇßÅß¿á;PM1PE;PM2FPPE=<MìISÀ;PM0PE¿áÆßÈÝÌßÎÛÐÛÔÙÔÕØÕÚÓÚÏÞÍÞËàÅàÅâÁâÂàÆÞÆàÌÜÎÜÐÚÔÖÖÖÖÔÚÐÜÎÜÌàÆÞÆàÂâÁâÅàÅàËÞÍÞÏÚÓÚÕØÕÔÙÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÝÍÙÏÙÓ×ÓÓ×ÓÙÏÙÍÝËÝÇßÅß¿á;PM1PEÌ¿Æ?ÀÒûÞõèíîçöÛüÓ@ÀÅ@ÀÆüÔöÜîèèîÜöÔüÆ@ÀÅ@ÀÓüÛöçîíèõÞûÒ?ÀÆ?ÀÅûÑõÝíççíÝõÑûÅ?À;PM1PE;PM2FPPE=<AìISÀ;PM0PEÆ?ÀÒûÞõèíîçöÛüÓ@ÀÅ@ÀÆüÔöÜîèèîÜöÔüÆ@ÀÅ@ÀÓüÛöçîíèõÞûÒ?ÀÆ?ÀÅûÑõÝíççíÝõÑûÅ?À;PM1PEÊ¿ÆûÒùÞõäëîåôÛúÑþÅüÆúÒöÜìææìÜöÒúÆüÅþÑúÛôåîëäõÞùÒûÆýÅùÑóÝíããíÝóÑùÅý;PM1PE;PM2FPPE=<wëISÀ;PM0PEÆûÒùÞõäëîåôÛúÑþÅüÆúÒöÜìææìÜöÒúÆüÅþÑúÛôåîëäõÞùÒûÆýÅùÑóÝíããíÝóÑùÅý;PM1PEÌ¿ÆùÒ÷ÚñäëîãòÛöÏüÅúÆøÐòÜìääìÜòÐøÆúÅüÏöÛòãîëäñÚ÷ÒùÆûÅõÑñÙíããíÙñÑõÅû;PM1PE;PM2FPPE=<këISÀ;PM0PEÆùÒ÷ÚñäëîãòÛöÏüÅúÆøÐòÜìääìÜòÐøÆúÅüÏöÛòãîëäñÚ÷ÒùÆûÅõÑñÙíããíÙñÑõÅû;PM1PEÌ¿ÆùÐóÚïäéêáðÛôÏúÅúÆôÐðÜêââêÜðÐôÆúÅúÏôÛðáêéäïÚóÐùÆùÅóÏïÙéããéÙïÏóÅù;PM1PE;PM2FPPE=<_ëISÀ;PM0PEÆùÐóÚïäéêáðÛôÏúÅúÆôÐðÜêââêÜðÐôÆúÅúÏôÛðáêéäïÚóÐùÆùÅóÏïÙéããéÙïÏóÅù;PM1PEÌ¿ÆõÎóÚíâçèáî×òÏøÅöÆôÐîØèââèØîÐôÆöÅøÏò×îáèçâíÚóÎõÆ÷ÅñÍíÙçááçÙíÍñÅ÷;PM1PE;PM2FPPE=<SëISÀ;PM0PEÆõÎóÚíâçèáî×òÏøÅöÆôÐîØèââèØîÐôÆöÅøÏò×îáèçâíÚóÎõÆ÷ÅñÍíÙçááçÙíÍñÅ÷;PM1PEÊ¿ÄóÐñØëàåèßì×ðÏöÅôÆòÐìØæààæØìÐòÆôÅöÏð×ìßèåàëØñÐóÄõÃïÏë×çßßç×ëÏïÃõ;PM1PE;PM2FPPE=<IëISÀ;PM0PEÄóÐñØëàåèßì×ðÏöÅôÆòÐìØæààæØìÐòÆôÅöÏð×ìßèåàëØñÐóÄõÃïÏë×çßßç×ëÏïÃõ;PM1PEÌ¿ÄñÐíØéÞåäÝê×ðÍòÅòÆîÎêØæÞÞæØêÎîÆòÅòÍð×êÝäåÞéØíÐñÄñÃïÏé×ãÝÝã×éÏïÃñ;PM1PE;PM2FPPE=<}êISÀ;PM0PEÄñÐíØéÞåäÝê×ðÍòÅòÆîÎêØæÞÞæØêÎîÆòÅòÍð×êÝäåÞéØíÐñÄñÃïÏé×ãÝÝã×éÏïÃñ;PM1PEÊ¿ÆïÎëÖçÞãâÝêÕìÍðÃðÄìÎèÖäÞÞäÖèÎìÄðÃðÍìÕêÝâãÞçÖëÎïÆïÅëÍéÕáÝÝáÕéÍëÅï;PM1PE;PM2FPPE=<sêISÀ;PM0PEÆïÎëÖçÞãâÝêÕìÍðÃðÄìÎèÖäÞÞäÖèÎìÄðÃðÍìÕêÝâãÞçÖëÎïÆïÅëÍéÕáÝÝáÕéÍëÅï;PM1PEÌ¿ÄíÎéÖåÚáâÛæÕìËîÅîÆêÌæÖâÜÜâÖæÌêÆîÅîËìÕæÛâáÚåÖéÎíÄíÃëÍåÕáÙÙáÕåÍëÃí;PM1PE;PM2FPPE=<gêISÀ;PM0PEÄíÎéÖåÚáâÛæÕìËîÅîÆêÌæÖâÜÜâÖæÌêÆîÅîËìÕæÛâáÚåÖéÎíÄíÃëÍåÕáÙÙáÕåÍëÃí;PM1PEÌ¿ÄéÌéÔãÜßàÙäÓèËìÅêÆêÌäÔàÚÚàÔäÌêÆêÅìËèÓäÙàßÜãÔéÌéÄëÃçËãÓßÛÛßÓãËçÃë;PM1PE;PM2FPPE=<[êISÀ;PM0PEÄéÌéÔãÜßàÙäÓèËìÅêÆêÌäÔàÚÚàÔäÌêÆêÅìËèÓäÙàßÜãÔéÌéÄëÃçËãÓßÛÛßÓãËçÃë;PM1PEÊ¿ÄçÌåÔãØÝàÙâÓæËêÁèÂæÌäÔÞÚÚÞÒäÎæÂèÁêÍæÑâÙàÝØãÒåÎçÄéÃåÍáÑß××ßÓáËåÃé;PM1PE;PM2FPPE=<QêISÀ;PM0PEÄçÌåÔãØÝàÙâÓæËêÁèÂæÌäÔÞÚÚÞÒäÎæÂèÁêÍæÑâÙàÝØãÒåÎçÄéÃåÍáÑß××ßÓáËåÃé;PM1PEÌ¿ÄåÌãÒáÖÛÞ×âÑäËæÁæÂäÌâÒÜØØÜÒâÌäÂæÁæËäÑâ×ÜÛØáÒãÌåÄåÃãËáÑÝ×ÕÛÑáËãÃå;PM1PE;PM2FPPE=<EêISÀ;PM0PEÄåÌãÒáÖÛÞ×âÑäËæÁæÂäÌâÒÜØØÜÒâÌäÂæÁæËäÑâ×ÜÛØáÒãÌåÄåÃãËáÑÝ×ÕÛÑáËãÃå;PM1PEÌ¿ÂãÌáÐßØÙÚÕÞÑäÉäÃäÄâÊàÒÚÖÖÚÒàÊâÄäÃäÉäÑÞÕÚÙØßÐáÌãÂãÁãËÝÏÙ××ÙÏÝËãÁã;PM1PE;PM2FPPE=<yéISÀ;PM0PEÂãÌáÐßØÙÚÕÞÑäÉäÃäÄâÊàÒÚÖÖÚÒàÊâÄäÃäÉäÑÞÕÚÙØßÐáÌãÂãÁãËÝÏÙ××ÙÏÝËãÁã;PM1PEÌ¿ÂáÊßÐÛÖÙØÕÞÍàÉâÃâÄàÊÜÎÚÖÖÚÎÜÊàÄâÃâÉàÍÞÕØÙÖÛÐßÊáÂáÁßÉÝÏ×ÕÕ×ÏÝÉßÁá;PM1PE;PM2FPPE=<méISÀ;PM0PEÂáÊßÐÛÖÙØÕÞÍàÉâÃâÄàÊÜÎÚÖÖÚÎÜÊàÄâÃâÉàÍÞÕØÙÖÛÐßÊáÂáÁßÉÝÏ×ÕÕ×ÏÝÉßÁá;PM1PEÊ¿ÄßÊÝÎÙÒ×ØÓÜÍÞÉàÃàÄÞÊÚÎØÔÔØÎÚÊÞÄàÃàÉÞÍÜÓØ×ÒÙÎÝÊßÄßÃÝÉÛÍ×ÑÑ×ÍÛÉÝÃß;PM1PE;PM2FPPE=<céISÀ;PM0PEÄßÊÝÎÙÒ×ØÓÜÍÞÉàÃàÄÞÊÚÎØÔÔØÎÚÊÞÄàÃàÉÞÍÜÓØ×ÒÙÎÝÊßÄßÃÝÉÛÍ×ÑÑ×ÍÛÉÝÃß;PM1PEÌ¿ÄÝÈÙÎÙÒÕÖÑÚÍÚÇÞÃÞÄÚÈÚÎÖÒÒÖÎÚÈÚÄÞÃÞÇÚÍÚÑÖÕÒÙÎÙÈÝÄÝÃÙÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PE;PM2FPPE=<WéISÀ;PM0PEÄÝÈÙÎÙÒÕÖÑÚÍÚÇÞÃÞÄÚÈÚÎÖÒÒÖÎÚÈÚÄÞÃÞÇÚÍÚÑÖÕÒÙÎÙÈÝÄÝÃÙÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PEÊ¿ÄÛÈ×Ì×ÒÓÔÏÖÍÚÇÜÁÜÂØÈØÎÔÐÐÔÎØÈØÂÜÁÜÇÚÍÖÏÔÓÒ×Ì×ÈÛÄÛÃÙÇÕËÓÑÑÓËÕÇÙÃÛ;PM1PE;PM2FPPE=<MéISÀ;PM0PEÄÛÈ×Ì×ÒÓÔÏÖÍÚÇÜÁÜÂØÈØÎÔÐÐÔÎØÈØÂÜÁÜÇÚÍÖÏÔÓÒ×Ì×ÈÛÄÛÃÙÇÕËÓÑÑÓËÕÇÙÃÛ;PM1PEÌ¿Ä×Æ×ÌÕÐÑÒÍÖËÖÇÚÁØÂØÈÖÌÒÎÎÒÌÖÈØÂØÁÚÇÖËÖÍÒÑÐÕÌ×Æ×ÄÙÃÕÅÕËÑÏÏÑËÕÅÕÃÙ;PM1PE;PM2FPPE=<AéISÀ;PM0PEÄ×Æ×ÌÕÐÑÒÍÖËÖÇÚÁØÂØÈÖÌÒÎÎÒÌÖÈØÂØÁÚÇÖËÖÍÒÑÐÕÌ×Æ×ÄÙÃÕÅÕËÑÏÏÑËÕÅÕÃÙ;PM1PEÌ¿ÂÕÈÕÈÓÐÏÐÍÔÉÔÇØÁÖÂÖÈÔÊÐÎÎÐÊÔÈÖÂÖÁØÇÔÉÔÍÐÏÐÓÈÕÈÕÂ×ÁÓÇÓÇÏÏÏÏÇÓÇÓÁ×;PM1PE;PM2FPPE=<uèISÀ;PM0PEÂÕÈÕÈÓÐÏÐÍÔÉÔÇØÁÖÂÖÈÔÊÐÎÎÐÊÔÈÖÂÖÁØÇÔÉÔÍÐÏÐÓÈÕÈÕÂ×ÁÓÇÓÇÏÏÏÏÇÓÇÓÁ×;PM1PEÊ¿ÂÓÆÓÊÑÌÍÐËÒÉÔÅÔÁÔÂÔÆÒÊÎÌÌÎÊÒÆÔÂÔÁÔÅÔÉÒËÐÍÌÑÊÓÆÓÂÓÁÓÅÑÉÏËËÏÉÑÅÓÁÓ;PM1PE;PM2FPPE=<kèISÀ;PM0PEÂÓÆÓÊÑÌÍÐËÒÉÔÅÔÁÔÂÔÆÒÊÎÌÌÎÊÒÆÔÂÔÁÔÅÔÉÒËÐÍÌÑÊÓÆÓÂÓÁÓÅÑÉÏËËÏÉÑÅÓÁÓ;PM1PEÌ¿ÂÑÆÏÈÏÌÍÎËÎÇÒÃÒÁÒÂÐÄÐÈÎÌÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎÍÌÏÈÏÆÑÂÑÁÑÅÍÇÍËËÍÇÍÅÑÁÑ;PM1PE;PM2FPPE=<_èISÀ;PM0PEÂÑÆÏÈÏÌÍÎËÎÇÒÃÒÁÒÂÐÄÐÈÎÌÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎÍÌÏÈÏÆÑÂÑÁÑÅÍÇÍËËÍÇÍÅÑÁÑ;PM1PEÌ¿¿ÏÆÍÆÍÌËÌÉÌÇÎÃÒÁÐÂÎÄÎÈÌÊÊÌÈÎÄÎÂÐÁÒÃÎÇÌÉÌËÌÍÆÍÆÏ¿Ñ¿ÍÅËÅËËËËÅËÅÍ¿Ñ;PM1PE;PM2FPPE=<SèISÀ;PM0PE¿ÏÆÍÆÍÌËÌÉÌÇÎÃÒÁÐÂÎÄÎÈÌÊÊÌÈÎÄÎÂÐÁÒÃÎÇÌÉÌËÌÍÆÍÆÏ¿Ñ¿ÍÅËÅËËËËÅËÅÍ¿Ñ;PM1PEÌ¿¿ËÆÍÆËÈÉÊÇÌÅÌÃÎÁÌÂÎÄÌÆÊÈÈÊÆÌÄÎÂÌÁÎÃÌÅÌÇÊÉÈËÆÍÆË¿Í¿ËÅËÅÉÇÇÉÅËÅË¿Í;PM1PE;PM2FPPE=<GèISÀ;PM0PE¿ËÆÍÆËÈÉÊÇÌÅÌÃÎÁÌÂÎÄÌÆÊÈÈÊÆÌÄÎÂÌÁÎÃÌÅÌÇÊÉÈËÆÍÆË¿Í¿ËÅËÅÉÇÇÉÅËÅË¿Í;PM1PEÊ¿ÄÕÌÑÔËÖÅÖÆÒÌÌÒÆÖÅÖËÔÑÌÕÄÕÃÓËËÓÃÕ;PM1PE;PM2FPPE=<}çISÀ;PM0PEÄÕÌÑÔËÖÅÖÆÒÌÌÒÆÖÅÖËÔÑÌÕÄÕÃÓËËÓÃÕ;PM1PEÌ¿ÄÏÊÏÎÉÒÃÐÄÎÊÌÐÄÐÃÒËÎÍÊÏÄÑÃÍÉÉÍÃÑ;PM1PE;PM2FPPE=<qçISÀ;PM0PEÄÏÊÏÎÉÒÃÐÄÎÊÌÐÄÐÃÒËÎÍÊÏÄÑÃÍÉÉÍÃÑ;PM1PEÊ¿ÄËÆËÌÇÎÁÌÂÌÈÈÌÂÌÁÎÇÊËÈËÄÍÃËÇÅÉÃÍ;PM1PE;PM2FPPE=<gçISÀ;PM0PEÄËÆËÌÇÎÁÌÂÌÈÈÌÂÌÁÎÇÊËÈËÄÍÃËÇÅÉÃÍ;PM1PEÌ¿ÄÇÄÇÈÃÈÁÈÂÈÄÄÈÂÈÁÈÃÈÇÄÇÄÇÃÇÃÃÇÃÇ;PM1PE;PM2FPPE=<[çISÀ;PM0PEÄÇÄÇÈÃÈÁÈÂÈÄÄÈÂÈÁÈÃÈÇÄÇÄÇÃÇÃÃÇÃÇ;PM1PEÌ¿¿ÃÄÃÂÁÆÁÄÂÄÂÂÄÂÄÁÆÁÂÃÄÿſÁÃÃÁ¿Å;PM1PE;PM2FPPE=<OçISÀ;PM0PE¿ÃÄÃÂÁÆÁÄÂÄÂÂÄÂÄÁÆÁÂÃÄÿſÁÃÃÁ¿Å;PM2FPMC1,240PE=<Eãq[À;PM0PEÖðÎøÊüÆBÀ¿FÀÁHÀÅLÀÇNÀËPÀÍNÀÍNÀÏNÀÏJÀÏHÀÑBÀÏ@ÀÅÐÇÎÉÈÍÆÏÄÓÂÕ¿ÙÂ׿×ÁÑÃÏÅÍÇÍËËÍËÏ×åÕåÓáÑáÏÝÍÝËÝÉÙÉÙÅÙÅ×Á×ÃÕ¿Õ¿Õ¿ÕÄçÆíÄíÄïÄñÂï¿ñ¿ï¿ïÃëÃéÉåÉáÍÛÑ×ÓÑÉÇÁÇÆÇÊÅÐÅÖÃØÅÞÃÞÃàÁàÁàÁà¿Þ¿Ü¿ØÂÔ¿Ü¿à¿äÂâÄàÊÚÎÒÖ;PM2FTFPMC1,90PE=<YòISÀ;PM0PEÄIÀÊGÀÒEÀÚAÀÞ?Àäûê÷îóôíøéüã@ÀÝBÀÙFÀÑHÀÉJÀÃJÀÄHÀÊFÀÒBÀÚ@ÀÞüäøêôîîôêøäüÞ@ÀÚBÀÒFÀÊHÀÄJÀÃJÀÉHÀÑFÀÙBÀÝ@Àãüéøíôóî÷êûä?ÀÞAÀÚEÀÒGÀÊIÀÄIÀÃGÀÉEÀÑAÀÙ?ÀÝûã÷éóííóé÷ãûÝ?ÀÙAÀÑEÀÉGÀÃIÀ;PM1PEÊ¿ÄGÀÊGÀÒCÀØAÀÞýäûêõîñòïøçúã@ÀÝBÀ×DÀÑFÀËJÀÁHÀÂHÀÌDÀÒBÀØþÞüäöèòððòèöäüÞþØBÀÒDÀÌHÀÂHÀÁJÀËFÀÑDÀ×BÀÝþãüçöïôñîõèûäýÞAÀØCÀÒGÀÌGÀÄIÀÃEÀËCÀÑAÀ×?ÀÝùã÷çñííóéõãûÝý×AÀÑCÀÉEÀÃIÀ;PM1PE;PM2FT11,2FPPE=<OòISÀ;PM0PEÄGÀÊGÀÒCÀØAÀÞýäûêõîñòïøçúã@ÀÝBÀ×DÀÑFÀËJÀÁHÀÂHÀÌDÀÒBÀØþÞüäöèòððòèöäüÞþØBÀÒDÀÌHÀÂHÀÁJÀËFÀÑDÀ×BÀÝþãüçöïôñîõèûäýÞAÀØCÀÒGÀÌGÀÄIÀÃEÀËCÀÑAÀ×?ÀÝùã÷çñííóéõãûÝý×AÀÑCÀÉEÀÃIÀ;PM1PEÌ¿ÂGÀÌEÀÐAÀØAÀÞýäùèõîñòíöçúáþÝ@À×DÀÑFÀÉHÀÃHÀÄFÀÊBÀÒBÀØþÞúâöèòîîòèöâúÞþØBÀÒBÀÊFÀÄHÀÃHÀÉFÀÑDÀ×@ÀÝþáúçöíòñîõèùäýÞAÀØAÀÐEÀÊGÀÄGÀÃEÀÉCÀÏ?À×ýÝùãõçñííñçõãùÝý×?ÀÏCÀËEÀÁGÀ;PM1PE;PM2FPPE=<CòISÀ;PM0PEÂGÀÌEÀÐAÀØAÀÞýäùèõîñòíöçúáþÝ@À×DÀÑFÀÉHÀÃHÀÄFÀÊBÀÒBÀØþÞúâöèòîîòèöâúÞþØBÀÒBÀÊFÀÄHÀÃHÀÉFÀÑDÀ×@ÀÝþáúçöíòñîõèùäýÞAÀØAÀÐEÀÊGÀÄGÀÃEÀÉCÀÏ?À×ýÝùãõçñííñçõãùÝý×?ÀÏCÀËEÀÁGÀ;PM1PEÌ¿ÂEÀÌCÀÐAÀØ?ÀÞýâ÷èõìñòëöçøáüÝ@ÀÕBÀÑDÀÉHÀÃFÀÄDÀÊBÀÒ@ÀÖþÞøâöèòììòèöâøÞþÖ@ÀÒBÀÊDÀÄFÀÃHÀÉDÀÑBÀÕ@ÀÝüáøçöëòñìõè÷âýÞ?ÀØAÀÐCÀÊEÀÄGÀÃCÀÉAÀÏ?À×ûÝ÷áõçñëëñçõá÷Ýû×?ÀÏAÀËCÀÁGÀ;PM1PE;PM2FT11,3FPPE=<wñISÀ;PM0PEÂEÀÌCÀÐAÀØ?ÀÞýâ÷èõìñòëöçøáüÝ@ÀÕBÀÑDÀÉHÀÃFÀÄDÀÊBÀÒ@ÀÖþÞøâöèòììòèöâøÞþÖ@ÀÒBÀÊDÀÄFÀÃHÀÉDÀÑBÀÕ@ÀÝüáøçöëòñìõè÷âýÞ?ÀØAÀÐCÀÊEÀÄGÀÃCÀÉAÀÏ?À×ûÝ÷áõçñëëñçõá÷Ýû×?ÀÏAÀËCÀÁGÀ;PM1PEÊ¿ÄEÀÊAÀÒAÀÖýÜûâ÷èóìïðíöåøáúÝþÕBÀÏDÀËFÀÃFÀÄBÀÌBÀÐþÖüÞøâôæðîîðæôâøÞüÖþÐBÀÌBÀÄFÀÃFÀËDÀÏBÀÕþÝúáøåöíðïìóè÷àûÞýÖAÀÒAÀÊEÀÄEÀÃCÀÉAÀÑýÕùÝ÷ßõçïëëïçõá÷ÛùÕýÑAÀÉCÀÃEÀ;PM1PE;PM2FT11,2FPPE=<mñISÀ;PM0PEÄEÀÊAÀÒAÀÖýÜûâ÷èóìïðíöåøáúÝþÕBÀÏDÀËFÀÃFÀÄBÀÌBÀÐþÖüÞøâôæðîîðæôâøÞüÖþÐBÀÌBÀÄFÀÃFÀËDÀÏBÀÕþÝúáøåöíðïìóè÷àûÞýÖAÀÒAÀÊEÀÄEÀÃCÀÉAÀÑýÕùÝ÷ßõçïëëïçõá÷ÛùÕýÑAÀÉCÀÃEÀ;PM1PEÌ¿ÄCÀÊAÀÐ?ÀÖýÜùâ÷æóìïðéôçößüÛü×BÀÏBÀÉDÀÃDÀÄBÀÊ@ÀÐþØúÜøàôèîêìðèôàøÜúØþÐ@ÀÊBÀÄDÀÃDÀÉBÀÏBÀ×üÛüßöçôëîíîóæ÷âùÚýØ?ÀÐAÀÊCÀÄCÀÃAÀÉAÀÏû×ûÙõáóåïíëíåóáõÛûÕûÏAÀÉAÀÃCÀ;PM1PE;PM2FPPE=<añISÀ;PM0PEÄCÀÊAÀÐ?ÀÖýÜùâ÷æóìïðéôçößüÛü×BÀÏBÀÉDÀÃDÀÄBÀÊ@ÀÐþØúÜøàôèîêìðèôàøÜúØþÐ@ÀÊBÀÄDÀÃDÀÉBÀÏBÀ×üÛüßöçôëîíîóæ÷âùÚýØ?ÀÐAÀÊCÀÄCÀÃAÀÉAÀÏû×ûÙõáóåïíëíåóáõÛûÕûÏAÀÉAÀÃCÀ;PM1PEÊ¿ÄAÀÊAÀÐ?ÀÖûÜùâõäñìïîéôåöáøÙþÕþÑBÀÇDÀÃBÀÄBÀÈ@ÀÒüÖúÚöâòæðêêðæòâöÚúÖüÒ@ÀÈBÀÄBÀÃDÀÇBÀÑþÕþÙøáöåòéðïêñæõâùÜûÔ?ÀÒAÀÊAÀÂCÀÁAÀÉýÑýÓ÷ÛõáóåíéëïãñáõÛ÷ÕýÏýÉAÀÃCÀ;PM1PE;PM2FPPE=<WñISÀ;PM0PEÄAÀÊAÀÐ?ÀÖûÜùâõäñìïîéôåöáøÙþÕþÑBÀÇDÀÃBÀÄBÀÈ@ÀÒüÖúÚöâòæðêêðæòâöÚúÖüÒ@ÀÈBÀÄBÀÃDÀÇBÀÑþÕþÙøáöåòéðïêñæõâùÜûÔ?ÀÒAÀÊAÀÂCÀÁAÀÉýÑýÓ÷ÛõáóåíéëïãñáõÛ÷ÕýÏýÉAÀÃCÀ;PM1PEÌ¿ÄAÀÊ?ÀÐýÖûÚ÷âóäóêëîéòåößøÛüÕþÏ@ÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜôàôæìêêìæôàôÜøÖüÐþÈ@ÀÄBÀÃBÀÇ@ÀÏþÕüÛøßöåòéîëêóäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁ?ÀÉýÏûÕ÷ÛõßñãíééíãñáõÙ÷ÕûÏýÉ?ÀÃAÀ;PM1PE;PM2FPPE=<KñISÀ;PM0PEÄAÀÊ?ÀÐýÖûÚ÷âóäóêëîéòåößøÛüÕþÏ@ÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜôàôæìêêìæôàôÜøÖüÐþÈ@ÀÄBÀÃBÀÇ@ÀÏþÕüÛøßöåòéîëêóäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁ?ÀÉýÏûÕ÷ÛõßñãíééíãñáõÙ÷ÕûÏýÉ?ÀÃAÀ;PM1PEÌ¿Ä?ÀÈ?ÀÐûÖùÚ÷àóäñêíîçðãößöÛüÓüÏþÉBÀÃ@ÀÄ@ÀÊüÐúÔøÜôàòäìèêîäòàôÜøÔúÐüÊ@ÀÄ@ÀÃBÀÉþÏüÓüÛößöãðéìëêñäóâ÷ÚùÖûÎ?ÀÊ?ÀÄAÀÃýÉûÍûÕõÙõáïãíééëãïßõÙõÕûÏûÇýÃAÀ;PM1PE;PM2FT11,3FPPE=<?ñISÀ;PM0PEÄ?ÀÈ?ÀÐûÖùÚ÷àóäñêíîçðãößöÛüÓüÏþÉBÀÃ@ÀÄ@ÀÊüÐúÔøÜôàòäìèêîäòàôÜøÔúÐüÊ@ÀÄ@ÀÃBÀÉþÏüÓüÛößöãðéìëêñäóâ÷ÚùÖûÎ?ÀÊ?ÀÄAÀÃýÉûÍûÕõÙõáïãíééëãïßõÙõÕûÏûÇýÃAÀ;PM1PEÌ¿Ä?ÀÈýÐûÔ÷Ü÷ÞñäïèíìåðãôßøÙøÕüÍþÉ@ÀÃ@ÀÄþÊüÎøÖøÚòàðäîææîäðàòÚøÖøÎüÊþÄ@ÀÃ@ÀÉþÍüÕøÙøßôãðåìíèïäñÞ÷Ú÷ÖûÎýÊ?ÀÄ?ÀÃýÉûÍ÷Õ÷ÙóÝïãëççëãïÝóÛ÷Ó÷ÏûÇýÃ?À;PM1PE;PM2FPPE=<sðISÀ;PM0PEÄ?ÀÈýÐûÔ÷Ü÷ÞñäïèíìåðãôßøÙøÕüÍþÉ@ÀÃ@ÀÄþÊüÎøÖøÚòàðäîææîäðàòÚøÖøÎüÊþÄ@ÀÃ@ÀÉþÍüÕøÙøßôãðåìíèïäñÞ÷Ú÷ÖûÎýÊ?ÀÄ?ÀÃýÉûÍ÷Õ÷ÙóÝïãëççëãïÝóÛ÷Ó÷ÏûÇýÃ?À;PM1PEÊ¿ÄýÈýÐùÔ÷ÚõÞñäïèéìçîãôÝôÙúÕúÍþÉþÁþÂþÊúÎøÖöÚòÞðäêèèêäðÞòÚöÖøÎúÊþÂþÁþÉþÍúÕúÙôÝôãîçìéæïäñÞõÜ÷ÔùÐýÈýÄýÃýÇùÏùÓóÛóÝíãëåçëãíÝóÙóÓùÏùÇýÃý;PM1PE;PM2FT11,2FPPE=<iðISÀ;PM0PEÄýÈýÐùÔ÷ÚõÞñäïèéìçîãôÝôÙúÕúÍþÉþÁþÂþÊúÎøÖöÚòÞðäêèèêäðÞòÚöÖøÎúÊþÂþÁþÉþÍúÕúÙôÝôãîçìéæïäñÞõÜ÷ÔùÐýÈýÄýÃýÇùÏùÓóÛóÝíãëåçëãíÝóÙóÓùÏùÇýÃý;PM1PEÌ¿ÂûÊûÎùÔ÷ÚóÞñäíæëêåîáòÝöÛöÑúÏüÇþÃüÄüÈúÐøÒôÜòÞîâìææìâîÞòÜôÒøÐúÈüÄüÃþÇüÏúÑöÛöÝòáìåìëæíäñÞóÚ÷ÒùÐûÈûÄýÃûÇùÏõÑõÙñÝíãéååëãëÝñÙõÓõÍùÉûÁý;PM1PE;PM2FPPE=<]ðISÀ;PM0PEÂûÊûÎùÔ÷ÚóÞñäíæëêåîáòÝöÛöÑúÏüÇþÃüÄüÈúÐøÒôÜòÞîâìææìâîÞòÜôÒøÐúÈüÄüÃþÇüÏúÑöÛöÝòáìåìëæíäñÞóÚ÷ÒùÐûÈûÄýÃûÇùÏõÑõÙñÝíãéååëãëÝñÙõÓõÍùÉûÁý;PM1PEÌ¿ÂûÊùÎ÷ÔõÚóÜñâíæéêãîãðÛôÙöÓøÍüÇüÃüÄúÈøÎöÔôÚòÜîäêääêäîÜòÚôÔöÎøÈúÄüÃüÇüÍøÓöÙôÛðãîãêéäíäñÜóÚõÔ÷ÎùÈûÄûÃûÇ÷ÍõÓóÙïÛíãéãåéáíÛïÙóÓõÍ÷ÉûÁû;PM1PE;PM2FT11,3FPPE=<QðISÀ;PM0PEÂûÊùÎ÷ÔõÚóÜñâíæéêãîãðÛôÙöÓøÍüÇüÃüÄúÈøÎöÔôÚòÜîäêääêäîÜòÚôÔöÎøÈúÄüÃüÇüÍøÓöÙôÛðãîãêéäíäñÜóÚõÔ÷ÎùÈûÄûÃûÇ÷ÍõÓóÙïÛíãéãåéáíÛïÙóÓõÍ÷ÉûÁû;PM1PEÊ¿ÄùÈùÎ÷ÔõØñÞïâëäçêåìáðÝò×öÑøÏøÇüÃúÄúÈøÐöÒòØðÞìâèææèâìÞðØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðáìåêçäëâïÞñØõÔ÷ÎùÈùÄûÃ÷Ç÷ÍõÓñ×ïÝëáéããéáëÝï×ñÓõÍ÷Ç÷Ãû;PM1PE;PM2FT11,2FPPE=<GðISÀ;PM0PEÄùÈùÎ÷ÔõØñÞïâëäçêåìáðÝò×öÑøÏøÇüÃúÄúÈøÐöÒòØðÞìâèææèâìÞðØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðáìåêçäëâïÞñØõÔ÷ÎùÈùÄûÃ÷Ç÷ÍõÓñ×ïÝëáéããéáëÝï×ñÓõÍ÷Ç÷Ãû;PM1PEÌ¿ÂùÊ÷ÎõÒóØñÞíàëäçèåìßðÛð×ôÓøÍøÇúÃúÄøÈöÎôÔòØîÜìàèææèàìÜîØòÔôÎöÈøÄúÃúÇøÍøÓô×ðÛðßìåæçæëàíÞñØóÒõÎ÷ÊùÂùÁ÷É÷ÍóÑï×ïÝëßçåãåßëÝï×ïÑóÍ÷É÷Áù;PM1PE;PM2FT11,3FPPE=<{ïISÀ;PM0PEÂùÊ÷ÎõÒóØñÞíàëäçèåìßðÛð×ôÓøÍøÇúÃúÄøÈöÎôÔòØîÜìàèææèàìÜîØòÔôÎöÈøÄúÃúÇøÍøÓô×ðÛðßìåæçæëàíÞñØóÒõÎ÷ÊùÂùÁ÷É÷ÍóÑï×ïÝëßçåãåßëÝï×ïÑóÍ÷É÷Áù;PM1PEÊ¿Ä÷È÷ÎõÒñØïÜíàëäçèãêßîÛð×ôÑöÍøÇøÁøÂøÈöÎòÒðØîÜìàèääèàìÜîÖðÔòÎöÈøÂøÁøÇøÍöÓòÕòÛîßêãèçäëàíÜïÖñÔõÎ÷È÷Â÷Á÷ÇõÍóÓïÕíÛéßçããçßéÛí×ñÑñÍõÇ÷Ã÷;PM1PE;PM2FPPE=<qïISÀ;PM0PEÄ÷È÷ÎõÒñØïÜíàëäçèãêßîÛð×ôÑöÍøÇøÁøÂøÈöÎòÒðØîÜìàèääèàìÜîÖðÔòÎöÈøÂøÁøÇøÍöÓòÕòÛîßêãèçäëàíÜïÖñÔõÎ÷È÷Â÷Á÷ÇõÍóÓïÕíÛéßçããçßéÛí×ñÑñÍõÇ÷Ã÷;PM1PEÌ¿ÄõÈõÌõÔïÖïÜíàéâåèãèÝîÛð×òÑôÍöÇøÁöÂöÈöÎðÒðØîÜêÞæääæÞêÜîØðÒðÎöÈöÂöÁøÇöÍôÑò×ðÛîÝèãèåâéàíÚïØïÒõÎõÈõÂ÷ÁõÇóÍñÑï×íÙçßçááçßçÛíÕïÓñËóÇõÃ÷;PM1PE;PM2FT11,2FPPE=<eïISÀ;PM0PEÄõÈõÌõÔïÖïÜíàéâåèãèÝîÛð×òÑôÍöÇøÁöÂöÈöÎðÒðØîÜêÞæääæÞêÜîØðÒðÎöÈöÂöÁøÇöÍôÑò×ðÛîÝèãèåâéàíÚïØïÒõÎõÈõÂ÷ÁõÇóÍñÑï×íÙçßçááçßçÛíÕïÓñËóÇõÃ÷;PM1PEÌ¿ÂõÈóÎóÒñÖíÚëàéâãæãêÝìÙî×òÑòËöÉöÁöÂôÊôÌòÒîØìÚêÞääääÞêÚìØîÒòÌôÊôÂöÁöÉöËòÑò×îÙìÝêãäãäéÞëÜíÖñÒóÎóÈõÂõÁõÇñÍñÑíÕëÛéÝåãáãßéÙëÕíÑñÍñÇõÁõ;PM1PE;PM2FPPE=<YïISÀ;PM0PEÂõÈóÎóÒñÖíÚëàéâãæãêÝìÙî×òÑòËöÉöÁöÂôÊôÌòÒîØìÚêÞääääÞêÚìØîÒòÌôÊôÂöÁöÉöËòÑò×îÙìÝêãäãäéÞëÜíÖñÒóÎóÈõÂõÁõÇñÍñÑíÕëÛéÝåãáãßéÙëÕíÑñÍñÇõÁõ;PM1PEÌ¿ÂóÈõÎïÐïØíØëÞçâåæßèÝìÙìÕðÑòËôÉöÁôÂöÊðÌðÒîÖìÚèÞäàâæÞèÚìÖîÒðÌðÊöÂôÁöÉôËòÑðÕìÙìÝèáäãäçÞëØíØïÐïÎõÈóÂõÁóÇñÍïÏë×ë×çÝåãáãÝç×ë×ëÏïÍñÇóÁõ;PM1PE;PM2FT11,3FPPE=<MïISÀ;PM0PEÂóÈõÎïÐïØíØëÞçâåæßèÝìÙìÕðÑòËôÉöÁôÂöÊðÌðÒîÖìÚèÞäàâæÞèÚìÖîÒðÌðÊöÂôÁöÉôËòÑðÕìÙìÝèáäãäçÞëØíØïÐïÎõÈóÂõÁóÇñÍïÏë×ë×çÝåãáãÝç×ë×ëÏïÍñÇóÁõ;PM1PEÊ¿ÂóÊñÌñÒíÔíÚéÜåâãäáèÝêÙìÓðÑðËòÇöÁôÂòÈòÌîÒîÔêÚæÞäââäÞæÚêÔîÒîÌòÈòÂôÁöÇòËðÑðÓìÙêÝèáäãàåÞéÚíÔíÒñÌñÈóÄõÃñÇïËïÑëÓéÙçÝãßáãÛçÙéÓëÑïËïÉñÁõ;PM1PE;PM2FPPE=<CïISÀ;PM0PEÂóÊñÌñÒíÔíÚéÜåâãäáèÝêÙìÓðÑðËòÇöÁôÂòÈòÌîÒîÔêÚæÞäââäÞæÚêÔîÒîÌòÈòÂôÁöÇòËðÑðÓìÙêÝèáäãàåÞéÚíÔíÒñÌñÈóÄõÃñÇïËïÑëÓéÙçÝãßáãÛçÙéÓëÑïËïÉñÁõ;PM1PEÌ¿ÂñÈñÎïÐíÔëÚçÜåàãäßèÝè×ìÕîÏîÍôÅòÁòÂòÆðÎîÐìÖèØæÞäààäÞæØèÖìÐîÎðÆòÂòÁòÅôÍîÏîÕì×èÝèßâãâåÜçÚëÔíÐïÎñÆñÄñÃóÅíÍíÏëÓçÙçÛãáßáÛçÙçÓëÏíÍíÇóÁñ;PM1PE;PM2FPPE=<wîISÀ;PM0PEÂñÈñÎïÐíÔëÚçÜåàãäßèÝè×ìÕîÏîÍôÅòÁòÂòÆðÎîÐìÖèØæÞäààäÞæØèÖìÐîÎðÆòÂòÁòÅôÍîÏîÕì×èÝèßâãâåÜçÚëÔíÐïÎñÆñÄñÃóÅíÍíÏëÓçÙçÛãáßáÛçÙçÓëÏíÍíÇóÁñ;PM1PEÌ¿ÂïÆñÌíÒíÔéÚçÚåàãâÝèÛæÙìÓìÏðËðÇòÁðÂòÈîÌîÐêÔèÚæÜâÞàäÜæÚèÔêÐîÌîÈòÂðÁòÇðËðÏìÓìÙæÛèßàáàåÜçÚéÔíÐíÌñÈïÂñÁïÇïËëÏëÓåÙçÛáßßßÙçÙåÓëÑëËïÅïÁñ;PM1PE;PM2FPPE=<kîISÀ;PM0PEÂïÆñÌíÒíÔéÚçÚåàãâÝèÛæÙìÓìÏðËðÇòÁðÂòÈîÌîÐêÔèÚæÜâÞàäÜæÚèÔêÐîÌîÈòÂðÁòÇðËðÏìÓìÙæÛèßàáàåÜçÚéÔíÐíÌñÈïÂñÁïÇïËëÏëÓåÙçÛáßßßÙçÙåÓëÑëËïÅïÁñ;PM1PEÊ¿ÂïÈïÌíÐëÔçØçÜåÞßâßæÛæ×êÓìÏîËîÅòÃðÄðÆîÌìÐèÔèØæÜààààÜæØèÔèÐìÌîÆðÄðÃòÅîËîÏìÓê×æÛæßâßÞåÜçØçÔëÐíÌïÈïÂñÁíÇíËëÏéÓå×åÛáÝÝáÛå×åÓéÏëËíÇíÁñ;PM1PE;PM2FT11,2FPPE=<aîISÀ;PM0PEÂïÈïÌíÐëÔçØçÜåÞßâßæÛæ×êÓìÏîËîÅòÃðÄðÆîÌìÐèÔèØæÜààààÜæØèÔèÐìÌîÆðÄðÃòÅîËîÏìÓê×æÛæßâßÞåÜçØçÔëÐíÌïÈïÂñÁíÇíËëÏéÓå×åÛáÝÝáÛå×åÓéÏëËíÇíÁñ;PM1PEÌ¿ÂïÈíÊëÒéÒéØåÚãÞßâÝäÛæÕèÓìÏìËîÅðÃðÄîÆìÌêÐêÔæÖäÜàÞÞàÜäÖæÔêÐêÌìÆîÄðÃðÅîËìÏìÓèÕæÛäÝâßÜãÜåØéÒéÒëÊíÈïÂïÁíÇëÉëÑçÑå×ãÛáÛÝáÙã×åÑçÑëÉëÇíÁï;PM1PE;PM2FT11,3FPPE=<UîISÀ;PM0PEÂïÈíÊëÒéÒéØåÚãÞßâÝäÛæÕèÓìÏìËîÅðÃðÄîÆìÌêÐêÔæÖäÜàÞÞàÜäÖæÔêÐêÌìÆîÄðÃðÅîËìÏìÓèÕæÛäÝâßÜãÜåØéÒéÒëÊíÈïÂïÁíÇëÉëÑçÑå×ãÛáÛÝáÙã×åÑçÑëÉëÇíÁï;PM1PEÊ¿ÄíÆëÌíÎçÔçÖåÜáÜáàÛäÙä×êÑèÏìÉìÇðÁîÂìÈîÊèÐèÒæØâÚâÜÜâÚâØæÒèÐèÊîÈìÂîÁðÇìÉìÏèÑê×äÙäÛàáÜáÚåØçÒçÐíÌëÆíÂïÁëÅëËçÏéÑã×ãÙßÛÛßÛãÕãÓéÍçËëÅëÃï;PM1PE;PM2FPPE=<KîISÀ;PM0PEÄíÆëÌíÎçÔçÖåÜáÜáàÛäÙä×êÑèÏìÉìÇðÁîÂìÈîÊèÐèÒæØâÚâÜÜâÚâØæÒèÐèÊîÈìÂîÁðÇìÉìÏèÑê×äÙäÛàáÜáÚåØçÒçÐíÌëÆíÂïÁëÅëËçÏéÑã×ãÙßÛÛßÛãÕãÓéÍçËëÅëÃï;PM1PEÌ¿ÄíÆéÌéÎéÒåÖãÚáÜßàÛâÙäÕèÓèÍêÉìÇîÁîÂêÈêÊêÎæÔäÖâÚàÜÜàÚâÖäÔæÎêÊêÈêÂîÁîÇìÉêÍèÓèÕäÙâÛàßÚáÜãÔåÔéÎéÌéÆíÂíÁëÅéËçÍçÓãÓáÛßÙÛßÙáÕãÑçÍçËéÅëÃí;PM1PE;PM2FPPE=<?îISÀ;PM0PEÄíÆéÌéÎéÒåÖãÚáÜßàÛâÙäÕèÓèÍêÉìÇîÁîÂêÈêÊêÎæÔäÖâÚàÜÜàÚâÖäÔæÎêÊêÈêÂîÁîÇìÉêÍèÓèÕäÙâÛàßÚáÜãÔåÔéÎéÌéÆíÂíÁëÅéËçÍçÓãÓáÛßÙÛßÙáÕãÑçÍçËéÅëÃí;PM1PEÌ¿ÂëÆéÊéÐçÒãÖãØáÜÝÞÝâ×äÓæÓèÍêËêÅìÁìÂêÆêÌèÎäÔäÔâØÞÞÞÞØâÔäÔäÎèÌêÆêÂìÁìÅêËêÍèÓæÓä×âÝÞÝÜáØãÖãÒçÎéÌéÆëÂëÁéÅéËçÍåÑãÕá×ÝÛÛÝ×áÕãÑåÏçÉéÅéÁë;PM1PE;PM2FPPE=<síISÀ;PM0PEÂëÆéÊéÐçÒãÖãØáÜÝÞÝâ×äÓæÓèÍêËêÅìÁìÂêÆêÌèÎäÔäÔâØÞÞÞÞØâÔäÔäÎèÌêÆêÂìÁìÅêËêÍèÓæÓä×âÝÞÝÜáØãÖãÒçÎéÌéÆëÂëÁéÅéËçÍåÑãÕá×ÝÛÛÝ×áÕãÑåÏçÉéÅéÁë;PM1PEÌ¿ÂéÆéÊçÐåÐåÖáØáÜÛÜÛà×äÕäÏæÍêËèÅìÁêÂêÆèÌæÎæÐâÖâØÜÜÜÜØâÖâÐæÎæÌèÆêÂêÁìÅèËêÍæÏäÕä×àÛÜÛÜáØáÖåÐåÎçÌéÆéÂëÁçÅéËåÍãÏãÕß×ÛÛÛÛ×ßÕãÏãÏåÉéÅçÁë;PM1PE;PM2FPPE=<gíISÀ;PM0PEÂéÆéÊçÐåÐåÖáØáÜÛÜÛà×äÕäÏæÍêËèÅìÁêÂêÆèÌæÎæÐâÖâØÜÜÜÜØâÖâÐæÎæÌèÆêÂêÁìÅèËêÍæÏäÕä×àÛÜÛÜáØáÖåÐåÎçÌéÆéÂëÁçÅéËåÍãÏãÕß×ÛÛÛÛ×ßÕãÏãÏåÉéÅçÁë;PM1PEÊ¿ÂéÆçÊåÎçÒáÔáØßÚÛÞÛÞ×äÓâÏæÍæÉêÅêÁêÂèÆæÊèÎâÐâÔàØÜÜÜÜØàÔâÐâÎèÊæÆèÂêÁêÅêÉæÍæÏâÓä×ÞÛÞÛÚßØáÔáÐçÐåÈçÆéÄéÃéÅåÇåÏáÏãÓÝ×ÝÙÙÝ×ÝÓãÑáÍåÉåÅéÁé;PM1PE;PM2FPPE=<]íISÀ;PM0PEÂéÆçÊåÎçÒáÔáØßÚÛÞÛÞ×äÓâÏæÍæÉêÅêÁêÂèÆæÊèÎâÐâÔàØÜÜÜÜØàÔâÐâÎèÊæÆèÂêÁêÅêÉæÍæÏâÓä×ÞÛÞÛÚßØáÔáÐçÐåÈçÆéÄéÃéÅåÇåÏáÏãÓÝ×ÝÙÙÝ×ÝÓãÑáÍåÉåÅéÁé;PM1PEÌ¿ÂçÆåÊçÎãÐáÔáØÝØÛÞÙÞÕâÓàÑæËæÉæÅêÁèÂæÆèÊäÌâÒâÔÞÖÜÚÚÜÖÞÔâÒâÌäÊèÆæÂèÁêÅæÉæËäÑâÓâÕÞÙÞÛØÝØáÔáÐãÎçÈåÆçÄéÃåÅåÇåÍßÏáÓÝ×Ý××Ý×ÝÓáÏáÍãÉåÅåÁé;PM1PE;PM2FPPE=<QíISÀ;PM0PEÂçÆåÊçÎãÐáÔáØÝØÛÞÙÞÕâÓàÑæËæÉæÅêÁèÂæÆèÊäÌâÒâÔÞÖÜÚÚÜÖÞÔâÒâÌäÊèÆæÂèÁêÅæÉæËäÑâÓâÕÞÙÞÛØÝØáÔáÐãÎçÈåÆçÄéÃåÅåÇåÍßÏáÓÝ×Ý××Ý×ÝÓáÏáÍãÉåÅåÁé;PM1PEÌ¿ÂçÆåÊãÌãÐáÔßÖÛÚÛÚÙÞÕàÓâÏäËäÉæÅèÁèÂæÆäÊäÌâÐàÔÜÖÜÚÚÜÖÜÔàÐâÌäÊäÆæÂèÁèÅæÉäËäÏâÓàÕÞÙÚÛÚÛÖßÔáÐãÌãÊåÆçÂçÁåÅãÉãËáÏßÓÝÕÙÙÙÙÕÝÓßÏáËãÉãÅåÁç;PM1PE;PM2FPPE=<EíISÀ;PM0PEÂçÆåÊãÌãÐáÔßÖÛÚÛÚÙÞÕàÓâÏäËäÉæÅèÁèÂæÆäÊäÌâÐàÔÜÖÜÚÚÜÖÜÔàÐâÌäÊäÆæÂèÁèÅæÉäËäÏâÓàÕÞÙÚÛÚÛÖßÔáÐãÌãÊåÆçÂçÁåÅãÉãËáÏßÓÝÕÙÙÙÙÕÝÓßÏáËãÉãÅåÁç;PM1PEÌ¿ÂåÄåÊãÎßÎáÒÝÖÝØÙÜ×ÜÕÞÑâÏâÍäÇæÅæÁæÂæÆäÈàÎâÐÞÒÞÖÚØØÚÖÞÒÞÐâÎàÈäÆæÂæÁæÅæÇäÍâÏâÑÞÕÜ×ÚÙÚÝÖÝÒáÎßÎãÊåÄåÂåÁåÃãÉáÍáÍÝÑÛÕÛÙ×ÙÕÛÑÝÍáÍáÉãÃåÁå;PM1PE;PM2FPPE=<yìISÀ;PM0PEÂåÄåÊãÎßÎáÒÝÖÝØÙÜ×ÜÕÞÑâÏâÍäÇæÅæÁæÂæÆäÈàÎâÐÞÒÞÖÚØØÚÖÞÒÞÐâÎàÈäÆæÂæÁæÅæÇäÍâÏâÑÞÕÜ×ÚÙÚÝÖÝÒáÎßÎãÊåÄåÂåÁåÃãÉáÍáÍÝÑÛÕÛÙ×ÙÕÛÑÝÍáÍáÉãÃåÁå;PM1PEÊ¿ÂãÆãÈãÌáÐÝÒÝÔÝØ×Ú×ÜÓÞÑàÏâËâÉäÃæÃäÄäÄäÊâÌÞÐÞÒÞÔØØØØÔÞÒÞÐÞÌâÊäÄäÄäÃæÃäÉâËâÏàÑÞÓÜ×Ú×ØÝÔÝÒÝÎáÌãÊãÆãÂåÁãÅáÉáËßÍÝÑÛÓÙ××ÙÓÛÑÝÏßËáÇáÅãÁå;PM1PE;PM2FT11,2FPPE=<oìISÀ;PM0PEÂãÆãÈãÌáÐÝÒÝÔÝØ×Ú×ÜÓÞÑàÏâËâÉäÃæÃäÄäÄäÊâÌÞÐÞÒÞÔØØØØÔÞÒÞÐÞÌâÊäÄäÄäÃæÃäÉâËâÏàÑÞÓÜ×Ú×ØÝÔÝÒÝÎáÌãÊãÆãÂåÁãÅáÉáËßÍÝÑÛÓÙ××ÙÓÛÑÝÏßËáÇáÅãÁå;PM1PEÊ¿ÄãÄáÈáÌßÐßÐÛÖÛÖÙÚÕÚÓÞÑÞÍâËàÉäÃäÁäÂâÄâÊàÌàÎÜÒÜÔÚÖÖÚÔÜÒÜÎàÌàÊâÄâÂäÁäÃäÉàËâÍÞÑÞÓÚÕÚÙÖÛÖÛÐßÐßÌáÈáÄãÂãÁãÃßÇáËÝÏÝÏÙÕÙÕÕÙÕÙÏÝÏÝËáÇßÃãÃã;PM1PE;PM2FT11,3FPPE=<eìISÀ;PM0PEÄãÄáÈáÌßÐßÐÛÖÛÖÙÚÕÚÓÞÑÞÍâËàÉäÃäÁäÂâÄâÊàÌàÎÜÒÜÔÚÖÖÚÔÜÒÜÎàÌàÊâÄâÂäÁäÃäÉàËâÍÞÑÞÓÚÕÚÙÖÛÖÛÐßÐßÌáÈáÄãÂãÁãÃßÇáËÝÏÝÏÙÕÙÕÕÙÕÙÏÝÏÝËáÇßÃãÃã;PM1PEÌ¿ÂáÆáÈßÌßÎÝÒÛÒÙÖ×ÚÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÒÜÎÞÊàÊàÆâ¿â¿äÅàÉâÉÞÍÞÑÜÓÚÕØ×ØÙÒÛÒÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÑÙÑÙ×Õ×ÑÙÑÛÍÝËÝÇáÅßÁã;PM1PE;PM2FPPE=<YìISÀ;PM0PEÂáÆáÈßÌßÎÝÒÛÒÙÖ×ÚÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÒÜÎÞÊàÊàÆâ¿â¿äÅàÉâÉÞÍÞÑÜÓÚÕØ×ØÙÒÛÒÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÑÙÑÙ×Õ×ÑÙÑÛÍÝËÝÇáÅßÁã;PM1PEÌ¿¿áÆßÈÝÌßÎÛÐÛÔÙÔÕØÕÚÓÚÏÞÍÞËàÅàÅâÁâÂàÆÞÆàÌÜÎÜÐÚÔÖÖÖÖÔÚÐÜÎÜÌàÆÞÆàÂâÁâÅàÅàËÞÍÞÏÚÓÚÕØÕÔÙÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÝÍÙÏÙÓ×ÓÓ×ÓÙÏÙÍÝËÝÇßÅß¿á;PM1PE;PM2FPPE=<MìISÀ;PM0PE¿áÆßÈÝÌßÎÛÐÛÔÙÔÕØÕÚÓÚÏÞÍÞËàÅàÅâÁâÂàÆÞÆàÌÜÎÜÐÚÔÖÖÖÖÔÚÐÜÎÜÌàÆÞÆàÂâÁâÅàÅàËÞÍÞÏÚÓÚÕØÕÔÙÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÝÍÙÏÙÓ×ÓÓ×ÓÙÏÙÍÝËÝÇßÅß¿á;PM1PEÌ¿Æ?ÀÒûÞõèíîçöÛüÓ@ÀÅ@ÀÆüÔöÜîèèîÜöÔüÆ@ÀÅ@ÀÓüÛöçîíèõÞûÒ?ÀÆ?ÀÅûÑõÝíççíÝõÑûÅ?À;PM1PE;PM2FPPE=<AìISÀ;PM0PEÆ?ÀÒûÞõèíîçöÛüÓ@ÀÅ@ÀÆüÔöÜîèèîÜöÔüÆ@ÀÅ@ÀÓüÛöçîíèõÞûÒ?ÀÆ?ÀÅûÑõÝíççíÝõÑûÅ?À;PM1PEÊ¿ÆûÒùÞõäëîåôÛúÑþÅüÆúÒöÜìææìÜöÒúÆüÅþÑúÛôåîëäõÞùÒûÆýÅùÑóÝíããíÝóÑùÅý;PM1PE;PM2FPPE=<wëISÀ;PM0PEÆûÒùÞõäëîåôÛúÑþÅüÆúÒöÜìææìÜöÒúÆüÅþÑúÛôåîëäõÞùÒûÆýÅùÑóÝíããíÝóÑùÅý;PM1PEÌ¿ÆùÒ÷ÚñäëîãòÛöÏüÅúÆøÐòÜìääìÜòÐøÆúÅüÏöÛòãîëäñÚ÷ÒùÆûÅõÑñÙíããíÙñÑõÅû;PM1PE;PM2FPPE=<këISÀ;PM0PEÆùÒ÷ÚñäëîãòÛöÏüÅúÆøÐòÜìääìÜòÐøÆúÅüÏöÛòãîëäñÚ÷ÒùÆûÅõÑñÙíããíÙñÑõÅû;PM1PEÌ¿ÆùÐóÚïäéêáðÛôÏúÅúÆôÐðÜêââêÜðÐôÆúÅúÏôÛðáêéäïÚóÐùÆùÅóÏïÙéããéÙïÏóÅù;PM1PE;PM2FPPE=<_ëISÀ;PM0PEÆùÐóÚïäéêáðÛôÏúÅúÆôÐðÜêââêÜðÐôÆúÅúÏôÛðáêéäïÚóÐùÆùÅóÏïÙéããéÙïÏóÅù;PM1PEÌ¿ÆõÎóÚíâçèáî×òÏøÅöÆôÐîØèââèØîÐôÆöÅøÏò×îáèçâíÚóÎõÆ÷ÅñÍíÙçááçÙíÍñÅ÷;PM1PE;PM2FPPE=<SëISÀ;PM0PEÆõÎóÚíâçèáî×òÏøÅöÆôÐîØèââèØîÐôÆöÅøÏò×îáèçâíÚóÎõÆ÷ÅñÍíÙçááçÙíÍñÅ÷;PM1PEÊ¿ÄóÐñØëàåèßì×ðÏöÅôÆòÐìØæààæØìÐòÆôÅöÏð×ìßèåàëØñÐóÄõÃïÏë×çßßç×ëÏïÃõ;PM1PE;PM2FPPE=<IëISÀ;PM0PEÄóÐñØëàåèßì×ðÏöÅôÆòÐìØæààæØìÐòÆôÅöÏð×ìßèåàëØñÐóÄõÃïÏë×çßßç×ëÏïÃõ;PM1PEÌ¿ÄñÐíØéÞåäÝê×ðÍòÅòÆîÎêØæÞÞæØêÎîÆòÅòÍð×êÝäåÞéØíÐñÄñÃïÏé×ãÝÝã×éÏïÃñ;PM1PE;PM2FPPE=<}êISÀ;PM0PEÄñÐíØéÞåäÝê×ðÍòÅòÆîÎêØæÞÞæØêÎîÆòÅòÍð×êÝäåÞéØíÐñÄñÃïÏé×ãÝÝã×éÏïÃñ;PM1PEÊ¿ÆïÎëÖçÞãâÝêÕìÍðÃðÄìÎèÖäÞÞäÖèÎìÄðÃðÍìÕêÝâãÞçÖëÎïÆïÅëÍéÕáÝÝáÕéÍëÅï;PM1PE;PM2FPPE=<sêISÀ;PM0PEÆïÎëÖçÞãâÝêÕìÍðÃðÄìÎèÖäÞÞäÖèÎìÄðÃðÍìÕêÝâãÞçÖëÎïÆïÅëÍéÕáÝÝáÕéÍëÅï;PM1PEÌ¿ÄíÎéÖåÚáâÛæÕìËîÅîÆêÌæÖâÜÜâÖæÌêÆîÅîËìÕæÛâáÚåÖéÎíÄíÃëÍåÕáÙÙáÕåÍëÃí;PM1PE;PM2FPPE=<gêISÀ;PM0PEÄíÎéÖåÚáâÛæÕìËîÅîÆêÌæÖâÜÜâÖæÌêÆîÅîËìÕæÛâáÚåÖéÎíÄíÃëÍåÕáÙÙáÕåÍëÃí;PM1PEÌ¿ÄéÌéÔãÜßàÙäÓèËìÅêÆêÌäÔàÚÚàÔäÌêÆêÅìËèÓäÙàßÜãÔéÌéÄëÃçËãÓßÛÛßÓãËçÃë;PM1PE;PM2FPPE=<[êISÀ;PM0PEÄéÌéÔãÜßàÙäÓèËìÅêÆêÌäÔàÚÚàÔäÌêÆêÅìËèÓäÙàßÜãÔéÌéÄëÃçËãÓßÛÛßÓãËçÃë;PM1PEÊ¿ÄçÌåÔãØÝàÙâÓæËêÁèÂæÌäÔÞÚÚÞÒäÎæÂèÁêÍæÑâÙàÝØãÒåÎçÄéÃåÍáÑß××ßÓáËåÃé;PM1PE;PM2FPPE=<QêISÀ;PM0PEÄçÌåÔãØÝàÙâÓæËêÁèÂæÌäÔÞÚÚÞÒäÎæÂèÁêÍæÑâÙàÝØãÒåÎçÄéÃåÍáÑß××ßÓáËåÃé;PM1PEÌ¿ÄåÌãÒáÖÛÞ×âÑäËæÁæÂäÌâÒÜØØÜÒâÌäÂæÁæËäÑâ×ÜÛØáÒãÌåÄåÃãËáÑÝ×ÕÛÑáËãÃå;PM1PE;PM2FPPE=<EêISÀ;PM0PEÄåÌãÒáÖÛÞ×âÑäËæÁæÂäÌâÒÜØØÜÒâÌäÂæÁæËäÑâ×ÜÛØáÒãÌåÄåÃãËáÑÝ×ÕÛÑáËãÃå;PM1PEÌ¿ÂãÌáÐßØÙÚÕÞÑäÉäÃäÄâÊàÒÚÖÖÚÒàÊâÄäÃäÉäÑÞÕÚÙØßÐáÌãÂãÁãËÝÏÙ××ÙÏÝËãÁã;PM1PE;PM2FPPE=<yéISÀ;PM0PEÂãÌáÐßØÙÚÕÞÑäÉäÃäÄâÊàÒÚÖÖÚÒàÊâÄäÃäÉäÑÞÕÚÙØßÐáÌãÂãÁãËÝÏÙ××ÙÏÝËãÁã;PM1PEÌ¿ÂáÊßÐÛÖÙØÕÞÍàÉâÃâÄàÊÜÎÚÖÖÚÎÜÊàÄâÃâÉàÍÞÕØÙÖÛÐßÊáÂáÁßÉÝÏ×ÕÕ×ÏÝÉßÁá;PM1PE;PM2FPPE=<méISÀ;PM0PEÂáÊßÐÛÖÙØÕÞÍàÉâÃâÄàÊÜÎÚÖÖÚÎÜÊàÄâÃâÉàÍÞÕØÙÖÛÐßÊáÂáÁßÉÝÏ×ÕÕ×ÏÝÉßÁá;PM1PEÊ¿ÄßÊÝÎÙÒ×ØÓÜÍÞÉàÃàÄÞÊÚÎØÔÔØÎÚÊÞÄàÃàÉÞÍÜÓØ×ÒÙÎÝÊßÄßÃÝÉÛÍ×ÑÑ×ÍÛÉÝÃß;PM1PE;PM2FPPE=<céISÀ;PM0PEÄßÊÝÎÙÒ×ØÓÜÍÞÉàÃàÄÞÊÚÎØÔÔØÎÚÊÞÄàÃàÉÞÍÜÓØ×ÒÙÎÝÊßÄßÃÝÉÛÍ×ÑÑ×ÍÛÉÝÃß;PM1PEÌ¿ÄÝÈÙÎÙÒÕÖÑÚÍÚÇÞÃÞÄÚÈÚÎÖÒÒÖÎÚÈÚÄÞÃÞÇÚÍÚÑÖÕÒÙÎÙÈÝÄÝÃÙÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PE;PM2FPPE=<WéISÀ;PM0PEÄÝÈÙÎÙÒÕÖÑÚÍÚÇÞÃÞÄÚÈÚÎÖÒÒÖÎÚÈÚÄÞÃÞÇÚÍÚÑÖÕÒÙÎÙÈÝÄÝÃÙÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PEÊ¿ÄÛÈ×Ì×ÒÓÔÏÖÍÚÇÜÁÜÂØÈØÎÔÐÐÔÎØÈØÂÜÁÜÇÚÍÖÏÔÓÒ×Ì×ÈÛÄÛÃÙÇÕËÓÑÑÓËÕÇÙÃÛ;PM1PE;PM2FPPE=<MéISÀ;PM0PEÄÛÈ×Ì×ÒÓÔÏÖÍÚÇÜÁÜÂØÈØÎÔÐÐÔÎØÈØÂÜÁÜÇÚÍÖÏÔÓÒ×Ì×ÈÛÄÛÃÙÇÕËÓÑÑÓËÕÇÙÃÛ;PM1PEÌ¿Ä×Æ×ÌÕÐÑÒÍÖËÖÇÚÁØÂØÈÖÌÒÎÎÒÌÖÈØÂØÁÚÇÖËÖÍÒÑÐÕÌ×Æ×ÄÙÃÕÅÕËÑÏÏÑËÕÅÕÃÙ;PM1PE;PM2FPPE=<AéISÀ;PM0PEÄ×Æ×ÌÕÐÑÒÍÖËÖÇÚÁØÂØÈÖÌÒÎÎÒÌÖÈØÂØÁÚÇÖËÖÍÒÑÐÕÌ×Æ×ÄÙÃÕÅÕËÑÏÏÑËÕÅÕÃÙ;PM1PEÌ¿ÂÕÈÕÈÓÐÏÐÍÔÉÔÇØÁÖÂÖÈÔÊÐÎÎÐÊÔÈÖÂÖÁØÇÔÉÔÍÐÏÐÓÈÕÈÕÂ×ÁÓÇÓÇÏÏÏÏÇÓÇÓÁ×;PM1PE;PM2FPPE=<uèISÀ;PM0PEÂÕÈÕÈÓÐÏÐÍÔÉÔÇØÁÖÂÖÈÔÊÐÎÎÐÊÔÈÖÂÖÁØÇÔÉÔÍÐÏÐÓÈÕÈÕÂ×ÁÓÇÓÇÏÏÏÏÇÓÇÓÁ×;PM1PEÊ¿ÂÓÆÓÊÑÌÍÐËÒÉÔÅÔÁÔÂÔÆÒÊÎÌÌÎÊÒÆÔÂÔÁÔÅÔÉÒËÐÍÌÑÊÓÆÓÂÓÁÓÅÑÉÏËËÏÉÑÅÓÁÓ;PM1PE;PM2FPPE=<kèISÀ;PM0PEÂÓÆÓÊÑÌÍÐËÒÉÔÅÔÁÔÂÔÆÒÊÎÌÌÎÊÒÆÔÂÔÁÔÅÔÉÒËÐÍÌÑÊÓÆÓÂÓÁÓÅÑÉÏËËÏÉÑÅÓÁÓ;PM1PEÌ¿ÂÑÆÏÈÏÌÍÎËÎÇÒÃÒÁÒÂÐÄÐÈÎÌÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎÍÌÏÈÏÆÑÂÑÁÑÅÍÇÍËËÍÇÍÅÑÁÑ;PM1PE;PM2FPPE=<_èISÀ;PM0PEÂÑÆÏÈÏÌÍÎËÎÇÒÃÒÁÒÂÐÄÐÈÎÌÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎÍÌÏÈÏÆÑÂÑÁÑÅÍÇÍËËÍÇÍÅÑÁÑ;PM1PEÌ¿¿ÏÆÍÆÍÌËÌÉÌÇÎÃÒÁÐÂÎÄÎÈÌÊÊÌÈÎÄÎÂÐÁÒÃÎÇÌÉÌËÌÍÆÍÆÏ¿Ñ¿ÍÅËÅËËËËÅËÅÍ¿Ñ;PM1PE;PM2FPPE=<SèISÀ;PM0PE¿ÏÆÍÆÍÌËÌÉÌÇÎÃÒÁÐÂÎÄÎÈÌÊÊÌÈÎÄÎÂÐÁÒÃÎÇÌÉÌËÌÍÆÍÆÏ¿Ñ¿ÍÅËÅËËËËÅËÅÍ¿Ñ;PM1PEÌ¿¿ËÆÍÆËÈÉÊÇÌÅÌÃÎÁÌÂÎÄÌÆÊÈÈÊÆÌÄÎÂÌÁÎÃÌÅÌÇÊÉÈËÆÍÆË¿Í¿ËÅËÅÉÇÇÉÅËÅË¿Í;PM1PE;PM2FPPE=<GèISÀ;PM0PE¿ËÆÍÆËÈÉÊÇÌÅÌÃÎÁÌÂÎÄÌÆÊÈÈÊÆÌÄÎÂÌÁÎÃÌÅÌÇÊÉÈËÆÍÆË¿Í¿ËÅËÅÉÇÇÉÅËÅË¿Í;PM1PEÊ¿ÄÕÌÑÔËÖÅÖÆÒÌÌÒÆÖÅÖËÔÑÌÕÄÕÃÓËËÓÃÕ;PM1PE;PM2FPPE=<}çISÀ;PM0PEÄÕÌÑÔËÖÅÖÆÒÌÌÒÆÖÅÖËÔÑÌÕÄÕÃÓËËÓÃÕ;PM1PEÌ¿ÄÏÊÏÎÉÒÃÐÄÎÊÌÐÄÐÃÒËÎÍÊÏÄÑÃÍÉÉÍÃÑ;PM1PE;PM2FPPE=<qçISÀ;PM0PEÄÏÊÏÎÉÒÃÐÄÎÊÌÐÄÐÃÒËÎÍÊÏÄÑÃÍÉÉÍÃÑ;PM1PEÊ¿ÄËÆËÌÇÎÁÌÂÌÈÈÌÂÌÁÎÇÊËÈËÄÍÃËÇÅÉÃÍ;PM1PE;PM2FPPE=<gçISÀ;PM0PEÄËÆËÌÇÎÁÌÂÌÈÈÌÂÌÁÎÇÊËÈËÄÍÃËÇÅÉÃÍ;PM1PEÌ¿ÄÇÄÇÈÃÈÁÈÂÈÄÄÈÂÈÁÈÃÈÇÄÇÄÇÃÇÃÃÇÃÇ;PM1PE;PM2FPPE=<[çISÀ;PM0PEÄÇÄÇÈÃÈÁÈÂÈÄÄÈÂÈÁÈÃÈÇÄÇÄÇÃÇÃÃÇÃÇ;PM1PEÌ¿¿ÃÄÃÂÁÆÁÄÂÄÂÂÄÂÄÁÆÁÂÃÄÿſÁÃÃÁ¿Å;PM1PE;PM2FPPE=<OçISÀ;PM0PE¿ÃÄÃÂÁÆÁÄÂÄÂÂÄÂÄÁÆÁÂÃÄÿſÁÃÃÁ¿Å;PM2FPMC1,240PE=<A?À[ZÀ;PM0PEÖÅ¿ÁËÂÍÊÉÒÆÚÞêBÀöÖÌâÒêÒìÖäÒÚÎÊÊÑÂSÀÇUÀÅUÀÅSÀÅUÀÃUÀÁUÀÁUÀ¿SÀ¿WÀÂUÀÂSÀÄWÀÂUÀÆSÀÆWÀÆUÀÆSÀÊWÀÈUÀÊSÀÈWÀÌSÀÌUÀÌSÀÌUÀÎUÀÎSÀÎUÀÐSÀÎSÀÐSÀÒÕÂÍÄſ¿ÆÃÎÁÔÅØÅÞÇäÇæÉêÉîËòËôËøËøËúÍüÍüÍþËþÍüÍþËúÍüËøËöÉôËðÇîÉêÅJÀËHÀËHÀÉJÀÉHÀÇJÀÉJÀÇHÀÇJÀÇJÀÉJÀÇJÀÉLÀËJÀÉLÀÍLÀË;PM2FT11,5FPPE=<[EÀQü;PM0PEÿ¿ÉÊ¿¿ÊÅ¿;PM2RF4,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,4FP1PE=<GëoQÀ;PM0PEËÏ¿ÄÄÒÄÞÄâÉæÕäéÞÁÎÆâÒìØôÞôàòâèäÚâÊàÄàÃàÇâÉâËâÉäÇÈ¿ÊÁÈ¿ÊÁÈ¿ÊÂÆÂÆÆÆÊÂÌ¿ÌÁ̿οÌÂÌÄÊÎÈÒ¿ÐÅÆ˿׿ÕÁÕÃÕÅÓÉÑÍÏÑËÏÇÓÅÑÃÑÁÓ¿ÑÂÏÄÏÂÑÈÑÊÑÊÑÌÍÈÏÂËÁËËËÕËÕËÙËÙÇÙËÛÉÙÇÛÉÛÉÛÉÙËÙËÙË×Í×ÏÓ;PM2FT11,1FPPE=<Uì]NÀ;PM0PEÆèÈæÊäÌâÒâÐàÔàØàô¿ô¿öÁöÁôÁö¿ôÃô¿öÁô¿ö¿ö¿ôÂöÂôÄöÄÐÈÒÈÎÈÒÈÐÈÐÈÐÈÐÆ¿ÒÁÐÁÒ¿ÐÁÒ¿ÐÁÒÁÐãäãâåâãäãäãâãäåâãäåâãäãâãäãäåäãâÈÈÊÊÈÈÊÊÈÈÊÊÈÈÈÊÚÄÖÂÔÁÒÃÒÃÒÁØÂÚÄÖÈÒÌÔÎÖÐÚÌâÊîÄüÅÈÜÎØÎÒÐÎÒÎÒÌÒÌÐÎËÁÅÄ¿ÆÄÈÄÈ¿ÆÅÄË¿ÉÆÑÁÕÉÕË×ËÓÇÑÃÉÈÑÖÑÊÍÁËÇËÏÉÏÉÑÉÑñÐëÂåÅãÍßÓßÓßÑãËÑÇ×ÅÛÇÝÅÝÅÙÅ×ÇÑÅËÅÇÉÃÉÃËÁÉÃËÅÉËÇâëàéäéæçèåèãêãêãêáêãêßêáêãæáèáæãÝ¿ß¿Ý¿á¿ß¿ãÂá¿ãÄáÂáÂãÂãÄãÄáÄãÄáÄáÄáÄáÂá¿áÁßÁáÁÝÃßÁÝÃÝÃÛÁÛÃÙÁÙÁ׿çåáßß×ÙÓ×ÓÑÓÏÓËÙÇÙÉÙÉ×ÉÑÍÑÏÉÕÇÙ¿ñ¿ãÉÙÑÓ×ÕÙ×ßßßíßØÝÖåÔéÐëÌëÆé¿ãÅÛÎÚÐÜÎÞÐÞÎÞÐàÐÞÐÞÐÜÐÜÐØÒØÒÖÔÒÔÐÔÌÒÄÒÂÔÂÔÁÖÁÖÃÖÅÖÅÖÇØÇÖÉÖÉÖÇÔËÔÉÒÉ;PM2FT10,0FPPE=<Oì]NÀ;PM0PEÄèÈæÈäÌâÐâÒàÒàØàô¿ô¿öÁöÁôÁö¿ôÃô¿öÁô¿ö¿ö¿ôÂöÂôÄöÄÐÈÒÈÎÈÒÈÐÈÐÈÐÈÐÆ¿ÒÁÐÁÒ¿ÐÁÒ¿ÐÁÒÁÐãäãâåâãäãäãâãäåâãäåâãäãâãäãäåäãâÈÈÊÊÈÈÊÊÈÈÊÊÈÈÈÊÚÄÖÂÔÁÒÃÒÃÒÁØÂÚÄÖÈÒÌÔÎÖÐÚÌâÊîÄüÅÈÜÎØÎÒÐÎÒÎÒÌÒÌÐÎËÁÅÄ¿ÆÄÈÄÈ¿ÆÅÄË¿ÉÆÑÁÕÉÕË×ËÓÇÑÃÉÈÑÖÑÊÍÁËÇËÏÉÏÉÑÉÑñÐëÂåÅãÍßÓßÓßÑãËÏÅÓÅÕÁÙÃÛÅÛÅÛÇÝÏ×ÍËËÅË¿ÉÂÇ¿ÅÁÇÉÇâëàéäéæçèåèãêãêãêáêãêßêáêãæáèáæãÝ¿ß¿Ý¿á¿ß¿ãÂá¿ãÄáÂáÂãÂãÄãÄáÄãÄáÄáÄáÄáÂá¿áÁßÁáÁÝÃßÁÝÃÝÃÛÁÛÃÙÁÙÁ׿çåáßß×ÙÓ×ÓÑÓÏÓËÙÇÙËÙË×ËÓÏÏÏËÓÅÓ¿ÛÁßËáÓãÙÝÝÙáÑãÇãÆÏÆÑÈÑÈÑÊÓÈÓÌÑÊÑÈÑÄÑ¿ÑÃÓÅÑÇÏÅÍÅÍÎÚÐÜÎÞÐÞÎÞÐàÐÞÐÞÐÜÐÜÐØÒØÒÖÔÒÔÐÔÌÒÄÒÂÔÂÔÁÖÁÖÃØÅÖÅØÇÖÉÖÇØÉÖÉÔÉÔÉÔÉ;PM2FT11,2FPPE=<G^ÀMBÀ;PM0PEàÆÃÚ?ÀËÄÙàÆ;PM2FTFP1PE=<IxÀGOÀ;PM0PELÀÏLÀÑLÀÑLÀÑJÀÑLÀÑLÀÑLÀÑLÀÑJÀÑLÀÑLÀÑLÀÏLÀÑLÀÏLÀÑLÀÏJÀÏNÀÏLÀÏLÀÍLÀÏLÀËNÀÍJÀËNÀËLÀËNÀÉLÀÉLÀÇNÀÇNÀÇðÃðÃòÅòÃðÃðÃòÅðÁòÃòÃòÃðÃòÁòÁðÁòÁð¿ò¿ò¿ð¿ðÂòÂðÄðÄðÆðÄòÈðÈîÈðÊðÌðÌèÌìÖðÚìÞæäÞèÒìÂîÍ@ÀÕú×ôÝðãêåâéâíÜíÚñÖñÔóÔñÒóÐóÒñÐUÀÞWÀÞUÀÜWÀÜWÀÚWÀÜWÀØWÀÚWÀØWÀÖYÀØWÀÖWÀÖYÀÖWÀÔYÀÖWÀÔYÀÒWÀÖYÀÒYÀÔWÀÒYÀÒYÀÒYÀÔYÀÒYÀÔYÀÒWÀÒYÀÒYÀÒYÀÔSÀÒQÀÐSÀÒUÀÒSÀÐUÀÐSÀÒSÀÐUÀÒSÀÐUÀÐUÀÐUÀÐSÀÐWÀÐSÀÐUÀÐUÀÎUÀÎUÀÐSÀÎUÀÎUÀÎUÀÎSÀÌUÀÎSÀÌUÀÌSÀÌSÀÌSÀÌSÀÌóÆùÂûÂ?ÀÁAÀÃ?ÀÇýËûÏõÓï×éßÝáÓéÉïÆ÷ÖûÂÛÍÙ××Ý×Ù×ÓÙÅÙÐÛâåæãêáìáîßòÝòÛôÛôÙö×ö×ôÕôÓôÓòÏòÑüÑüÓüÑüÑüÑüÑþÑüÑüÏüÑþÏüÏüÏþÑþÍüÏþÏüÍþÏþÍüÏþÍüÍþÏþÍüÍþÍþÍþÍüÍþÍüÍ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<ERÀaVÀ;PM0PEKÀÈMÀÈKÀÈMÀÊKÀÊMÀÌKÀÌKÀÌKÀÎMÀÎIÀÎMÀÐKÀÎKÀÐKÀÐIÀÐKÀÒKÀÐKÀÒKÀÒKÀÒIÀÒKÀÒKÀÒKÀÒKÀÒIÀÒKÀÒKÀÒKÀÐKÀÒIÀÐÅÏLÀÏLÀÑLÀÑJÀÑLÀÑLÀÑLÀÑLÀÑJÀÑLÀÑLÀÑLÀÑLÀÏJÀÑNÀÑLÀÏLÀÏLÀÏLÀÏLÀÏLÀÏLÀÍNÀËLÀÍLÀÍLÀËNÀÉLÀÉLÀÉNÀÇNÀÉLÀÅÂÐ;PM2FT10,0FP1PE=<oùKVÀ;PM0PEïËïËíÉïÇïÇïÇïÃïÅïÃïÃñÁïÁï¿ñ¿ñ¿ï¿ñÂïÂñÂñÄïÂñÄñÄñÄïÄïÄïÄñÄïÆñÄïÄñÄÁÏòÅðÁðÅòÃòÃðÃðÅòÃòÁòÃòÃðÃòÁòÁðÁòÁðÁò¿ò¿ðÂðÂòÂðÄòÂðÆðÆòÆðÊîÈòÊðÌîÌÃÐ;PM2FP1PE=<mõURÀ;PM0PEÁëÏåÝçããíÝëÙíÑåÍÄÏèÌîÖðÚìàèäàêÒîÂðÏÁ;PM2FP1PE=<u?ÀWJÀ;PM0PEòÑôÏòÏôÑòÓôÓðÕîÙîÛèßæáâéÞíÚñÒùÐ?ÀÐÂÍBÀÕüÙôÝðãìåâéâíÞïØñØñÔóÔóÒóÐóÒïÐÅÏ;PM2FP1PE=<OlÀ[?À;PM0PEZÀÓZÀÑZÀÓZÀÑZÀÑZÀÑZÀÑXÀÓZÀÑZÀÑZÀÑZÀÓVÀÓZÀÓZÀÑXÀÕZÀÓXÀÕXÀÓZÀÕXÀ×ZÀÕVÀÕZÀ×XÀÙVÀÙZÀÙXÀÙVÀÛXÀÛVÀÝXÀÝÆÐWÀÞUÀÞWÀÜWÀÜWÀÜWÀÚWÀØWÀÚWÀØWÀÖWÀØYÀÖWÀÖYÀÖWÀÖWÀÔYÀÔYÀÔWÀÔYÀÒYÀÔYÀÒYÀÔYÀÒWÀÒYÀÒYÀÔYÀÒWÀÒYÀÒYÀÒYÀÔÃÏ;PM2FP1PE=<oVÁ{÷;PM0PETÀËTÀËTÀËVÀËTÀËTÀËVÀÍVÀÍTÀËVÀÍVÀÍVÀÍVÀÏTÀÍXÀÍTÀÏVÀÏVÀÏVÀÏVÀÏTÀÏVÀÏVÀÑTÀÏVÀÏTÀÑTÀÏTÀÑVÀÑTÀÏRÀÏTÀÑÄÐSÀÒSÀÐSÀÒSÀÒSÀÐUÀÒSÀÐUÀÐSÀÒUÀÐSÀÒUÀÎUÀÐUÀÒUÀÎUÀÐSÀÐUÀÎUÀÎUÀÐUÀÎSÀÎWÀÎSÀÎUÀÌSÀÎSÀÎUÀÌUÀÌSÀÌSÀÌSÀÊÁÏ;PM2FP1PE=<}`ÁKý;PM0PEÑüÅôÈîÒèÞàèÞðØöÔúÐþÌ@ÀÈ@ÀÄ@À¿ü¿øÁôÅÂÐñÆûÂûÂ?ÀÁAÀÃAÀÇýËûÏ÷Óñ×éáßãÕëÇñÆùÖýÎÈ;PM2FP1PE=<cbÁW@À;PM0PEËØÄÔÒØÚØÞØØÚÐÜÃâÍÇÂÕËÕ××Ý×Ù×ÓÛÇßÒßÌÌ;PM2FP1PE=<cVÁAGÀ;PM0PEïÐóÐñÔóÔõÔõØóØóÜóÚñÞïÞïàëàçâåäáæËËâåæãêáìáðßðÝôÝôÛôÙö×ö×ôÕöÓôÓòÏòÑÄÒ;PM2FP1PE=<ExÀ?OÀ;PM0PEýÐýÌûÎýÎýÎýÎûÎýÐûÎýÎýÎûÐýÎûÐýÎýÐûÐýÐûÐýÐûÐýÒûÐûÐûÒýÒûÒûÒûÒûÒûÔûÔÃÑüÑüÓüÓüÑüÑüÑüÏüÑþÏüÑþÏüÑüÍþÑüÏþÍþÏüÍþÏüÍþÏþÍüÏþÍüÍþÍþÍþÍüÍþÍþÍüÍÆÐ;PM2FP1MC1,90PE=<YkÀ_GÀ;PM0PEÄeÀÆcÀÎaÀÐaÀØ_ÀÚ]ÀÞYÀäYÀèUÀìUÀîQÀôQÀøKÀúIÀþGÀBÀCÀDÀAÀHÀýJÀùLÀ÷RÀóRÀíVÀëVÀçZÀãZÀÝ^ÀÙ`À×bÀÏbÀÍdÀÅfÀÃfÀÄdÀÆbÀÎ`ÀÐ`ÀØ^ÀÚ\ÀÞZÀäVÀèVÀìRÀîPÀôNÀøJÀúHÀþDÀBÀBÀDÀþHÀúJÀøLÀòRÀðRÀìVÀèVÀâZÀàZÀÚ^ÀÖ`ÀÒbÀÌbÀÈdÀÂfÀÁfÀÇbÀËdÀÑ`ÀÕ`ÀÙ^Àß\ÀáZÀçVÀëTÀïTÀñPÀ÷LÀùLÀýHÀAÀDÀCÀBÀGÀüIÀüMÀöOÀôQÀðUÀìUÀèYÀâ[Àà]ÀÚ_ÀÖ_ÀÒaÀÌcÀÈeÀÂeÀÁcÀÇaÀËaÀÑ_ÀÕ]ÀÙYÀßYÀáUÀçUÀëQÀïQÀóKÀõIÀûGÀûCÀAÀAÀCÀýGÀùKÀ÷KÀóOÀíSÀëSÀçUÀãYÀÝ[ÀÙ]À×_ÀÏ_ÀÍcÀÅaÀÃeÀ;PM1PEÞ¿ÄcÀÆcÀÎaÀÐ]ÀÖ]ÀÚ[ÀÞYÀäWÀæUÀêSÀðQÀôMÀöMÀøGÀþGÀ@ÀAÀBÀ?ÀHÀýHÀ÷NÀõNÀóRÀïTÀéVÀåXÀãZÀÝ\ÀÙ^ÀÕ`ÀÏ`ÀÍdÀÅdÀÃdÀÄbÀÆbÀÎ^ÀÐ`ÀÖZÀÚ\ÀÞXÀäVÀæTÀêPÀðPÀôLÀöJÀøFÀþDÀ@À@ÀBÀüHÀúHÀöNÀôNÀîRÀêTÀèVÀâXÀÞZÀÜ\ÀÔ^ÀÒ^ÀÌbÀÈdÀÂdÀÁbÀÇdÀËbÀÑ^ÀÓ`ÀÛZÀÝ\ÀáXÀçVÀéTÀíPÀóPÀõLÀùJÀûFÀ?ÀDÀCÀþEÀþIÀúKÀöOÀôOÀîSÀêUÀèWÀâ[ÀÞYÀÚ_ÀÖ]ÀÒaÀÌaÀÈcÀÂcÀÁcÀÇ_ÀË_ÀÑ]ÀÕ[ÀÙYÀÝWÀáUÀçSÀéQÀíMÀóMÀõGÀùGÀýAÀý?ÀCÀýEÀ÷IÀõKÀóOÀïOÀéSÀåUÀãWÀÝ[ÀÙYÀÕ_ÀÏ]ÀÍaÀÅcÀÃaÀ;PM1PE;PM2FT11,2FPPE=<{jÀ_GÀ;PM0PEÄcÀÆcÀÎaÀÐ]ÀÖ]ÀÚ[ÀÞYÀäWÀæUÀêSÀðQÀôMÀöMÀøGÀþGÀ@ÀAÀBÀ?ÀHÀýHÀ÷NÀõNÀóRÀïTÀéVÀåXÀãZÀÝ\ÀÙ^ÀÕ`ÀÏ`ÀÍdÀÅdÀÃdÀÄbÀÆbÀÎ^ÀÐ`ÀÖZÀÚ\ÀÞXÀäVÀæTÀêPÀðPÀôLÀöJÀøFÀþDÀ@À@ÀBÀüHÀúHÀöNÀôNÀîRÀêTÀèVÀâXÀÞZÀÜ\ÀÔ^ÀÒ^ÀÌbÀÈdÀÂdÀÁbÀÇdÀËbÀÑ^ÀÓ`ÀÛZÀÝ\ÀáXÀçVÀéTÀíPÀóPÀõLÀùJÀûFÀ?ÀDÀCÀþEÀþIÀúKÀöOÀôOÀîSÀêUÀèWÀâ[ÀÞYÀÚ_ÀÖ]ÀÒaÀÌaÀÈcÀÂcÀÁcÀÇ_ÀË_ÀÑ]ÀÕ[ÀÙYÀÝWÀáUÀçSÀéQÀíMÀóMÀõGÀùGÀýAÀý?ÀCÀýEÀ÷IÀõKÀóOÀïOÀéSÀåUÀãWÀÝ[ÀÙYÀÕ_ÀÏ]ÀÍaÀÅcÀÃaÀ;PM1PEà¿ÂcÀÈ_ÀÌ_ÀÐ]ÀÖ[ÀÚYÀÞWÀâWÀæSÀêSÀðOÀðKÀöKÀøGÀüEÀ@ÀAÀBÀ?ÀFÀûHÀ÷LÀõLÀïPÀïTÀéTÀåXÀáXÀÝZÀÙ\ÀÕ`ÀÏ^ÀËbÀÇbÀÁbÀÂbÀÈ^ÀÌ^ÀÐ^ÀÖZÀÚXÀÞXÀâTÀæRÀêPÀðNÀðLÀöHÀøDÀüBÀ@À@ÀBÀüFÀøHÀöLÀòLÀîPÀêTÀèTÀàXÀÞXÀÜZÀÔ\ÀÒ^ÀÌ`ÀÆ`ÀÄdÀÃbÀÅ`ÀË`ÀÑ^ÀÓ\ÀÛZÀÝZÀßXÀçTÀéRÀíPÀñNÀõJÀ÷HÀûFÀ?ÀBÀAÀ@ÀCÀüGÀøKÀöMÀòOÀîQÀêSÀæWÀâWÀÞYÀÚ]ÀÖ]ÀÒ]ÀÌaÀÆaÀÂaÀÁaÀÅ]ÀË_ÀÑ[ÀÕYÀÙWÀÝWÀáSÀåSÀéOÀíKÀñKÀõGÀ÷EÀûAÀ?À?ÀAÀûEÀ÷GÀõIÀïMÀïOÀéQÀåSÀáWÀÝYÀÙYÀÕ[ÀÏ]ÀË_ÀÇ_ÀÁaÀ;PM1PE;PM2FPPE=<[jÀ_GÀ;PM0PEÂcÀÈ_ÀÌ_ÀÐ]ÀÖ[ÀÚYÀÞWÀâWÀæSÀêSÀðOÀðKÀöKÀøGÀüEÀ@ÀAÀBÀ?ÀFÀûHÀ÷LÀõLÀïPÀïTÀéTÀåXÀáXÀÝZÀÙ\ÀÕ`ÀÏ^ÀËbÀÇbÀÁbÀÂbÀÈ^ÀÌ^ÀÐ^ÀÖZÀÚXÀÞXÀâTÀæRÀêPÀðNÀðLÀöHÀøDÀüBÀ@À@ÀBÀüFÀøHÀöLÀòLÀîPÀêTÀèTÀàXÀÞXÀÜZÀÔ\ÀÒ^ÀÌ`ÀÆ`ÀÄdÀÃbÀÅ`ÀË`ÀÑ^ÀÓ\ÀÛZÀÝZÀßXÀçTÀéRÀíPÀñNÀõJÀ÷HÀûFÀ?ÀBÀAÀ@ÀCÀüGÀøKÀöMÀòOÀîQÀêSÀæWÀâWÀÞYÀÚ]ÀÖ]ÀÒ]ÀÌaÀÆaÀÂaÀÁaÀÅ]ÀË_ÀÑ[ÀÕYÀÙWÀÝWÀáSÀåSÀéOÀíKÀñKÀõGÀ÷EÀûAÀ?À?ÀAÀûEÀ÷GÀõIÀïMÀïOÀéQÀåSÀáWÀÝYÀÙYÀÕ[ÀÏ]ÀË_ÀÇ_ÀÁaÀ;PM1PEà¿ÂaÀÆ]ÀÌ_ÀÒ[ÀÔYÀÚYÀÞWÀàSÀèSÀèOÀîMÀðMÀôGÀøGÀüCÀþAÀBÀýDÀûHÀ÷HÀóNÀïNÀíPÀçTÀçTÀßXÀÝZÀÙZÀÓ\ÀÑ`ÀË^ÀÅbÀÁ`ÀÂ`ÀÆ^ÀÌ\ÀÒZÀÔZÀÚXÀÞVÀàRÀèRÀèNÀîLÀðJÀôHÀøDÀüBÀþþBÀúDÀøHÀôHÀòNÀîNÀèPÀæTÀâTÀÞXÀÚZÀÔZÀÐ\ÀÌ`ÀÈ^ÀÂbÀÁ`ÀÇ`ÀË^ÀÏ\ÀÓZÀÙZÀÝXÀáVÀåRÀçRÀíNÀñLÀóJÀ÷HÀùBÀýBÀAÀ@ÀCÀúGÀøIÀôKÀòMÀìQÀêQÀæUÀâWÀÞYÀØYÀÖ[ÀÐ]ÀÌ_ÀÈ_ÀÂaÀÁ]ÀÇ_ÀË[ÀÏYÀÕYÀ×WÀÝSÀáSÀåOÀéMÀëMÀñGÀóGÀ÷CÀùAÀ?ÀýAÀûAÀ÷GÀóIÀïKÀíMÀçQÀçQÀßUÀÝWÀÙYÀÓYÀÑ[ÀË]ÀÅ_ÀÁ_À;PM1PE;PM2FPPE=<{iÀ_GÀ;PM0PEÂaÀÆ]ÀÌ_ÀÒ[ÀÔYÀÚYÀÞWÀàSÀèSÀèOÀîMÀðMÀôGÀøGÀüCÀþAÀBÀýDÀûHÀ÷HÀóNÀïNÀíPÀçTÀçTÀßXÀÝZÀÙZÀÓ\ÀÑ`ÀË^ÀÅbÀÁ`ÀÂ`ÀÆ^ÀÌ\ÀÒZÀÔZÀÚXÀÞVÀàRÀèRÀèNÀîLÀðJÀôHÀøDÀüBÀþþBÀúDÀøHÀôHÀòNÀîNÀèPÀæTÀâTÀÞXÀÚZÀÔZÀÐ\ÀÌ`ÀÈ^ÀÂbÀÁ`ÀÇ`ÀË^ÀÏ\ÀÓZÀÙZÀÝXÀáVÀåRÀçRÀíNÀñLÀóJÀ÷HÀùBÀýBÀAÀ@ÀCÀúGÀøIÀôKÀòMÀìQÀêQÀæUÀâWÀÞYÀØYÀÖ[ÀÐ]ÀÌ_ÀÈ_ÀÂaÀÁ]ÀÇ_ÀË[ÀÏYÀÕYÀ×WÀÝSÀáSÀåOÀéMÀëMÀñGÀóGÀ÷CÀùAÀ?ÀýAÀûAÀ÷GÀóIÀïKÀíMÀçQÀçQÀßUÀÝWÀÙYÀÓYÀÑ[ÀË]ÀÅ_ÀÁ_À;PM1PEÞ¿Â_ÀÆ]ÀÌ[ÀÐ[ÀÖWÀØWÀÞUÀàSÀæQÀèOÀìMÀòIÀôGÀöGÀúAÀþ?À@ÀýBÀùHÀõHÀóJÀñNÀëPÀçRÀåTÀßVÀÝXÀ×XÀÕ\ÀÏ\ÀË^ÀÅ`ÀÁ^ÀÂ`ÀÆ\ÀÌZÀÐZÀÖXÀØVÀÞTÀàRÀæPÀèLÀìLÀòHÀôFÀöDÀú@Àþü@ÀüBÀöHÀôHÀðJÀìNÀêPÀäRÀâTÀÞVÀØXÀÔXÀÐ\ÀÌ\ÀÈ^ÀÂ`ÀÁ^ÀÇ^ÀË^ÀÏZÀÓZÀ×VÀÝXÀáTÀãPÀéRÀëLÀïLÀóHÀõFÀûDÀû@À?ÀüCÀüEÀöGÀòKÀòKÀìOÀêQÀäSÀàUÀÞWÀØYÀÖYÀÐ[ÀÌ_ÀÈ]ÀÂ_ÀÁ]ÀÇ[ÀË[ÀÏWÀÕWÀ×UÀÝSÀßQÀãOÀéMÀëIÀñGÀñGÀõAÀû?Àûý?ÀùCÀõEÀóGÀñKÀëKÀçQÀåOÀßSÀÝWÀ×UÀÕYÀÏYÀË]ÀÅ]ÀÁ]À;PM1PE;PM2FPPE=<]iÀ_GÀ;PM0PEÂ_ÀÆ]ÀÌ[ÀÐ[ÀÖWÀØWÀÞUÀàSÀæQÀèOÀìMÀòIÀôGÀöGÀúAÀþ?À@ÀýBÀùHÀõHÀóJÀñNÀëPÀçRÀåTÀßVÀÝXÀ×XÀÕ\ÀÏ\ÀË^ÀÅ`ÀÁ^ÀÂ`ÀÆ\ÀÌZÀÐZÀÖXÀØVÀÞTÀàRÀæPÀèLÀìLÀòHÀôFÀöDÀú@Àþü@ÀüBÀöHÀôHÀðJÀìNÀêPÀäRÀâTÀÞVÀØXÀÔXÀÐ\ÀÌ\ÀÈ^ÀÂ`ÀÁ^ÀÇ^ÀË^ÀÏZÀÓZÀ×VÀÝXÀáTÀãPÀéRÀëLÀïLÀóHÀõFÀûDÀû@À?ÀüCÀüEÀöGÀòKÀòKÀìOÀêQÀäSÀàUÀÞWÀØYÀÖYÀÐ[ÀÌ_ÀÈ]ÀÂ_ÀÁ]ÀÇ[ÀË[ÀÏWÀÕWÀ×UÀÝSÀßQÀãOÀéMÀëIÀñGÀñGÀõAÀû?Àûý?ÀùCÀõEÀóGÀñKÀëKÀçQÀåOÀßSÀÝWÀ×UÀÕYÀÏYÀË]ÀÅ]ÀÁ]À;PM1PEÞ¿Â]ÀÈ[ÀÊ[ÀÒWÀÔYÀØUÀÜSÀâQÀäOÀèMÀìMÀðGÀòGÀöEÀúAÀüýþûBÀùFÀõHÀñHÀïNÀëNÀçPÀãRÀáTÀÛVÀ×ZÀÓXÀÑ\ÀÉ\ÀÇ^ÀÁ^ÀÂ\ÀÈZÀÊZÀÒXÀÔVÀØTÀÜTÀâPÀäNÀèLÀìJÀðHÀòDÀöBÀú@ÀüüþúBÀöFÀòHÀîHÀîNÀæNÀæPÀàRÀÞTÀØVÀÔZÀÐXÀÌ\ÀÆ\ÀÂ^ÀÁ\ÀÅ^ÀËZÀÏZÀÓXÀ×VÀÝTÀßTÀåPÀåNÀíLÀíJÀñHÀõDÀùBÀû@À?ÀüAÀúCÀöGÀòIÀîKÀìMÀèOÀæSÀàSÀÜUÀØWÀÖYÀÐYÀÊ[ÀÈ]ÀÂ]ÀÁ[ÀÇ[ÀÉWÀÏYÀÕUÀ×SÀÛQÀßOÀåMÀçMÀëGÀíGÀñEÀõAÀùýûû?ÀùAÀõCÀñGÀïIÀëKÀçMÀãOÀáSÀÛSÀ×UÀÓWÀÑYÀÉYÀÇ]ÀÁ[À;PM1PE;PM2FT11,7FPPE=<?iÀ_GÀ;PM0PEÂ]ÀÈ[ÀÊ[ÀÒWÀÔYÀØUÀÜSÀâQÀäOÀèMÀìMÀðGÀòGÀöEÀúAÀüýþûBÀùFÀõHÀñHÀïNÀëNÀçPÀãRÀáTÀÛVÀ×ZÀÓXÀÑ\ÀÉ\ÀÇ^ÀÁ^ÀÂ\ÀÈZÀÊZÀÒXÀÔVÀØTÀÜTÀâPÀäNÀèLÀìJÀðHÀòDÀöBÀú@ÀüüþúBÀöFÀòHÀîHÀîNÀæNÀæPÀàRÀÞTÀØVÀÔZÀÐXÀÌ\ÀÆ\ÀÂ^ÀÁ\ÀÅ^ÀËZÀÏZÀÓXÀ×VÀÝTÀßTÀåPÀåNÀíLÀíJÀñHÀõDÀùBÀû@À?ÀüAÀúCÀöGÀòIÀîKÀìMÀèOÀæSÀàSÀÜUÀØWÀÖYÀÐYÀÊ[ÀÈ]ÀÂ]ÀÁ[ÀÇ[ÀÉWÀÏYÀÕUÀ×SÀÛQÀßOÀåMÀçMÀëGÀíGÀñEÀõAÀùýûû?ÀùAÀõCÀñGÀïIÀëKÀçMÀãOÀáSÀÛSÀ×UÀÓWÀÑYÀÉYÀÇ]ÀÁ[À;PM1PEà¿Â]ÀÈYÀÊYÀÐUÀÔUÀØUÀÜQÀàQÀäOÀèKÀêIÀðIÀðEÀöAÀøAÀüýþûBÀ÷BÀõFÀïJÀïJÀéLÀçPÀãRÀßRÀÛVÀ×VÀÓXÀÏZÀÉZÀÇ\ÀÁ\ÀÂZÀÈZÀÊXÀÐVÀÔVÀØRÀÜRÀàNÀäNÀèJÀêJÀðDÀðDÀö@Àø@ÀüüþöBÀöBÀòFÀîJÀìJÀèLÀäPÀÞRÀÞRÀØVÀÔVÀÐVÀÊZÀÈZÀÂ^ÀÁ\ÀÇZÀÉZÀÏXÀÓVÀ×TÀÝTÀÝRÀãNÀçNÀëJÀíHÀñFÀõDÀõ@Àûþ?Àü?ÀøCÀöCÀòIÀîIÀìMÀæMÀäQÀàQÀÜUÀØUÀÖWÀÎYÀÌYÀÆ[ÀÄ[ÀÃYÀÅYÀËWÀÍUÀÕUÀ×QÀÛQÀßOÀãKÀåIÀëIÀíEÀñAÀõAÀ÷ýûûý÷?ÀõCÀïEÀïGÀéIÀçMÀãMÀßQÀÛSÀ×SÀÓUÀÏWÀÉYÀÇYÀÁ[À;PM1PE;PM2FPPE=<_hÀ_GÀ;PM0PEÂ]ÀÈYÀÊYÀÐUÀÔUÀØUÀÜQÀàQÀäOÀèKÀêIÀðIÀðEÀöAÀøAÀüýþûBÀ÷BÀõFÀïJÀïJÀéLÀçPÀãRÀßRÀÛVÀ×VÀÓXÀÏZÀÉZÀÇ\ÀÁ\ÀÂZÀÈZÀÊXÀÐVÀÔVÀØRÀÜRÀàNÀäNÀèJÀêJÀðDÀðDÀö@Àø@ÀüüþöBÀöBÀòFÀîJÀìJÀèLÀäPÀÞRÀÞRÀØVÀÔVÀÐVÀÊZÀÈZÀÂ^ÀÁ\ÀÇZÀÉZÀÏXÀÓVÀ×TÀÝTÀÝRÀãNÀçNÀëJÀíHÀñFÀõDÀõ@Àûþ?Àü?ÀøCÀöCÀòIÀîIÀìMÀæMÀäQÀàQÀÜUÀØUÀÖWÀÎYÀÌYÀÆ[ÀÄ[ÀÃYÀÅYÀËWÀÍUÀÕUÀ×QÀÛQÀßOÀãKÀåIÀëIÀíEÀñAÀõAÀ÷ýûûý÷?ÀõCÀïEÀïGÀéIÀçMÀãMÀßQÀÛSÀ×SÀÓUÀÏWÀÉYÀÇYÀÁ[À;PM1PEÞ¿ÂYÀÈYÀÊWÀÐUÀÒUÀØSÀÜQÀàMÀâMÀèKÀêIÀîGÀðCÀöAÀö?Àúýþù@ÀõBÀõDÀïHÀíJÀéLÀçNÀáNÀßRÀÛTÀ×VÀÑVÀÏXÀÉZÀÇZÀÁZÀÂZÀÈXÀÊVÀÐTÀÒTÀØRÀÜPÀàNÀâLÀèJÀêFÀîDÀðDÀö@Àöüúúþø@ÀôBÀòDÀîHÀêJÀæLÀäNÀÞNÀÜRÀØTÀÔVÀÐVÀÊXÀÈZÀÂZÀÁZÀÇZÀÉVÀÏXÀÓTÀ×TÀÛRÀÝPÀãNÀåJÀéLÀíFÀñDÀóDÀ÷@Àùüûú?ÀøCÀôCÀòEÀìIÀêKÀèMÀäOÀÞQÀÜSÀØSÀÔUÀÎWÀÌYÀÆYÀÄYÀÃYÀÅWÀËUÀÍUÀÓSÀ×QÀÛMÀÝMÀãKÀçIÀéGÀëCÀñAÀó?À÷ýùùûõ?ÀõCÀïCÀíEÀéKÀçIÀáMÀßOÀÛQÀ×SÀÑSÀÏWÀÉUÀÇYÀÁYÀ;PM1PE;PM2FPPE=<AhÀ_GÀ;PM0PEÂYÀÈYÀÊWÀÐUÀÒUÀØSÀÜQÀàMÀâMÀèKÀêIÀîGÀðCÀöAÀö?Àúýþù@ÀõBÀõDÀïHÀíJÀéLÀçNÀáNÀßRÀÛTÀ×VÀÑVÀÏXÀÉZÀÇZÀÁZÀÂZÀÈXÀÊVÀÐTÀÒTÀØRÀÜPÀàNÀâLÀèJÀêFÀîDÀðDÀö@Àöüúúþø@ÀôBÀòDÀîHÀêJÀæLÀäNÀÞNÀÜRÀØTÀÔVÀÐVÀÊXÀÈZÀÂZÀÁZÀÇZÀÉVÀÏXÀÓTÀ×TÀÛRÀÝPÀãNÀåJÀéLÀíFÀñDÀóDÀ÷@Àùüûú?ÀøCÀôCÀòEÀìIÀêKÀèMÀäOÀÞQÀÜSÀØSÀÔUÀÎWÀÌYÀÆYÀÄYÀÃYÀÅWÀËUÀÍUÀÓSÀ×QÀÛMÀÝMÀãKÀçIÀéGÀëCÀñAÀó?À÷ýùùûõ?ÀõCÀïCÀíEÀéKÀçIÀáMÀßOÀÛQÀ×SÀÑSÀÏWÀÉUÀÇYÀÁYÀ;PM1PEÞ¿ÄYÀÆWÀÌUÀÎSÀÒSÀØQÀÜOÀÞMÀäMÀæIÀêGÀìEÀðCÀô?Àöýúûüùþõ@ÀóDÀïFÀëHÀéJÀåNÀãNÀÝPÀÛRÀ×TÀÑTÀÍXÀËVÀÅZÀÃXÀÄXÀÆVÀÌVÀÎRÀÒTÀØNÀÜPÀÞLÀäJÀæHÀêFÀìDÀðBÀôþöüúúüöþô@ÀðDÀìFÀêHÀæJÀâNÀàNÀÚPÀØRÀÔTÀÎTÀÌVÀÆXÀÂZÀÁXÀÅXÀËVÀÍVÀÓRÀ×RÀÙPÀßPÀáLÀåJÀéHÀëFÀïDÀóBÀõþùüûúýöAÀòCÀðEÀîGÀêIÀæKÀâOÀàMÀÚSÀØQÀÔUÀÎUÀÌWÀÆWÀÂYÀÁUÀÅWÀËSÀÍSÀÓQÀ×OÀÙMÀßMÀáIÀåGÀéEÀíCÀï?ÀñýõûùùûõýóAÀïCÀëEÀéGÀåIÀãKÀÝOÀÛOÀ×QÀÑQÀÍUÀËUÀÅWÀÃWÀ;PM1PE;PM2FPPE=<cgÀ_GÀ;PM0PEÄYÀÆWÀÌUÀÎSÀÒSÀØQÀÜOÀÞMÀäMÀæIÀêGÀìEÀðCÀô?Àöýúûüùþõ@ÀóDÀïFÀëHÀéJÀåNÀãNÀÝPÀÛRÀ×TÀÑTÀÍXÀËVÀÅZÀÃXÀÄXÀÆVÀÌVÀÎRÀÒTÀØNÀÜPÀÞLÀäJÀæHÀêFÀìDÀðBÀôþöüúúüöþô@ÀðDÀìFÀêHÀæJÀâNÀàNÀÚPÀØRÀÔTÀÎTÀÌVÀÆXÀÂZÀÁXÀÅXÀËVÀÍVÀÓRÀ×RÀÙPÀßPÀáLÀåJÀéHÀëFÀïDÀóBÀõþùüûúýöAÀòCÀðEÀîGÀêIÀæKÀâOÀàMÀÚSÀØQÀÔUÀÎUÀÌWÀÆWÀÂYÀÁUÀÅWÀËSÀÍSÀÓQÀ×OÀÙMÀßMÀáIÀåGÀéEÀíCÀï?ÀñýõûùùûõýóAÀïCÀëEÀéGÀåIÀãKÀÝOÀÛOÀ×QÀÑQÀÍUÀËUÀÅWÀÃWÀ;PM1PEà¿ÂWÀÆUÀÌSÀÎSÀÔQÀÖOÀÜOÀÞKÀàIÀèIÀèGÀìCÀðAÀòAÀôûøûü÷üóBÀñBÀïDÀëHÀçJÀçJÀßLÀÝPÀÛPÀÕRÀÓTÀÍTÀËVÀÅXÀÁXÀÂTÀÆVÀÌTÀÎRÀÔPÀÖNÀÜNÀÞJÀàJÀèHÀèDÀìBÀð@ÀòþôúøøüöüòBÀðBÀìDÀèHÀæJÀâJÀÞLÀÚPÀØPÀÒRÀÐTÀÊTÀÆVÀÄXÀÃVÀÅVÀÉVÀÏTÀÑPÀ×RÀÙNÀÝNÀáJÀåHÀçHÀëFÀïBÀñ@Àõþ÷úùøýö?ÀòAÀðCÀêGÀêIÀæIÀâMÀÞMÀÚOÀÖQÀÔSÀÐUÀÊSÀÆWÀÂWÀÁUÀÅSÀÉSÀÏQÀÓOÀÕOÀÙKÀÝIÀáIÀåGÀéCÀéAÀïAÀñûõû÷÷ùóýñ?ÀïAÀëEÀçGÀçGÀßIÀÝMÀÛMÀÕQÀÓOÀÍSÀËUÀÅUÀÁUÀ;PM1PE;PM2FPPE=<CgÀ_GÀ;PM0PEÂWÀÆUÀÌSÀÎSÀÔQÀÖOÀÜOÀÞKÀàIÀèIÀèGÀìCÀðAÀòAÀôûøûü÷üóBÀñBÀïDÀëHÀçJÀçJÀßLÀÝPÀÛPÀÕRÀÓTÀÍTÀËVÀÅXÀÁXÀÂTÀÆVÀÌTÀÎRÀÔPÀÖNÀÜNÀÞJÀàJÀèHÀèDÀìBÀð@ÀòþôúøøüöüòBÀðBÀìDÀèHÀæJÀâJÀÞLÀÚPÀØPÀÒRÀÐTÀÊTÀÆVÀÄXÀÃVÀÅVÀÉVÀÏTÀÑPÀ×RÀÙNÀÝNÀáJÀåHÀçHÀëFÀïBÀñ@Àõþ÷úùøýö?ÀòAÀðCÀêGÀêIÀæIÀâMÀÞMÀÚOÀÖQÀÔSÀÐUÀÊSÀÆWÀÂWÀÁUÀÅSÀÉSÀÏQÀÓOÀÕOÀÙKÀÝIÀáIÀåGÀéCÀéAÀïAÀñûõû÷÷ùóýñ?ÀïAÀëEÀçGÀçGÀßIÀÝMÀÛMÀÕQÀÓOÀÍSÀËUÀÅUÀÁUÀ;PM1PEÞ¿ÂUÀÆUÀÌQÀÎQÀÒOÀÖOÀÚKÀÞKÀâIÀæGÀèEÀêCÀð?Àð?Àöûöùúõüõ@Àï@ÀïDÀéFÀçHÀåJÀáLÀÝLÀÙPÀÕPÀÑRÀÍTÀËTÀÅVÀÁTÀÂVÀÆRÀÌTÀÎPÀÒPÀÖLÀÚLÀÞJÀâFÀæFÀèDÀêBÀð@Àðüöøöøúôüò@Àî@ÀìDÀèFÀäHÀâJÀÞLÀÚLÀÖPÀÔPÀÎRÀÊRÀÆVÀÄVÀÃTÀÅVÀÉRÀÍTÀÓPÀÕNÀÙNÀÝLÀáJÀãFÀçFÀëDÀíBÀñþóü÷ú÷øûô?ÀòAÀîCÀìEÀèEÀäIÀâKÀÞKÀÚOÀÖOÀÔSÀÎQÀÊUÀÆSÀÂUÀÁSÀÅSÀÉQÀÍOÀÓOÀÕKÀÙKÀÝIÀáGÀãEÀçCÀë?Àí?Àñûóù÷õùõûïýïAÀéCÀçEÀåEÀáIÀÝKÀÙMÀÕMÀÑOÀÍSÀËQÀÅUÀÁSÀ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<efÀ_GÀ;PM0PEÂUÀÆUÀÌQÀÎQÀÒOÀÖOÀÚKÀÞKÀâIÀæGÀèEÀêCÀð?Àð?Àöûöùúõüõ@Àï@ÀïDÀéFÀçHÀåJÀáLÀÝLÀÙPÀÕPÀÑRÀÍTÀËTÀÅVÀÁTÀÂVÀÆRÀÌTÀÎPÀÒPÀÖLÀÚLÀÞJÀâFÀæFÀèDÀêBÀð@Àðüöøöøúôüò@Àî@ÀìDÀèFÀäHÀâJÀÞLÀÚLÀÖPÀÔPÀÎRÀÊRÀÆVÀÄVÀÃTÀÅVÀÉRÀÍTÀÓPÀÕNÀÙNÀÝLÀáJÀãFÀçFÀëDÀíBÀñþóü÷ú÷øûô?ÀòAÀîCÀìEÀèEÀäIÀâKÀÞKÀÚOÀÖOÀÔSÀÎQÀÊUÀÆSÀÂUÀÁSÀÅSÀÉQÀÍOÀÓOÀÕKÀÙKÀÝIÀáGÀãEÀçCÀë?Àí?Àñûóù÷õùõûïýïAÀéCÀçEÀåEÀáIÀÝKÀÙMÀÕMÀÑOÀÍSÀËQÀÅUÀÁSÀ;PM1PEà¿ÂSÀÆSÀÊQÀÎOÀÒMÀÖMÀÚKÀÞIÀàGÀäGÀèCÀêAÀî?Àðýôûö÷øõüóþï@ÀíBÀéDÀçHÀãHÀßJÀÝLÀÙNÀÕNÀÑRÀÍPÀÉTÀÅTÀÁTÀÂRÀÆRÀÊPÀÎPÀÒNÀÖLÀÚJÀÞHÀàFÀäDÀèBÀêBÀîüðüôúööøòüðþî@ÀìBÀèDÀäHÀàHÀÜJÀÚLÀÖNÀÒNÀÎPÀÌRÀÆTÀÂTÀÁTÀÅRÀËRÀÍPÀÑPÀÕNÀÙJÀÛLÀßHÀãFÀçDÀëBÀíBÀïüñüõøùöûôûðAÀîAÀìCÀæEÀäGÀâIÀÜKÀÚMÀÖOÀÒOÀÎQÀÌQÀÆSÀÂSÀÁSÀÅOÀËQÀÍMÀÑMÀÕKÀÙIÀÛGÀáGÀãCÀåAÀë?Àíýïûó÷õõ÷óûïûíAÀéAÀçCÀãEÀßGÀÝKÀÙIÀÕMÀÑOÀÍOÀÉQÀÅQÀÁSÀ;PM1PE;PM2FPPE=<EfÀ_GÀ;PM0PEÂSÀÆSÀÊQÀÎOÀÒMÀÖMÀÚKÀÞIÀàGÀäGÀèCÀêAÀî?Àðýôûö÷øõüóþï@ÀíBÀéDÀçHÀãHÀßJÀÝLÀÙNÀÕNÀÑRÀÍPÀÉTÀÅTÀÁTÀÂRÀÆRÀÊPÀÎPÀÒNÀÖLÀÚJÀÞHÀàFÀäDÀèBÀêBÀîüðüôúööøòüðþî@ÀìBÀèDÀäHÀàHÀÜJÀÚLÀÖNÀÒNÀÎPÀÌRÀÆTÀÂTÀÁTÀÅRÀËRÀÍPÀÑPÀÕNÀÙJÀÛLÀßHÀãFÀçDÀëBÀíBÀïüñüõøùöûôûðAÀîAÀìCÀæEÀäGÀâIÀÜKÀÚMÀÖOÀÒOÀÎQÀÌQÀÆSÀÂSÀÁSÀÅOÀËQÀÍMÀÑMÀÕKÀÙIÀÛGÀáGÀãCÀåAÀë?Àíýïûó÷õõ÷óûïûíAÀéAÀçCÀãEÀßGÀÝKÀÙIÀÕMÀÑOÀÍOÀÉQÀÅQÀÁSÀ;PM1PEÞ¿ÂSÀÆOÀÊOÀÎOÀÒMÀÖIÀÚKÀÜGÀàGÀäCÀèAÀèAÀî?Àîûòùö÷øõúñüí@ÀíBÀçBÀçDÀãHÀßHÀÛLÀÙJÀÕNÀÑPÀÍPÀÉPÀÅTÀÁRÀÂPÀÆRÀÊNÀÎNÀÒLÀÖJÀÚJÀÜFÀàDÀäDÀèBÀèþîüîüòöööøòúðüî@ÀèBÀèBÀâDÀàHÀÞHÀØLÀÖJÀÒNÀÎPÀÊPÀÆPÀÂTÀÁRÀÅPÀÉPÀÍPÀÑNÀÕLÀ×JÀÝJÀßFÀáDÀçDÀçBÀíþïüñúõøõöûòûðýìAÀêCÀèCÀâEÀàIÀÞIÀØKÀÖMÀÒMÀÎQÀÊOÀÆQÀÂSÀÁOÀÅOÀÉOÀÍMÀÑIÀÕKÀ×GÀÝGÀßCÀáAÀçAÀé?Àëûïùñ÷õõ÷ñùíûíýçAÀçCÀãCÀßEÀÛIÀÙIÀÕKÀÑMÀÍOÀÉOÀÅOÀÁQÀ;PM1PE;PM2FPPE=<geÀ_GÀ;PM0PEÂSÀÆOÀÊOÀÎOÀÒMÀÖIÀÚKÀÜGÀàGÀäCÀèAÀèAÀî?Àîûòùö÷øõúñüí@ÀíBÀçBÀçDÀãHÀßHÀÛLÀÙJÀÕNÀÑPÀÍPÀÉPÀÅTÀÁRÀÂPÀÆRÀÊNÀÎNÀÒLÀÖJÀÚJÀÜFÀàDÀäDÀèBÀèþîüîüòöööøòúðüî@ÀèBÀèBÀâDÀàHÀÞHÀØLÀÖJÀÒNÀÎPÀÊPÀÆPÀÂTÀÁRÀÅPÀÉPÀÍPÀÑNÀÕLÀ×JÀÝJÀßFÀáDÀçDÀçBÀíþïüñúõøõöûòûðýìAÀêCÀèCÀâEÀàIÀÞIÀØKÀÖMÀÒMÀÎQÀÊOÀÆQÀÂSÀÁOÀÅOÀÉOÀÍMÀÑIÀÕKÀ×GÀÝGÀßCÀáAÀçAÀé?Àëûïùñ÷õõ÷ñùíûíýçAÀçCÀãCÀßEÀÛIÀÙIÀÕKÀÑMÀÍOÀÉOÀÅOÀÁQÀ;PM1PEÞ¿ÂQÀÆOÀÊMÀÎMÀÒKÀÖIÀØGÀÜGÀàEÀâCÀæAÀê?Àìýîùòùôõöóúñúíþë@ÀéBÀåDÀáFÀßHÀÛHÀ×LÀÕJÀÑNÀÍNÀÉRÀÅPÀÁPÀÂPÀÆNÀÊNÀÎLÀÒJÀÖJÀØHÀÜFÀàBÀâBÀæBÀêüìüîøòøôôöðúðúìþè@ÀèBÀâDÀàFÀÚHÀÚHÀÖJÀÐLÀÎNÀÊNÀÆPÀÂRÀÁPÀÅPÀÉNÀÍNÀÏLÀÕJÀÙJÀÙHÀßDÀáDÀçBÀç@Àëþïúïúóø÷ô÷ðûðûìAÀèAÀæAÀäEÀÞGÀÜIÀÚIÀÖKÀÐMÀÎMÀÊOÀÆOÀÂOÀÁQÀÅMÀÉMÀÍIÀÏKÀÕGÀÙGÀÛEÀÝCÀãAÀå?Àçýëùïùïõóó÷ñùíùëýé?ÀåAÀáCÀßCÀÛGÀ×IÀÕIÀÑKÀÍMÀÉMÀÅOÀÁOÀ;PM1PE;PM2FPPE=<IeÀ_GÀ;PM0PEÂQÀÆOÀÊMÀÎMÀÒKÀÖIÀØGÀÜGÀàEÀâCÀæAÀê?Àìýîùòùôõöóúñúíþë@ÀéBÀåDÀáFÀßHÀÛHÀ×LÀÕJÀÑNÀÍNÀÉRÀÅPÀÁPÀÂPÀÆNÀÊNÀÎLÀÒJÀÖJÀØHÀÜFÀàBÀâBÀæBÀêüìüîøòøôôöðúðúìþè@ÀèBÀâDÀàFÀÚHÀÚHÀÖJÀÐLÀÎNÀÊNÀÆPÀÂRÀÁPÀÅPÀÉNÀÍNÀÏLÀÕJÀÙJÀÙHÀßDÀáDÀçBÀç@Àëþïúïúóø÷ô÷ðûðûìAÀèAÀæAÀäEÀÞGÀÜIÀÚIÀÖKÀÐMÀÎMÀÊOÀÆOÀÂOÀÁQÀÅMÀÉMÀÍIÀÏKÀÕGÀÙGÀÛEÀÝCÀãAÀå?Àçýëùïùïõóó÷ñùíùëýé?ÀåAÀáCÀßCÀÛGÀ×IÀÕIÀÑKÀÍMÀÉMÀÅOÀÁOÀ;PM1PEà¿ÂOÀÆMÀÊMÀÌKÀÒIÀÖGÀØGÀÚEÀàCÀâAÀäAÀêýêýî÷ðùôóôóúïøíþéþéBÀãBÀáDÀßFÀÙHÀ×HÀÕJÀÑLÀËNÀÉNÀÅPÀÁNÀÂNÀÆNÀÊLÀÌJÀÒJÀÖHÀØFÀÚDÀàBÀâ@Àä@ÀêüêúîøðöôòôðúðøêþèþæBÀâBÀÞDÀÜFÀØHÀÖHÀÐJÀÎLÀÊNÀÆNÀÂPÀÁNÀÅNÀÉNÀÍLÀÏJÀÕJÀ×HÀÛFÀÝDÀáBÀå@Àçþéþïúïøñôõô÷ðùðûê?Àè?ÀæAÀàCÀàEÀÜGÀØIÀÖIÀÐKÀÎMÀÈMÀÆMÀÄOÀÃMÀÅMÀÇKÀÍIÀÏGÀÕGÀ×EÀÛCÀßAÀßAÀåýçýé÷ïùïóóóóï÷íùéýéýã?ÀáAÀßCÀÙEÀ×GÀÕIÀÑIÀËKÀÉMÀÅMÀÁMÀ;PM1PE;PM2FPPE=<idÀ_GÀ;PM0PEÂOÀÆMÀÊMÀÌKÀÒIÀÖGÀØGÀÚEÀàCÀâAÀäAÀêýêýî÷ðùôóôóúïøíþéþéBÀãBÀáDÀßFÀÙHÀ×HÀÕJÀÑLÀËNÀÉNÀÅPÀÁNÀÂNÀÆNÀÊLÀÌJÀÒJÀÖHÀØFÀÚDÀàBÀâ@Àä@ÀêüêúîøðöôòôðúðøêþèþæBÀâBÀÞDÀÜFÀØHÀÖHÀÐJÀÎLÀÊNÀÆNÀÂPÀÁNÀÅNÀÉNÀÍLÀÏJÀÕJÀ×HÀÛFÀÝDÀáBÀå@Àçþéþïúïøñôõô÷ðùðûê?Àè?ÀæAÀàCÀàEÀÜGÀØIÀÖIÀÐKÀÎMÀÈMÀÆMÀÄOÀÃMÀÅMÀÇKÀÍIÀÏGÀÕGÀ×EÀÛCÀßAÀßAÀåýçýé÷ïùïóóóóï÷íùéýéýã?ÀáAÀßCÀÙEÀ×GÀÕIÀÑIÀËKÀÉMÀÅMÀÁMÀ;PM1PEÞ¿ÄMÀÆMÀÈKÀÎIÀÐGÀÖGÀÖEÀÜCÀÞCÀâ?Àä?Àæýêùîùðõòóôñöïúíúéþå@Àã@ÀáDÀÝDÀÛFÀÕHÀÕHÀÏLÀÍJÀÇNÀÅNÀÃNÀÄLÀÆLÀÈJÀÎJÀÐFÀÖHÀÖDÀÜBÀÞBÀâ@Àäüæüêøîöðöòòôîöîúêúèþä@Àâ@ÀÞDÀÜDÀÖFÀÔHÀÒHÀÌJÀÊLÀÆNÀÂNÀÁNÀÅLÀÉLÀËJÀÑJÀÓFÀÕFÀÛFÀÝBÀáBÀãþçþéúíúíöñöõòõî÷îûêûè?ÀäAÀâAÀÞCÀÚGÀØEÀÔIÀÐIÀÎKÀÊKÀÆMÀÂMÀÁMÀÅIÀÉKÀÍGÀÏGÀÓEÀ×CÀÙCÀÝ?Àá?ÀãýçùéùíõíóññõïõíùéùåýãýáAÀÝAÀÛEÀÕEÀÕEÀÏIÀÍIÀÇKÀÅKÀÃMÀ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<KdÀ_GÀ;PM0PEÄMÀÆMÀÈKÀÎIÀÐGÀÖGÀÖEÀÜCÀÞCÀâ?Àä?Àæýêùîùðõòóôñöïúíúéþå@Àã@ÀáDÀÝDÀÛFÀÕHÀÕHÀÏLÀÍJÀÇNÀÅNÀÃNÀÄLÀÆLÀÈJÀÎJÀÐFÀÖHÀÖDÀÜBÀÞBÀâ@Àäüæüêøîöðöòòôîöîúêúèþä@Àâ@ÀÞDÀÜDÀÖFÀÔHÀÒHÀÌJÀÊLÀÆNÀÂNÀÁNÀÅLÀÉLÀËJÀÑJÀÓFÀÕFÀÛFÀÝBÀáBÀãþçþéúíúíöñöõòõî÷îûêûè?ÀäAÀâAÀÞCÀÚGÀØEÀÔIÀÐIÀÎKÀÊKÀÆMÀÂMÀÁMÀÅIÀÉKÀÍGÀÏGÀÓEÀ×CÀÙCÀÝ?Àá?ÀãýçùéùíõíóññõïõíùéùåýãýáAÀÝAÀÛEÀÕEÀÕEÀÏIÀÍIÀÇKÀÅKÀÃMÀ;PM1PEà¿ÂKÀÆKÀÈIÀÎGÀÐGÀÖEÀÖEÀÚAÀÞAÀàýä?Àèûè÷ìùðõðñòïöïúëøçüç@ÀãþßBÀÝBÀÙFÀÕFÀÕHÀÏHÀÍJÀÇLÀÅLÀÁLÀÂJÀÆLÀÈHÀÎHÀÐDÀÖFÀÖDÀÚ@ÀÞ@Ààþäüèúèøìöðòðòòîöîúèøæüä@ÀàþÞBÀÜBÀÖFÀÔFÀÒHÀÌHÀÊJÀÄLÀÄLÀÃJÀÃLÀÉJÀËHÀÑHÀÓFÀÕFÀÛDÀÝ@Àß@Àãþåüçúíøíöñòñòõî÷ìùêûæýä?Àà?ÀÞCÀÚEÀØCÀÔGÀÐGÀÎKÀÊIÀÄKÀÂKÀÁKÀÃIÀÉGÀÍGÀÏEÀÓEÀ×AÀÙAÀÝýß?Àãûå÷éùëõíññïñïõë÷çùçûãýß?ÀÝ?ÀÙCÀÕEÀÕEÀÏGÀÍGÀÇIÀÅKÀÁIÀ;PM1PE;PM2FPPE=<kcÀ_GÀ;PM0PEÂKÀÆKÀÈIÀÎGÀÐGÀÖEÀÖEÀÚAÀÞAÀàýä?Àèûè÷ìùðõðñòïöïúëøçüç@ÀãþßBÀÝBÀÙFÀÕFÀÕHÀÏHÀÍJÀÇLÀÅLÀÁLÀÂJÀÆLÀÈHÀÎHÀÐDÀÖFÀÖDÀÚ@ÀÞ@Ààþäüèúèøìöðòðòòîöîúèøæüä@ÀàþÞBÀÜBÀÖFÀÔFÀÒHÀÌHÀÊJÀÄLÀÄLÀÃJÀÃLÀÉJÀËHÀÑHÀÓFÀÕFÀÛDÀÝ@Àß@Àãþåüçúíøíöñòñòõî÷ìùêûæýä?Àà?ÀÞCÀÚEÀØCÀÔGÀÐGÀÎKÀÊIÀÄKÀÂKÀÁKÀÃIÀÉGÀÍGÀÏEÀÓEÀ×AÀÙAÀÝýß?Àãûå÷éùëõíññïñïõë÷çùçûãýß?ÀÝ?ÀÙCÀÕEÀÕEÀÏGÀÍGÀÇIÀÅKÀÁIÀ;PM1PEÞ¿ÂKÀÆGÀÈIÀÎEÀÐGÀÒCÀØAÀÚAÀÜAÀâýâûæùèùìõìóðóôïôëöëúçúåüáþáBÀÛBÀÙBÀ×FÀÑFÀÏFÀÍJÀÇJÀÅJÀÁJÀÂJÀÆHÀÈHÀÎFÀÐDÀÒDÀØBÀÚ@ÀÜþâüâüæúèöìôìòððôîôìöèúæúâüàþÞBÀÚBÀÖBÀÔDÀÐHÀÌFÀÊJÀÄHÀÄLÀÃJÀÃHÀÉJÀËFÀÏHÀÓDÀÕDÀÙBÀÝ@Àßþáüåüçøëöíöïòñðóîõêùêûäûäýà?ÀÜAÀÜCÀÖCÀÔEÀÎGÀÎGÀÊIÀÄIÀÂIÀÁIÀÃIÀÉEÀÍEÀÍEÀÓAÀÕAÀÛAÀÛýßûãùãùéõéóíóïïñëõëõç÷åûáûáýÛ?ÀÙAÀ×CÀÑCÀÏGÀÍEÀÇIÀÅGÀÁIÀ;PM1PE;PM2FPPE=<McÀ_GÀ;PM0PEÂKÀÆGÀÈIÀÎEÀÐGÀÒCÀØAÀÚAÀÜAÀâýâûæùèùìõìóðóôïôëöëúçúåüáþáBÀÛBÀÙBÀ×FÀÑFÀÏFÀÍJÀÇJÀÅJÀÁJÀÂJÀÆHÀÈHÀÎFÀÐDÀÒDÀØBÀÚ@ÀÜþâüâüæúèöìôìòððôîôìöèúæúâüàþÞBÀÚBÀÖBÀÔDÀÐHÀÌFÀÊJÀÄHÀÄLÀÃJÀÃHÀÉJÀËFÀÏHÀÓDÀÕDÀÙBÀÝ@Àßþáüåüçøëöíöïòñðóîõêùêûäûäýà?ÀÜAÀÜCÀÖCÀÔEÀÎGÀÎGÀÊIÀÄIÀÂIÀÁIÀÃIÀÉEÀÍEÀÍEÀÓAÀÕAÀÛAÀÛýßûãùãùéõéóíóïïñëõëõç÷åûáûáýÛ?ÀÙAÀ×CÀÑCÀÏGÀÍEÀÇIÀÅGÀÁIÀ;PM1PEà¿ÂIÀÄGÀÊEÀÌEÀÐCÀÒCÀØAÀØ?ÀÞýÞýâûæùèõêõìóîñòíôëöéöçúåüáþÝþÝ@À×BÀ×DÀÑDÀÏFÀËFÀÉHÀÃJÀÁHÀÂHÀÄHÀÊFÀÌDÀÐBÀÒBÀØBÀØþÞþÞüâøæøèöêòìòîðòìôêöèöäúâüàþÜþÚ@ÀÖBÀÔDÀÐDÀÌFÀÈFÀÆHÀÂJÀÁHÀÅHÀÇHÀËDÀÏFÀÓBÀÕBÀÙBÀÛþßüáüãúçøéöëòïòñðñìõê÷è÷äûâýàýÜAÀÚAÀÖAÀÔCÀÎEÀÌGÀÊGÀÆGÀÂIÀÁGÀÅEÀÉEÀËCÀÍCÀÓAÀÕ?ÀÙýÛýßûáùãõçõéóëñïíñëñéõç÷åùáûÝûÝý×AÀ×AÀÑAÀÏEÀËCÀÉGÀÃGÀÁGÀ;PM1PE;PM2FPPE=<mbÀ_GÀ;PM0PEÂIÀÄGÀÊEÀÌEÀÐCÀÒCÀØAÀØ?ÀÞýÞýâûæùèõêõìóîñòíôëöéöçúåüáþÝþÝ@À×BÀ×DÀÑDÀÏFÀËFÀÉHÀÃJÀÁHÀÂHÀÄHÀÊFÀÌDÀÐBÀÒBÀØBÀØþÞþÞüâøæøèöêòìòîðòìôêöèöäúâüàþÜþÚ@ÀÖBÀÔDÀÐDÀÌFÀÈFÀÆHÀÂJÀÁHÀÅHÀÇHÀËDÀÏFÀÓBÀÕBÀÙBÀÛþßüáüãúçøéöëòïòñðñìõê÷è÷äûâýàýÜAÀÚAÀÖAÀÔCÀÎEÀÌGÀÊGÀÆGÀÂIÀÁGÀÅEÀÉEÀËCÀÍCÀÓAÀÕ?ÀÙýÛýßûáùãõçõéóëñïíñëñéõç÷åùáûÝûÝý×AÀ×AÀÑAÀÏEÀËCÀÉGÀÃGÀÁGÀ;PM1PEÞ¿ÂGÀÆEÀÈEÀÎCÀÎCÀÒAÀÖýÚ?ÀÜýÞûàùæ÷æõêóêñðïðïòéôéöåøåúßüÝþÛ@ÀÙþÕBÀÑDÀÍDÀÍFÀÇFÀÅHÀÁFÀÂHÀÆDÀÈFÀÎBÀÎBÀÒ@ÀÖ@ÀÚüÜüÞúàøæöæöêòêððîðìòèôèöäøàúàüÜþØ@ÀÖþÔBÀÎDÀÎDÀÈFÀÄFÀÂHÀÁFÀÃFÀÇFÀÍDÀÍDÀÓBÀÕ@À×@ÀÛüßüßúãøçöçöëòíðïîñìõèõæ÷æùàûàûÜ?ÀØ?ÀÖAÀÔAÀÎEÀÌCÀÊGÀÄEÀÂGÀÁEÀÃEÀÉCÀËCÀÍAÀÓýÕ?À×ýÛûßùß÷åõåóçñëïíïïéñéõåõå÷ßùÝûÛûÙ?ÀÕ?ÀÑAÀÍCÀÍCÀÇEÀÅEÀÁEÀ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<ObÀ_GÀ;PM0PEÂGÀÆEÀÈEÀÎCÀÎCÀÒAÀÖýÚ?ÀÜýÞûàùæ÷æõêóêñðïðïòéôéöåøåúßüÝþÛ@ÀÙþÕBÀÑDÀÍDÀÍFÀÇFÀÅHÀÁFÀÂHÀÆDÀÈFÀÎBÀÎBÀÒ@ÀÖ@ÀÚüÜüÞúàøæöæöêòêððîðìòèôèöäøàúàüÜþØ@ÀÖþÔBÀÎDÀÎDÀÈFÀÄFÀÂHÀÁFÀÃFÀÇFÀÍDÀÍDÀÓBÀÕ@À×@ÀÛüßüßúãøçöçöëòíðïîñìõèõæ÷æùàûàûÜ?ÀØ?ÀÖAÀÔAÀÎEÀÌCÀÊGÀÄEÀÂGÀÁEÀÃEÀÉCÀËCÀÍAÀÓýÕ?À×ýÛûßùß÷åõåóçñëïíïïéñéõåõå÷ßùÝûÛûÙ?ÀÕ?ÀÑAÀÍCÀÍCÀÇEÀÅEÀÁEÀ;PM1PEÞ¿ÂEÀÆEÀÈCÀÌAÀÐAÀÒ?ÀÖ?ÀØûÚûÞûâ÷âõæõèóìïìïðëðëôçöåöáøáüÝüÙü×@ÀÕBÀÑ@ÀÏDÀËBÀÇFÀÅFÀÁFÀÂDÀÆDÀÈDÀÌ@ÀÐ@ÀÒ@ÀÖþØüÚúÞøâøâôæôèòìîìîðìðæôèöâöàøÞüÜüØüÖ@ÀÒ@ÀÐBÀÌBÀÈDÀÆFÀ¿FÀ¿DÀÅFÀÇDÀËBÀÏBÀÑ@ÀÕ@À×þÛüÝúßøáøçôåôëòíîíîñêóèóæ÷ä÷àùÞûÜýØ?ÀÖ?ÀÒ?ÀÎCÀÌCÀÊCÀÆEÀ¿EÀ¿EÀÅAÀÉCÀË?ÀÍAÀÑ?ÀÕû×ûÛûÝ÷ßõãõåóçïéïíëíëñçóåóá÷á÷ÝùÙû×ýÕ?ÀÑ?ÀÏAÀËAÀÇCÀÅEÀÁCÀ;PM1PE;PM2FPPE=<qaÀ_GÀ;PM0PEÂEÀÆEÀÈCÀÌAÀÐAÀÒ?ÀÖ?ÀØûÚûÞûâ÷âõæõèóìïìïðëðëôçöåöáøáüÝüÙü×@ÀÕBÀÑ@ÀÏDÀËBÀÇFÀÅFÀÁFÀÂDÀÆDÀÈDÀÌ@ÀÐ@ÀÒ@ÀÖþØüÚúÞøâøâôæôèòìîìîðìðæôèöâöàøÞüÜüØüÖ@ÀÒ@ÀÐBÀÌBÀÈDÀÆFÀ¿FÀ¿DÀÅFÀÇDÀËBÀÏBÀÑ@ÀÕ@À×þÛüÝúßøáøçôåôëòíîíîñêóèóæ÷ä÷àùÞûÜýØ?ÀÖ?ÀÒ?ÀÎCÀÌCÀÊCÀÆEÀ¿EÀ¿EÀÅAÀÉCÀË?ÀÍAÀÑ?ÀÕû×ûÛûÝ÷ßõãõåóçïéïíëíëñçóåóá÷á÷ÝùÙû×ýÕ?ÀÑ?ÀÏAÀËAÀÇCÀÅEÀÁCÀ;PM1PEà¿¿EÀÆAÀÊAÀÊAÀÐ?ÀÒýÔýØûÚûÞ÷à÷âõæóæñêïìíîëðéòåôåöáøßøÝüÙü×þÓþÑ@ÀÏBÀÉBÀÉDÀÅDÀ¿DÀ¿DÀÆBÀÊBÀÊþÐ@ÀÒþÔüØúÚúÞøàöâòæôæðêììîîêðæòäôäöàøÜøÜüØüÔþÒþÐ@ÀÊBÀÈBÀÆBÀÂFÀÁDÀÅBÀÇBÀÉBÀÏ@ÀÑþÓ@À×üÛúÛúßöãöãôåòéðíîëìïêóèñäõä÷àùÜùÚûØýÖ?ÀÒýÎAÀÌAÀÈCÀÆCÀÂCÀÁCÀÅAÀÇAÀË?ÀÍýÑýÕû×ûÙ÷Û÷ßõãóãñçïéíëëíéïåñåóáõßõÝùÙù×ûÓ?ÀÑýÏ?ÀÉAÀÉAÀÅAÀ¿CÀ;PM1PE;PM2FPPE=<QaÀ_GÀ;PM0PE¿EÀÆAÀÊAÀÊAÀÐ?ÀÒýÔýØûÚûÞ÷à÷âõæóæñêïìíîëðéòåôåöáøßøÝüÙü×þÓþÑ@ÀÏBÀÉBÀÉDÀÅDÀ¿DÀ¿DÀÆBÀÊBÀÊþÐ@ÀÒþÔüØúÚúÞøàöâòæôæðêììîîêðæòäôäöàøÜøÜüØüÔþÒþÐ@ÀÊBÀÈBÀÆBÀÂFÀÁDÀÅBÀÇBÀÉBÀÏ@ÀÑþÓ@À×üÛúÛúßöãöãôåòéðíîëìïêóèñäõä÷àùÜùÚûØýÖ?ÀÒýÎAÀÌAÀÈCÀÆCÀÂCÀÁCÀÅAÀÇAÀË?ÀÍýÑýÕû×ûÙ÷Û÷ßõãóãñçïéíëëíéïåñåóáõßõÝùÙù×ûÓ?ÀÑýÏ?ÀÉAÀÉAÀÅAÀ¿CÀ;PM1PEÞ¿ÈCÁÔAÁà{ÀêuÀöqÀBÀiÀLÀcÀRÀ[À\ÀQÀdÀKÀjÀAÀrÀõvÀé~Àß@ÁÓDÁÇDÁÈ@ÁÔ|ÀàxÀêpÀölÀBÀbÀLÀ^ÀRÀRÀ\ÀJÀdÀBÀjÀörÀìvÀà|ÀÔBÁÆDÁÅDÁÓ@Áß|ÀëxÀõpÀAÀjÀIÀdÀQÀ\À]ÀTÀaÀJÀkÀBÀoÀöwÀì{Àà?ÁÒCÁÈCÁÇ?ÁÑ}ÀßuÀëqÀõiÀAÀcÀIÀ[ÀSÀQÀ[ÀKÀcÀAÀiÀõoÀéwÀß{ÀÓ?ÁÇCÁ;PM1PE;PM2FPPE=<s`À_GÀ;PM0PEÈCÁÔAÁà{ÀêuÀöqÀBÀiÀLÀcÀRÀ[À\ÀQÀdÀKÀjÀAÀrÀõvÀé~Àß@ÁÓDÁÇDÁÈ@ÁÔ|ÀàxÀêpÀölÀBÀbÀLÀ^ÀRÀRÀ\ÀJÀdÀBÀjÀörÀìvÀà|ÀÔBÁÆDÁÅDÁÓ@Áß|ÀëxÀõpÀAÀjÀIÀdÀQÀ\À]ÀTÀaÀJÀkÀBÀoÀöwÀì{Àà?ÁÒCÁÈCÁÇ?ÁÑ}ÀßuÀëqÀõiÀAÀcÀIÀ[ÀSÀQÀ[ÀKÀcÀAÀiÀõoÀéwÀß{ÀÓ?ÁÇCÁ;PM1PEÞ¿ÆAÁÔ}ÀàwÀêsÀömÀþiÀJÀ_ÀRÀYÀZÀQÀ`ÀIÀjÀýnÀõtÀézÀß|ÀÓBÁÅBÁÆ|ÀÔzÀàtÀênÀöhÀþbÀJÀZÀRÀRÀZÀHÀ`À@ÀjÀônÀìtÀàxÀÒ~ÀÆBÁÅ@ÁÑ~ÀßxÀëvÀónÀ?ÀhÀGÀbÀQÀZÀYÀPÀaÀJÀgÀ@ÀmÀôsÀìyÀÞ{ÀÔAÁÆAÁÅ{ÀÓyÀÝsÀëmÀóiÀ?À_ÀIÀYÀOÀQÀYÀIÀaÀýgÀõmÀéuÀßwÀÓ}ÀÅ?Á;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<U`À_GÀ;PM0PEÆAÁÔ}ÀàwÀêsÀömÀþiÀJÀ_ÀRÀYÀZÀQÀ`ÀIÀjÀýnÀõtÀézÀß|ÀÓBÁÅBÁÆ|ÀÔzÀàtÀênÀöhÀþbÀJÀZÀRÀRÀZÀHÀ`À@ÀjÀônÀìtÀàxÀÒ~ÀÆBÁÅ@ÁÑ~ÀßxÀëvÀónÀ?ÀhÀGÀbÀQÀZÀYÀPÀaÀJÀgÀ@ÀmÀôsÀìyÀÞ{ÀÔAÁÆAÁÅ{ÀÓyÀÝsÀëmÀóiÀ?À_ÀIÀYÀOÀQÀYÀIÀaÀýgÀõmÀéuÀßwÀÓ}ÀÅ?Á;PM1PEà¿Æ}ÀÔ{ÀÞsÀêqÀòkÀ@ÀeÀFÀ_ÀPÀUÀVÀOÀ`ÀEÀfÀ?ÀlÀñrÀévÀÝzÀÓ~ÀÅ~ÀÆzÀÔvÀÞrÀêlÀòdÀ@À`ÀFÀXÀPÀPÀVÀFÀ`ÀþfÀôlÀêrÀÞtÀÔ|ÀÆ~ÀÅ~ÀÓzÀÝvÀérÀólÀýdÀEÀ`ÀOÀXÀWÀNÀ_ÀHÀcÀþkÀôqÀêuÀÞyÀÒ}ÀÆ}ÀÅyÀÑuÀÝqÀékÀóeÀý_ÀGÀUÀMÀOÀWÀEÀ_À?ÀcÀñkÀéqÀÝuÀÓyÀÅ}À;PM1PE;PM2FPPE=<u_À_GÀ;PM0PEÆ}ÀÔ{ÀÞsÀêqÀòkÀ@ÀeÀFÀ_ÀPÀUÀVÀOÀ`ÀEÀfÀ?ÀlÀñrÀévÀÝzÀÓ~ÀÅ~ÀÆzÀÔvÀÞrÀêlÀòdÀ@À`ÀFÀXÀPÀPÀVÀFÀ`ÀþfÀôlÀêrÀÞtÀÔ|ÀÆ~ÀÅ~ÀÓzÀÝvÀérÀólÀýdÀEÀ`ÀOÀXÀWÀNÀ_ÀHÀcÀþkÀôqÀêuÀÞyÀÒ}ÀÆ}ÀÅyÀÑuÀÝqÀékÀóeÀý_ÀGÀUÀMÀOÀWÀEÀ_À?ÀcÀñkÀéqÀÝuÀÓyÀÅ}À;PM1PEà¿Æ{ÀÒwÀÞqÀèmÀògÀücÀFÀ[ÀNÀUÀVÀMÀ\ÀEÀdÀûhÀñnÀçtÀÝxÀÑzÀÅzÀÆxÀÒtÀÞnÀèhÀòdÀü\ÀFÀVÀNÀNÀVÀDÀ\ÀüdÀôhÀènÀÞrÀÒxÀÆ|ÀÅzÀÑxÀÝrÀçpÀóhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀcÀügÀòmÀêsÀÞwÀÒyÀÆyÀÅwÀÑsÀÝmÀégÀñcÀû[ÀEÀUÀMÀMÀSÀEÀ[ÀûcÀñgÀçoÀÝqÀÑwÀÅyÀ;PM1PE;PM2FPPE=<U_À_GÀ;PM0PEÆ{ÀÒwÀÞqÀèmÀògÀücÀFÀ[ÀNÀUÀVÀMÀ\ÀEÀdÀûhÀñnÀçtÀÝxÀÑzÀÅzÀÆxÀÒtÀÞnÀèhÀòdÀü\ÀFÀVÀNÀNÀVÀDÀ\ÀüdÀôhÀènÀÞrÀÒxÀÆ|ÀÅzÀÑxÀÝrÀçpÀóhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀcÀügÀòmÀêsÀÞwÀÒyÀÆyÀÅwÀÑsÀÝmÀégÀñcÀû[ÀEÀUÀMÀMÀSÀEÀ[ÀûcÀñgÀçoÀÝqÀÑwÀÅyÀ;PM1PEÞ¿ÆwÀÒuÀÜmÀèkÀðeÀüaÀBÀYÀLÀSÀTÀKÀZÀAÀbÀûfÀïlÀçpÀÛtÀÑxÀÅxÀÆtÀÒpÀÜlÀèfÀð`ÀüZÀBÀTÀLÀLÀTÀDÀZÀúbÀòfÀèlÀÜnÀÒvÀÆxÀÅxÀÑtÀÛpÀçlÀñfÀù`ÀCÀZÀKÀTÀSÀLÀYÀDÀ_ÀúeÀòkÀæoÀÞsÀÒwÀÆwÀÅsÀÑoÀÝkÀåeÀñaÀùYÀCÀSÀKÀKÀSÀAÀYÀû_ÀïeÀçkÀÛoÀÑsÀÅwÀ;PM1PE;PM2FPPE=<w^À_GÀ;PM0PEÆwÀÒuÀÜmÀèkÀðeÀüaÀBÀYÀLÀSÀTÀKÀZÀAÀbÀûfÀïlÀçpÀÛtÀÑxÀÅxÀÆtÀÒpÀÜlÀèfÀð`ÀüZÀBÀTÀLÀLÀTÀDÀZÀúbÀòfÀèlÀÜnÀÒvÀÆxÀÅxÀÑtÀÛpÀçlÀñfÀù`ÀCÀZÀKÀTÀSÀLÀYÀDÀ_ÀúeÀòkÀæoÀÞsÀÒwÀÆwÀÅsÀÑoÀÝkÀåeÀñaÀùYÀCÀSÀKÀKÀSÀAÀYÀû_ÀïeÀçkÀÛoÀÑsÀÅwÀ;PM1PEÞ¿ÆuÀÒqÀÜkÀægÀðcÀø]ÀBÀWÀLÀOÀPÀKÀXÀAÀ^À÷dÀïhÀånÀÛrÀÑtÀÅtÀÆrÀÒnÀÜhÀædÀð^ÀøXÀBÀPÀLÀJÀPÀBÀXÀø^ÀðdÀèhÀÜlÀÐrÀÆvÀÅtÀÏrÀÛlÀçjÀïbÀ÷`ÀAÀXÀIÀPÀOÀJÀWÀBÀ]ÀøcÀðgÀæmÀÞqÀÐsÀÆsÀÅqÀÏmÀÝgÀåcÀï]À÷WÀAÀOÀIÀKÀOÀAÀWÀ÷_ÀïaÀåiÀÛkÀÑqÀÅsÀ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<Y^À_GÀ;PM0PEÆuÀÒqÀÜkÀægÀðcÀø]ÀBÀWÀLÀOÀPÀKÀXÀAÀ^À÷dÀïhÀånÀÛrÀÑtÀÅtÀÆrÀÒnÀÜhÀædÀð^ÀøXÀBÀPÀLÀJÀPÀBÀXÀø^ÀðdÀèhÀÜlÀÐrÀÆvÀÅtÀÏrÀÛlÀçjÀïbÀ÷`ÀAÀXÀIÀPÀOÀJÀWÀBÀ]ÀøcÀðgÀæmÀÞqÀÐsÀÆsÀÅqÀÏmÀÝgÀåcÀï]À÷WÀAÀOÀIÀKÀOÀAÀWÀ÷_ÀïaÀåiÀÛkÀÑqÀÅsÀ;PM1PEà¿ÆqÀÐmÀÜiÀæeÀîaÀøYÀ@ÀUÀFÀOÀPÀEÀVÀ?ÀZÀ÷bÀífÀåjÀÛnÀÏrÀÅpÀÆnÀÐlÀÜfÀæ`Àî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀøZÀîbÀæfÀÚjÀÒnÀÆrÀÅpÀÑnÀÙlÀåfÀí`À÷\À?ÀTÀGÀPÀMÀFÀUÀBÀ[Àö_ÀðeÀäkÀÜmÀÒoÀÆqÀÅmÀÑiÀÛeÀãaÀïYÀõUÀAÀOÀEÀEÀOÀ?ÀSÀ÷[Àí_ÀåeÀÛkÀÏmÀÅoÀ;PM1PE;PM2FPPE=<y]À_GÀ;PM0PEÆqÀÐmÀÜiÀæeÀîaÀøYÀ@ÀUÀFÀOÀPÀEÀVÀ?ÀZÀ÷bÀífÀåjÀÛnÀÏrÀÅpÀÆnÀÐlÀÜfÀæ`Àî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀøZÀîbÀæfÀÚjÀÒnÀÆrÀÅpÀÑnÀÙlÀåfÀí`À÷\À?ÀTÀGÀPÀMÀFÀUÀBÀ[Àö_ÀðeÀäkÀÜmÀÒoÀÆqÀÅmÀÑiÀÛeÀãaÀïYÀõUÀAÀOÀEÀEÀOÀ?ÀSÀ÷[Àí_ÀåeÀÛkÀÏmÀÅoÀ;PM1PEÞ¿ÆoÀÐiÀÚgÀäaÀî_ÀöWÀþQÀFÀMÀNÀEÀRÀýXÀõ`ÀíbÀãhÀÙlÀÏnÀÅnÀÆjÀÐjÀÚbÀä^ÀîZÀöRÀþLÀFÀFÀNÀþRÀöXÀî`ÀæbÀÚhÀÐjÀÆpÀÅnÀÏjÀÙhÀådÀí^ÀõXÀýTÀEÀLÀKÀFÀQÀþYÀö]ÀîaÀæiÀÚiÀÐmÀÆmÀÅkÀÏgÀÙaÀå_ÀíWÀõQÀýMÀEÀEÀKÀýSÀõWÀí]ÀãcÀÙgÀÏiÀÅmÀ;PM1PE;PM2FPPE=<[]À_GÀ;PM0PEÆoÀÐiÀÚgÀäaÀî_ÀöWÀþQÀFÀMÀNÀEÀRÀýXÀõ`ÀíbÀãhÀÙlÀÏnÀÅnÀÆjÀÐjÀÚbÀä^ÀîZÀöRÀþLÀFÀFÀNÀþRÀöXÀî`ÀæbÀÚhÀÐjÀÆpÀÅnÀÏjÀÙhÀådÀí^ÀõXÀýTÀEÀLÀKÀFÀQÀþYÀö]ÀîaÀæiÀÚiÀÐmÀÆmÀÅkÀÏgÀÙaÀå_ÀíWÀõQÀýMÀEÀEÀKÀýSÀõWÀí]ÀãcÀÙgÀÏiÀÅmÀ;PM1PEÞ¿ÆkÀÐgÀÚcÀä_Àì[ÀôUÀüQÀDÀIÀJÀCÀRÀûVÀó\Àë`ÀãdÀÙhÀÏlÀÅjÀÆhÀÐfÀÚ`ÀäZÀìXÀôPÀüLÀDÀBÀJÀþRÀôVÀì\Àä`ÀØdÀÐhÀÆlÀÅjÀÏhÀ×fÀã`ÀëZÀóVÀýRÀAÀJÀKÀDÀOÀþWÀòYÀî_ÀäeÀØgÀÐiÀÆkÀÅgÀÏcÀ×_Àã[ÀíUÀñQÀýIÀCÀCÀIÀûQÀóUÀëYÀã_ÀÙeÀÏgÀÅiÀ;PM1PE;PM2FPPE=<}\À_GÀ;PM0PEÆkÀÐgÀÚcÀä_Àì[ÀôUÀüQÀDÀIÀJÀCÀRÀûVÀó\Àë`ÀãdÀÙhÀÏlÀÅjÀÆhÀÐfÀÚ`ÀäZÀìXÀôPÀüLÀDÀBÀJÀþRÀôVÀì\Àä`ÀØdÀÐhÀÆlÀÅjÀÏhÀ×fÀã`ÀëZÀóVÀýRÀAÀJÀKÀDÀOÀþWÀòYÀî_ÀäeÀØgÀÐiÀÆkÀÅgÀÏcÀ×_Àã[ÀíUÀñQÀýIÀCÀCÀIÀûQÀóUÀëYÀã_ÀÙeÀÏgÀÅiÀ;PM1PEà¿ÄiÀÐcÀÚaÀâ[ÀêYÀôSÀúMÀBÀGÀHÀAÀNÀùTÀóZÀé^Àá`ÀÙfÀÏhÀÃhÀÄdÀÐbÀÚ^ÀâXÀêTÀôNÀúHÀBÀBÀHÀüNÀòTÀêZÀä\ÀØbÀÐdÀÆjÀÅhÀÏdÀ×bÀã^ÀéXÀñTÀûNÀAÀHÀGÀBÀMÀúSÀôWÀê]ÀäaÀØcÀÐgÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóMÀùGÀAÀAÀGÀùMÀóSÀéWÀá]ÀÙaÀÏcÀÃgÀ;PM1PE;PM2FPPE=<]\À_GÀ;PM0PEÄiÀÐcÀÚaÀâ[ÀêYÀôSÀúMÀBÀGÀHÀAÀNÀùTÀóZÀé^Àá`ÀÙfÀÏhÀÃhÀÄdÀÐbÀÚ^ÀâXÀêTÀôNÀúHÀBÀBÀHÀüNÀòTÀêZÀä\ÀØbÀÐdÀÆjÀÅhÀÏdÀ×bÀã^ÀéXÀñTÀûNÀAÀHÀGÀBÀMÀúSÀôWÀê]ÀäaÀØcÀÐgÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóMÀùGÀAÀAÀGÀùMÀóSÀéWÀá]ÀÙaÀÏcÀÃgÀ;PM1PEà¿ÄeÀÐ_ÀØ_ÀâYÀèUÀòQÀøIÀ@ÀGÀHÀ?ÀJÀ÷RÀñVÀçZÀá`À×`ÀÏfÀÃdÀÄbÀÐ^ÀØ\ÀâTÀèRÀòLÀøFÀ@À@ÀHÀøJÀôRÀèVÀâZÀØ`ÀÐ`ÀÄfÀÃdÀÏbÀ×^Àá\ÀçTÀóRÀ÷LÀ?ÀFÀEÀ@ÀKÀøQÀòSÀê[Àâ]ÀØaÀÎcÀÆeÀÅ_ÀÍ_À×YÀáUÀéQÀñIÀ÷GÀ?À?ÀEÀ÷KÀñQÀçSÀá[À×]ÀÏaÀÃcÀ;PM1PE;PM2FPPE=<}[À_GÀ;PM0PEÄeÀÐ_ÀØ_ÀâYÀèUÀòQÀøIÀ@ÀGÀHÀ?ÀJÀ÷RÀñVÀçZÀá`À×`ÀÏfÀÃdÀÄbÀÐ^ÀØ\ÀâTÀèRÀòLÀøFÀ@À@ÀHÀøJÀôRÀèVÀâZÀØ`ÀÐ`ÀÄfÀÃdÀÏbÀ×^Àá\ÀçTÀóRÀ÷LÀ?ÀFÀEÀ@ÀKÀøQÀòSÀê[Àâ]ÀØaÀÎcÀÆeÀÅ_ÀÍ_À×YÀáUÀéQÀñIÀ÷GÀ?À?ÀEÀ÷KÀñQÀçSÀá[À×]ÀÏaÀÃcÀ;PM1PEÞ¿ÄaÀÎ_ÀØ[ÀàUÀèSÀðOÀøGÀüEÀFÀûHÀ÷PÀïTÀçXÀßZÀ×`ÀÍbÀÃ`ÀÄ`ÀÎ\ÀØXÀàTÀèNÀðJÀøDÀüþFÀöHÀðPÀèTÀàVÀØ\ÀÐ`ÀÄbÀÃ`ÀÏ`À×\ÀßXÀçTÀïNÀõJÀýBÀCÀ@ÀIÀöMÀðSÀèWÀà[ÀØ_ÀÎ_ÀÆaÀÅ_ÀÍYÀ×WÀßSÀçOÀïGÀõEÀ?ÀûAÀ÷IÀïMÀçSÀßWÀ×[ÀÍ_ÀÃ_À;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<_[À_GÀ;PM0PEÄaÀÎ_ÀØ[ÀàUÀèSÀðOÀøGÀüEÀFÀûHÀ÷PÀïTÀçXÀßZÀ×`ÀÍbÀÃ`ÀÄ`ÀÎ\ÀØXÀàTÀèNÀðJÀøDÀüþFÀöHÀðPÀèTÀàVÀØ\ÀÐ`ÀÄbÀÃ`ÀÏ`À×\ÀßXÀçTÀïNÀõJÀýBÀCÀ@ÀIÀöMÀðSÀèWÀà[ÀØ_ÀÎ_ÀÆaÀÅ_ÀÍYÀ×WÀßSÀçOÀïGÀõEÀ?ÀûAÀ÷IÀïMÀçSÀßWÀ×[ÀÍ_ÀÃ_À;PM1PEÞ¿Æ_ÀÎYÀÖYÀàSÀæOÀîMÀöEÀüAÀBÀûFÀõNÀíPÀåTÀßZÀÕZÀÍ`ÀÅ^ÀÆ\ÀÎXÀÖVÀàPÀæLÀîHÀöBÀüüBÀôFÀðNÀæPÀÞTÀØZÀÎZÀÄ`ÀÃ^ÀÍ\À×XÀÝVÀåPÀïLÀóHÀûBÀAÀüGÀôKÀîOÀèUÀÞWÀØ[ÀÎ]ÀÄ_ÀÃYÀÍYÀ×SÀÝOÀçMÀíEÀóAÀûûAÀõGÀíKÀåOÀßUÀÕWÀÍ[ÀÅ]À;PM1PE;PM2FPPE=<A[À_GÀ;PM0PEÆ_ÀÎYÀÖYÀàSÀæOÀîMÀöEÀüAÀBÀûFÀõNÀíPÀåTÀßZÀÕZÀÍ`ÀÅ^ÀÆ\ÀÎXÀÖVÀàPÀæLÀîHÀöBÀüüBÀôFÀðNÀæPÀÞTÀØZÀÎZÀÄ`ÀÃ^ÀÍ\À×XÀÝVÀåPÀïLÀóHÀûBÀAÀüGÀôKÀîOÀèUÀÞWÀØ[ÀÎ]ÀÄ_ÀÃYÀÍYÀ×SÀÝOÀçMÀíEÀóAÀûûAÀõGÀíKÀåOÀßUÀÕWÀÍ[ÀÅ]À;PM1PEà¿Ä[ÀÎWÀÖUÀÞQÀæMÀìIÀôEÀúýþùFÀóJÀëNÀåRÀÝVÀÕXÀÍ\ÀÃZÀÄZÀÎTÀÖTÀÞNÀæHÀìFÀô@ÀúúþôFÀìJÀäNÀÞRÀØVÀÌXÀÆ\ÀÅZÀËZÀ×TÀÝTÀãNÀëHÀóFÀù@À?ÀúEÀòGÀîMÀäSÀÞSÀØYÀÌYÀÆ[ÀÅWÀËUÀ×QÀÝMÀãIÀíEÀñýùù?ÀóEÀëGÀåMÀÝSÀÕSÀÍYÀÃYÀ;PM1PE;PM2FPPE=<aZÀ_GÀ;PM0PEÄ[ÀÎWÀÖUÀÞQÀæMÀìIÀôEÀúýþùFÀóJÀëNÀåRÀÝVÀÕXÀÍ\ÀÃZÀÄZÀÎTÀÖTÀÞNÀæHÀìFÀô@ÀúúþôFÀìJÀäNÀÞRÀØVÀÌXÀÆ\ÀÅZÀËZÀ×TÀÝTÀãNÀëHÀóFÀù@À?ÀúEÀòGÀîMÀäSÀÞSÀØYÀÌYÀÆ[ÀÅWÀËUÀ×QÀÝMÀãIÀíEÀñýùù?ÀóEÀëGÀåMÀÝSÀÕSÀÍYÀÃYÀ;PM1PEÞ¿ÄYÀÎSÀÔSÀÞMÀäKÀìEÀòCÀöýþõDÀñFÀëLÀãNÀÝTÀÓTÀÍZÀÃXÀÄVÀÎRÀÔPÀÞLÀäFÀìDÀòüöøþòDÀìFÀäLÀÞNÀÔTÀÌTÀÆZÀÅXÀËVÀÓRÀÝPÀãJÀëHÀñBÀ÷þûøCÀòEÀêKÀäOÀÞQÀÖUÀÌWÀÆYÀÅSÀËSÀÕMÀÝKÀãEÀéCÀñý÷õýñAÀëGÀãIÀÝOÀÓQÀÍUÀÃWÀ;PM1PE;PM2RF4,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<CZÀ_GÀ;PM0PEÄYÀÎSÀÔSÀÞMÀäKÀìEÀòCÀöýþõDÀñFÀëLÀãNÀÝTÀÓTÀÍZÀÃXÀÄVÀÎRÀÔPÀÞLÀäFÀìDÀòüöøþòDÀìFÀäLÀÞNÀÔTÀÌTÀÆZÀÅXÀËVÀÓRÀÝPÀãJÀëHÀñBÀ÷þûøCÀòEÀêKÀäOÀÞQÀÖUÀÌWÀÆYÀÅSÀËSÀÕMÀÝKÀãEÀéCÀñý÷õýñAÀëGÀãIÀÝOÀÓQÀÍUÀÃWÀ;PM1PEÞ¿ÆUÀÌQÀÔOÀÜKÀäIÀêCÀð?Àôûüó@ÀïDÀéJÀãLÀÛPÀÓRÀËVÀÅTÀÆTÀÌNÀÔNÀÜHÀäFÀêþðüôöüð@ÀêDÀâJÀÞLÀÔPÀÌRÀÄVÀÃTÀËTÀÓNÀÝNÀáHÀéDÀï@ÀõüûöýðEÀêGÀâMÀÜMÀÖSÀÌSÀÄUÀÃQÀËOÀÕKÀÛIÀáCÀé?Àïûõóûï?ÀéCÀãGÀÛMÀÓMÀËSÀÅSÀ;PM1PE;PM2FPPE=<eYÀ_GÀ;PM0PEÆUÀÌQÀÔOÀÜKÀäIÀêCÀð?Àôûüó@ÀïDÀéJÀãLÀÛPÀÓRÀËVÀÅTÀÆTÀÌNÀÔNÀÜHÀäFÀêþðüôöüð@ÀêDÀâJÀÞLÀÔPÀÌRÀÄVÀÃTÀËTÀÓNÀÝNÀáHÀéDÀï@ÀõüûöýðEÀêGÀâMÀÜMÀÖSÀÌSÀÄUÀÃQÀËOÀÕKÀÛIÀáCÀé?Àïûõóûï?ÀéCÀãGÀÛMÀÓMÀËSÀÅSÀ;PM1PEà¿ÄQÀÌOÀÔKÀÜIÀâEÀæAÀðýô÷øóþïBÀåFÀáJÀÛLÀÓPÀËRÀÃRÀÄNÀÌNÀÔJÀÜFÀâBÀæþðøôôøîþèBÀâFÀÜJÀÒLÀÎPÀÄRÀÃPÀÍPÀÑLÀÛLÀáDÀçBÀí@Àóø÷ôýîAÀèEÀâIÀÚMÀÔMÀÎQÀÂQÀÁOÀÍKÀÓIÀÙEÀáAÀçýí÷óó÷ï?ÀåAÀáCÀÛKÀÓKÀËOÀÃOÀ;PM1PE;PM2FPPE=<EYÀ_GÀ;PM0PEÄQÀÌOÀÔKÀÜIÀâEÀæAÀðýô÷øóþïBÀåFÀáJÀÛLÀÓPÀËRÀÃRÀÄNÀÌNÀÔJÀÜFÀâBÀæþðøôôøîþèBÀâFÀÜJÀÒLÀÎPÀÄRÀÃPÀÍPÀÑLÀÛLÀáDÀçBÀí@Àóø÷ôýîAÀèEÀâIÀÚMÀÔMÀÎQÀÂQÀÁOÀÍKÀÓIÀÙEÀáAÀçýí÷óó÷ï?ÀåAÀáCÀÛKÀÓKÀËOÀÃOÀ;PM1PEÞ¿ÄOÀÌKÀÒIÀÜEÀàCÀæ?Àìûòõöñüë@ÀåDÀßFÀÛJÀÑLÀËPÀÃNÀÄNÀÌHÀÒHÀÜBÀà@Àæüìøòðöîüæ@ÀàDÀÚFÀÔJÀÌLÀÄPÀÃNÀËNÀÓHÀÙHÀßBÀå@Àíüïø÷ðûì?ÀèAÀàGÀÚGÀÔMÀÌMÀÂOÀÁKÀËIÀÓEÀÙCÀß?Àçûëõïñ÷ëûå?ÀßAÀÛGÀÑGÀËMÀÃMÀ;PM1PE;PM2FPPE=<gXÀ_GÀ;PM0PEÄOÀÌKÀÒIÀÜEÀàCÀæ?Àìûòõöñüë@ÀåDÀßFÀÛJÀÑLÀËPÀÃNÀÄNÀÌHÀÒHÀÜBÀà@Àæüìøòðöîüæ@ÀàDÀÚFÀÔJÀÌLÀÄPÀÃNÀËNÀÓHÀÙHÀßBÀå@Àíüïø÷ðûì?ÀèAÀàGÀÚGÀÔMÀÌMÀÂOÀÁKÀËIÀÓEÀÙCÀß?Àçûëõïñ÷ëûå?ÀßAÀÛGÀÑGÀËMÀÃMÀ;PM1PEà¿ÂKÀÌIÀÒEÀÚCÀàAÀäûê÷ðõöïøéüãBÀßDÀÙFÀÑJÀËLÀÁLÀÂHÀÌHÀÒDÀÚ@ÀàþäøêôððöêøæüàBÀØDÀÒFÀÌJÀÄLÀÃJÀËJÀÑFÀ×FÀß@Àåþéøïôóð÷êýæ?ÀÞCÀÚGÀÒGÀÌKÀÄKÀÃIÀËEÀÑCÀÙAÀÝûå÷éõïïóé÷ãýß?ÀÙEÀÑEÀËIÀÁIÀ;PM1PE;PM2FPPE=<GXÀ_GÀ;PM0PEÂKÀÌIÀÒEÀÚCÀàAÀäûê÷ðõöïøéüãBÀßDÀÙFÀÑJÀËLÀÁLÀÂHÀÌHÀÒDÀÚ@ÀàþäøêôððöêøæüàBÀØDÀÒFÀÌJÀÄLÀÃJÀËJÀÑFÀ×FÀß@Àåþéøïôóð÷êýæ?ÀÞCÀÚGÀÒGÀÌKÀÄKÀÃIÀËEÀÑCÀÙAÀÝûå÷éõïïóé÷ãýß?ÀÙEÀÑEÀËIÀÁIÀ;PM1PEÞ¿ÄGÀÊGÀÒCÀØ?ÀÞ?Àä÷è÷îñòíøçúãþÝ@À×DÀÑHÀÉHÀÃHÀÄFÀÊDÀÒBÀØþÞúäöèôîìòêøäøÜ@ÀØ@ÀÒDÀÌHÀÂHÀÁHÀËFÀÑDÀ×BÀÛþãúéöëòóîõêùäýÜAÀØCÀÒEÀÊGÀÄGÀÃGÀÉCÀÑ?À×ýÛùã÷éñííñçõãùÝý×AÀÑCÀÉEÀÃGÀ;PM1PE;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<iWÀ_GÀ;PM0PEÄGÀÊGÀÒCÀØ?ÀÞ?Àä÷è÷îñòíøçúãþÝ@À×DÀÑHÀÉHÀÃHÀÄFÀÊDÀÒBÀØþÞúäöèôîìòêøäøÜ@ÀØ@ÀÒDÀÌHÀÂHÀÁHÀËFÀÑDÀ×BÀÛþãúéöëòóîõêùäýÜAÀØCÀÒEÀÊGÀÄGÀÃGÀÉCÀÑ?À×ýÛùã÷éñííñçõãùÝý×AÀÑCÀÉEÀÃGÀ;PM1PEÞ¿ÄEÀÊCÀÐ?ÀØýÜûâ÷èóìïðëôçøáüÛþ×@ÀÏDÀÉFÀÃFÀÄBÀÊBÀÐþØüÜöâöèðììðæôäøÚüØþÐ@ÀÌDÀÂFÀÁDÀËDÀÏ@À×@ÀÙüãöåöëðïìõæõâûÜýØAÀÐAÀÊEÀÄEÀÃCÀÉ?ÀÏý×ûÛ÷áóåïëëïçõáõÛû×?ÀÏ?ÀÉCÀÃCÀ;PM1PE;PM2FPPE=<KWÀ_GÀ;PM0PEÄEÀÊCÀÐ?ÀØýÜûâ÷èóìïðëôçøáüÛþ×@ÀÏDÀÉFÀÃFÀÄBÀÊBÀÐþØüÜöâöèðììðæôäøÚüØþÐ@ÀÌDÀÂFÀÁDÀËDÀÏ@À×@ÀÙüãöåöëðïìõæõâûÜýØAÀÐAÀÊEÀÄEÀÃCÀÉ?ÀÏý×ûÛ÷áóåïëëïçõáõÛû×?ÀÏ?ÀÉCÀÃCÀ;PM1PEà¿ÄAÀÈAÀÐûÖûÜùàõæïêíîéòåößøÛüÕüÏBÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜöàòæîêêîæðàöÜúÔüÐüÊBÀÄBÀÃBÀÉ@ÀÏþÓüÛøßöåðéðíêñäõâ÷ÚûÖýÐ?ÀÊAÀÄAÀÃAÀÉûÏûÕ÷ÙõáñãíééïåïßõÛ÷ÕûÏýÇ?ÀÃAÀ;PM1PE;PM2FPPE=<kVÀ_GÀ;PM0PEÄAÀÈAÀÐûÖûÜùàõæïêíîéòåößøÛüÕüÏBÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜöàòæîêêîæðàöÜúÔüÐüÊBÀÄBÀÃBÀÉ@ÀÏþÓüÛøßöåðéðíêñäõâ÷ÚûÖýÐ?ÀÊAÀÄAÀÃAÀÉûÏûÕ÷ÙõáñãíééïåïßõÛ÷ÕûÏýÇ?ÀÃAÀ;PM1PEÞ¿Ä?ÀÈûÐûÖ÷ÚõÞóäïèéìçðãòÝöÙøÕüÏþÇþÃþÄþÈüÐøÖöÚòÞðäìèæêäðàôÚöÔøÐüÈüÄ@ÀÃþÇüÏüÓúÙößòãðåêëèïäñàõØ÷ÖûÐýÈýÄýÃýÇûÏ÷Õõ×ñßïãëççéãïÝñÙõÕùÏûÇûÃý;PM1PE;PM2FPPE=<MVÀ_GÀ;PM0PEÄ?ÀÈûÐûÖ÷ÚõÞóäïèéìçðãòÝöÙøÕüÏþÇþÃþÄþÈüÐøÖöÚòÞðäìèæêäðàôÚöÔøÐüÈüÄ@ÀÃþÇüÏüÓúÙößòãðåêëèïäñàõØ÷ÖûÐýÈýÄýÃýÇûÏ÷Õõ×ñßïãëççéãïÝñÙõÕùÏûÇûÃý;PM1PEÞ¿ÄûÈûÐõÒõÚóÞïâíäéêãîáðÝôÙöÑöÏüÇüÃüÄúÈøÐöÒôÚðÞìâêäæêâîÞðØôÔöÎöÈüÄüÃüÇúÍøÓö×òÝðáîåêéæëâïÞóØõÔ÷ÎùÈûÄûÃûÇõÍõÓó×ïÝíáéåãéáíÝïÙñÑõÏ÷ÇùÃû;PM1PE;PM2RF6,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<oUÀ_GÀ;PM0PEÄûÈûÐõÒõÚóÞïâíäéêãîáðÝôÙöÑöÏüÇüÃüÄúÈøÐöÒôÚðÞìâêäæêâîÞðØôÔöÎöÈüÄüÃüÇúÍøÓö×òÝðáîåêéæëâïÞóØõÔ÷ÎùÈûÄûÃûÇõÍõÓó×ïÝíáéåãéáíÝïÙñÑõÏ÷ÇùÃû;PM1PEà¿ÂùÈõÐõÒñØïÚïâéäçæáêáðÙð×ôÑôÏøÇøÁøÂøÈôÐôÒðØîÚêâèâäèàêÜðØðÒòÎöÈöÄúÃøÇöÍöÑô×ðÛîßêãèçäéàíÜïØóÒóÎ÷È÷Â÷Á÷ÇóÍóÑï×ïÛéßåããçáéÙí×ïÑóÏõÇõÁ÷;PM1PE;PM2FPPE=<OUÀ_GÀ;PM0PEÂùÈõÐõÒñØïÚïâéäçæáêáðÙð×ôÑôÏøÇøÁøÂøÈôÐôÒðØîÚêâèâäèàêÜðØðÒòÎöÈöÄúÃøÇöÍöÑô×ðÛîßêãèçäéàíÜïØóÒóÎ÷È÷Â÷Á÷ÇóÍóÑï×ïÛéßåããçáéÙí×ïÑóÏõÇõÁ÷;PM1PEà¿ÂõÈóÎñÐïÖíÜëÞçàåæáèÛìÛîÕðÏòÍôÇöÁöÂôÈòÎðÐîÖêÜêÜäââæÞèÚìØîÐðÎòÈôÂöÁöÇòÍôÏð×ìÙìÝèáæãâéÞéÚíÖïÒñÌóÊõÂõÁóÉñËïÑíÕëÙçÝåáßåÝçÛëÕëÏïÍóÇñÁõ;PM1PE;PM2FPPE=<oTÀ_GÀ;PM0PEÂõÈóÎñÐïÖíÜëÞçàåæáèÛìÛîÕðÏòÍôÇöÁöÂôÈòÎðÐîÖêÜêÜäââæÞèÚìØîÐðÎòÈôÂöÁöÇòÍôÏð×ìÙìÝèáæãâéÞéÚíÖïÒñÌóÊõÂõÁóÉñËïÑíÕëÙçÝåáßåÝçÛëÕëÏïÍóÇñÁõ;PM1PEÞ¿ÂóÈïÎïÎëÖéØéÞåàáâáæÛê×êÕîÍîÍòÇòÁòÂòÈîÎîÎêÖèØæÜäâàâÜæØêÖêÐìÎðÆðÂôÁòÅðÍðÏîÕê×èÛæßäãàåÜçØéÖíÐíÌñÈñÂñÁñÇíËíÏéÕé×åÛáßßãÝå×çÕéÍíÍïÇïÁñ;PM1PE;PM2FPPE=<QTÀ_GÀ;PM0PEÂóÈïÎïÎëÖéØéÞåàáâáæÛê×êÕîÍîÍòÇòÁòÂòÈîÎîÎêÖèØæÜäâàâÜæØêÖêÐìÎðÆðÂôÁòÅðÍðÏîÕê×èÛæßäãàåÜçØéÖíÐíÌñÈñÂñÁñÇíËíÏéÕé×åÛáßßãÝå×çÕéÍíÍïÇïÁñ;PM1PEÞ¿ÂïÈíÊëÐéÔéØåÚáÞáâÝâÙæ×êÓêÏìÉîÇðÁîÂðÈìÊêÐèÔæØäÚâÞÞâÚâÖæÔêÐêÌìÆîÂðÁîÅîËîÏêÓèÕæÙäÝàáÞãÜåÖçÔéÐëÊïÈíÂïÁíÇëÉéÏéÓåÕáÛáÝÝßÙã×åÓçÏéÉíÇíÁí;PM1PE;PM2FPPE=<sSÀ_GÀ;PM0PEÂïÈíÊëÐéÔéØåÚáÞáâÝâÙæ×êÓêÏìÉîÇðÁîÂðÈìÊêÐèÔæØäÚâÞÞâÚâÖæÔêÐêÌìÆîÂðÁîÅîËîÏêÓèÕæÙäÝàáÞãÜåÖçÔéÐëÊïÈíÂïÁíÇëÉéÏéÓåÕáÛáÝÝßÙã×åÓçÏéÉíÇíÁí;PM1PEà¿ÂíÆéÊéÐåÒåÖãØáÜÝÞÛâ×äÕæÓèÍêÉêÅìÁìÂêÆêÊèÎäÔäÖâØÞÜÞÞØâÔäÔæÎæÌêÆêÂîÁìÅêËêÍèÓäÓä×âÝÞÝÜáØãÖãÔçÎéÊéÆëÄëÃéÅéÉçÍåÓãÕá×ÝÛÛÝ×áÕãÑãÏçÉéÅéÁë;PM1PE;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<SSÀ_GÀ;PM0PEÂíÆéÊéÐåÒåÖãØáÜÝÞÛâ×äÕæÓèÍêÉêÅìÁìÂêÆêÊèÎäÔäÖâØÞÜÞÞØâÔäÔæÎæÌêÆêÂîÁìÅêËêÍèÓäÓä×âÝÞÝÜáØãÖãÔçÎéÊéÆëÄëÃéÅéÉçÍåÓãÕá×ÝÛÛÝ×áÕãÑãÏçÉéÅéÁë;PM1PEÞ¿ÄéÆçÈåÎãÐãÖáÖÝÚÛÞÙÞ×àÓäÏäÍèÉæÅêÁèÂèÆæÊæÎâÐâÔÞØÜÚÜÜÖÞÔâÒäÌäÊæÆèÂêÁèÅèÉæËæÑâÓâÕÞÛÜÛÚÝØáÔáÐåÎåÊçÆçÂéÁåÅçÉãÍãÏßÓÝ×ÝÙÙÛÕÝÕáÏáÍåÇåÅçÃç;PM1PE;PM2FPPE=<uRÀ_GÀ;PM0PEÄéÆçÈåÎãÐãÖáÖÝÚÛÞÙÞ×àÓäÏäÍèÉæÅêÁèÂèÆæÊæÎâÐâÔÞØÜÚÜÜÖÞÔâÒäÌäÊæÆèÂêÁèÅèÉæËæÑâÓâÕÞÛÜÛÚÝØáÔáÐåÎåÊçÆçÂéÁåÅçÉãÍãÏßÓÝ×ÝÙÙÛÕÝÕáÏáÍåÇåÅçÃç;PM1PEÞ¿ÄåÄåÊãÌßÐáÒÝÖÛØÙÚ×ÞÕÞÓàÍâËäÉäÅæÁäÂæÆäÊâÌàÎÞÔÜÖÜØØÚÔÜÔÞÐâÌàÊäÄæÂæÁäÃæÉäËâÏàÓÞÓÜ×ÚÛØÛÖÝÔßÐáÌãÈåÆãÂåÁãÅãÇáËßÏÝÓÝÕÙ××ÙÕÛÑÝÏßËáÉãÃåÃã;PM1PE;PM2FPPE=<WRÀ_GÀ;PM0PEÄåÄåÊãÌßÐáÒÝÖÛØÙÚ×ÞÕÞÓàÍâËäÉäÅæÁäÂæÆäÊâÌàÎÞÔÜÖÜØØÚÔÜÔÞÐâÌàÊäÄæÂæÁäÃæÉäËâÏàÓÞÓÜ×ÚÛØÛÖÝÔßÐáÌãÈåÆãÂåÁãÅãÇáËßÏÝÓÝÕÙ××ÙÕÛÑÝÏßËáÉãÃåÃã;PM1PEà¿ÂãÆáÈßÊÝÎÝÒÛÔÙÖ×ØÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÐÜÎÞÌÞÈàÆâÂäÁâÅâÇàËàÍÞÏÚÓÜÕØ×ÔÙÖÛÐÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÏÙÕ×ÓÕ×ÓÛÑÙÍÝÉßÇßÅáÁá;PM1PE;PM2FPPE=<wQÀ_GÀ;PM0PEÂãÆáÈßÊÝÎÝÒÛÔÙÖ×ØÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÐÜÎÞÌÞÈàÆâÂäÁâÅâÇàËàÍÞÏÚÓÜÕØ×ÔÙÖÛÐÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÏÙÕ×ÓÕ×ÓÛÑÙÍÝÉßÇßÅáÁá;PM1PEà¿Æ?ÀÒ÷ÜóæíîåôÝúÑþÅþÆúÒôÞìæèîÜôÒøÆ@ÀÅþÑúÛòçîëæóÞùÒýÆýÅùÑóÝíååíÛñÑùÅý;PM1PE;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<WQÀ_GÀ;PM0PEÆ?ÀÒ÷ÜóæíîåôÝúÑþÅþÆúÒôÞìæèîÜôÒøÆ@ÀÅþÑúÛòçîëæóÞùÒýÆýÅùÑóÝíååíÛñÑùÅý;PM1PEÞ¿ÆùÎñÜïàéêáðÙôÏøÅøÆôÐðÚèââêÚðÐòÆúÅøÏôÙðáèçâïÚóÐ÷Æ÷ÅóÏïÙéáßçÛïÍóÅ÷;PM1PE;PM2FPPE=<yPÀ_GÀ;PM0PEÆùÎñÜïàéêáðÙôÏøÅøÆôÐðÚèââêÚðÐòÆúÅøÏôÙðáèçâïÚóÐ÷Æ÷ÅóÏïÙéáßçÛïÍóÅ÷;PM1PEÞ¿ÆñÎíÖéàãäßêÕîÏòÃðÄðÐêÖäàÞäØêÎîÄòÃðÍð×êÝäãÞéØïÎïÄñÃíÍé×ãÝßãÕéÍïÅï;PM1PE;PM2FPPE=<[PÀ_GÀ;PM0PEÆñÎíÖéàãäßêÕîÏòÃðÄðÐêÖäàÞäØêÎîÄòÃðÍð×êÝäãÞéØïÎïÄñÃíÍé×ãÝßãÕéÍïÅï;PM1PEà¿ÄëÌçÔãÜáàÙäÓèËìÃêÄêÌäÔàÚÚâÔäÌèÆìÅêËêÓäÙàßÚãÔéÌéÆëÅçËãÓßÙÛßÓãËéÃé;PM1PE;PM2FPPE=<{OÀ_GÀ;PM0PEÄëÌçÔãÜáàÙäÓèËìÃêÄêÌäÔàÚÚâÔäÌèÆìÅêËêÓäÙàßÚãÔéÌéÆëÅçËãÓßÙÛßÓãËéÃé;PM1PEÞ¿ÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PE;PM2FPPE=<]OÀ_GÀ;PM0PEÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PEÞ¿ÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PE;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<?OÀ_GÀ;PM0PEÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PEà¿ÂÙÈÕÌÕÎÑÔÍÔËÖÇÚÁØÂØÈÔÌÒÎÐÒÌÖÆÖÄÚÃØÅØËÔÏÒÑÐÓÌ×Æ×ÂÙÁÕÅÓËÓÏÍÑËÓÇ×Á×;PM1PE;PM2FPPE=<_NÀ_GÀ;PM0PEÂÙÈÕÌÕÎÑÔÍÔËÖÇÚÁØÂØÈÔÌÒÎÐÒÌÖÆÖÄÚÃØÅØËÔÏÒÑÐÓÌ×Æ×ÂÙÁÕÅÓËÓÏÍÑËÓÇ×Á×;PM1PEÞ¿ÂÓÆÏÈÑÌËÌËÒÉÐÃÔÁÒÂÒÄÐÊÎÌÌÌÈÒÄÐÄÔÃÒÃÒÇÐËÎÍÌÏÈÑÄÑÂÓÁÏÃÑÇËËËÍÇÏÅÑÁÑ;PM1PE;PM2FPPE=<ANÀ_GÀ;PM0PEÂÓÆÏÈÑÌËÌËÒÉÐÃÔÁÒÂÒÄÐÊÎÌÌÌÈÒÄÐÄÔÃÒÃÒÇÐËÎÍÌÏÈÑÄÑÂÓÁÏÃÑÇËËËÍÇÏÅÑÁÑ;PM1PEà¿¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PE;PM2FPPE=<aMÀ_GÀ;PM0PE¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PEÞ¿ÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM1PE;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<CMÀ_GÀ;PM0PEÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM2FPMC1,240PE=<GùYUÀ;PM0PEÊÑØÃâÌæØêÞääâèÔæÈÜÆàÆäÄêÆêÆêÈèÊæÄÊÄÐÈÖÊÞÊàÎäÎæÌæÎæÌæÌâÌÞÊÚÆÔÆÌÂÆ×ÂÍÌÅÖÂØÄÞÆÚÂØÁÒÏÖÝÌåÂí¿íÁë¿åÆÝÎÏÌÑÒÓÖÕØÙÜÛÞÝàÝàÝÞßàÝÜÝÜßØÛÒÛÎÙÊÛÄßÁçÃéÇíËñÉóË÷ËõÉùÉ÷Å÷¿ùÂõÈñÎñÖïÚñÖïØïÔñÔïÒíÐëÎëÎçÈåÊáÆÝÄÛÂ×ÁÑÃÛÅÙ¿ÙÄÙÄÛÄÝ¿áÅåÍßÏÓÇÅÁ¿ÄÄÆÆÆÄÈÃÄÉÌÏÚÓäÓè×æÕäÓÚÑÌÑÇÛÙÝãßéáéÝÝÛÏÕÆËÌ×ÐÛÐãÔåÒëÔëÖïÔëÒíÒçÎåÎßÈ×ÄÑÂÉÅÅÏ¿ÕÆ×ÌÛÒÙÖÛÚÙâÙÔËÖËÚËØÍÚÍØÑÖÑÒÓÌÕÈÙÂÛÇÝÏáÛãåéñëÃËÆÕÎÝÒãØéÜëàñàóâñâñàïÜëÚåÔßÐÙÆÏÊÍÒ×ØÝàãäéìíðñòñöñøóøïøïøëöåôáðÙîÕôÓúÓþÑBÀÑHÀÏNÀÍPÀÍTÀÉVÀÉ\ÀÅ^ÀÃ`ÀÁbÀ¿dÀÆfÀÆÒÄÖÄÚÆàÈâÈâÈæÊäÊäÈàÈàÈÜÆÖÂÒÂÌÁÄÁ;PM2FTFPMC1,90PE=<YkÀ_GÀ;PM0PEÄeÀÆcÀÎaÀÐaÀØ_ÀÚ]ÀÞYÀäYÀèUÀìUÀîQÀôQÀøKÀúIÀþGÀBÀCÀDÀAÀHÀýJÀùLÀ÷RÀóRÀíVÀëVÀçZÀãZÀÝ^ÀÙ`À×bÀÏbÀÍdÀÅfÀÃfÀÄdÀÆbÀÎ`ÀÐ`ÀØ^ÀÚ\ÀÞZÀäVÀèVÀìRÀîPÀôNÀøJÀúHÀþDÀBÀBÀDÀþHÀúJÀøLÀòRÀðRÀìVÀèVÀâZÀàZÀÚ^ÀÖ`ÀÒbÀÌbÀÈdÀÂfÀÁfÀÇbÀËdÀÑ`ÀÕ`ÀÙ^Àß\ÀáZÀçVÀëTÀïTÀñPÀ÷LÀùLÀýHÀAÀDÀCÀBÀGÀüIÀüMÀöOÀôQÀðUÀìUÀèYÀâ[Àà]ÀÚ_ÀÖ_ÀÒaÀÌcÀÈeÀÂeÀÁcÀÇaÀËaÀÑ_ÀÕ]ÀÙYÀßYÀáUÀçUÀëQÀïQÀóKÀõIÀûGÀûCÀAÀAÀCÀýGÀùKÀ÷KÀóOÀíSÀëSÀçUÀãYÀÝ[ÀÙ]À×_ÀÏ_ÀÍcÀÅaÀÃeÀ;PM1PEÞ¿ÄcÀÆcÀÎaÀÐ]ÀÖ]ÀÚ[ÀÞYÀäWÀæUÀêSÀðQÀôMÀöMÀøGÀþGÀ@ÀAÀBÀ?ÀHÀýHÀ÷NÀõNÀóRÀïTÀéVÀåXÀãZÀÝ\ÀÙ^ÀÕ`ÀÏ`ÀÍdÀÅdÀÃdÀÄbÀÆbÀÎ^ÀÐ`ÀÖZÀÚ\ÀÞXÀäVÀæTÀêPÀðPÀôLÀöJÀøFÀþDÀ@À@ÀBÀüHÀúHÀöNÀôNÀîRÀêTÀèVÀâXÀÞZÀÜ\ÀÔ^ÀÒ^ÀÌbÀÈdÀÂdÀÁbÀÇdÀËbÀÑ^ÀÓ`ÀÛZÀÝ\ÀáXÀçVÀéTÀíPÀóPÀõLÀùJÀûFÀ?ÀDÀCÀþEÀþIÀúKÀöOÀôOÀîSÀêUÀèWÀâ[ÀÞYÀÚ_ÀÖ]ÀÒaÀÌaÀÈcÀÂcÀÁcÀÇ_ÀË_ÀÑ]ÀÕ[ÀÙYÀÝWÀáUÀçSÀéQÀíMÀóMÀõGÀùGÀýAÀý?ÀCÀýEÀ÷IÀõKÀóOÀïOÀéSÀåUÀãWÀÝ[ÀÙYÀÕ_ÀÏ]ÀÍaÀÅcÀÃaÀ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,3FPPE=<{jÀ_GÀ;PM0PEÄcÀÆcÀÎaÀÐ]ÀÖ]ÀÚ[ÀÞYÀäWÀæUÀêSÀðQÀôMÀöMÀøGÀþGÀ@ÀAÀBÀ?ÀHÀýHÀ÷NÀõNÀóRÀïTÀéVÀåXÀãZÀÝ\ÀÙ^ÀÕ`ÀÏ`ÀÍdÀÅdÀÃdÀÄbÀÆbÀÎ^ÀÐ`ÀÖZÀÚ\ÀÞXÀäVÀæTÀêPÀðPÀôLÀöJÀøFÀþDÀ@À@ÀBÀüHÀúHÀöNÀôNÀîRÀêTÀèVÀâXÀÞZÀÜ\ÀÔ^ÀÒ^ÀÌbÀÈdÀÂdÀÁbÀÇdÀËbÀÑ^ÀÓ`ÀÛZÀÝ\ÀáXÀçVÀéTÀíPÀóPÀõLÀùJÀûFÀ?ÀDÀCÀþEÀþIÀúKÀöOÀôOÀîSÀêUÀèWÀâ[ÀÞYÀÚ_ÀÖ]ÀÒaÀÌaÀÈcÀÂcÀÁcÀÇ_ÀË_ÀÑ]ÀÕ[ÀÙYÀÝWÀáUÀçSÀéQÀíMÀóMÀõGÀùGÀýAÀý?ÀCÀýEÀ÷IÀõKÀóOÀïOÀéSÀåUÀãWÀÝ[ÀÙYÀÕ_ÀÏ]ÀÍaÀÅcÀÃaÀ;PM1PEà¿ÂcÀÈ_ÀÌ_ÀÐ]ÀÖ[ÀÚYÀÞWÀâWÀæSÀêSÀðOÀðKÀöKÀøGÀüEÀ@ÀAÀBÀ?ÀFÀûHÀ÷LÀõLÀïPÀïTÀéTÀåXÀáXÀÝZÀÙ\ÀÕ`ÀÏ^ÀËbÀÇbÀÁbÀÂbÀÈ^ÀÌ^ÀÐ^ÀÖZÀÚXÀÞXÀâTÀæRÀêPÀðNÀðLÀöHÀøDÀüBÀ@À@ÀBÀüFÀøHÀöLÀòLÀîPÀêTÀèTÀàXÀÞXÀÜZÀÔ\ÀÒ^ÀÌ`ÀÆ`ÀÄdÀÃbÀÅ`ÀË`ÀÑ^ÀÓ\ÀÛZÀÝZÀßXÀçTÀéRÀíPÀñNÀõJÀ÷HÀûFÀ?ÀBÀAÀ@ÀCÀüGÀøKÀöMÀòOÀîQÀêSÀæWÀâWÀÞYÀÚ]ÀÖ]ÀÒ]ÀÌaÀÆaÀÂaÀÁaÀÅ]ÀË_ÀÑ[ÀÕYÀÙWÀÝWÀáSÀåSÀéOÀíKÀñKÀõGÀ÷EÀûAÀ?À?ÀAÀûEÀ÷GÀõIÀïMÀïOÀéQÀåSÀáWÀÝYÀÙYÀÕ[ÀÏ]ÀË_ÀÇ_ÀÁaÀ;PM1PE;PM2FPPE=<[jÀ_GÀ;PM0PEÂcÀÈ_ÀÌ_ÀÐ]ÀÖ[ÀÚYÀÞWÀâWÀæSÀêSÀðOÀðKÀöKÀøGÀüEÀ@ÀAÀBÀ?ÀFÀûHÀ÷LÀõLÀïPÀïTÀéTÀåXÀáXÀÝZÀÙ\ÀÕ`ÀÏ^ÀËbÀÇbÀÁbÀÂbÀÈ^ÀÌ^ÀÐ^ÀÖZÀÚXÀÞXÀâTÀæRÀêPÀðNÀðLÀöHÀøDÀüBÀ@À@ÀBÀüFÀøHÀöLÀòLÀîPÀêTÀèTÀàXÀÞXÀÜZÀÔ\ÀÒ^ÀÌ`ÀÆ`ÀÄdÀÃbÀÅ`ÀË`ÀÑ^ÀÓ\ÀÛZÀÝZÀßXÀçTÀéRÀíPÀñNÀõJÀ÷HÀûFÀ?ÀBÀAÀ@ÀCÀüGÀøKÀöMÀòOÀîQÀêSÀæWÀâWÀÞYÀÚ]ÀÖ]ÀÒ]ÀÌaÀÆaÀÂaÀÁaÀÅ]ÀË_ÀÑ[ÀÕYÀÙWÀÝWÀáSÀåSÀéOÀíKÀñKÀõGÀ÷EÀûAÀ?À?ÀAÀûEÀ÷GÀõIÀïMÀïOÀéQÀåSÀáWÀÝYÀÙYÀÕ[ÀÏ]ÀË_ÀÇ_ÀÁaÀ;PM1PEà¿ÂaÀÆ]ÀÌ_ÀÒ[ÀÔYÀÚYÀÞWÀàSÀèSÀèOÀîMÀðMÀôGÀøGÀüCÀþAÀBÀýDÀûHÀ÷HÀóNÀïNÀíPÀçTÀçTÀßXÀÝZÀÙZÀÓ\ÀÑ`ÀË^ÀÅbÀÁ`ÀÂ`ÀÆ^ÀÌ\ÀÒZÀÔZÀÚXÀÞVÀàRÀèRÀèNÀîLÀðJÀôHÀøDÀüBÀþþBÀúDÀøHÀôHÀòNÀîNÀèPÀæTÀâTÀÞXÀÚZÀÔZÀÐ\ÀÌ`ÀÈ^ÀÂbÀÁ`ÀÇ`ÀË^ÀÏ\ÀÓZÀÙZÀÝXÀáVÀåRÀçRÀíNÀñLÀóJÀ÷HÀùBÀýBÀAÀ@ÀCÀúGÀøIÀôKÀòMÀìQÀêQÀæUÀâWÀÞYÀØYÀÖ[ÀÐ]ÀÌ_ÀÈ_ÀÂaÀÁ]ÀÇ_ÀË[ÀÏYÀÕYÀ×WÀÝSÀáSÀåOÀéMÀëMÀñGÀóGÀ÷CÀùAÀ?ÀýAÀûAÀ÷GÀóIÀïKÀíMÀçQÀçQÀßUÀÝWÀÙYÀÓYÀÑ[ÀË]ÀÅ_ÀÁ_À;PM1PE;PM2FPPE=<{iÀ_GÀ;PM0PEÂaÀÆ]ÀÌ_ÀÒ[ÀÔYÀÚYÀÞWÀàSÀèSÀèOÀîMÀðMÀôGÀøGÀüCÀþAÀBÀýDÀûHÀ÷HÀóNÀïNÀíPÀçTÀçTÀßXÀÝZÀÙZÀÓ\ÀÑ`ÀË^ÀÅbÀÁ`ÀÂ`ÀÆ^ÀÌ\ÀÒZÀÔZÀÚXÀÞVÀàRÀèRÀèNÀîLÀðJÀôHÀøDÀüBÀþþBÀúDÀøHÀôHÀòNÀîNÀèPÀæTÀâTÀÞXÀÚZÀÔZÀÐ\ÀÌ`ÀÈ^ÀÂbÀÁ`ÀÇ`ÀË^ÀÏ\ÀÓZÀÙZÀÝXÀáVÀåRÀçRÀíNÀñLÀóJÀ÷HÀùBÀýBÀAÀ@ÀCÀúGÀøIÀôKÀòMÀìQÀêQÀæUÀâWÀÞYÀØYÀÖ[ÀÐ]ÀÌ_ÀÈ_ÀÂaÀÁ]ÀÇ_ÀË[ÀÏYÀÕYÀ×WÀÝSÀáSÀåOÀéMÀëMÀñGÀóGÀ÷CÀùAÀ?ÀýAÀûAÀ÷GÀóIÀïKÀíMÀçQÀçQÀßUÀÝWÀÙYÀÓYÀÑ[ÀË]ÀÅ_ÀÁ_À;PM1PEÞ¿Â_ÀÆ]ÀÌ[ÀÐ[ÀÖWÀØWÀÞUÀàSÀæQÀèOÀìMÀòIÀôGÀöGÀúAÀþ?À@ÀýBÀùHÀõHÀóJÀñNÀëPÀçRÀåTÀßVÀÝXÀ×XÀÕ\ÀÏ\ÀË^ÀÅ`ÀÁ^ÀÂ`ÀÆ\ÀÌZÀÐZÀÖXÀØVÀÞTÀàRÀæPÀèLÀìLÀòHÀôFÀöDÀú@Àþü@ÀüBÀöHÀôHÀðJÀìNÀêPÀäRÀâTÀÞVÀØXÀÔXÀÐ\ÀÌ\ÀÈ^ÀÂ`ÀÁ^ÀÇ^ÀË^ÀÏZÀÓZÀ×VÀÝXÀáTÀãPÀéRÀëLÀïLÀóHÀõFÀûDÀû@À?ÀüCÀüEÀöGÀòKÀòKÀìOÀêQÀäSÀàUÀÞWÀØYÀÖYÀÐ[ÀÌ_ÀÈ]ÀÂ_ÀÁ]ÀÇ[ÀË[ÀÏWÀÕWÀ×UÀÝSÀßQÀãOÀéMÀëIÀñGÀñGÀõAÀû?Àûý?ÀùCÀõEÀóGÀñKÀëKÀçQÀåOÀßSÀÝWÀ×UÀÕYÀÏYÀË]ÀÅ]ÀÁ]À;PM1PE;PM2FPPE=<]iÀ_GÀ;PM0PEÂ_ÀÆ]ÀÌ[ÀÐ[ÀÖWÀØWÀÞUÀàSÀæQÀèOÀìMÀòIÀôGÀöGÀúAÀþ?À@ÀýBÀùHÀõHÀóJÀñNÀëPÀçRÀåTÀßVÀÝXÀ×XÀÕ\ÀÏ\ÀË^ÀÅ`ÀÁ^ÀÂ`ÀÆ\ÀÌZÀÐZÀÖXÀØVÀÞTÀàRÀæPÀèLÀìLÀòHÀôFÀöDÀú@Àþü@ÀüBÀöHÀôHÀðJÀìNÀêPÀäRÀâTÀÞVÀØXÀÔXÀÐ\ÀÌ\ÀÈ^ÀÂ`ÀÁ^ÀÇ^ÀË^ÀÏZÀÓZÀ×VÀÝXÀáTÀãPÀéRÀëLÀïLÀóHÀõFÀûDÀû@À?ÀüCÀüEÀöGÀòKÀòKÀìOÀêQÀäSÀàUÀÞWÀØYÀÖYÀÐ[ÀÌ_ÀÈ]ÀÂ_ÀÁ]ÀÇ[ÀË[ÀÏWÀÕWÀ×UÀÝSÀßQÀãOÀéMÀëIÀñGÀñGÀõAÀû?Àûý?ÀùCÀõEÀóGÀñKÀëKÀçQÀåOÀßSÀÝWÀ×UÀÕYÀÏYÀË]ÀÅ]ÀÁ]À;PM1PEÞ¿Â]ÀÈ[ÀÊ[ÀÒWÀÔYÀØUÀÜSÀâQÀäOÀèMÀìMÀðGÀòGÀöEÀúAÀüýþûBÀùFÀõHÀñHÀïNÀëNÀçPÀãRÀáTÀÛVÀ×ZÀÓXÀÑ\ÀÉ\ÀÇ^ÀÁ^ÀÂ\ÀÈZÀÊZÀÒXÀÔVÀØTÀÜTÀâPÀäNÀèLÀìJÀðHÀòDÀöBÀú@ÀüüþúBÀöFÀòHÀîHÀîNÀæNÀæPÀàRÀÞTÀØVÀÔZÀÐXÀÌ\ÀÆ\ÀÂ^ÀÁ\ÀÅ^ÀËZÀÏZÀÓXÀ×VÀÝTÀßTÀåPÀåNÀíLÀíJÀñHÀõDÀùBÀû@À?ÀüAÀúCÀöGÀòIÀîKÀìMÀèOÀæSÀàSÀÜUÀØWÀÖYÀÐYÀÊ[ÀÈ]ÀÂ]ÀÁ[ÀÇ[ÀÉWÀÏYÀÕUÀ×SÀÛQÀßOÀåMÀçMÀëGÀíGÀñEÀõAÀùýûû?ÀùAÀõCÀñGÀïIÀëKÀçMÀãOÀáSÀÛSÀ×UÀÓWÀÑYÀÉYÀÇ]ÀÁ[À;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<?iÀ_GÀ;PM0PEÂ]ÀÈ[ÀÊ[ÀÒWÀÔYÀØUÀÜSÀâQÀäOÀèMÀìMÀðGÀòGÀöEÀúAÀüýþûBÀùFÀõHÀñHÀïNÀëNÀçPÀãRÀáTÀÛVÀ×ZÀÓXÀÑ\ÀÉ\ÀÇ^ÀÁ^ÀÂ\ÀÈZÀÊZÀÒXÀÔVÀØTÀÜTÀâPÀäNÀèLÀìJÀðHÀòDÀöBÀú@ÀüüþúBÀöFÀòHÀîHÀîNÀæNÀæPÀàRÀÞTÀØVÀÔZÀÐXÀÌ\ÀÆ\ÀÂ^ÀÁ\ÀÅ^ÀËZÀÏZÀÓXÀ×VÀÝTÀßTÀåPÀåNÀíLÀíJÀñHÀõDÀùBÀû@À?ÀüAÀúCÀöGÀòIÀîKÀìMÀèOÀæSÀàSÀÜUÀØWÀÖYÀÐYÀÊ[ÀÈ]ÀÂ]ÀÁ[ÀÇ[ÀÉWÀÏYÀÕUÀ×SÀÛQÀßOÀåMÀçMÀëGÀíGÀñEÀõAÀùýûû?ÀùAÀõCÀñGÀïIÀëKÀçMÀãOÀáSÀÛSÀ×UÀÓWÀÑYÀÉYÀÇ]ÀÁ[À;PM1PEà¿Â]ÀÈYÀÊYÀÐUÀÔUÀØUÀÜQÀàQÀäOÀèKÀêIÀðIÀðEÀöAÀøAÀüýþûBÀ÷BÀõFÀïJÀïJÀéLÀçPÀãRÀßRÀÛVÀ×VÀÓXÀÏZÀÉZÀÇ\ÀÁ\ÀÂZÀÈZÀÊXÀÐVÀÔVÀØRÀÜRÀàNÀäNÀèJÀêJÀðDÀðDÀö@Àø@ÀüüþöBÀöBÀòFÀîJÀìJÀèLÀäPÀÞRÀÞRÀØVÀÔVÀÐVÀÊZÀÈZÀÂ^ÀÁ\ÀÇZÀÉZÀÏXÀÓVÀ×TÀÝTÀÝRÀãNÀçNÀëJÀíHÀñFÀõDÀõ@Àûþ?Àü?ÀøCÀöCÀòIÀîIÀìMÀæMÀäQÀàQÀÜUÀØUÀÖWÀÎYÀÌYÀÆ[ÀÄ[ÀÃYÀÅYÀËWÀÍUÀÕUÀ×QÀÛQÀßOÀãKÀåIÀëIÀíEÀñAÀõAÀ÷ýûûý÷?ÀõCÀïEÀïGÀéIÀçMÀãMÀßQÀÛSÀ×SÀÓUÀÏWÀÉYÀÇYÀÁ[À;PM1PE;PM2FPPE=<_hÀ_GÀ;PM0PEÂ]ÀÈYÀÊYÀÐUÀÔUÀØUÀÜQÀàQÀäOÀèKÀêIÀðIÀðEÀöAÀøAÀüýþûBÀ÷BÀõFÀïJÀïJÀéLÀçPÀãRÀßRÀÛVÀ×VÀÓXÀÏZÀÉZÀÇ\ÀÁ\ÀÂZÀÈZÀÊXÀÐVÀÔVÀØRÀÜRÀàNÀäNÀèJÀêJÀðDÀðDÀö@Àø@ÀüüþöBÀöBÀòFÀîJÀìJÀèLÀäPÀÞRÀÞRÀØVÀÔVÀÐVÀÊZÀÈZÀÂ^ÀÁ\ÀÇZÀÉZÀÏXÀÓVÀ×TÀÝTÀÝRÀãNÀçNÀëJÀíHÀñFÀõDÀõ@Àûþ?Àü?ÀøCÀöCÀòIÀîIÀìMÀæMÀäQÀàQÀÜUÀØUÀÖWÀÎYÀÌYÀÆ[ÀÄ[ÀÃYÀÅYÀËWÀÍUÀÕUÀ×QÀÛQÀßOÀãKÀåIÀëIÀíEÀñAÀõAÀ÷ýûûý÷?ÀõCÀïEÀïGÀéIÀçMÀãMÀßQÀÛSÀ×SÀÓUÀÏWÀÉYÀÇYÀÁ[À;PM1PEÞ¿ÂYÀÈYÀÊWÀÐUÀÒUÀØSÀÜQÀàMÀâMÀèKÀêIÀîGÀðCÀöAÀö?Àúýþù@ÀõBÀõDÀïHÀíJÀéLÀçNÀáNÀßRÀÛTÀ×VÀÑVÀÏXÀÉZÀÇZÀÁZÀÂZÀÈXÀÊVÀÐTÀÒTÀØRÀÜPÀàNÀâLÀèJÀêFÀîDÀðDÀö@Àöüúúþø@ÀôBÀòDÀîHÀêJÀæLÀäNÀÞNÀÜRÀØTÀÔVÀÐVÀÊXÀÈZÀÂZÀÁZÀÇZÀÉVÀÏXÀÓTÀ×TÀÛRÀÝPÀãNÀåJÀéLÀíFÀñDÀóDÀ÷@Àùüûú?ÀøCÀôCÀòEÀìIÀêKÀèMÀäOÀÞQÀÜSÀØSÀÔUÀÎWÀÌYÀÆYÀÄYÀÃYÀÅWÀËUÀÍUÀÓSÀ×QÀÛMÀÝMÀãKÀçIÀéGÀëCÀñAÀó?À÷ýùùûõ?ÀõCÀïCÀíEÀéKÀçIÀáMÀßOÀÛQÀ×SÀÑSÀÏWÀÉUÀÇYÀÁYÀ;PM1PE;PM2FPPE=<AhÀ_GÀ;PM0PEÂYÀÈYÀÊWÀÐUÀÒUÀØSÀÜQÀàMÀâMÀèKÀêIÀîGÀðCÀöAÀö?Àúýþù@ÀõBÀõDÀïHÀíJÀéLÀçNÀáNÀßRÀÛTÀ×VÀÑVÀÏXÀÉZÀÇZÀÁZÀÂZÀÈXÀÊVÀÐTÀÒTÀØRÀÜPÀàNÀâLÀèJÀêFÀîDÀðDÀö@Àöüúúþø@ÀôBÀòDÀîHÀêJÀæLÀäNÀÞNÀÜRÀØTÀÔVÀÐVÀÊXÀÈZÀÂZÀÁZÀÇZÀÉVÀÏXÀÓTÀ×TÀÛRÀÝPÀãNÀåJÀéLÀíFÀñDÀóDÀ÷@Àùüûú?ÀøCÀôCÀòEÀìIÀêKÀèMÀäOÀÞQÀÜSÀØSÀÔUÀÎWÀÌYÀÆYÀÄYÀÃYÀÅWÀËUÀÍUÀÓSÀ×QÀÛMÀÝMÀãKÀçIÀéGÀëCÀñAÀó?À÷ýùùûõ?ÀõCÀïCÀíEÀéKÀçIÀáMÀßOÀÛQÀ×SÀÑSÀÏWÀÉUÀÇYÀÁYÀ;PM1PEÞ¿ÄYÀÆWÀÌUÀÎSÀÒSÀØQÀÜOÀÞMÀäMÀæIÀêGÀìEÀðCÀô?Àöýúûüùþõ@ÀóDÀïFÀëHÀéJÀåNÀãNÀÝPÀÛRÀ×TÀÑTÀÍXÀËVÀÅZÀÃXÀÄXÀÆVÀÌVÀÎRÀÒTÀØNÀÜPÀÞLÀäJÀæHÀêFÀìDÀðBÀôþöüúúüöþô@ÀðDÀìFÀêHÀæJÀâNÀàNÀÚPÀØRÀÔTÀÎTÀÌVÀÆXÀÂZÀÁXÀÅXÀËVÀÍVÀÓRÀ×RÀÙPÀßPÀáLÀåJÀéHÀëFÀïDÀóBÀõþùüûúýöAÀòCÀðEÀîGÀêIÀæKÀâOÀàMÀÚSÀØQÀÔUÀÎUÀÌWÀÆWÀÂYÀÁUÀÅWÀËSÀÍSÀÓQÀ×OÀÙMÀßMÀáIÀåGÀéEÀíCÀï?ÀñýõûùùûõýóAÀïCÀëEÀéGÀåIÀãKÀÝOÀÛOÀ×QÀÑQÀÍUÀËUÀÅWÀÃWÀ;PM1PE;PM2FPPE=<cgÀ_GÀ;PM0PEÄYÀÆWÀÌUÀÎSÀÒSÀØQÀÜOÀÞMÀäMÀæIÀêGÀìEÀðCÀô?Àöýúûüùþõ@ÀóDÀïFÀëHÀéJÀåNÀãNÀÝPÀÛRÀ×TÀÑTÀÍXÀËVÀÅZÀÃXÀÄXÀÆVÀÌVÀÎRÀÒTÀØNÀÜPÀÞLÀäJÀæHÀêFÀìDÀðBÀôþöüúúüöþô@ÀðDÀìFÀêHÀæJÀâNÀàNÀÚPÀØRÀÔTÀÎTÀÌVÀÆXÀÂZÀÁXÀÅXÀËVÀÍVÀÓRÀ×RÀÙPÀßPÀáLÀåJÀéHÀëFÀïDÀóBÀõþùüûúýöAÀòCÀðEÀîGÀêIÀæKÀâOÀàMÀÚSÀØQÀÔUÀÎUÀÌWÀÆWÀÂYÀÁUÀÅWÀËSÀÍSÀÓQÀ×OÀÙMÀßMÀáIÀåGÀéEÀíCÀï?ÀñýõûùùûõýóAÀïCÀëEÀéGÀåIÀãKÀÝOÀÛOÀ×QÀÑQÀÍUÀËUÀÅWÀÃWÀ;PM1PEà¿ÂWÀÆUÀÌSÀÎSÀÔQÀÖOÀÜOÀÞKÀàIÀèIÀèGÀìCÀðAÀòAÀôûøûü÷üóBÀñBÀïDÀëHÀçJÀçJÀßLÀÝPÀÛPÀÕRÀÓTÀÍTÀËVÀÅXÀÁXÀÂTÀÆVÀÌTÀÎRÀÔPÀÖNÀÜNÀÞJÀàJÀèHÀèDÀìBÀð@ÀòþôúøøüöüòBÀðBÀìDÀèHÀæJÀâJÀÞLÀÚPÀØPÀÒRÀÐTÀÊTÀÆVÀÄXÀÃVÀÅVÀÉVÀÏTÀÑPÀ×RÀÙNÀÝNÀáJÀåHÀçHÀëFÀïBÀñ@Àõþ÷úùøýö?ÀòAÀðCÀêGÀêIÀæIÀâMÀÞMÀÚOÀÖQÀÔSÀÐUÀÊSÀÆWÀÂWÀÁUÀÅSÀÉSÀÏQÀÓOÀÕOÀÙKÀÝIÀáIÀåGÀéCÀéAÀïAÀñûõû÷÷ùóýñ?ÀïAÀëEÀçGÀçGÀßIÀÝMÀÛMÀÕQÀÓOÀÍSÀËUÀÅUÀÁUÀ;PM1PE;PM2FPPE=<CgÀ_GÀ;PM0PEÂWÀÆUÀÌSÀÎSÀÔQÀÖOÀÜOÀÞKÀàIÀèIÀèGÀìCÀðAÀòAÀôûøûü÷üóBÀñBÀïDÀëHÀçJÀçJÀßLÀÝPÀÛPÀÕRÀÓTÀÍTÀËVÀÅXÀÁXÀÂTÀÆVÀÌTÀÎRÀÔPÀÖNÀÜNÀÞJÀàJÀèHÀèDÀìBÀð@ÀòþôúøøüöüòBÀðBÀìDÀèHÀæJÀâJÀÞLÀÚPÀØPÀÒRÀÐTÀÊTÀÆVÀÄXÀÃVÀÅVÀÉVÀÏTÀÑPÀ×RÀÙNÀÝNÀáJÀåHÀçHÀëFÀïBÀñ@Àõþ÷úùøýö?ÀòAÀðCÀêGÀêIÀæIÀâMÀÞMÀÚOÀÖQÀÔSÀÐUÀÊSÀÆWÀÂWÀÁUÀÅSÀÉSÀÏQÀÓOÀÕOÀÙKÀÝIÀáIÀåGÀéCÀéAÀïAÀñûõû÷÷ùóýñ?ÀïAÀëEÀçGÀçGÀßIÀÝMÀÛMÀÕQÀÓOÀÍSÀËUÀÅUÀÁUÀ;PM1PEÞ¿ÂUÀÆUÀÌQÀÎQÀÒOÀÖOÀÚKÀÞKÀâIÀæGÀèEÀêCÀð?Àð?Àöûöùúõüõ@Àï@ÀïDÀéFÀçHÀåJÀáLÀÝLÀÙPÀÕPÀÑRÀÍTÀËTÀÅVÀÁTÀÂVÀÆRÀÌTÀÎPÀÒPÀÖLÀÚLÀÞJÀâFÀæFÀèDÀêBÀð@Àðüöøöøúôüò@Àî@ÀìDÀèFÀäHÀâJÀÞLÀÚLÀÖPÀÔPÀÎRÀÊRÀÆVÀÄVÀÃTÀÅVÀÉRÀÍTÀÓPÀÕNÀÙNÀÝLÀáJÀãFÀçFÀëDÀíBÀñþóü÷ú÷øûô?ÀòAÀîCÀìEÀèEÀäIÀâKÀÞKÀÚOÀÖOÀÔSÀÎQÀÊUÀÆSÀÂUÀÁSÀÅSÀÉQÀÍOÀÓOÀÕKÀÙKÀÝIÀáGÀãEÀçCÀë?Àí?Àñûóù÷õùõûïýïAÀéCÀçEÀåEÀáIÀÝKÀÙMÀÕMÀÑOÀÍSÀËQÀÅUÀÁSÀ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<efÀ_GÀ;PM0PEÂUÀÆUÀÌQÀÎQÀÒOÀÖOÀÚKÀÞKÀâIÀæGÀèEÀêCÀð?Àð?Àöûöùúõüõ@Àï@ÀïDÀéFÀçHÀåJÀáLÀÝLÀÙPÀÕPÀÑRÀÍTÀËTÀÅVÀÁTÀÂVÀÆRÀÌTÀÎPÀÒPÀÖLÀÚLÀÞJÀâFÀæFÀèDÀêBÀð@Àðüöøöøúôüò@Àî@ÀìDÀèFÀäHÀâJÀÞLÀÚLÀÖPÀÔPÀÎRÀÊRÀÆVÀÄVÀÃTÀÅVÀÉRÀÍTÀÓPÀÕNÀÙNÀÝLÀáJÀãFÀçFÀëDÀíBÀñþóü÷ú÷øûô?ÀòAÀîCÀìEÀèEÀäIÀâKÀÞKÀÚOÀÖOÀÔSÀÎQÀÊUÀÆSÀÂUÀÁSÀÅSÀÉQÀÍOÀÓOÀÕKÀÙKÀÝIÀáGÀãEÀçCÀë?Àí?Àñûóù÷õùõûïýïAÀéCÀçEÀåEÀáIÀÝKÀÙMÀÕMÀÑOÀÍSÀËQÀÅUÀÁSÀ;PM1PEà¿ÂSÀÆSÀÊQÀÎOÀÒMÀÖMÀÚKÀÞIÀàGÀäGÀèCÀêAÀî?Àðýôûö÷øõüóþï@ÀíBÀéDÀçHÀãHÀßJÀÝLÀÙNÀÕNÀÑRÀÍPÀÉTÀÅTÀÁTÀÂRÀÆRÀÊPÀÎPÀÒNÀÖLÀÚJÀÞHÀàFÀäDÀèBÀêBÀîüðüôúööøòüðþî@ÀìBÀèDÀäHÀàHÀÜJÀÚLÀÖNÀÒNÀÎPÀÌRÀÆTÀÂTÀÁTÀÅRÀËRÀÍPÀÑPÀÕNÀÙJÀÛLÀßHÀãFÀçDÀëBÀíBÀïüñüõøùöûôûðAÀîAÀìCÀæEÀäGÀâIÀÜKÀÚMÀÖOÀÒOÀÎQÀÌQÀÆSÀÂSÀÁSÀÅOÀËQÀÍMÀÑMÀÕKÀÙIÀÛGÀáGÀãCÀåAÀë?Àíýïûó÷õõ÷óûïûíAÀéAÀçCÀãEÀßGÀÝKÀÙIÀÕMÀÑOÀÍOÀÉQÀÅQÀÁSÀ;PM1PE;PM2FPPE=<EfÀ_GÀ;PM0PEÂSÀÆSÀÊQÀÎOÀÒMÀÖMÀÚKÀÞIÀàGÀäGÀèCÀêAÀî?Àðýôûö÷øõüóþï@ÀíBÀéDÀçHÀãHÀßJÀÝLÀÙNÀÕNÀÑRÀÍPÀÉTÀÅTÀÁTÀÂRÀÆRÀÊPÀÎPÀÒNÀÖLÀÚJÀÞHÀàFÀäDÀèBÀêBÀîüðüôúööøòüðþî@ÀìBÀèDÀäHÀàHÀÜJÀÚLÀÖNÀÒNÀÎPÀÌRÀÆTÀÂTÀÁTÀÅRÀËRÀÍPÀÑPÀÕNÀÙJÀÛLÀßHÀãFÀçDÀëBÀíBÀïüñüõøùöûôûðAÀîAÀìCÀæEÀäGÀâIÀÜKÀÚMÀÖOÀÒOÀÎQÀÌQÀÆSÀÂSÀÁSÀÅOÀËQÀÍMÀÑMÀÕKÀÙIÀÛGÀáGÀãCÀåAÀë?Àíýïûó÷õõ÷óûïûíAÀéAÀçCÀãEÀßGÀÝKÀÙIÀÕMÀÑOÀÍOÀÉQÀÅQÀÁSÀ;PM1PEÞ¿ÂSÀÆOÀÊOÀÎOÀÒMÀÖIÀÚKÀÜGÀàGÀäCÀèAÀèAÀî?Àîûòùö÷øõúñüí@ÀíBÀçBÀçDÀãHÀßHÀÛLÀÙJÀÕNÀÑPÀÍPÀÉPÀÅTÀÁRÀÂPÀÆRÀÊNÀÎNÀÒLÀÖJÀÚJÀÜFÀàDÀäDÀèBÀèþîüîüòöööøòúðüî@ÀèBÀèBÀâDÀàHÀÞHÀØLÀÖJÀÒNÀÎPÀÊPÀÆPÀÂTÀÁRÀÅPÀÉPÀÍPÀÑNÀÕLÀ×JÀÝJÀßFÀáDÀçDÀçBÀíþïüñúõøõöûòûðýìAÀêCÀèCÀâEÀàIÀÞIÀØKÀÖMÀÒMÀÎQÀÊOÀÆQÀÂSÀÁOÀÅOÀÉOÀÍMÀÑIÀÕKÀ×GÀÝGÀßCÀáAÀçAÀé?Àëûïùñ÷õõ÷ñùíûíýçAÀçCÀãCÀßEÀÛIÀÙIÀÕKÀÑMÀÍOÀÉOÀÅOÀÁQÀ;PM1PE;PM2FPPE=<geÀ_GÀ;PM0PEÂSÀÆOÀÊOÀÎOÀÒMÀÖIÀÚKÀÜGÀàGÀäCÀèAÀèAÀî?Àîûòùö÷øõúñüí@ÀíBÀçBÀçDÀãHÀßHÀÛLÀÙJÀÕNÀÑPÀÍPÀÉPÀÅTÀÁRÀÂPÀÆRÀÊNÀÎNÀÒLÀÖJÀÚJÀÜFÀàDÀäDÀèBÀèþîüîüòöööøòúðüî@ÀèBÀèBÀâDÀàHÀÞHÀØLÀÖJÀÒNÀÎPÀÊPÀÆPÀÂTÀÁRÀÅPÀÉPÀÍPÀÑNÀÕLÀ×JÀÝJÀßFÀáDÀçDÀçBÀíþïüñúõøõöûòûðýìAÀêCÀèCÀâEÀàIÀÞIÀØKÀÖMÀÒMÀÎQÀÊOÀÆQÀÂSÀÁOÀÅOÀÉOÀÍMÀÑIÀÕKÀ×GÀÝGÀßCÀáAÀçAÀé?Àëûïùñ÷õõ÷ñùíûíýçAÀçCÀãCÀßEÀÛIÀÙIÀÕKÀÑMÀÍOÀÉOÀÅOÀÁQÀ;PM1PEÞ¿ÂQÀÆOÀÊMÀÎMÀÒKÀÖIÀØGÀÜGÀàEÀâCÀæAÀê?Àìýîùòùôõöóúñúíþë@ÀéBÀåDÀáFÀßHÀÛHÀ×LÀÕJÀÑNÀÍNÀÉRÀÅPÀÁPÀÂPÀÆNÀÊNÀÎLÀÒJÀÖJÀØHÀÜFÀàBÀâBÀæBÀêüìüîøòøôôöðúðúìþè@ÀèBÀâDÀàFÀÚHÀÚHÀÖJÀÐLÀÎNÀÊNÀÆPÀÂRÀÁPÀÅPÀÉNÀÍNÀÏLÀÕJÀÙJÀÙHÀßDÀáDÀçBÀç@Àëþïúïúóø÷ô÷ðûðûìAÀèAÀæAÀäEÀÞGÀÜIÀÚIÀÖKÀÐMÀÎMÀÊOÀÆOÀÂOÀÁQÀÅMÀÉMÀÍIÀÏKÀÕGÀÙGÀÛEÀÝCÀãAÀå?Àçýëùïùïõóó÷ñùíùëýé?ÀåAÀáCÀßCÀÛGÀ×IÀÕIÀÑKÀÍMÀÉMÀÅOÀÁOÀ;PM1PE;PM2FPPE=<IeÀ_GÀ;PM0PEÂQÀÆOÀÊMÀÎMÀÒKÀÖIÀØGÀÜGÀàEÀâCÀæAÀê?Àìýîùòùôõöóúñúíþë@ÀéBÀåDÀáFÀßHÀÛHÀ×LÀÕJÀÑNÀÍNÀÉRÀÅPÀÁPÀÂPÀÆNÀÊNÀÎLÀÒJÀÖJÀØHÀÜFÀàBÀâBÀæBÀêüìüîøòøôôöðúðúìþè@ÀèBÀâDÀàFÀÚHÀÚHÀÖJÀÐLÀÎNÀÊNÀÆPÀÂRÀÁPÀÅPÀÉNÀÍNÀÏLÀÕJÀÙJÀÙHÀßDÀáDÀçBÀç@Àëþïúïúóø÷ô÷ðûðûìAÀèAÀæAÀäEÀÞGÀÜIÀÚIÀÖKÀÐMÀÎMÀÊOÀÆOÀÂOÀÁQÀÅMÀÉMÀÍIÀÏKÀÕGÀÙGÀÛEÀÝCÀãAÀå?Àçýëùïùïõóó÷ñùíùëýé?ÀåAÀáCÀßCÀÛGÀ×IÀÕIÀÑKÀÍMÀÉMÀÅOÀÁOÀ;PM1PEà¿ÂOÀÆMÀÊMÀÌKÀÒIÀÖGÀØGÀÚEÀàCÀâAÀäAÀêýêýî÷ðùôóôóúïøíþéþéBÀãBÀáDÀßFÀÙHÀ×HÀÕJÀÑLÀËNÀÉNÀÅPÀÁNÀÂNÀÆNÀÊLÀÌJÀÒJÀÖHÀØFÀÚDÀàBÀâ@Àä@ÀêüêúîøðöôòôðúðøêþèþæBÀâBÀÞDÀÜFÀØHÀÖHÀÐJÀÎLÀÊNÀÆNÀÂPÀÁNÀÅNÀÉNÀÍLÀÏJÀÕJÀ×HÀÛFÀÝDÀáBÀå@Àçþéþïúïøñôõô÷ðùðûê?Àè?ÀæAÀàCÀàEÀÜGÀØIÀÖIÀÐKÀÎMÀÈMÀÆMÀÄOÀÃMÀÅMÀÇKÀÍIÀÏGÀÕGÀ×EÀÛCÀßAÀßAÀåýçýé÷ïùïóóóóï÷íùéýéýã?ÀáAÀßCÀÙEÀ×GÀÕIÀÑIÀËKÀÉMÀÅMÀÁMÀ;PM1PE;PM2FPPE=<idÀ_GÀ;PM0PEÂOÀÆMÀÊMÀÌKÀÒIÀÖGÀØGÀÚEÀàCÀâAÀäAÀêýêýî÷ðùôóôóúïøíþéþéBÀãBÀáDÀßFÀÙHÀ×HÀÕJÀÑLÀËNÀÉNÀÅPÀÁNÀÂNÀÆNÀÊLÀÌJÀÒJÀÖHÀØFÀÚDÀàBÀâ@Àä@ÀêüêúîøðöôòôðúðøêþèþæBÀâBÀÞDÀÜFÀØHÀÖHÀÐJÀÎLÀÊNÀÆNÀÂPÀÁNÀÅNÀÉNÀÍLÀÏJÀÕJÀ×HÀÛFÀÝDÀáBÀå@Àçþéþïúïøñôõô÷ðùðûê?Àè?ÀæAÀàCÀàEÀÜGÀØIÀÖIÀÐKÀÎMÀÈMÀÆMÀÄOÀÃMÀÅMÀÇKÀÍIÀÏGÀÕGÀ×EÀÛCÀßAÀßAÀåýçýé÷ïùïóóóóï÷íùéýéýã?ÀáAÀßCÀÙEÀ×GÀÕIÀÑIÀËKÀÉMÀÅMÀÁMÀ;PM1PEÞ¿ÄMÀÆMÀÈKÀÎIÀÐGÀÖGÀÖEÀÜCÀÞCÀâ?Àä?Àæýêùîùðõòóôñöïúíúéþå@Àã@ÀáDÀÝDÀÛFÀÕHÀÕHÀÏLÀÍJÀÇNÀÅNÀÃNÀÄLÀÆLÀÈJÀÎJÀÐFÀÖHÀÖDÀÜBÀÞBÀâ@Àäüæüêøîöðöòòôîöîúêúèþä@Àâ@ÀÞDÀÜDÀÖFÀÔHÀÒHÀÌJÀÊLÀÆNÀÂNÀÁNÀÅLÀÉLÀËJÀÑJÀÓFÀÕFÀÛFÀÝBÀáBÀãþçþéúíúíöñöõòõî÷îûêûè?ÀäAÀâAÀÞCÀÚGÀØEÀÔIÀÐIÀÎKÀÊKÀÆMÀÂMÀÁMÀÅIÀÉKÀÍGÀÏGÀÓEÀ×CÀÙCÀÝ?Àá?ÀãýçùéùíõíóññõïõíùéùåýãýáAÀÝAÀÛEÀÕEÀÕEÀÏIÀÍIÀÇKÀÅKÀÃMÀ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<KdÀ_GÀ;PM0PEÄMÀÆMÀÈKÀÎIÀÐGÀÖGÀÖEÀÜCÀÞCÀâ?Àä?Àæýêùîùðõòóôñöïúíúéþå@Àã@ÀáDÀÝDÀÛFÀÕHÀÕHÀÏLÀÍJÀÇNÀÅNÀÃNÀÄLÀÆLÀÈJÀÎJÀÐFÀÖHÀÖDÀÜBÀÞBÀâ@Àäüæüêøîöðöòòôîöîúêúèþä@Àâ@ÀÞDÀÜDÀÖFÀÔHÀÒHÀÌJÀÊLÀÆNÀÂNÀÁNÀÅLÀÉLÀËJÀÑJÀÓFÀÕFÀÛFÀÝBÀáBÀãþçþéúíúíöñöõòõî÷îûêûè?ÀäAÀâAÀÞCÀÚGÀØEÀÔIÀÐIÀÎKÀÊKÀÆMÀÂMÀÁMÀÅIÀÉKÀÍGÀÏGÀÓEÀ×CÀÙCÀÝ?Àá?ÀãýçùéùíõíóññõïõíùéùåýãýáAÀÝAÀÛEÀÕEÀÕEÀÏIÀÍIÀÇKÀÅKÀÃMÀ;PM1PEà¿ÂKÀÆKÀÈIÀÎGÀÐGÀÖEÀÖEÀÚAÀÞAÀàýä?Àèûè÷ìùðõðñòïöïúëøçüç@ÀãþßBÀÝBÀÙFÀÕFÀÕHÀÏHÀÍJÀÇLÀÅLÀÁLÀÂJÀÆLÀÈHÀÎHÀÐDÀÖFÀÖDÀÚ@ÀÞ@Ààþäüèúèøìöðòðòòîöîúèøæüä@ÀàþÞBÀÜBÀÖFÀÔFÀÒHÀÌHÀÊJÀÄLÀÄLÀÃJÀÃLÀÉJÀËHÀÑHÀÓFÀÕFÀÛDÀÝ@Àß@Àãþåüçúíøíöñòñòõî÷ìùêûæýä?Àà?ÀÞCÀÚEÀØCÀÔGÀÐGÀÎKÀÊIÀÄKÀÂKÀÁKÀÃIÀÉGÀÍGÀÏEÀÓEÀ×AÀÙAÀÝýß?Àãûå÷éùëõíññïñïõë÷çùçûãýß?ÀÝ?ÀÙCÀÕEÀÕEÀÏGÀÍGÀÇIÀÅKÀÁIÀ;PM1PE;PM2FPPE=<kcÀ_GÀ;PM0PEÂKÀÆKÀÈIÀÎGÀÐGÀÖEÀÖEÀÚAÀÞAÀàýä?Àèûè÷ìùðõðñòïöïúëøçüç@ÀãþßBÀÝBÀÙFÀÕFÀÕHÀÏHÀÍJÀÇLÀÅLÀÁLÀÂJÀÆLÀÈHÀÎHÀÐDÀÖFÀÖDÀÚ@ÀÞ@Ààþäüèúèøìöðòðòòîöîúèøæüä@ÀàþÞBÀÜBÀÖFÀÔFÀÒHÀÌHÀÊJÀÄLÀÄLÀÃJÀÃLÀÉJÀËHÀÑHÀÓFÀÕFÀÛDÀÝ@Àß@Àãþåüçúíøíöñòñòõî÷ìùêûæýä?Àà?ÀÞCÀÚEÀØCÀÔGÀÐGÀÎKÀÊIÀÄKÀÂKÀÁKÀÃIÀÉGÀÍGÀÏEÀÓEÀ×AÀÙAÀÝýß?Àãûå÷éùëõíññïñïõë÷çùçûãýß?ÀÝ?ÀÙCÀÕEÀÕEÀÏGÀÍGÀÇIÀÅKÀÁIÀ;PM1PEÞ¿ÂKÀÆGÀÈIÀÎEÀÐGÀÒCÀØAÀÚAÀÜAÀâýâûæùèùìõìóðóôïôëöëúçúåüáþáBÀÛBÀÙBÀ×FÀÑFÀÏFÀÍJÀÇJÀÅJÀÁJÀÂJÀÆHÀÈHÀÎFÀÐDÀÒDÀØBÀÚ@ÀÜþâüâüæúèöìôìòððôîôìöèúæúâüàþÞBÀÚBÀÖBÀÔDÀÐHÀÌFÀÊJÀÄHÀÄLÀÃJÀÃHÀÉJÀËFÀÏHÀÓDÀÕDÀÙBÀÝ@Àßþáüåüçøëöíöïòñðóîõêùêûäûäýà?ÀÜAÀÜCÀÖCÀÔEÀÎGÀÎGÀÊIÀÄIÀÂIÀÁIÀÃIÀÉEÀÍEÀÍEÀÓAÀÕAÀÛAÀÛýßûãùãùéõéóíóïïñëõëõç÷åûáûáýÛ?ÀÙAÀ×CÀÑCÀÏGÀÍEÀÇIÀÅGÀÁIÀ;PM1PE;PM2FPPE=<McÀ_GÀ;PM0PEÂKÀÆGÀÈIÀÎEÀÐGÀÒCÀØAÀÚAÀÜAÀâýâûæùèùìõìóðóôïôëöëúçúåüáþáBÀÛBÀÙBÀ×FÀÑFÀÏFÀÍJÀÇJÀÅJÀÁJÀÂJÀÆHÀÈHÀÎFÀÐDÀÒDÀØBÀÚ@ÀÜþâüâüæúèöìôìòððôîôìöèúæúâüàþÞBÀÚBÀÖBÀÔDÀÐHÀÌFÀÊJÀÄHÀÄLÀÃJÀÃHÀÉJÀËFÀÏHÀÓDÀÕDÀÙBÀÝ@Àßþáüåüçøëöíöïòñðóîõêùêûäûäýà?ÀÜAÀÜCÀÖCÀÔEÀÎGÀÎGÀÊIÀÄIÀÂIÀÁIÀÃIÀÉEÀÍEÀÍEÀÓAÀÕAÀÛAÀÛýßûãùãùéõéóíóïïñëõëõç÷åûáûáýÛ?ÀÙAÀ×CÀÑCÀÏGÀÍEÀÇIÀÅGÀÁIÀ;PM1PEà¿ÂIÀÄGÀÊEÀÌEÀÐCÀÒCÀØAÀØ?ÀÞýÞýâûæùèõêõìóîñòíôëöéöçúåüáþÝþÝ@À×BÀ×DÀÑDÀÏFÀËFÀÉHÀÃJÀÁHÀÂHÀÄHÀÊFÀÌDÀÐBÀÒBÀØBÀØþÞþÞüâøæøèöêòìòîðòìôêöèöäúâüàþÜþÚ@ÀÖBÀÔDÀÐDÀÌFÀÈFÀÆHÀÂJÀÁHÀÅHÀÇHÀËDÀÏFÀÓBÀÕBÀÙBÀÛþßüáüãúçøéöëòïòñðñìõê÷è÷äûâýàýÜAÀÚAÀÖAÀÔCÀÎEÀÌGÀÊGÀÆGÀÂIÀÁGÀÅEÀÉEÀËCÀÍCÀÓAÀÕ?ÀÙýÛýßûáùãõçõéóëñïíñëñéõç÷åùáûÝûÝý×AÀ×AÀÑAÀÏEÀËCÀÉGÀÃGÀÁGÀ;PM1PE;PM2FPPE=<mbÀ_GÀ;PM0PEÂIÀÄGÀÊEÀÌEÀÐCÀÒCÀØAÀØ?ÀÞýÞýâûæùèõêõìóîñòíôëöéöçúåüáþÝþÝ@À×BÀ×DÀÑDÀÏFÀËFÀÉHÀÃJÀÁHÀÂHÀÄHÀÊFÀÌDÀÐBÀÒBÀØBÀØþÞþÞüâøæøèöêòìòîðòìôêöèöäúâüàþÜþÚ@ÀÖBÀÔDÀÐDÀÌFÀÈFÀÆHÀÂJÀÁHÀÅHÀÇHÀËDÀÏFÀÓBÀÕBÀÙBÀÛþßüáüãúçøéöëòïòñðñìõê÷è÷äûâýàýÜAÀÚAÀÖAÀÔCÀÎEÀÌGÀÊGÀÆGÀÂIÀÁGÀÅEÀÉEÀËCÀÍCÀÓAÀÕ?ÀÙýÛýßûáùãõçõéóëñïíñëñéõç÷åùáûÝûÝý×AÀ×AÀÑAÀÏEÀËCÀÉGÀÃGÀÁGÀ;PM1PEÞ¿ÂGÀÆEÀÈEÀÎCÀÎCÀÒAÀÖýÚ?ÀÜýÞûàùæ÷æõêóêñðïðïòéôéöåøåúßüÝþÛ@ÀÙþÕBÀÑDÀÍDÀÍFÀÇFÀÅHÀÁFÀÂHÀÆDÀÈFÀÎBÀÎBÀÒ@ÀÖ@ÀÚüÜüÞúàøæöæöêòêððîðìòèôèöäøàúàüÜþØ@ÀÖþÔBÀÎDÀÎDÀÈFÀÄFÀÂHÀÁFÀÃFÀÇFÀÍDÀÍDÀÓBÀÕ@À×@ÀÛüßüßúãøçöçöëòíðïîñìõèõæ÷æùàûàûÜ?ÀØ?ÀÖAÀÔAÀÎEÀÌCÀÊGÀÄEÀÂGÀÁEÀÃEÀÉCÀËCÀÍAÀÓýÕ?À×ýÛûßùß÷åõåóçñëïíïïéñéõåõå÷ßùÝûÛûÙ?ÀÕ?ÀÑAÀÍCÀÍCÀÇEÀÅEÀÁEÀ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<ObÀ_GÀ;PM0PEÂGÀÆEÀÈEÀÎCÀÎCÀÒAÀÖýÚ?ÀÜýÞûàùæ÷æõêóêñðïðïòéôéöåøåúßüÝþÛ@ÀÙþÕBÀÑDÀÍDÀÍFÀÇFÀÅHÀÁFÀÂHÀÆDÀÈFÀÎBÀÎBÀÒ@ÀÖ@ÀÚüÜüÞúàøæöæöêòêððîðìòèôèöäøàúàüÜþØ@ÀÖþÔBÀÎDÀÎDÀÈFÀÄFÀÂHÀÁFÀÃFÀÇFÀÍDÀÍDÀÓBÀÕ@À×@ÀÛüßüßúãøçöçöëòíðïîñìõèõæ÷æùàûàûÜ?ÀØ?ÀÖAÀÔAÀÎEÀÌCÀÊGÀÄEÀÂGÀÁEÀÃEÀÉCÀËCÀÍAÀÓýÕ?À×ýÛûßùß÷åõåóçñëïíïïéñéõåõå÷ßùÝûÛûÙ?ÀÕ?ÀÑAÀÍCÀÍCÀÇEÀÅEÀÁEÀ;PM1PEÞ¿ÂEÀÆEÀÈCÀÌAÀÐAÀÒ?ÀÖ?ÀØûÚûÞûâ÷âõæõèóìïìïðëðëôçöåöáøáüÝüÙü×@ÀÕBÀÑ@ÀÏDÀËBÀÇFÀÅFÀÁFÀÂDÀÆDÀÈDÀÌ@ÀÐ@ÀÒ@ÀÖþØüÚúÞøâøâôæôèòìîìîðìðæôèöâöàøÞüÜüØüÖ@ÀÒ@ÀÐBÀÌBÀÈDÀÆFÀ¿FÀ¿DÀÅFÀÇDÀËBÀÏBÀÑ@ÀÕ@À×þÛüÝúßøáøçôåôëòíîíîñêóèóæ÷ä÷àùÞûÜýØ?ÀÖ?ÀÒ?ÀÎCÀÌCÀÊCÀÆEÀ¿EÀ¿EÀÅAÀÉCÀË?ÀÍAÀÑ?ÀÕû×ûÛûÝ÷ßõãõåóçïéïíëíëñçóåóá÷á÷ÝùÙû×ýÕ?ÀÑ?ÀÏAÀËAÀÇCÀÅEÀÁCÀ;PM1PE;PM2FPPE=<qaÀ_GÀ;PM0PEÂEÀÆEÀÈCÀÌAÀÐAÀÒ?ÀÖ?ÀØûÚûÞûâ÷âõæõèóìïìïðëðëôçöåöáøáüÝüÙü×@ÀÕBÀÑ@ÀÏDÀËBÀÇFÀÅFÀÁFÀÂDÀÆDÀÈDÀÌ@ÀÐ@ÀÒ@ÀÖþØüÚúÞøâøâôæôèòìîìîðìðæôèöâöàøÞüÜüØüÖ@ÀÒ@ÀÐBÀÌBÀÈDÀÆFÀ¿FÀ¿DÀÅFÀÇDÀËBÀÏBÀÑ@ÀÕ@À×þÛüÝúßøáøçôåôëòíîíîñêóèóæ÷ä÷àùÞûÜýØ?ÀÖ?ÀÒ?ÀÎCÀÌCÀÊCÀÆEÀ¿EÀ¿EÀÅAÀÉCÀË?ÀÍAÀÑ?ÀÕû×ûÛûÝ÷ßõãõåóçïéïíëíëñçóåóá÷á÷ÝùÙû×ýÕ?ÀÑ?ÀÏAÀËAÀÇCÀÅEÀÁCÀ;PM1PEà¿¿EÀÆAÀÊAÀÊAÀÐ?ÀÒýÔýØûÚûÞ÷à÷âõæóæñêïìíîëðéòåôåöáøßøÝüÙü×þÓþÑ@ÀÏBÀÉBÀÉDÀÅDÀ¿DÀ¿DÀÆBÀÊBÀÊþÐ@ÀÒþÔüØúÚúÞøàöâòæôæðêììîîêðæòäôäöàøÜøÜüØüÔþÒþÐ@ÀÊBÀÈBÀÆBÀÂFÀÁDÀÅBÀÇBÀÉBÀÏ@ÀÑþÓ@À×üÛúÛúßöãöãôåòéðíîëìïêóèñäõä÷àùÜùÚûØýÖ?ÀÒýÎAÀÌAÀÈCÀÆCÀÂCÀÁCÀÅAÀÇAÀË?ÀÍýÑýÕû×ûÙ÷Û÷ßõãóãñçïéíëëíéïåñåóáõßõÝùÙù×ûÓ?ÀÑýÏ?ÀÉAÀÉAÀÅAÀ¿CÀ;PM1PE;PM2FPPE=<QaÀ_GÀ;PM0PE¿EÀÆAÀÊAÀÊAÀÐ?ÀÒýÔýØûÚûÞ÷à÷âõæóæñêïìíîëðéòåôåöáøßøÝüÙü×þÓþÑ@ÀÏBÀÉBÀÉDÀÅDÀ¿DÀ¿DÀÆBÀÊBÀÊþÐ@ÀÒþÔüØúÚúÞøàöâòæôæðêììîîêðæòäôäöàøÜøÜüØüÔþÒþÐ@ÀÊBÀÈBÀÆBÀÂFÀÁDÀÅBÀÇBÀÉBÀÏ@ÀÑþÓ@À×üÛúÛúßöãöãôåòéðíîëìïêóèñäõä÷àùÜùÚûØýÖ?ÀÒýÎAÀÌAÀÈCÀÆCÀÂCÀÁCÀÅAÀÇAÀË?ÀÍýÑýÕû×ûÙ÷Û÷ßõãóãñçïéíëëíéïåñåóáõßõÝùÙù×ûÓ?ÀÑýÏ?ÀÉAÀÉAÀÅAÀ¿CÀ;PM1PEÞ¿ÈCÁÔAÁà{ÀêuÀöqÀBÀiÀLÀcÀRÀ[À\ÀQÀdÀKÀjÀAÀrÀõvÀé~Àß@ÁÓDÁÇDÁÈ@ÁÔ|ÀàxÀêpÀölÀBÀbÀLÀ^ÀRÀRÀ\ÀJÀdÀBÀjÀörÀìvÀà|ÀÔBÁÆDÁÅDÁÓ@Áß|ÀëxÀõpÀAÀjÀIÀdÀQÀ\À]ÀTÀaÀJÀkÀBÀoÀöwÀì{Àà?ÁÒCÁÈCÁÇ?ÁÑ}ÀßuÀëqÀõiÀAÀcÀIÀ[ÀSÀQÀ[ÀKÀcÀAÀiÀõoÀéwÀß{ÀÓ?ÁÇCÁ;PM1PE;PM2FPPE=<s`À_GÀ;PM0PEÈCÁÔAÁà{ÀêuÀöqÀBÀiÀLÀcÀRÀ[À\ÀQÀdÀKÀjÀAÀrÀõvÀé~Àß@ÁÓDÁÇDÁÈ@ÁÔ|ÀàxÀêpÀölÀBÀbÀLÀ^ÀRÀRÀ\ÀJÀdÀBÀjÀörÀìvÀà|ÀÔBÁÆDÁÅDÁÓ@Áß|ÀëxÀõpÀAÀjÀIÀdÀQÀ\À]ÀTÀaÀJÀkÀBÀoÀöwÀì{Àà?ÁÒCÁÈCÁÇ?ÁÑ}ÀßuÀëqÀõiÀAÀcÀIÀ[ÀSÀQÀ[ÀKÀcÀAÀiÀõoÀéwÀß{ÀÓ?ÁÇCÁ;PM1PEÞ¿ÆAÁÔ}ÀàwÀêsÀömÀþiÀJÀ_ÀRÀYÀZÀQÀ`ÀIÀjÀýnÀõtÀézÀß|ÀÓBÁÅBÁÆ|ÀÔzÀàtÀênÀöhÀþbÀJÀZÀRÀRÀZÀHÀ`À@ÀjÀônÀìtÀàxÀÒ~ÀÆBÁÅ@ÁÑ~ÀßxÀëvÀónÀ?ÀhÀGÀbÀQÀZÀYÀPÀaÀJÀgÀ@ÀmÀôsÀìyÀÞ{ÀÔAÁÆAÁÅ{ÀÓyÀÝsÀëmÀóiÀ?À_ÀIÀYÀOÀQÀYÀIÀaÀýgÀõmÀéuÀßwÀÓ}ÀÅ?Á;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<U`À_GÀ;PM0PEÆAÁÔ}ÀàwÀêsÀömÀþiÀJÀ_ÀRÀYÀZÀQÀ`ÀIÀjÀýnÀõtÀézÀß|ÀÓBÁÅBÁÆ|ÀÔzÀàtÀênÀöhÀþbÀJÀZÀRÀRÀZÀHÀ`À@ÀjÀônÀìtÀàxÀÒ~ÀÆBÁÅ@ÁÑ~ÀßxÀëvÀónÀ?ÀhÀGÀbÀQÀZÀYÀPÀaÀJÀgÀ@ÀmÀôsÀìyÀÞ{ÀÔAÁÆAÁÅ{ÀÓyÀÝsÀëmÀóiÀ?À_ÀIÀYÀOÀQÀYÀIÀaÀýgÀõmÀéuÀßwÀÓ}ÀÅ?Á;PM1PEà¿Æ}ÀÔ{ÀÞsÀêqÀòkÀ@ÀeÀFÀ_ÀPÀUÀVÀOÀ`ÀEÀfÀ?ÀlÀñrÀévÀÝzÀÓ~ÀÅ~ÀÆzÀÔvÀÞrÀêlÀòdÀ@À`ÀFÀXÀPÀPÀVÀFÀ`ÀþfÀôlÀêrÀÞtÀÔ|ÀÆ~ÀÅ~ÀÓzÀÝvÀérÀólÀýdÀEÀ`ÀOÀXÀWÀNÀ_ÀHÀcÀþkÀôqÀêuÀÞyÀÒ}ÀÆ}ÀÅyÀÑuÀÝqÀékÀóeÀý_ÀGÀUÀMÀOÀWÀEÀ_À?ÀcÀñkÀéqÀÝuÀÓyÀÅ}À;PM1PE;PM2FPPE=<u_À_GÀ;PM0PEÆ}ÀÔ{ÀÞsÀêqÀòkÀ@ÀeÀFÀ_ÀPÀUÀVÀOÀ`ÀEÀfÀ?ÀlÀñrÀévÀÝzÀÓ~ÀÅ~ÀÆzÀÔvÀÞrÀêlÀòdÀ@À`ÀFÀXÀPÀPÀVÀFÀ`ÀþfÀôlÀêrÀÞtÀÔ|ÀÆ~ÀÅ~ÀÓzÀÝvÀérÀólÀýdÀEÀ`ÀOÀXÀWÀNÀ_ÀHÀcÀþkÀôqÀêuÀÞyÀÒ}ÀÆ}ÀÅyÀÑuÀÝqÀékÀóeÀý_ÀGÀUÀMÀOÀWÀEÀ_À?ÀcÀñkÀéqÀÝuÀÓyÀÅ}À;PM1PEà¿Æ{ÀÒwÀÞqÀèmÀògÀücÀFÀ[ÀNÀUÀVÀMÀ\ÀEÀdÀûhÀñnÀçtÀÝxÀÑzÀÅzÀÆxÀÒtÀÞnÀèhÀòdÀü\ÀFÀVÀNÀNÀVÀDÀ\ÀüdÀôhÀènÀÞrÀÒxÀÆ|ÀÅzÀÑxÀÝrÀçpÀóhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀcÀügÀòmÀêsÀÞwÀÒyÀÆyÀÅwÀÑsÀÝmÀégÀñcÀû[ÀEÀUÀMÀMÀSÀEÀ[ÀûcÀñgÀçoÀÝqÀÑwÀÅyÀ;PM1PE;PM2FPPE=<U_À_GÀ;PM0PEÆ{ÀÒwÀÞqÀèmÀògÀücÀFÀ[ÀNÀUÀVÀMÀ\ÀEÀdÀûhÀñnÀçtÀÝxÀÑzÀÅzÀÆxÀÒtÀÞnÀèhÀòdÀü\ÀFÀVÀNÀNÀVÀDÀ\ÀüdÀôhÀènÀÞrÀÒxÀÆ|ÀÅzÀÑxÀÝrÀçpÀóhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀcÀügÀòmÀêsÀÞwÀÒyÀÆyÀÅwÀÑsÀÝmÀégÀñcÀû[ÀEÀUÀMÀMÀSÀEÀ[ÀûcÀñgÀçoÀÝqÀÑwÀÅyÀ;PM1PEÞ¿ÆwÀÒuÀÜmÀèkÀðeÀüaÀBÀYÀLÀSÀTÀKÀZÀAÀbÀûfÀïlÀçpÀÛtÀÑxÀÅxÀÆtÀÒpÀÜlÀèfÀð`ÀüZÀBÀTÀLÀLÀTÀDÀZÀúbÀòfÀèlÀÜnÀÒvÀÆxÀÅxÀÑtÀÛpÀçlÀñfÀù`ÀCÀZÀKÀTÀSÀLÀYÀDÀ_ÀúeÀòkÀæoÀÞsÀÒwÀÆwÀÅsÀÑoÀÝkÀåeÀñaÀùYÀCÀSÀKÀKÀSÀAÀYÀû_ÀïeÀçkÀÛoÀÑsÀÅwÀ;PM1PE;PM2FPPE=<w^À_GÀ;PM0PEÆwÀÒuÀÜmÀèkÀðeÀüaÀBÀYÀLÀSÀTÀKÀZÀAÀbÀûfÀïlÀçpÀÛtÀÑxÀÅxÀÆtÀÒpÀÜlÀèfÀð`ÀüZÀBÀTÀLÀLÀTÀDÀZÀúbÀòfÀèlÀÜnÀÒvÀÆxÀÅxÀÑtÀÛpÀçlÀñfÀù`ÀCÀZÀKÀTÀSÀLÀYÀDÀ_ÀúeÀòkÀæoÀÞsÀÒwÀÆwÀÅsÀÑoÀÝkÀåeÀñaÀùYÀCÀSÀKÀKÀSÀAÀYÀû_ÀïeÀçkÀÛoÀÑsÀÅwÀ;PM1PEÞ¿ÆuÀÒqÀÜkÀægÀðcÀø]ÀBÀWÀLÀOÀPÀKÀXÀAÀ^À÷dÀïhÀånÀÛrÀÑtÀÅtÀÆrÀÒnÀÜhÀædÀð^ÀøXÀBÀPÀLÀJÀPÀBÀXÀø^ÀðdÀèhÀÜlÀÐrÀÆvÀÅtÀÏrÀÛlÀçjÀïbÀ÷`ÀAÀXÀIÀPÀOÀJÀWÀBÀ]ÀøcÀðgÀæmÀÞqÀÐsÀÆsÀÅqÀÏmÀÝgÀåcÀï]À÷WÀAÀOÀIÀKÀOÀAÀWÀ÷_ÀïaÀåiÀÛkÀÑqÀÅsÀ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<Y^À_GÀ;PM0PEÆuÀÒqÀÜkÀægÀðcÀø]ÀBÀWÀLÀOÀPÀKÀXÀAÀ^À÷dÀïhÀånÀÛrÀÑtÀÅtÀÆrÀÒnÀÜhÀædÀð^ÀøXÀBÀPÀLÀJÀPÀBÀXÀø^ÀðdÀèhÀÜlÀÐrÀÆvÀÅtÀÏrÀÛlÀçjÀïbÀ÷`ÀAÀXÀIÀPÀOÀJÀWÀBÀ]ÀøcÀðgÀæmÀÞqÀÐsÀÆsÀÅqÀÏmÀÝgÀåcÀï]À÷WÀAÀOÀIÀKÀOÀAÀWÀ÷_ÀïaÀåiÀÛkÀÑqÀÅsÀ;PM1PEà¿ÆqÀÐmÀÜiÀæeÀîaÀøYÀ@ÀUÀFÀOÀPÀEÀVÀ?ÀZÀ÷bÀífÀåjÀÛnÀÏrÀÅpÀÆnÀÐlÀÜfÀæ`Àî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀøZÀîbÀæfÀÚjÀÒnÀÆrÀÅpÀÑnÀÙlÀåfÀí`À÷\À?ÀTÀGÀPÀMÀFÀUÀBÀ[Àö_ÀðeÀäkÀÜmÀÒoÀÆqÀÅmÀÑiÀÛeÀãaÀïYÀõUÀAÀOÀEÀEÀOÀ?ÀSÀ÷[Àí_ÀåeÀÛkÀÏmÀÅoÀ;PM1PE;PM2FPPE=<y]À_GÀ;PM0PEÆqÀÐmÀÜiÀæeÀîaÀøYÀ@ÀUÀFÀOÀPÀEÀVÀ?ÀZÀ÷bÀífÀåjÀÛnÀÏrÀÅpÀÆnÀÐlÀÜfÀæ`Àî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀøZÀîbÀæfÀÚjÀÒnÀÆrÀÅpÀÑnÀÙlÀåfÀí`À÷\À?ÀTÀGÀPÀMÀFÀUÀBÀ[Àö_ÀðeÀäkÀÜmÀÒoÀÆqÀÅmÀÑiÀÛeÀãaÀïYÀõUÀAÀOÀEÀEÀOÀ?ÀSÀ÷[Àí_ÀåeÀÛkÀÏmÀÅoÀ;PM1PEÞ¿ÆoÀÐiÀÚgÀäaÀî_ÀöWÀþQÀFÀMÀNÀEÀRÀýXÀõ`ÀíbÀãhÀÙlÀÏnÀÅnÀÆjÀÐjÀÚbÀä^ÀîZÀöRÀþLÀFÀFÀNÀþRÀöXÀî`ÀæbÀÚhÀÐjÀÆpÀÅnÀÏjÀÙhÀådÀí^ÀõXÀýTÀEÀLÀKÀFÀQÀþYÀö]ÀîaÀæiÀÚiÀÐmÀÆmÀÅkÀÏgÀÙaÀå_ÀíWÀõQÀýMÀEÀEÀKÀýSÀõWÀí]ÀãcÀÙgÀÏiÀÅmÀ;PM1PE;PM2FPPE=<[]À_GÀ;PM0PEÆoÀÐiÀÚgÀäaÀî_ÀöWÀþQÀFÀMÀNÀEÀRÀýXÀõ`ÀíbÀãhÀÙlÀÏnÀÅnÀÆjÀÐjÀÚbÀä^ÀîZÀöRÀþLÀFÀFÀNÀþRÀöXÀî`ÀæbÀÚhÀÐjÀÆpÀÅnÀÏjÀÙhÀådÀí^ÀõXÀýTÀEÀLÀKÀFÀQÀþYÀö]ÀîaÀæiÀÚiÀÐmÀÆmÀÅkÀÏgÀÙaÀå_ÀíWÀõQÀýMÀEÀEÀKÀýSÀõWÀí]ÀãcÀÙgÀÏiÀÅmÀ;PM1PEÞ¿ÆkÀÐgÀÚcÀä_Àì[ÀôUÀüQÀDÀIÀJÀCÀRÀûVÀó\Àë`ÀãdÀÙhÀÏlÀÅjÀÆhÀÐfÀÚ`ÀäZÀìXÀôPÀüLÀDÀBÀJÀþRÀôVÀì\Àä`ÀØdÀÐhÀÆlÀÅjÀÏhÀ×fÀã`ÀëZÀóVÀýRÀAÀJÀKÀDÀOÀþWÀòYÀî_ÀäeÀØgÀÐiÀÆkÀÅgÀÏcÀ×_Àã[ÀíUÀñQÀýIÀCÀCÀIÀûQÀóUÀëYÀã_ÀÙeÀÏgÀÅiÀ;PM1PE;PM2FPPE=<}\À_GÀ;PM0PEÆkÀÐgÀÚcÀä_Àì[ÀôUÀüQÀDÀIÀJÀCÀRÀûVÀó\Àë`ÀãdÀÙhÀÏlÀÅjÀÆhÀÐfÀÚ`ÀäZÀìXÀôPÀüLÀDÀBÀJÀþRÀôVÀì\Àä`ÀØdÀÐhÀÆlÀÅjÀÏhÀ×fÀã`ÀëZÀóVÀýRÀAÀJÀKÀDÀOÀþWÀòYÀî_ÀäeÀØgÀÐiÀÆkÀÅgÀÏcÀ×_Àã[ÀíUÀñQÀýIÀCÀCÀIÀûQÀóUÀëYÀã_ÀÙeÀÏgÀÅiÀ;PM1PEà¿ÄiÀÐcÀÚaÀâ[ÀêYÀôSÀúMÀBÀGÀHÀAÀNÀùTÀóZÀé^Àá`ÀÙfÀÏhÀÃhÀÄdÀÐbÀÚ^ÀâXÀêTÀôNÀúHÀBÀBÀHÀüNÀòTÀêZÀä\ÀØbÀÐdÀÆjÀÅhÀÏdÀ×bÀã^ÀéXÀñTÀûNÀAÀHÀGÀBÀMÀúSÀôWÀê]ÀäaÀØcÀÐgÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóMÀùGÀAÀAÀGÀùMÀóSÀéWÀá]ÀÙaÀÏcÀÃgÀ;PM1PE;PM2FPPE=<]\À_GÀ;PM0PEÄiÀÐcÀÚaÀâ[ÀêYÀôSÀúMÀBÀGÀHÀAÀNÀùTÀóZÀé^Àá`ÀÙfÀÏhÀÃhÀÄdÀÐbÀÚ^ÀâXÀêTÀôNÀúHÀBÀBÀHÀüNÀòTÀêZÀä\ÀØbÀÐdÀÆjÀÅhÀÏdÀ×bÀã^ÀéXÀñTÀûNÀAÀHÀGÀBÀMÀúSÀôWÀê]ÀäaÀØcÀÐgÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóMÀùGÀAÀAÀGÀùMÀóSÀéWÀá]ÀÙaÀÏcÀÃgÀ;PM1PEà¿ÄeÀÐ_ÀØ_ÀâYÀèUÀòQÀøIÀ@ÀGÀHÀ?ÀJÀ÷RÀñVÀçZÀá`À×`ÀÏfÀÃdÀÄbÀÐ^ÀØ\ÀâTÀèRÀòLÀøFÀ@À@ÀHÀøJÀôRÀèVÀâZÀØ`ÀÐ`ÀÄfÀÃdÀÏbÀ×^Àá\ÀçTÀóRÀ÷LÀ?ÀFÀEÀ@ÀKÀøQÀòSÀê[Àâ]ÀØaÀÎcÀÆeÀÅ_ÀÍ_À×YÀáUÀéQÀñIÀ÷GÀ?À?ÀEÀ÷KÀñQÀçSÀá[À×]ÀÏaÀÃcÀ;PM1PE;PM2FPPE=<}[À_GÀ;PM0PEÄeÀÐ_ÀØ_ÀâYÀèUÀòQÀøIÀ@ÀGÀHÀ?ÀJÀ÷RÀñVÀçZÀá`À×`ÀÏfÀÃdÀÄbÀÐ^ÀØ\ÀâTÀèRÀòLÀøFÀ@À@ÀHÀøJÀôRÀèVÀâZÀØ`ÀÐ`ÀÄfÀÃdÀÏbÀ×^Àá\ÀçTÀóRÀ÷LÀ?ÀFÀEÀ@ÀKÀøQÀòSÀê[Àâ]ÀØaÀÎcÀÆeÀÅ_ÀÍ_À×YÀáUÀéQÀñIÀ÷GÀ?À?ÀEÀ÷KÀñQÀçSÀá[À×]ÀÏaÀÃcÀ;PM1PEÞ¿ÄaÀÎ_ÀØ[ÀàUÀèSÀðOÀøGÀüEÀFÀûHÀ÷PÀïTÀçXÀßZÀ×`ÀÍbÀÃ`ÀÄ`ÀÎ\ÀØXÀàTÀèNÀðJÀøDÀüþFÀöHÀðPÀèTÀàVÀØ\ÀÐ`ÀÄbÀÃ`ÀÏ`À×\ÀßXÀçTÀïNÀõJÀýBÀCÀ@ÀIÀöMÀðSÀèWÀà[ÀØ_ÀÎ_ÀÆaÀÅ_ÀÍYÀ×WÀßSÀçOÀïGÀõEÀ?ÀûAÀ÷IÀïMÀçSÀßWÀ×[ÀÍ_ÀÃ_À;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<_[À_GÀ;PM0PEÄaÀÎ_ÀØ[ÀàUÀèSÀðOÀøGÀüEÀFÀûHÀ÷PÀïTÀçXÀßZÀ×`ÀÍbÀÃ`ÀÄ`ÀÎ\ÀØXÀàTÀèNÀðJÀøDÀüþFÀöHÀðPÀèTÀàVÀØ\ÀÐ`ÀÄbÀÃ`ÀÏ`À×\ÀßXÀçTÀïNÀõJÀýBÀCÀ@ÀIÀöMÀðSÀèWÀà[ÀØ_ÀÎ_ÀÆaÀÅ_ÀÍYÀ×WÀßSÀçOÀïGÀõEÀ?ÀûAÀ÷IÀïMÀçSÀßWÀ×[ÀÍ_ÀÃ_À;PM1PEÞ¿Æ_ÀÎYÀÖYÀàSÀæOÀîMÀöEÀüAÀBÀûFÀõNÀíPÀåTÀßZÀÕZÀÍ`ÀÅ^ÀÆ\ÀÎXÀÖVÀàPÀæLÀîHÀöBÀüüBÀôFÀðNÀæPÀÞTÀØZÀÎZÀÄ`ÀÃ^ÀÍ\À×XÀÝVÀåPÀïLÀóHÀûBÀAÀüGÀôKÀîOÀèUÀÞWÀØ[ÀÎ]ÀÄ_ÀÃYÀÍYÀ×SÀÝOÀçMÀíEÀóAÀûûAÀõGÀíKÀåOÀßUÀÕWÀÍ[ÀÅ]À;PM1PE;PM2FPPE=<A[À_GÀ;PM0PEÆ_ÀÎYÀÖYÀàSÀæOÀîMÀöEÀüAÀBÀûFÀõNÀíPÀåTÀßZÀÕZÀÍ`ÀÅ^ÀÆ\ÀÎXÀÖVÀàPÀæLÀîHÀöBÀüüBÀôFÀðNÀæPÀÞTÀØZÀÎZÀÄ`ÀÃ^ÀÍ\À×XÀÝVÀåPÀïLÀóHÀûBÀAÀüGÀôKÀîOÀèUÀÞWÀØ[ÀÎ]ÀÄ_ÀÃYÀÍYÀ×SÀÝOÀçMÀíEÀóAÀûûAÀõGÀíKÀåOÀßUÀÕWÀÍ[ÀÅ]À;PM1PEà¿Ä[ÀÎWÀÖUÀÞQÀæMÀìIÀôEÀúýþùFÀóJÀëNÀåRÀÝVÀÕXÀÍ\ÀÃZÀÄZÀÎTÀÖTÀÞNÀæHÀìFÀô@ÀúúþôFÀìJÀäNÀÞRÀØVÀÌXÀÆ\ÀÅZÀËZÀ×TÀÝTÀãNÀëHÀóFÀù@À?ÀúEÀòGÀîMÀäSÀÞSÀØYÀÌYÀÆ[ÀÅWÀËUÀ×QÀÝMÀãIÀíEÀñýùù?ÀóEÀëGÀåMÀÝSÀÕSÀÍYÀÃYÀ;PM1PE;PM2FPPE=<aZÀ_GÀ;PM0PEÄ[ÀÎWÀÖUÀÞQÀæMÀìIÀôEÀúýþùFÀóJÀëNÀåRÀÝVÀÕXÀÍ\ÀÃZÀÄZÀÎTÀÖTÀÞNÀæHÀìFÀô@ÀúúþôFÀìJÀäNÀÞRÀØVÀÌXÀÆ\ÀÅZÀËZÀ×TÀÝTÀãNÀëHÀóFÀù@À?ÀúEÀòGÀîMÀäSÀÞSÀØYÀÌYÀÆ[ÀÅWÀËUÀ×QÀÝMÀãIÀíEÀñýùù?ÀóEÀëGÀåMÀÝSÀÕSÀÍYÀÃYÀ;PM1PEÞ¿ÄYÀÎSÀÔSÀÞMÀäKÀìEÀòCÀöýþõDÀñFÀëLÀãNÀÝTÀÓTÀÍZÀÃXÀÄVÀÎRÀÔPÀÞLÀäFÀìDÀòüöøþòDÀìFÀäLÀÞNÀÔTÀÌTÀÆZÀÅXÀËVÀÓRÀÝPÀãJÀëHÀñBÀ÷þûøCÀòEÀêKÀäOÀÞQÀÖUÀÌWÀÆYÀÅSÀËSÀÕMÀÝKÀãEÀéCÀñý÷õýñAÀëGÀãIÀÝOÀÓQÀÍUÀÃWÀ;PM1PE;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<CZÀ_GÀ;PM0PEÄYÀÎSÀÔSÀÞMÀäKÀìEÀòCÀöýþõDÀñFÀëLÀãNÀÝTÀÓTÀÍZÀÃXÀÄVÀÎRÀÔPÀÞLÀäFÀìDÀòüöøþòDÀìFÀäLÀÞNÀÔTÀÌTÀÆZÀÅXÀËVÀÓRÀÝPÀãJÀëHÀñBÀ÷þûøCÀòEÀêKÀäOÀÞQÀÖUÀÌWÀÆYÀÅSÀËSÀÕMÀÝKÀãEÀéCÀñý÷õýñAÀëGÀãIÀÝOÀÓQÀÍUÀÃWÀ;PM1PEÞ¿ÆUÀÌQÀÔOÀÜKÀäIÀêCÀð?Àôûüó@ÀïDÀéJÀãLÀÛPÀÓRÀËVÀÅTÀÆTÀÌNÀÔNÀÜHÀäFÀêþðüôöüð@ÀêDÀâJÀÞLÀÔPÀÌRÀÄVÀÃTÀËTÀÓNÀÝNÀáHÀéDÀï@ÀõüûöýðEÀêGÀâMÀÜMÀÖSÀÌSÀÄUÀÃQÀËOÀÕKÀÛIÀáCÀé?Àïûõóûï?ÀéCÀãGÀÛMÀÓMÀËSÀÅSÀ;PM1PE;PM2FPPE=<eYÀ_GÀ;PM0PEÆUÀÌQÀÔOÀÜKÀäIÀêCÀð?Àôûüó@ÀïDÀéJÀãLÀÛPÀÓRÀËVÀÅTÀÆTÀÌNÀÔNÀÜHÀäFÀêþðüôöüð@ÀêDÀâJÀÞLÀÔPÀÌRÀÄVÀÃTÀËTÀÓNÀÝNÀáHÀéDÀï@ÀõüûöýðEÀêGÀâMÀÜMÀÖSÀÌSÀÄUÀÃQÀËOÀÕKÀÛIÀáCÀé?Àïûõóûï?ÀéCÀãGÀÛMÀÓMÀËSÀÅSÀ;PM1PEà¿ÄQÀÌOÀÔKÀÜIÀâEÀæAÀðýô÷øóþïBÀåFÀáJÀÛLÀÓPÀËRÀÃRÀÄNÀÌNÀÔJÀÜFÀâBÀæþðøôôøîþèBÀâFÀÜJÀÒLÀÎPÀÄRÀÃPÀÍPÀÑLÀÛLÀáDÀçBÀí@Àóø÷ôýîAÀèEÀâIÀÚMÀÔMÀÎQÀÂQÀÁOÀÍKÀÓIÀÙEÀáAÀçýí÷óó÷ï?ÀåAÀáCÀÛKÀÓKÀËOÀÃOÀ;PM1PE;PM2FPPE=<EYÀ_GÀ;PM0PEÄQÀÌOÀÔKÀÜIÀâEÀæAÀðýô÷øóþïBÀåFÀáJÀÛLÀÓPÀËRÀÃRÀÄNÀÌNÀÔJÀÜFÀâBÀæþðøôôøîþèBÀâFÀÜJÀÒLÀÎPÀÄRÀÃPÀÍPÀÑLÀÛLÀáDÀçBÀí@Àóø÷ôýîAÀèEÀâIÀÚMÀÔMÀÎQÀÂQÀÁOÀÍKÀÓIÀÙEÀáAÀçýí÷óó÷ï?ÀåAÀáCÀÛKÀÓKÀËOÀÃOÀ;PM1PEÞ¿ÄOÀÌKÀÒIÀÜEÀàCÀæ?Àìûòõöñüë@ÀåDÀßFÀÛJÀÑLÀËPÀÃNÀÄNÀÌHÀÒHÀÜBÀà@Àæüìøòðöîüæ@ÀàDÀÚFÀÔJÀÌLÀÄPÀÃNÀËNÀÓHÀÙHÀßBÀå@Àíüïø÷ðûì?ÀèAÀàGÀÚGÀÔMÀÌMÀÂOÀÁKÀËIÀÓEÀÙCÀß?Àçûëõïñ÷ëûå?ÀßAÀÛGÀÑGÀËMÀÃMÀ;PM1PE;PM2FPPE=<gXÀ_GÀ;PM0PEÄOÀÌKÀÒIÀÜEÀàCÀæ?Àìûòõöñüë@ÀåDÀßFÀÛJÀÑLÀËPÀÃNÀÄNÀÌHÀÒHÀÜBÀà@Àæüìøòðöîüæ@ÀàDÀÚFÀÔJÀÌLÀÄPÀÃNÀËNÀÓHÀÙHÀßBÀå@Àíüïø÷ðûì?ÀèAÀàGÀÚGÀÔMÀÌMÀÂOÀÁKÀËIÀÓEÀÙCÀß?Àçûëõïñ÷ëûå?ÀßAÀÛGÀÑGÀËMÀÃMÀ;PM1PEà¿ÂKÀÌIÀÒEÀÚCÀàAÀäûê÷ðõöïøéüãBÀßDÀÙFÀÑJÀËLÀÁLÀÂHÀÌHÀÒDÀÚ@ÀàþäøêôððöêøæüàBÀØDÀÒFÀÌJÀÄLÀÃJÀËJÀÑFÀ×FÀß@Àåþéøïôóð÷êýæ?ÀÞCÀÚGÀÒGÀÌKÀÄKÀÃIÀËEÀÑCÀÙAÀÝûå÷éõïïóé÷ãýß?ÀÙEÀÑEÀËIÀÁIÀ;PM1PE;PM2FPPE=<GXÀ_GÀ;PM0PEÂKÀÌIÀÒEÀÚCÀàAÀäûê÷ðõöïøéüãBÀßDÀÙFÀÑJÀËLÀÁLÀÂHÀÌHÀÒDÀÚ@ÀàþäøêôððöêøæüàBÀØDÀÒFÀÌJÀÄLÀÃJÀËJÀÑFÀ×FÀß@Àåþéøïôóð÷êýæ?ÀÞCÀÚGÀÒGÀÌKÀÄKÀÃIÀËEÀÑCÀÙAÀÝûå÷éõïïóé÷ãýß?ÀÙEÀÑEÀËIÀÁIÀ;PM1PEÞ¿ÄGÀÊGÀÒCÀØ?ÀÞ?Àä÷è÷îñòíøçúãþÝ@À×DÀÑHÀÉHÀÃHÀÄFÀÊDÀÒBÀØþÞúäöèôîìòêøäøÜ@ÀØ@ÀÒDÀÌHÀÂHÀÁHÀËFÀÑDÀ×BÀÛþãúéöëòóîõêùäýÜAÀØCÀÒEÀÊGÀÄGÀÃGÀÉCÀÑ?À×ýÛùã÷éñííñçõãùÝý×AÀÑCÀÉEÀÃGÀ;PM1PE;PM2RF4,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<iWÀ_GÀ;PM0PEÄGÀÊGÀÒCÀØ?ÀÞ?Àä÷è÷îñòíøçúãþÝ@À×DÀÑHÀÉHÀÃHÀÄFÀÊDÀÒBÀØþÞúäöèôîìòêøäøÜ@ÀØ@ÀÒDÀÌHÀÂHÀÁHÀËFÀÑDÀ×BÀÛþãúéöëòóîõêùäýÜAÀØCÀÒEÀÊGÀÄGÀÃGÀÉCÀÑ?À×ýÛùã÷éñííñçõãùÝý×AÀÑCÀÉEÀÃGÀ;PM1PEÞ¿ÄEÀÊCÀÐ?ÀØýÜûâ÷èóìïðëôçøáüÛþ×@ÀÏDÀÉFÀÃFÀÄBÀÊBÀÐþØüÜöâöèðììðæôäøÚüØþÐ@ÀÌDÀÂFÀÁDÀËDÀÏ@À×@ÀÙüãöåöëðïìõæõâûÜýØAÀÐAÀÊEÀÄEÀÃCÀÉ?ÀÏý×ûÛ÷áóåïëëïçõáõÛû×?ÀÏ?ÀÉCÀÃCÀ;PM1PE;PM2FPPE=<KWÀ_GÀ;PM0PEÄEÀÊCÀÐ?ÀØýÜûâ÷èóìïðëôçøáüÛþ×@ÀÏDÀÉFÀÃFÀÄBÀÊBÀÐþØüÜöâöèðììðæôäøÚüØþÐ@ÀÌDÀÂFÀÁDÀËDÀÏ@À×@ÀÙüãöåöëðïìõæõâûÜýØAÀÐAÀÊEÀÄEÀÃCÀÉ?ÀÏý×ûÛ÷áóåïëëïçõáõÛû×?ÀÏ?ÀÉCÀÃCÀ;PM1PEà¿ÄAÀÈAÀÐûÖûÜùàõæïêíîéòåößøÛüÕüÏBÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜöàòæîêêîæðàöÜúÔüÐüÊBÀÄBÀÃBÀÉ@ÀÏþÓüÛøßöåðéðíêñäõâ÷ÚûÖýÐ?ÀÊAÀÄAÀÃAÀÉûÏûÕ÷ÙõáñãíééïåïßõÛ÷ÕûÏýÇ?ÀÃAÀ;PM1PE;PM2FPPE=<kVÀ_GÀ;PM0PEÄAÀÈAÀÐûÖûÜùàõæïêíîéòåößøÛüÕüÏBÀÇBÀÃBÀÄ@ÀÈþÐüÖøÜöàòæîêêîæðàöÜúÔüÐüÊBÀÄBÀÃBÀÉ@ÀÏþÓüÛøßöåðéðíêñäõâ÷ÚûÖýÐ?ÀÊAÀÄAÀÃAÀÉûÏûÕ÷ÙõáñãíééïåïßõÛ÷ÕûÏýÇ?ÀÃAÀ;PM1PEÞ¿Ä?ÀÈûÐûÖ÷ÚõÞóäïèéìçðãòÝöÙøÕüÏþÇþÃþÄþÈüÐøÖöÚòÞðäìèæêäðàôÚöÔøÐüÈüÄ@ÀÃþÇüÏüÓúÙößòãðåêëèïäñàõØ÷ÖûÐýÈýÄýÃýÇûÏ÷Õõ×ñßïãëççéãïÝñÙõÕùÏûÇûÃý;PM1PE;PM2FPPE=<MVÀ_GÀ;PM0PEÄ?ÀÈûÐûÖ÷ÚõÞóäïèéìçðãòÝöÙøÕüÏþÇþÃþÄþÈüÐøÖöÚòÞðäìèæêäðàôÚöÔøÐüÈüÄ@ÀÃþÇüÏüÓúÙößòãðåêëèïäñàõØ÷ÖûÐýÈýÄýÃýÇûÏ÷Õõ×ñßïãëççéãïÝñÙõÕùÏûÇûÃý;PM1PEÞ¿ÄûÈûÐõÒõÚóÞïâíäéêãîáðÝôÙöÑöÏüÇüÃüÄúÈøÐöÒôÚðÞìâêäæêâîÞðØôÔöÎöÈüÄüÃüÇúÍøÓö×òÝðáîåêéæëâïÞóØõÔ÷ÎùÈûÄûÃûÇõÍõÓó×ïÝíáéåãéáíÝïÙñÑõÏ÷ÇùÃû;PM1PE;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<oUÀ_GÀ;PM0PEÄûÈûÐõÒõÚóÞïâíäéêãîáðÝôÙöÑöÏüÇüÃüÄúÈøÐöÒôÚðÞìâêäæêâîÞðØôÔöÎöÈüÄüÃüÇúÍøÓö×òÝðáîåêéæëâïÞóØõÔ÷ÎùÈûÄûÃûÇõÍõÓó×ïÝíáéåãéáíÝïÙñÑõÏ÷ÇùÃû;PM1PEà¿ÂùÈõÐõÒñØïÚïâéäçæáêáðÙð×ôÑôÏøÇøÁøÂøÈôÐôÒðØîÚêâèâäèàêÜðØðÒòÎöÈöÄúÃøÇöÍöÑô×ðÛîßêãèçäéàíÜïØóÒóÎ÷È÷Â÷Á÷ÇóÍóÑï×ïÛéßåããçáéÙí×ïÑóÏõÇõÁ÷;PM1PE;PM2FPPE=<OUÀ_GÀ;PM0PEÂùÈõÐõÒñØïÚïâéäçæáêáðÙð×ôÑôÏøÇøÁøÂøÈôÐôÒðØîÚêâèâäèàêÜðØðÒòÎöÈöÄúÃøÇöÍöÑô×ðÛîßêãèçäéàíÜïØóÒóÎ÷È÷Â÷Á÷ÇóÍóÑï×ïÛéßåããçáéÙí×ïÑóÏõÇõÁ÷;PM1PEà¿ÂõÈóÎñÐïÖíÜëÞçàåæáèÛìÛîÕðÏòÍôÇöÁöÂôÈòÎðÐîÖêÜêÜäââæÞèÚìØîÐðÎòÈôÂöÁöÇòÍôÏð×ìÙìÝèáæãâéÞéÚíÖïÒñÌóÊõÂõÁóÉñËïÑíÕëÙçÝåáßåÝçÛëÕëÏïÍóÇñÁõ;PM1PE;PM2FPPE=<oTÀ_GÀ;PM0PEÂõÈóÎñÐïÖíÜëÞçàåæáèÛìÛîÕðÏòÍôÇöÁöÂôÈòÎðÐîÖêÜêÜäââæÞèÚìØîÐðÎòÈôÂöÁöÇòÍôÏð×ìÙìÝèáæãâéÞéÚíÖïÒñÌóÊõÂõÁóÉñËïÑíÕëÙçÝåáßåÝçÛëÕëÏïÍóÇñÁõ;PM1PEÞ¿ÂóÈïÎïÎëÖéØéÞåàáâáæÛê×êÕîÍîÍòÇòÁòÂòÈîÎîÎêÖèØæÜäâàâÜæØêÖêÐìÎðÆðÂôÁòÅðÍðÏîÕê×èÛæßäãàåÜçØéÖíÐíÌñÈñÂñÁñÇíËíÏéÕé×åÛáßßãÝå×çÕéÍíÍïÇïÁñ;PM1PE;PM2FPPE=<QTÀ_GÀ;PM0PEÂóÈïÎïÎëÖéØéÞåàáâáæÛê×êÕîÍîÍòÇòÁòÂòÈîÎîÎêÖèØæÜäâàâÜæØêÖêÐìÎðÆðÂôÁòÅðÍðÏîÕê×èÛæßäãàåÜçØéÖíÐíÌñÈñÂñÁñÇíËíÏéÕé×åÛáßßãÝå×çÕéÍíÍïÇïÁñ;PM1PEÞ¿ÂïÈíÊëÐéÔéØåÚáÞáâÝâÙæ×êÓêÏìÉîÇðÁîÂðÈìÊêÐèÔæØäÚâÞÞâÚâÖæÔêÐêÌìÆîÂðÁîÅîËîÏêÓèÕæÙäÝàáÞãÜåÖçÔéÐëÊïÈíÂïÁíÇëÉéÏéÓåÕáÛáÝÝßÙã×åÓçÏéÉíÇíÁí;PM1PE;PM2FPPE=<sSÀ_GÀ;PM0PEÂïÈíÊëÐéÔéØåÚáÞáâÝâÙæ×êÓêÏìÉîÇðÁîÂðÈìÊêÐèÔæØäÚâÞÞâÚâÖæÔêÐêÌìÆîÂðÁîÅîËîÏêÓèÕæÙäÝàáÞãÜåÖçÔéÐëÊïÈíÂïÁíÇëÉéÏéÓåÕáÛáÝÝßÙã×åÓçÏéÉíÇíÁí;PM1PEà¿ÂíÆéÊéÐåÒåÖãØáÜÝÞÛâ×äÕæÓèÍêÉêÅìÁìÂêÆêÊèÎäÔäÖâØÞÜÞÞØâÔäÔæÎæÌêÆêÂîÁìÅêËêÍèÓäÓä×âÝÞÝÜáØãÖãÔçÎéÊéÆëÄëÃéÅéÉçÍåÓãÕá×ÝÛÛÝ×áÕãÑãÏçÉéÅéÁë;PM1PE;PM2RF6,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<SSÀ_GÀ;PM0PEÂíÆéÊéÐåÒåÖãØáÜÝÞÛâ×äÕæÓèÍêÉêÅìÁìÂêÆêÊèÎäÔäÖâØÞÜÞÞØâÔäÔæÎæÌêÆêÂîÁìÅêËêÍèÓäÓä×âÝÞÝÜáØãÖãÔçÎéÊéÆëÄëÃéÅéÉçÍåÓãÕá×ÝÛÛÝ×áÕãÑãÏçÉéÅéÁë;PM1PEÞ¿ÄéÆçÈåÎãÐãÖáÖÝÚÛÞÙÞ×àÓäÏäÍèÉæÅêÁèÂèÆæÊæÎâÐâÔÞØÜÚÜÜÖÞÔâÒäÌäÊæÆèÂêÁèÅèÉæËæÑâÓâÕÞÛÜÛÚÝØáÔáÐåÎåÊçÆçÂéÁåÅçÉãÍãÏßÓÝ×ÝÙÙÛÕÝÕáÏáÍåÇåÅçÃç;PM1PE;PM2FPPE=<uRÀ_GÀ;PM0PEÄéÆçÈåÎãÐãÖáÖÝÚÛÞÙÞ×àÓäÏäÍèÉæÅêÁèÂèÆæÊæÎâÐâÔÞØÜÚÜÜÖÞÔâÒäÌäÊæÆèÂêÁèÅèÉæËæÑâÓâÕÞÛÜÛÚÝØáÔáÐåÎåÊçÆçÂéÁåÅçÉãÍãÏßÓÝ×ÝÙÙÛÕÝÕáÏáÍåÇåÅçÃç;PM1PEÞ¿ÄåÄåÊãÌßÐáÒÝÖÛØÙÚ×ÞÕÞÓàÍâËäÉäÅæÁäÂæÆäÊâÌàÎÞÔÜÖÜØØÚÔÜÔÞÐâÌàÊäÄæÂæÁäÃæÉäËâÏàÓÞÓÜ×ÚÛØÛÖÝÔßÐáÌãÈåÆãÂåÁãÅãÇáËßÏÝÓÝÕÙ××ÙÕÛÑÝÏßËáÉãÃåÃã;PM1PE;PM2FPPE=<WRÀ_GÀ;PM0PEÄåÄåÊãÌßÐáÒÝÖÛØÙÚ×ÞÕÞÓàÍâËäÉäÅæÁäÂæÆäÊâÌàÎÞÔÜÖÜØØÚÔÜÔÞÐâÌàÊäÄæÂæÁäÃæÉäËâÏàÓÞÓÜ×ÚÛØÛÖÝÔßÐáÌãÈåÆãÂåÁãÅãÇáËßÏÝÓÝÕÙ××ÙÕÛÑÝÏßËáÉãÃåÃã;PM1PEà¿ÂãÆáÈßÊÝÎÝÒÛÔÙÖ×ØÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÐÜÎÞÌÞÈàÆâÂäÁâÅâÇàËàÍÞÏÚÓÜÕØ×ÔÙÖÛÐÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÏÙÕ×ÓÕ×ÓÛÑÙÍÝÉßÇßÅáÁá;PM1PE;PM2FPPE=<wQÀ_GÀ;PM0PEÂãÆáÈßÊÝÎÝÒÛÔÙÖ×ØÕÚÓÜÑÞÍÞÉâÉàÅä¿â¿âÆàÊàÊÞÎÜÒÚÔØÖÖØÔÚÐÜÎÞÌÞÈàÆâÂäÁâÅâÇàËàÍÞÏÚÓÜÕØ×ÔÙÖÛÐÝÎßÌßÈáÆá¿ã¿ßÅáÇÝËÝÍÛÏÙÕ×ÓÕ×ÓÛÑÙÍÝÉßÇßÅáÁá;PM1PEà¿Æ?ÀÒ÷ÜóæíîåôÝúÑþÅþÆúÒôÞìæèîÜôÒøÆ@ÀÅþÑúÛòçîëæóÞùÒýÆýÅùÑóÝíååíÛñÑùÅý;PM1PE;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<WQÀ_GÀ;PM0PEÆ?ÀÒ÷ÜóæíîåôÝúÑþÅþÆúÒôÞìæèîÜôÒøÆ@ÀÅþÑúÛòçîëæóÞùÒýÆýÅùÑóÝíååíÛñÑùÅý;PM1PEÞ¿ÆùÎñÜïàéêáðÙôÏøÅøÆôÐðÚèââêÚðÐòÆúÅøÏôÙðáèçâïÚóÐ÷Æ÷ÅóÏïÙéáßçÛïÍóÅ÷;PM1PE;PM2FPPE=<yPÀ_GÀ;PM0PEÆùÎñÜïàéêáðÙôÏøÅøÆôÐðÚèââêÚðÐòÆúÅøÏôÙðáèçâïÚóÐ÷Æ÷ÅóÏïÙéáßçÛïÍóÅ÷;PM1PEÞ¿ÆñÎíÖéàãäßêÕîÏòÃðÄðÐêÖäàÞäØêÎîÄòÃðÍð×êÝäãÞéØïÎïÄñÃíÍé×ãÝßãÕéÍïÅï;PM1PE;PM2FPPE=<[PÀ_GÀ;PM0PEÆñÎíÖéàãäßêÕîÏòÃðÄðÐêÖäàÞäØêÎîÄòÃðÍð×êÝäãÞéØïÎïÄñÃíÍé×ãÝßãÕéÍïÅï;PM1PEà¿ÄëÌçÔãÜáàÙäÓèËìÃêÄêÌäÔàÚÚâÔäÌèÆìÅêËêÓäÙàßÚãÔéÌéÆëÅçËãÓßÙÛßÓãËéÃé;PM1PE;PM2FPPE=<{OÀ_GÀ;PM0PEÄëÌçÔãÜáàÙäÓèËìÃêÄêÌäÔàÚÚâÔäÌèÆìÅêËêÓäÙàßÚãÔéÌéÆëÅçËãÓßÙÛßÓãËéÃé;PM1PEÞ¿ÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PE;PM2FPPE=<]OÀ_GÀ;PM0PEÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PEÞ¿ÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PE;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<?OÀ_GÀ;PM0PEÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PEà¿ÂÙÈÕÌÕÎÑÔÍÔËÖÇÚÁØÂØÈÔÌÒÎÐÒÌÖÆÖÄÚÃØÅØËÔÏÒÑÐÓÌ×Æ×ÂÙÁÕÅÓËÓÏÍÑËÓÇ×Á×;PM1PE;PM2FPPE=<_NÀ_GÀ;PM0PEÂÙÈÕÌÕÎÑÔÍÔËÖÇÚÁØÂØÈÔÌÒÎÐÒÌÖÆÖÄÚÃØÅØËÔÏÒÑÐÓÌ×Æ×ÂÙÁÕÅÓËÓÏÍÑËÓÇ×Á×;PM1PEÞ¿ÂÓÆÏÈÑÌËÌËÒÉÐÃÔÁÒÂÒÄÐÊÎÌÌÌÈÒÄÐÄÔÃÒÃÒÇÐËÎÍÌÏÈÑÄÑÂÓÁÏÃÑÇËËËÍÇÏÅÑÁÑ;PM1PE;PM2FPPE=<ANÀ_GÀ;PM0PEÂÓÆÏÈÑÌËÌËÒÉÐÃÔÁÒÂÒÄÐÊÎÌÌÌÈÒÄÐÄÔÃÒÃÒÇÐËÎÍÌÏÈÑÄÑÂÓÁÏÃÑÇËËËÍÇÏÅÑÁÑ;PM1PEà¿¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PE;PM2FPPE=<aMÀ_GÀ;PM0PE¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PEÞ¿ÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM1PE;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<CMÀ_GÀ;PM0PEÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM2FPMC1,240PE=<QOÀaHÀ;PM0PEÈÉÈÁÊÁÊÁÊÁÊÃÊÁÊÅÈÃÈÎÉÄÉÆËÄÇÄËÂÉÂÇÄËÂÈÇÑ¿;PM1PE¿ÇÈÁÇÊ;PM2FTFP1PE=<APÀwGÀ;PM0PEÆÃÊÃÎÍÎÍÄÅÒ¿ÇÎÏÒÑÐÑÈÆÁËË;PM1PEÄÿÅÄ;PM2FP1PE=<mPÀ[GÀ;PM0PEÄÃÊÃÊÇÌÅÈÅÌÌÉÈËÆÍÈÇÄÂÁÍÇ;PM2FP1PE=<iPÀSGÀ;PM0PEÇÈ¿ÃÂÇÂÁ¿ÁÎÈÁĿ¿ÂÇÊÈÉ¿ÊÇ¿¿Ñ;PM2FP1PE=<CQÀGGÀ;PM0PEÊÅ¿ÁÆÁÄ¿ÆÁ¿ÒÁ¿ÃÂÿÅÂÈÅÑÃ;PM1PEÄÅÆ¿ÉÆ;PM2FP1PE=<ORÀgFÀ;PM0PEÊÁÌÁÌÃÌÃÌÁÊÇÆÅÂÃÒÄÇÌÉÈËÈËÆËÄÍÂËÄË¿ÁÏ;PM2FP1PE=<ycÀkSÀ;PM0PEæØæØæÜæØæÚæÜæÚæÜäÚæÜäÚäÜâÚäÚâØâØÑØÏÔÍÒÍÒÏÐÍÒÏÖÑØéáéßéßåßçÝçßçÝçßçßëßëßíáïãñá÷ãùåàÅÞÅàÅÞÅàÅÞÅÞÅàÅ;PM2FT11,5FPMC1,90PE=<]íITÀ;PM0PEÂñÆïÌïÒëÔëÚåÚçàáâßèÙæÙìÓìÑðËðÅòÁðÂòÆîÌîÒêÔèÚæÚâààâÜèÚæÔìÐìÌðÈðÂòÁðÇòËîÏîÓêÙèÛæßâáàåÜçØéÖíÐíÌñÈïÂñÁïÇïËëÏëÕå×çÛáßßáÙåÙçÓéÑíËíÅñÁï;PM1PEÆ¿ÂñÈïÌíÐëÔéÚçÚãàáâßäÙèÙêÓìÏîËðÇòÁðÂðÈîÌìÐêÔèÚæÚâàÞâÜäÚèÒêÒìÌîÆðÂòÁðÅðËîÑìÑêÙèÛæÝâáÞåÜçØéÔëÐíÌïÈïÂñÁïÇíËëÏéÓç×ãÛáÝßáÙåÙçÓéÏëËíÇïÁï;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,2FPPE=<WíITÀ;PM0PEÂñÈïÌíÐëÔéÚçÚãàáâßäÙèÙêÓìÏîËðÇòÁðÂðÈîÌìÐêÔèÚæÚâàÞâÜäÚèÒêÒìÌîÆðÂòÁðÅðËîÑìÑêÙèÛæÝâáÞåÜçØéÔëÐíÌïÈïÂñÁïÇíËëÏéÓç×ãÛáÝßáÙåÙçÓéÏëËíÇïÁï;PM1PEÈ¿ÂïÈïÌëÎíÖçÖçÜãÞáâÝäÛèÕèÕîÍìËðÇðÁðÂðÈìÌìÎêÖæÖäÜâÞàâÚäØèÔèÐîÌìÈðÂðÁðÇðËìÏìÓê×æÙäßâáàãÚåØéÔëÐëÌïÆïÄïÃïÅëËíÏçÓç×ãÙáßÝáÛãÕåÕéÍëËëÇïÁï;PM1PE;PM2FPPE=<OíITÀ;PM0PEÂïÈïÌëÎíÖçÖçÜãÞáâÝäÛèÕèÕîÍìËðÇðÁðÂðÈìÌìÎêÖæÖäÜâÞàâÚäØèÔèÐîÌìÈðÂðÁðÇðËìÏìÓê×æÙäßâáàãÚåØéÔëÐëÌïÆïÄïÃïÅëËíÏçÓç×ãÙáßÝáÛãÕåÕéÍëËëÇïÁï;PM1PEÈ¿ÂïÈíÊëÒëÒçØåÚãÞáâÝäÙæ×èÑìÑìÉîÇðÁðÂîÈìÊêÒêÒæØäÚàÞÞâÜäÖæÔèÐìÌìÆîÄðÃðÅîËìÏêÓêÕæÛäÝàßÞãÜåÖéÔéÐëÌíÆïÂïÁíÅëËëÏçÓåÕãÛáÝÝßÙã×åÑéÑéÉëÇíÁï;PM1PE;PM2FPPE=<GíITÀ;PM0PEÂïÈíÊëÒëÒçØåÚãÞáâÝäÙæ×èÑìÑìÉîÇðÁðÂîÈìÊêÒêÒæØäÚàÞÞâÜäÖæÔèÐìÌìÆîÄðÃðÅîËìÏêÓêÕæÛäÝàßÞãÜåÖéÔéÐëÌíÆïÂïÁíÅëËëÏçÓåÕãÛáÝÝßÙã×åÑéÑéÉëÇíÁï;PM1PEÈ¿ÂïÆëÌëÐéÒçØåÚãÞßàÝäÙæ×èÑêÏìËìÅðÁîÂîÆìÌêÐèÒæØäÚàÞÜàÜäÖæÔèÐêÊìÈìÂðÁîÇîÉìÏêÓèÕæÛäÛàßÜãÜåÖçÔéÐëÊíÈíÂïÁëÇëÉéÏçÓåÕãÛßÛÝßÙã×åÑçÏéËëÅíÁí;PM1PE;PM2FPPE=<?íITÀ;PM0PEÂïÆëÌëÐéÒçØåÚãÞßàÝäÙæ×èÑêÏìËìÅðÁîÂîÆìÌêÐèÒæØäÚàÞÜàÜäÖæÔèÐêÊìÈìÂðÁîÇîÉìÏêÓèÕæÛäÛàßÜãÜåÖçÔéÐëÊíÈíÂïÁëÇëÉéÏçÓåÕãÛßÛÝßÙã×åÑçÏéËëÅíÁí;PM1PEÆ¿ÂíÈíÊéÐéÔçÖãÚãÜßàÛäÙäÕèÓêÏêÉîÇîÁîÂìÈìÊèÐèÔæÖâÚàÜÞàÚäÖäÒèÐêÌêÆîÂîÁîÅìËìÏèÑèÕæÙâÝàßÞáÚåÖçÒçÐëÊëÈíÂíÁíÇéÉéÏçÑãÕãÙßÝÛßÙáÕåÓçÏçÉëÇëÁí;PM1PE;PM2FPPE=<yìITÀ;PM0PEÂíÈíÊéÐéÔçÖãÚãÜßàÛäÙäÕèÓêÏêÉîÇîÁîÂìÈìÊèÐèÔæÖâÚàÜÞàÚäÖäÒèÐêÌêÆîÂîÁîÅìËìÏèÑèÕæÙâÝàßÞáÚåÖçÒçÐëÊëÈíÂíÁíÇéÉéÏçÑãÕãÙßÝÛßÙáÕåÓçÏçÉëÇëÁí;PM1PEÈ¿ÄíÆëÌéÎçÒçÖãÚáÜßàÛâÙäÕèÑèÍêËìÅîÃîÄêÆêÌêÎæÒäÖâÚàÜÜàÚâÖäÔèÎèÊêÈìÂîÁîÇêÉêÍêÓæÕäÙâÛàßÜáÚãÖåÔéÎéÊéÈíÂíÁëÇéÉçÍçÓãÕáÙßÛÛßÙáÕãÑåÍéËéÅéÃí;PM1PE;PM2FPPE=<qìITÀ;PM0PEÄíÆëÌéÎçÒçÖãÚáÜßàÛâÙäÕèÑèÍêËìÅîÃîÄêÆêÌêÎæÒäÖâÚàÜÜàÚâÖäÔèÎèÊêÈìÂîÁîÇêÉêÍêÓæÕäÙâÛàßÜáÚãÖåÔéÎéÊéÈíÂíÁëÇéÉçÍçÓãÕáÙßÛÛßÙáÕãÑåÍéËéÅéÃí;PM1PEÈ¿ÂëÆëÌéÎçÒåÖãÚáÜÝÞÛâÙäÕæÑèÍêËìÅìÁìÂìÆêÌæÎèÒäÖàÚÞÜÞÞØâÖäÒæÐèÊêÆìÄìÃìÅìÉêÏæÑèÕä×àÝÞÝÞßØãÖçÒåÐéÊëÆëÂëÁëÅéÉçÏåÑãÕá×ÝÝÛÝÙßÕãÑçÍåËéÅëÁë;PM1PE;PM2FPPE=<iìITÀ;PM0PEÂëÆëÌéÎçÒåÖãÚáÜÝÞÛâÙäÕæÑèÍêËìÅìÁìÂìÆêÌæÎèÒäÖàÚÞÜÞÞØâÖäÒæÐèÊêÆìÄìÃìÅìÉêÏæÑèÕä×àÝÞÝÞßØãÖçÒåÐéÊëÆëÂëÁëÅéÉçÏåÑãÕá×ÝÝÛÝÙßÕãÑçÍåËéÅëÁë;PM1PEÈ¿ÂëÆéÊéÎçÒãÖãÚßÜÝÞÛàÙäÕäÑèÍêÉêÅìÁêÂìÆèÊèÎæÒäÖàÚÞÜÜÞØàÖäÒäÎèÌêÆêÂìÁêÅìËèÍèÑæÕä×àÛÞÝÜßØãÖåÒçÎçÌëÆéÂëÁéÅéËçÍãÑãÕß×ÝÛÛÝÙßÕãÑåÍçÉçÅëÁé;PM1PE;PM2FPPE=<aìITÀ;PM0PEÂëÆéÊéÎçÒãÖãÚßÜÝÞÛàÙäÕäÑèÍêÉêÅìÁêÂìÆèÊèÎæÒäÖàÚÞÜÜÞØàÖäÒäÎèÌêÆêÂìÁêÅìËèÍèÑæÕä×àÛÞÝÜßØãÖåÒçÎçÌëÆéÂëÁéÅéËçÍãÑãÕß×ÝÛÛÝÙßÕãÑåÍçÉçÅëÁé;PM1PEÈ¿ÂëÆçÊéÐåÐãÖãØßÜÛÜÛà×äÕäÏæÏêÉèÅìÁêÂêÆèÊæÐæÐâÖâØÜÜÜÜØàÖäÐäÎæÌêÆèÂìÁêÅêËèÍæÏæÕâ×âÛÜÛÜáØáÖåÐåÎçÊéÆéÄëÃçÅéÉåÍãÏãÕß×ÛÛÛÛ×áÕáÏåÏåÉçÅéÁé;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<YìITÀ;PM0PEÂëÆçÊéÐåÐãÖãØßÜÛÜÛà×äÕäÏæÏêÉèÅìÁêÂêÆèÊæÐæÐâÖâØÜÜÜÜØàÖäÐäÎæÌêÆèÂìÁêÅêËèÍæÏæÕâ×âÛÜÛÜáØáÖåÐåÎçÊéÆéÄëÃçÅéÉåÍãÏãÕß×ÛÛÛÛ×áÕáÏåÏåÉçÅéÁé;PM1PEÆ¿ÄéÆéÊåÎåÒåÔßØßÚÝÞÙà×àÓæÑæÍæÉêÅêÃêÄèÆèÊæÎäÒâÔàØÞÚÚÞØàÔàÒæÎæÊæÆêÂêÁêÅèÉèÍæÑäÓâ×àÙÞÝÚßØáÔãÒåÎçÊçÆéÂéÁéÅåÉåÍåÑßÓß×ÝÙÙÝ×ßÓáÑãÍåÉçÅçÃé;PM1PE;PM2FPPE=<SìITÀ;PM0PEÄéÆéÊåÎåÒåÔßØßÚÝÞÙà×àÓæÑæÍæÉêÅêÃêÄèÆèÊæÎäÒâÔàØÞÚÚÞØàÔàÒæÎæÊæÆêÂêÁêÅèÉèÍæÑäÓâ×àÙÞÝÚßØáÔãÒåÎçÊçÆéÂéÁéÅåÉåÍåÑßÓß×ÝÙÙÝ×ßÓáÑãÍåÉçÅçÃé;PM1PEÈ¿ÂéÆçÊåÎåÒãÔáÖÝÚÝÞÙÞÕâÓäÑæÍæÉèÅêÁèÂêÆæÊäÎäÒâÔàÖÜÚÚÞØÞÔâÐäÐæÈæÆèÄêÃèÅêÇæÏäÏäÓâ×àÙÜÛÚßØáÔãÐãÐåÈéÆçÂéÁçÅåÇåÏãÏáÓÝ×ÝÙÙÛÕßÓáÑãÍãÉåÅéÁç;PM1PE;PM2FPPE=<KìITÀ;PM0PEÂéÆçÊåÎåÒãÔáÖÝÚÝÞÙÞÕâÓäÑæÍæÉèÅêÁèÂêÆæÊäÎäÒâÔàÖÜÚÚÞØÞÔâÐäÐæÈæÆèÄêÃèÅêÇæÏäÏäÓâ×àÙÜÛÚßØáÔãÐãÐåÈéÆçÂéÁçÅåÇåÏãÏáÓÝ×ÝÙÙÛÕßÓáÑãÍãÉåÅéÁç;PM1PEÈ¿ÂéÆåÊåÎåÐßÔáØÝØÝÞ×Þ×âÓàÏæÍæÉæÅêÁèÂæÆèÊäÎâÐâÔÞØÜØÚÞÖÞÔâÒàÌæÊæÆæÂêÁèÅæÉèËäÑâÓâÕÞÙÜÛÚÝÖáÔáÒãÌçÊåÆçÂéÁåÅåÉåËßÑáÓÝÕÝÙ×Û×ÝÓáÏáÍãÉçÅåÁç;PM1PE;PM2FPPE=<CìITÀ;PM0PEÂéÆåÊåÎåÐßÔáØÝØÝÞ×Þ×âÓàÏæÍæÉæÅêÁèÂæÆèÊäÎâÐâÔÞØÜØÚÞÖÞÔâÒàÌæÊæÆæÂêÁèÅæÉèËäÑâÓâÕÞÙÜÛÚÝÖáÔáÒãÌçÊåÆçÂéÁåÅåÉåËßÑáÓÝÕÝÙ×Û×ÝÓáÏáÍãÉçÅåÁç;PM1PEÈ¿ÂçÆåÊåÌãÐáÔßÖÝÚÛÜÙÞÕàÓâÏäËæÉæÅèÁèÂæÆäÊäÌäÐÞÔàÖÜÚØÜÖÞÔàÐâÎäÊæÆæÂèÁèÅæÉäÍäÏäÓÞÕà×ÜÛØßÖÝÔãÐãÎãÊåÆçÂçÁåÅåÉãÍáÏßÓÝÕÛ×ÙÛÕßÓÝÏãËãÉãÅåÁç;PM1PE;PM2FPPE=<{ëITÀ;PM0PEÂçÆåÊåÌãÐáÔßÖÝÚÛÜÙÞÕàÓâÏäËæÉæÅèÁèÂæÆäÊäÌäÐÞÔàÖÜÚØÜÖÞÔàÐâÎäÊæÆæÂèÁèÅæÉäÍäÏäÓÞÕà×ÜÛØßÖÝÔãÐãÎãÊåÆçÂçÁåÅåÉãÍáÏßÓÝÕÛ×ÙÛÕßÓÝÏãËãÉãÅåÁç;PM1PEÈ¿ÂåÆçÈãÎãÐßÒßØÛØÛÜ×Ü×àÑàÏäÍäÇèÅæÁæÂæÆäÈäÎàÐâÒÜØÜØØÜÖÜÒàÒàÌäÊäÄèÄæÃæÃæÉäËäÑàÑâÕÜ×ÜÛØÛÖáÒßÒãÌãÊåÄåÄåÃçÃãÉãËßÑßÑÛÕÛ××Û×ÛÑáÏßÍãÇãÅåÁå;PM1PE;PM2FPPE=<sëITÀ;PM0PEÂåÆçÈãÎãÐßÒßØÛØÛÜ×Ü×àÑàÏäÍäÇèÅæÁæÂæÆäÈäÎàÐâÒÜØÜØØÜÖÜÒàÒàÌäÊäÄèÄæÃæÃæÉäËäÑàÑâÕÜ×ÜÛØÛÖáÒßÒãÌãÊåÄåÄåÃçÃãÉãËßÑßÑÛÕÛ××Û×ÛÑáÏßÍãÇãÅåÁå;PM1PEÈ¿ÂåÄåÊãÎáÎáÒÝÖÛØÛÜ×ÜÕÞÑâÍâÍäÉæÃæÁæÂæÄäÊàÎâÎÞÒÞÖÚØØÜÖÜÒÞÐâÎâÈäÆæÂæÁæÅæÇäÍàÏâÑÞÕÞ×ÚÙØÝÖÝÒáÐßÎãÈåÆåÂåÁåÅãÇáÍáÏÝÑÛÕÛ××ÙÕÝÑÝÍáÍßÉãÃåÁå;PM1PE;PM2FPPE=<këITÀ;PM0PEÂåÄåÊãÎáÎáÒÝÖÛØÛÜ×ÜÕÞÑâÍâÍäÉæÃæÁæÂæÄäÊàÎâÎÞÒÞÖÚØØÜÖÜÒÞÐâÎâÈäÆæÂæÁæÅæÇäÍàÏâÑÞÕÞ×ÚÙØÝÖÝÒáÐßÎãÈåÆåÂåÁåÅãÇáÍáÏÝÑÛÕÛ××ÙÕÝÑÝÍáÍßÉãÃåÁå;PM1PEÆ¿ÂåÆãÊãÌáÎÝÔßÔÛØÙÚ×ÜÓàÓÞÍâËäÉäÅæÁäÂäÆäÊâÌàÎÞÔÜÔÚØØÚÖÜÒàÐÞÌâÊäÄäÂæÁäÃäÉäËâÏàÑÞÕÜ×ÚÙØÛÖÝÒßÐáÌãÊãÄãÂåÁãÃãÉáËÝÏßÑÛÕÙ××ÙÓÛÓÝÍßËáÉãÅãÁã;PM1PE;PM2FPPE=<eëITÀ;PM0PEÂåÆãÊãÌáÎÝÔßÔÛØÙÚ×ÜÓàÓÞÍâËäÉäÅæÁäÂäÆäÊâÌàÎÞÔÜÔÚØØÚÖÜÒàÐÞÌâÊäÄäÂæÁäÃäÉäËâÏàÑÞÕÜ×ÚÙØÛÖÝÒßÐáÌãÊãÄãÂåÁãÃãÉáËÝÏßÑÛÕÙ××ÙÓÛÓÝÍßËáÉãÅãÁã;PM1PEÈ¿ÄåÄáÈãÎßÎÝÒÝÔÛØÙÚ×ÜÓÞÑÞÍàÍäÇâÃæÃäÄäÄâÈàÎàÎÞÒÜÔØØØÚÖÜÒÞÎÞÌàÊäÄâÂæÁäÃäÉâËàÍàÑÞÕÜ×Ø×ØÛÖÝÒßÎßÌáÊãÄãÂåÁáÃãÉßËÝÍÝÑÛÕÙ×××ÓÛÑÝÍßÍßÇáÃãÃã;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<]ëITÀ;PM0PEÄåÄáÈãÎßÎÝÒÝÔÛØÙÚ×ÜÓÞÑÞÍàÍäÇâÃæÃäÄäÄâÈàÎàÎÞÒÜÔØØØÚÖÜÒÞÎÞÌàÊäÄâÂæÁäÃäÉâËàÍàÑÞÕÜ×Ø×ØÛÖÝÒßÎßÌáÊãÄãÂåÁáÃãÉßËÝÍÝÑÛÕÙ×××ÓÛÑÝÍßÍßÇáÃãÃã;PM1PEÈ¿ÂãÆãÈßÌáÐÝÐÛÔÛØ×Ø×ÜÓÜÏÞÏâËàÇäÅäÁäÂâÆâÈàÌÞÐÞÐÚÔÚØÖØÖÜÐÜÐÞÌâÈàÄäÄäÃäÃâÇâËàÏÞÏÞÕÚÕÚÙÖÙÖÝÐÝÐßÌáÈáÄãÄãÃãÃßÇáËÝÏÛÏÛÕ×Õ×ÙÓÙÏÝÏÝËßÇáÅáÁã;PM1PE;PM2FPPE=<UëITÀ;PM0PEÂãÆãÈßÌáÐÝÐÛÔÛØ×Ø×ÜÓÜÏÞÏâËàÇäÅäÁäÂâÆâÈàÌÞÐÞÐÚÔÚØÖØÖÜÐÜÐÞÌâÈàÄäÄäÃäÃâÇâËàÏÞÏÞÕÚÕÚÙÖÙÖÝÐÝÐßÌáÈáÄãÄãÃãÃßÇáËÝÏÛÏÛÕ×Õ×ÙÓÙÏÝÏÝËßÇáÅáÁã;PM1PEÈ¿¿ãÆáÈßÌßÐÝÐÛÔÙÖÙÚÕÚÓÜÏÞÏàËàÇâÅä¿â¿äÆàÈÞÌàÐÜÐÚÔÚÖÔÚÖÚÐÜÎÞÌàÈàÆâÂäÁâÅäÇàËÞÍàÏÜÕÚÓÚÙÔÙÖÛÐßÎÝÌßÈãÆáÂãÁáÅßÇßËÝÍÛÏÙÕÙÓÕÙÓÙÏÛÏßËÝÇßÅã¿á;PM1PE;PM2FPPE=<MëITÀ;PM0PE¿ãÆáÈßÌßÐÝÐÛÔÙÖÙÚÕÚÓÜÏÞÏàËàÇâÅä¿â¿äÆàÈÞÌàÐÜÐÚÔÚÖÔÚÖÚÐÜÎÞÌàÈàÆâÂäÁâÅäÇàËÞÍàÏÜÕÚÓÚÙÔÙÖÛÐßÎÝÌßÈãÆáÂãÁáÅßÇßËÝÍÛÏÙÕÙÓÕÙÓÙÏÛÏßËÝÇßÅã¿á;PM1PEÈ¿¿ãÆßÊßÊßÎÛÒÛÒÙÖ×ØÕÚÑÜÑÜÍàÉàÉàÅä¿â¿àÆâÊÞÊÞÎÚÒÜÒØÖÔØÔÚÐÜÐÜÊàÈàÆàÂäÁâÅàÇâÉÞÏÞÏÚÓÜÓØ×ÔÛÔÙÐÝÐÝÊáÈßÆáÂãÁßÅßÇßÉÛÏÛÏÙÓ×ÓÕ×ÑÛÑÙÍÝÉÝÉáÅß¿á;PM1PE;PM2FPPE=<EëITÀ;PM0PE¿ãÆßÊßÊßÎÛÒÛÒÙÖ×ØÕÚÑÜÑÜÍàÉàÉàÅä¿â¿àÆâÊÞÊÞÎÚÒÜÒØÖÔØÔÚÐÜÐÜÊàÈàÆàÂäÁâÅàÇâÉÞÏÞÏÚÓÜÓØ×ÔÛÔÙÐÝÐÝÊáÈßÆáÂãÁßÅßÇßÉÛÏÛÏÙÓ×ÓÕ×ÑÛÑÙÍÝÉÝÉáÅß¿á;PM1PEÆ¿ÂáÆßÈßÌÝÌÛÒÛÒÙÔ×ØÓÚÑÜÑÜËÞËàÇàÅâÁâÂàÆÞÈàÌÜÌÜÒØÒØÔÔØÔÚÐÜÎÜÌÞÈàÆà¿â¿âÅàÇÞËàÍÜÏÜÓØÓØ×Ô×ÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÛÍÛÏÙÓ×ÓÓ×Ñ×ÑÛËÛËßÇÝÅßÁá;PM1PE;PM2FPPE=<?ëITÀ;PM0PEÂáÆßÈßÌÝÌÛÒÛÒÙÔ×ØÓÚÑÜÑÜËÞËàÇàÅâÁâÂàÆÞÈàÌÜÌÜÒØÒØÔÔØÔÚÐÜÎÜÌÞÈàÆà¿â¿âÅàÇÞËàÍÜÏÜÓØÓØ×Ô×ÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÛÍÛÏÙÓ×ÓÓ×Ñ×ÑÛËÛËßÇÝÅßÁá;PM1PEÈ¿ÂßÄáÈÝÌÝÌÛÒÙÒ×Ô×ØÓØÑÚÑÜËÞËÞÇâÃàÁàÂàÄàÈÜÌÞÌÚÒØÒÖÔÖØÒØÐÚÎÜÊÞÊÞÄâÂàÁàÃàÉàÉÜÍÞÏÚÑØÕÖÕÖ×ÒÙÐÝÎÛÊßÊßÄßÂßÁáÃÝÉÝÉÛÍÙÏ×Ñ×ÕÓÕÑ×ÑÙËÝËÛÇßÃßÁß;PM1PE;PM2FPPE=<wêITÀ;PM0PEÂßÄáÈÝÌÝÌÛÒÙÒ×Ô×ØÓØÑÚÑÜËÞËÞÇâÃàÁàÂàÄàÈÜÌÞÌÚÒØÒÖÔÖØÒØÐÚÎÜÊÞÊÞÄâÂàÁàÃàÉàÉÜÍÞÏÚÑØÕÖÕÖ×ÒÙÐÝÎÛÊßÊßÄßÂßÁáÃÝÉÝÉÛÍÙÏ×Ñ×ÕÓÕÑ×ÑÙËÝËÛÇßÃßÁß;PM1PEÈ¿Æ?ÀÔùÜõæíîåöÛúÓ@ÀÅ@ÀÆúÔôÜîææîÞöÒúÆ@ÀÅ@ÀÑúÝôåîíæóÞùÒ?ÀÆ?ÀÅùÑõÝíååíÛóÓùÅ?À;PM1PE;PM2FPPE=<oêITÀ;PM0PEÆ?ÀÔùÜõæíîåöÛúÓ@ÀÅ@ÀÆúÔôÜîææîÞöÒúÆ@ÀÅ@ÀÑúÝôåîíæóÞùÒ?ÀÆ?ÀÅùÑõÝíååíÛóÓùÅ?À;PM1PEÈ¿ÆýÒùÜñæíîåòÛúÑþÅüÆúÒôÜîæäîÞòÒúÆþÅüÑúÝôãîíäóÞùÒûÆýÅùÑñÝíãåíÛóÑùÅû;PM1PE;PM2FPPE=<gêITÀ;PM0PEÆýÒùÜñæíîåòÛúÑþÅüÆúÒôÜîæäîÞòÒúÆþÅüÑúÝôãîíäóÞùÒûÆýÅùÑñÝíãåíÛóÑùÅû;PM1PEÆ¿ÆûÒ÷ÜóäëìãôÛøÑüÅüÆøÒòÜìääìÜôÒøÆüÅüÑøÛòãìëäñÜ÷ÒûÆûÅ÷ÑóÛëããëÛñÑ÷Åû;PM1PE;PM2FPPE=<aêITÀ;PM0PEÆûÒ÷ÜóäëìãôÛøÑüÅüÆøÒòÜìääìÜôÒøÆüÅüÑøÛòãìëäñÜ÷ÒûÆûÅ÷ÑóÛëããëÛñÑ÷Åû;PM1PEÊ¿ÆûÐõÜïâëìáðÛöÏüÅúÆöÐòÜêâäìÜðÐöÆüÅúÏöÛòãêéäñÜõÐùÆûÅõÏïÛëãáéÛñÏõÅù;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<WêITÀ;PM0PEÆûÐõÜïâëìáðÛöÏüÅúÆöÐòÜêâäìÜðÐöÆüÅúÏöÛòãêéäñÜõÐùÆûÅõÏïÛëãáéÛñÏõÅù;PM1PEÆ¿Æ÷ÒõØïäéêãð×öÑøÅøÆöÒðØêäâêÚðÐöÆøÅøÏöÙðáêéâïÚõÐ÷Æ÷ÅõÏïÙéáãé×ïÑõÅ÷;PM1PE;PM2FPPE=<QêITÀ;PM0PEÆ÷ÒõØïäéêãð×öÑøÅøÆöÒðØêäâêÚðÐöÆøÅøÏöÙðáêéâïÚõÐ÷Æ÷ÅõÏïÙéáãé×ïÑõÅ÷;PM1PEÈ¿Æ÷ÐóÚíâçèáîÙôÏøÅöÆôÐðÚèââèØîÐôÆøÅöÏô×ðáèçâïØóÐõÆ÷ÅóÏí×çááçÙïÏóÅõ;PM1PE;PM2FPPE=<IêITÀ;PM0PEÆ÷ÐóÚíâçèáîÙôÏøÅöÆôÐðÚèââèØîÐôÆøÅöÏô×ðáèçâïØóÐõÆ÷ÅóÏí×çááçÙïÏóÅõ;PM1PEÈ¿ÆõÐñØíàçèßî×òÏöÅöÆòÐîØèààèØîÐòÆöÅöÏò×îßèçàíØñÐõÆõÅñÏí×çßßç×íÏñÅõ;PM1PE;PM2FPPE=<AêITÀ;PM0PEÆõÐñØíàçèßî×òÏöÅöÆòÐîØèààèØîÐòÆöÅöÏò×îßèçàíØñÐõÆõÅñÏí×çßßç×íÏñÅõ;PM1PEÈ¿ÄóÐñØëàåæßì×òÏôÃôÄðÐìØèààæØìÐòÄôÃôÏð×ìßèçàëØïÐóÄóÃñÏë×åßßç×ëÏïÃó;PM1PE;PM2FPPE=<yéITÀ;PM0PEÄóÐñØëàåæßì×òÏôÃôÄðÐìØèààæØìÐòÄôÃôÏð×ìßèçàëØïÐóÄóÃñÏë×åßßç×ëÏïÃó;PM1PEÈ¿ÄñÐïÖéàåæßêÕðÏòÃòÄîÐìÖæàÞæØêÎðÆòÅòÍî×ìÝæåÞëØíÎñÆñÅïÍé×åÝßåÕëÏíÃñ;PM1PE;PM2FPPE=<qéITÀ;PM0PEÄñÐïÖéàåæßêÕðÏòÃòÄîÐìÖæàÞæØêÎðÆòÅòÍî×ìÝæåÞëØíÎñÆñÅïÍé×åÝßåÕëÏíÃñ;PM1PEÆ¿ÆñÎíÖéÞãäÝêÕîÍòÅðÆîÎêÖäÞÞäØêÎîÄòÃðÍî×êÝäãÞéØíÎïÄñÃíÍé×ãÝÝãÕéÍíÅï;PM1PE;PM2FPPE=<kéITÀ;PM0PEÆñÎíÖéÞãäÝêÕîÍòÅðÆîÎêÖäÞÞäØêÎîÄòÃðÍî×êÝäãÞéØíÎïÄñÃíÍé×ãÝÝãÕéÍíÅï;PM1PEÈ¿ÄïÐëÔéÞáâÝêÓìÏðÃðÄìÐèÔäÞÜâÖêÎìÆðÅðÍìÕèÛäãÜçÖëÎïÆïÅëÍéÕáÛÝãÓçÏëÃï;PM1PE;PM2FPPE=<céITÀ;PM0PEÄïÐëÔéÞáâÝêÓìÏðÃðÄìÐèÔäÞÜâÖêÎìÆðÅðÍìÕèÛäãÜçÖëÎïÆïÅëÍéÕáÛÝãÓçÏëÃï;PM1PEÈ¿ÆíÌëÖåÜáâÛæÕìËîÅîÆêÌèÖâÜÜâÔæÎìÄîÃîÍêÓèÛâáÜçÔéÎíÄíÃëÍåÓáÛÛáÕçËéÅí;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<[éITÀ;PM0PEÆíÌëÖåÜáâÛæÕìËîÅîÆêÌèÖâÜÜâÔæÎìÄîÃîÍêÓèÛâáÜçÔéÎíÄíÃëÍåÓáÛÛáÕçËéÅí;PM1PEÈ¿ÄëÎéÔåÚáâÙæÓêÍìÃìÄêÎæÔàÚÜâÔæÌêÆìÅìËêÓæÛàßÜåÔéÌëÆëÅéËåÓáÛÙßÓåÍéÃë;PM1PE;PM2FPPE=<SéITÀ;PM0PEÄëÎéÔåÚáâÙæÓêÍìÃìÄêÎæÔàÚÜâÔæÌêÆìÅìËêÓæÛàßÜåÔéÌëÆëÅéËåÓáÛÙßÓåÍéÃë;PM1PEÆ¿ÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÜåÔçÌéÄëÃçËãÓßÛÙÝÓåËçÅé;PM1PE;PM2FPPE=<MéITÀ;PM0PEÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÜåÔçÌéÄëÃçËãÓßÛÙÝÓåËçÅé;PM1PEÊ¿ÄéÌåÔãØÝÞ×äÓæËêÃèÄèÌâÔÞØÚÞÔäÌæÄêÃèËèÓâÙÞÝÚáÔçÌçÄéÃåËãÓÝÙ×ÝÓáËçÃç;PM1PE;PM2FPPE=<CéITÀ;PM0PEÄéÌåÔãØÝÞ×äÓæËêÃèÄèÌâÔÞØÚÞÔäÌæÄêÃèËèÓâÙÞÝÚáÔçÌçÄéÃåËãÓÝÙ×ÝÓáËçÃç;PM1PEÆ¿ÄçÌåÔáØÛÜ×âÓæËèÃèÄäÌäÔÜØØÜÔâÌæÂèÁèËäÓä×ÜÛØãÔãÌçÂçÁåËáÓÛ××ÛÓãËãÃç;PM1PE;PM2FPPE=<}èITÀ;PM0PEÄçÌåÔáØÛÜ×âÓæËèÃèÄäÌäÔÜØØÜÔâÌæÂèÁèËäÓä×ÜÛØãÔãÌçÂçÁåËáÓÛ××ÛÓãËãÃç;PM1PEÈ¿ÄåÌãÒáØÙÚ×âÑäËæÃæÄäÌàÒÜØØÚÐâÌäÄæÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PE;PM2FPPE=<uèITÀ;PM0PEÄåÌãÒáØÙÚ×âÑäËæÃæÄäÌàÒÜØØÚÐâÌäÄæÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PEÈ¿ÄåÊáÒÝÖÛÜÕÞÑâÉæÃäÄâÊàÒÜÖÖÜÐÞÌâÄæÃäËâÏàÕÜÛÖßÐáÌãÄåÃáËÝÏÛÕÕÛÑßÉáÃã;PM1PE;PM2FPPE=<mèITÀ;PM0PEÄåÊáÒÝÖÛÜÕÞÑâÉæÃäÄâÊàÒÜÖÖÜÐÞÌâÄæÃäËâÏàÕÜÛÖßÐáÌãÄåÃáËÝÏÛÕÕÛÑßÉáÃã;PM1PEÈ¿ÂãÌßÐÝÔÛÜÓÞÏàËäÁäÂàÌÞÐÚÔÖÜÐÞÊàÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PE;PM2FPPE=<eèITÀ;PM0PEÂãÌßÐÝÔÛÜÓÞÏàËäÁäÂàÌÞÐÚÔÖÜÐÞÊàÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PEÈ¿ÄáÈßÐÛÔÙÚÓÜÏàÇâÃâÄÞÈÞÐØÔÔÚÐÜÊàÄâÃâÉÞÏÞÓØ×ÔÝÐÝÊáÄáÃßÉÛÏÙÓÓ×ÏÝÇÝÃá;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<]èITÀ;PM0PEÄáÈßÐÛÔÙÚÓÜÏàÇâÃâÄÞÈÞÐØÔÔÚÐÜÊàÄâÃâÉÞÏÞÓØ×ÔÝÐÝÊáÄáÃßÉÛÏÙÓÓ×ÏÝÇÝÃá;PM1PEÆ¿ÄßÊÝÎÛÔ×ØÓÜÍÞÉàÃàÄÞÊÜÎØÔÒØÐÜÈÞÄàÃàÇÞÏÜÑØ×ÒÛÐÝÈßÄßÃÝÇÛÏ×ÑÓ×ÍÛÉÝÃß;PM1PE;PM2FPPE=<WèITÀ;PM0PEÄßÊÝÎÛÔ×ØÓÜÍÞÉàÃàÄÞÊÜÎØÔÒØÐÜÈÞÄàÃàÇÞÏÜÑØ×ÒÛÐÝÈßÄßÃÝÇÛÏ×ÑÓ×ÍÛÉÝÃß;PM1PEÈ¿ÄßÈÛÎÙÔÕÖÓÚÍÜÇàÃÞÄÞÈØÎØÔÒÖÐÚÈÜÄàÃÞÇÞÏØÑØ×Ò×ÐÝÈÝÄßÃÛÇÙÏÕÑÓ×Í×ÇÝÃÝ;PM1PE;PM2FPPE=<OèITÀ;PM0PEÄßÈÛÎÙÔÕÖÓÚÍÜÇàÃÞÄÞÈØÎØÔÒÖÐÚÈÜÄàÃÞÇÞÏØÑØ×Ò×ÐÝÈÝÄßÃÛÇÙÏÕÑÓ×Í×ÇÝÃÝ;PM1PEÈ¿ÂÝÊÙÎ×ÒÕÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÖÌØÊÚÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PE;PM2FPPE=<GèITÀ;PM0PEÂÝÊÙÎ×ÒÕÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÖÌØÊÚÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PEÈ¿ÂÛÈÙÎ×ÐÓÔÏØÍÚÇÜÁÜÂÚÈÖÎÔÐÒÔÌØÊÚÂÜÁÜÉÚËÖÑÔÓÒÕÌÙÊÛÂÛÁÙÉ×ËÓÑÏÓÍÕÇÙÁÛ;PM1PE;PM2FPPE=<?èITÀ;PM0PEÂÛÈÙÎ×ÐÓÔÏØÍÚÇÜÁÜÂÚÈÖÎÔÐÒÔÌØÊÚÂÜÁÜÉÚËÖÑÔÓÒÕÌÙÊÛÂÛÁÙÉ×ËÓÑÏÓÍÕÇÙÁÛ;PM1PEÆ¿ÄÙÈ×Ì×ÐÑÒÏØËØÇÚÃÚÄØÈÖÌÔÐÐÒÌØÈØÂÚÁÚÇØËÖÏÔÓÐÕÌ×ÈÙÂÙÁ×Ç×ËÑÏÏÓËÕÇ×ÃÙ;PM1PE;PM2FPPE=<yçITÀ;PM0PEÄÙÈ×Ì×ÐÑÒÏØËØÇÚÃÚÄØÈÖÌÔÐÐÒÌØÈØÂÚÁÚÇØËÖÏÔÓÐÕÌ×ÈÙÂÙÁ×Ç×ËÑÏÏÓËÕÇ×ÃÙ;PM1PEÊ¿Â×Æ×ÌÓÐÑÒÏÔËØÅØÁØÂØÆÔÌÒÐÎÒÌÔÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PE;PM2FPPE=<oçITÀ;PM0PEÂ×Æ×ÌÓÐÑÒÏÔËØÅØÁØÂØÆÔÌÒÐÎÒÌÔÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PEÆ¿Â×ÈÓÊÕÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÖÆÔÂØÁÖÅÖÉÔÍÒÑÎÓÊÕÆÕÂ×ÁÓÅÕÉÏÍÍÑÉÓÇÕÁÕ;PM1PE;PM2FPPE=<içITÀ;PM0PEÂ×ÈÓÊÕÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÖÆÔÂØÁÖÅÖÉÔÍÒÑÎÓÊÕÆÕÂ×ÁÓÅÕÉÏÍÍÑÉÓÇÕÁÕ;PM1PEÈ¿ÂÕÆÓÊÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÌÒÆÔÂÖÁÖÅÔËÒËÐÏÌÑÌÓÆÕÂÕÁÓÅÑËÏËÍÏÉÑÅÓÁÕ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<açITÀ;PM0PEÂÕÆÓÊÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÌÒÆÔÂÖÁÖÅÔËÒËÐÏÌÑÌÓÆÕÂÕÁÓÅÑËÏËÍÏÉÑÅÓÁÕ;PM1PEÈ¿ÂÓÆÑÈÑÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÒÆÒÄÔÃÒÅÔÇÐËÐÏÌÏÈÓÆÑÄÓÃÑÅÑÇÍËÍÏÇÏÅÓÁÑ;PM1PE;PM2FPPE=<YçITÀ;PM0PEÂÓÆÑÈÑÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÒÆÒÄÔÃÒÅÔÇÐËÐÏÌÏÈÓÆÑÄÓÃÑÅÑÇÍËÍÏÇÏÅÓÁÑ;PM1PEÈ¿ÂÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÒÂÒÄÐÈÌÌÌÎÈÐÆÒÂÒÁÒÅÒÇÐËÌËÌÏÈÑÆÑÂÑÁÑÅÏÇÍËËËÇÏÃÑÁÑ;PM1PE;PM2FPPE=<QçITÀ;PM0PEÂÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÒÂÒÄÐÈÌÌÌÎÈÐÆÒÂÒÁÒÅÒÇÐËÌËÌÏÈÑÆÑÂÑÁÑÅÏÇÍËËËÇÏÃÑÁÑ;PM1PEÈ¿¿ÑÆÍÈÏÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÐÆÎÂÒÁÐÅÐÅÎËÌËÌÍÆÏÆÏÂÑÁÍÅÏÅËËÉËÇÍÅÏ¿Ï;PM1PE;PM2FPPE=<IçITÀ;PM0PE¿ÑÆÍÈÏÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÐÆÎÂÒÁÐÅÐÅÎËÌËÌÍÆÏÆÏÂÑÁÍÅÏÅËËÉËÇÍÅÏ¿Ï;PM1PEÆ¿ÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÐÅÎÅÌÉÌËÊËÆÍÆÏ¿Ï¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PE;PM2FPPE=<CçITÀ;PM0PEÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÐÅÎÅÌÉÌËÊËÆÍÆÏ¿Ï¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PEÈ¿ÂÍÄÍÆÉÈËÌÇÊÅÎÃÎÁÎÂÎÄÊÆÊÈÊÌÆÊÄÎÂÎÁÎÃÎÅÊÉÊÉÊÉÆÍÄÍÂÍÁÍÃÉÅËÉÇÉÅÉÃÍÁÍ;PM1PE;PM2FPPE=<{æITÀ;PM0PEÂÍÄÍÆÉÈËÌÇÊÅÎÃÎÁÎÂÎÄÊÆÊÈÊÌÆÊÄÎÂÎÁÎÃÎÅÊÉÊÉÊÉÆÍÄÍÂÍÁÍÃÉÅËÉÇÉÅÉÃÍÁÍ;PM1PEÈ¿ÂËÄËÆÉÆÉÊÅÊÅÌÃÌÁÌÂÌÄÊÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÊÇÈÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÇÅÉÃËÁË;PM1PE;PM2FPPE=<sæITÀ;PM0PEÂËÄËÆÉÆÉÊÅÊÅÌÃÌÁÌÂÌÄÊÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÊÇÈÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÇÅÉÃËÁË;PM1PEÈ¿ÄÓÌÑÒËÔÃÔÄÐÌÌÒÆÔÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PE;PM2FPPE=<kæITÀ;PM0PEÄÓÌÑÒËÔÃÔÄÐÌÌÒÆÔÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PEÆ¿ÄÑÌÍÎËÒÃÒÄÎÌÊÎÄÒÃÒÉÎÍÊÑÄÑÃÍÉËÍÃÑ;PM1PE;PM2FPPE=<eæITÀ;PM0PEÄÑÌÍÎËÒÃÒÄÎÌÊÎÄÒÃÒÉÎÍÊÑÄÑÃÍÉËÍÃÑ;PM1PEÊ¿ÂÍÊËÌÉÎÁÎÂÌÊÈÌÄÎÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE;PM2FPPE=<[æITÀ;PM0PEÂÍÊËÌÉÎÁÎÂÌÊÈÌÄÎÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PEÆ¿ÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÊÉÆËÂËÁÉÅÇÉÁË;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<UæITÀ;PM0PEÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÊÉÆËÂËÁÉÅÇÉÁË;PM1PEÈ¿ÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÊÅÆÅÆÉÂÉÁÇÅÃÅÁÉ;PM1PE;PM2FPPE=<MæITÀ;PM0PEÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÊÅÆÅÆÉÂÉÁÇÅÃÅÁÉ;PM1PEÈ¿ÂÅÂÅÆÁÆÁÆÂÄÂÄÆÂÆÁÆÃÄÃÄÅÂÅÁÅÃÁÃÁÅ;PM1PE;PM2FPPE=<EæITÀ;PM0PEÂÅÂÅÆÁÆÁÆÂÄÂÄÆÂÆÁÆÃÄÃÄÅÂÅÁÅÃÁÃÁÅ;PM1PEÈ¿¿ÁÂÃÄÁ¿¿Ä¿ÄÂÂÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM1PE;PM2FPPE=<}åITÀ;PM0PE¿ÁÂÃÄÁ¿¿Ä¿ÄÂÂÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM2FPMC1,240PE=<gâkZÀ;PM0PEã¿áÁãÁá¿ã¿á¿ãÄãÄÕÆÑÊÏÌËÎËÒÉÐÉÒËÒÇÚÅÜÅÚÃÜÃÚÁÞÃÜ¿Ú¿Ü¿ÚÂÜÂÚÄÜÄÚÆØÆÚÌèÎìÎîÌêÎêÌâÊØÈÎèÄÞÂÚÂØ¿ØÁÜÃàÃêÅÎûÊõÊïÈëÆåÆãÄßÄÛÂÛÂÙÄ×ÂÙÂ×ÄÛÂÛÄÝÂá¿ãÁã¿ãÃãÃáÅÝÇÛ;PM2FTFPMC1,90PE=<]íITÀ;PM0PEÂñÆïÌïÒëÔëÚåÚçàáâßèÙæÙìÓìÑðËðÅòÁðÂòÆîÌîÒêÔèÚæÚâààâÜèÚæÔìÐìÌðÈðÂòÁðÇòËîÏîÓêÙèÛæßâáàåÜçØéÖíÐíÌñÈïÂñÁïÇïËëÏëÕå×çÛáßßáÙåÙçÓéÑíËíÅñÁï;PM1PEÆ¿ÂñÈïÌíÐëÔéÚçÚãàáâßäÙèÙêÓìÏîËðÇòÁðÂðÈîÌìÐêÔèÚæÚâàÞâÜäÚèÒêÒìÌîÆðÂòÁðÅðËîÑìÑêÙèÛæÝâáÞåÜçØéÔëÐíÌïÈïÂñÁïÇíËëÏéÓç×ãÛáÝßáÙåÙçÓéÏëËíÇïÁï;PM1PE;PM2FT11,2FPPE=<WíITÀ;PM0PEÂñÈïÌíÐëÔéÚçÚãàáâßäÙèÙêÓìÏîËðÇòÁðÂðÈîÌìÐêÔèÚæÚâàÞâÜäÚèÒêÒìÌîÆðÂòÁðÅðËîÑìÑêÙèÛæÝâáÞåÜçØéÔëÐíÌïÈïÂñÁïÇíËëÏéÓç×ãÛáÝßáÙåÙçÓéÏëËíÇïÁï;PM1PEÈ¿ÂïÈïÌëÎíÖçÖçÜãÞáâÝäÛèÕèÕîÍìËðÇðÁðÂðÈìÌìÎêÖæÖäÜâÞàâÚäØèÔèÐîÌìÈðÂðÁðÇðËìÏìÓê×æÙäßâáàãÚåØéÔëÐëÌïÆïÄïÃïÅëËíÏçÓç×ãÙáßÝáÛãÕåÕéÍëËëÇïÁï;PM1PE;PM2FPPE=<OíITÀ;PM0PEÂïÈïÌëÎíÖçÖçÜãÞáâÝäÛèÕèÕîÍìËðÇðÁðÂðÈìÌìÎêÖæÖäÜâÞàâÚäØèÔèÐîÌìÈðÂðÁðÇðËìÏìÓê×æÙäßâáàãÚåØéÔëÐëÌïÆïÄïÃïÅëËíÏçÓç×ãÙáßÝáÛãÕåÕéÍëËëÇïÁï;PM1PEÈ¿ÂïÈíÊëÒëÒçØåÚãÞáâÝäÙæ×èÑìÑìÉîÇðÁðÂîÈìÊêÒêÒæØäÚàÞÞâÜäÖæÔèÐìÌìÆîÄðÃðÅîËìÏêÓêÕæÛäÝàßÞãÜåÖéÔéÐëÌíÆïÂïÁíÅëËëÏçÓåÕãÛáÝÝßÙã×åÑéÑéÉëÇíÁï;PM1PE;PM2FPPE=<GíITÀ;PM0PEÂïÈíÊëÒëÒçØåÚãÞáâÝäÙæ×èÑìÑìÉîÇðÁðÂîÈìÊêÒêÒæØäÚàÞÞâÜäÖæÔèÐìÌìÆîÄðÃðÅîËìÏêÓêÕæÛäÝàßÞãÜåÖéÔéÐëÌíÆïÂïÁíÅëËëÏçÓåÕãÛáÝÝßÙã×åÑéÑéÉëÇíÁï;PM1PEÈ¿ÂïÆëÌëÐéÒçØåÚãÞßàÝäÙæ×èÑêÏìËìÅðÁîÂîÆìÌêÐèÒæØäÚàÞÜàÜäÖæÔèÐêÊìÈìÂðÁîÇîÉìÏêÓèÕæÛäÛàßÜãÜåÖçÔéÐëÊíÈíÂïÁëÇëÉéÏçÓåÕãÛßÛÝßÙã×åÑçÏéËëÅíÁí;PM1PE;PM2FPPE=<?íITÀ;PM0PEÂïÆëÌëÐéÒçØåÚãÞßàÝäÙæ×èÑêÏìËìÅðÁîÂîÆìÌêÐèÒæØäÚàÞÜàÜäÖæÔèÐêÊìÈìÂðÁîÇîÉìÏêÓèÕæÛäÛàßÜãÜåÖçÔéÐëÊíÈíÂïÁëÇëÉéÏçÓåÕãÛßÛÝßÙã×åÑçÏéËëÅíÁí;PM1PEÆ¿ÂíÈíÊéÐéÔçÖãÚãÜßàÛäÙäÕèÓêÏêÉîÇîÁîÂìÈìÊèÐèÔæÖâÚàÜÞàÚäÖäÒèÐêÌêÆîÂîÁîÅìËìÏèÑèÕæÙâÝàßÞáÚåÖçÒçÐëÊëÈíÂíÁíÇéÉéÏçÑãÕãÙßÝÛßÙáÕåÓçÏçÉëÇëÁí;PM1PE;PM2FPPE=<yìITÀ;PM0PEÂíÈíÊéÐéÔçÖãÚãÜßàÛäÙäÕèÓêÏêÉîÇîÁîÂìÈìÊèÐèÔæÖâÚàÜÞàÚäÖäÒèÐêÌêÆîÂîÁîÅìËìÏèÑèÕæÙâÝàßÞáÚåÖçÒçÐëÊëÈíÂíÁíÇéÉéÏçÑãÕãÙßÝÛßÙáÕåÓçÏçÉëÇëÁí;PM1PEÈ¿ÄíÆëÌéÎçÒçÖãÚáÜßàÛâÙäÕèÑèÍêËìÅîÃîÄêÆêÌêÎæÒäÖâÚàÜÜàÚâÖäÔèÎèÊêÈìÂîÁîÇêÉêÍêÓæÕäÙâÛàßÜáÚãÖåÔéÎéÊéÈíÂíÁëÇéÉçÍçÓãÕáÙßÛÛßÙáÕãÑåÍéËéÅéÃí;PM1PE;PM2FPPE=<qìITÀ;PM0PEÄíÆëÌéÎçÒçÖãÚáÜßàÛâÙäÕèÑèÍêËìÅîÃîÄêÆêÌêÎæÒäÖâÚàÜÜàÚâÖäÔèÎèÊêÈìÂîÁîÇêÉêÍêÓæÕäÙâÛàßÜáÚãÖåÔéÎéÊéÈíÂíÁëÇéÉçÍçÓãÕáÙßÛÛßÙáÕãÑåÍéËéÅéÃí;PM1PEÈ¿ÂëÆëÌéÎçÒåÖãÚáÜÝÞÛâÙäÕæÑèÍêËìÅìÁìÂìÆêÌæÎèÒäÖàÚÞÜÞÞØâÖäÒæÐèÊêÆìÄìÃìÅìÉêÏæÑèÕä×àÝÞÝÞßØãÖçÒåÐéÊëÆëÂëÁëÅéÉçÏåÑãÕá×ÝÝÛÝÙßÕãÑçÍåËéÅëÁë;PM1PE;PM2FPPE=<iìITÀ;PM0PEÂëÆëÌéÎçÒåÖãÚáÜÝÞÛâÙäÕæÑèÍêËìÅìÁìÂìÆêÌæÎèÒäÖàÚÞÜÞÞØâÖäÒæÐèÊêÆìÄìÃìÅìÉêÏæÑèÕä×àÝÞÝÞßØãÖçÒåÐéÊëÆëÂëÁëÅéÉçÏåÑãÕá×ÝÝÛÝÙßÕãÑçÍåËéÅëÁë;PM1PEÈ¿ÂëÆéÊéÎçÒãÖãÚßÜÝÞÛàÙäÕäÑèÍêÉêÅìÁêÂìÆèÊèÎæÒäÖàÚÞÜÜÞØàÖäÒäÎèÌêÆêÂìÁêÅìËèÍèÑæÕä×àÛÞÝÜßØãÖåÒçÎçÌëÆéÂëÁéÅéËçÍãÑãÕß×ÝÛÛÝÙßÕãÑåÍçÉçÅëÁé;PM1PE;PM2FPPE=<aìITÀ;PM0PEÂëÆéÊéÎçÒãÖãÚßÜÝÞÛàÙäÕäÑèÍêÉêÅìÁêÂìÆèÊèÎæÒäÖàÚÞÜÜÞØàÖäÒäÎèÌêÆêÂìÁêÅìËèÍèÑæÕä×àÛÞÝÜßØãÖåÒçÎçÌëÆéÂëÁéÅéËçÍãÑãÕß×ÝÛÛÝÙßÕãÑåÍçÉçÅëÁé;PM1PEÈ¿ÂëÆçÊéÐåÐãÖãØßÜÛÜÛà×äÕäÏæÏêÉèÅìÁêÂêÆèÊæÐæÐâÖâØÜÜÜÜØàÖäÐäÎæÌêÆèÂìÁêÅêËèÍæÏæÕâ×âÛÜÛÜáØáÖåÐåÎçÊéÆéÄëÃçÅéÉåÍãÏãÕß×ÛÛÛÛ×áÕáÏåÏåÉçÅéÁé;PM1PE;PM2FT11,3FPPE=<YìITÀ;PM0PEÂëÆçÊéÐåÐãÖãØßÜÛÜÛà×äÕäÏæÏêÉèÅìÁêÂêÆèÊæÐæÐâÖâØÜÜÜÜØàÖäÐäÎæÌêÆèÂìÁêÅêËèÍæÏæÕâ×âÛÜÛÜáØáÖåÐåÎçÊéÆéÄëÃçÅéÉåÍãÏãÕß×ÛÛÛÛ×áÕáÏåÏåÉçÅéÁé;PM1PEÆ¿ÄéÆéÊåÎåÒåÔßØßÚÝÞÙà×àÓæÑæÍæÉêÅêÃêÄèÆèÊæÎäÒâÔàØÞÚÚÞØàÔàÒæÎæÊæÆêÂêÁêÅèÉèÍæÑäÓâ×àÙÞÝÚßØáÔãÒåÎçÊçÆéÂéÁéÅåÉåÍåÑßÓß×ÝÙÙÝ×ßÓáÑãÍåÉçÅçÃé;PM1PE;PM2FPPE=<SìITÀ;PM0PEÄéÆéÊåÎåÒåÔßØßÚÝÞÙà×àÓæÑæÍæÉêÅêÃêÄèÆèÊæÎäÒâÔàØÞÚÚÞØàÔàÒæÎæÊæÆêÂêÁêÅèÉèÍæÑäÓâ×àÙÞÝÚßØáÔãÒåÎçÊçÆéÂéÁéÅåÉåÍåÑßÓß×ÝÙÙÝ×ßÓáÑãÍåÉçÅçÃé;PM1PEÈ¿ÂéÆçÊåÎåÒãÔáÖÝÚÝÞÙÞÕâÓäÑæÍæÉèÅêÁèÂêÆæÊäÎäÒâÔàÖÜÚÚÞØÞÔâÐäÐæÈæÆèÄêÃèÅêÇæÏäÏäÓâ×àÙÜÛÚßØáÔãÐãÐåÈéÆçÂéÁçÅåÇåÏãÏáÓÝ×ÝÙÙÛÕßÓáÑãÍãÉåÅéÁç;PM1PE;PM2FPPE=<KìITÀ;PM0PEÂéÆçÊåÎåÒãÔáÖÝÚÝÞÙÞÕâÓäÑæÍæÉèÅêÁèÂêÆæÊäÎäÒâÔàÖÜÚÚÞØÞÔâÐäÐæÈæÆèÄêÃèÅêÇæÏäÏäÓâ×àÙÜÛÚßØáÔãÐãÐåÈéÆçÂéÁçÅåÇåÏãÏáÓÝ×ÝÙÙÛÕßÓáÑãÍãÉåÅéÁç;PM1PEÈ¿ÂéÆåÊåÎåÐßÔáØÝØÝÞ×Þ×âÓàÏæÍæÉæÅêÁèÂæÆèÊäÎâÐâÔÞØÜØÚÞÖÞÔâÒàÌæÊæÆæÂêÁèÅæÉèËäÑâÓâÕÞÙÜÛÚÝÖáÔáÒãÌçÊåÆçÂéÁåÅåÉåËßÑáÓÝÕÝÙ×Û×ÝÓáÏáÍãÉçÅåÁç;PM1PE;PM2FPPE=<CìITÀ;PM0PEÂéÆåÊåÎåÐßÔáØÝØÝÞ×Þ×âÓàÏæÍæÉæÅêÁèÂæÆèÊäÎâÐâÔÞØÜØÚÞÖÞÔâÒàÌæÊæÆæÂêÁèÅæÉèËäÑâÓâÕÞÙÜÛÚÝÖáÔáÒãÌçÊåÆçÂéÁåÅåÉåËßÑáÓÝÕÝÙ×Û×ÝÓáÏáÍãÉçÅåÁç;PM1PEÈ¿ÂçÆåÊåÌãÐáÔßÖÝÚÛÜÙÞÕàÓâÏäËæÉæÅèÁèÂæÆäÊäÌäÐÞÔàÖÜÚØÜÖÞÔàÐâÎäÊæÆæÂèÁèÅæÉäÍäÏäÓÞÕà×ÜÛØßÖÝÔãÐãÎãÊåÆçÂçÁåÅåÉãÍáÏßÓÝÕÛ×ÙÛÕßÓÝÏãËãÉãÅåÁç;PM1PE;PM2FPPE=<{ëITÀ;PM0PEÂçÆåÊåÌãÐáÔßÖÝÚÛÜÙÞÕàÓâÏäËæÉæÅèÁèÂæÆäÊäÌäÐÞÔàÖÜÚØÜÖÞÔàÐâÎäÊæÆæÂèÁèÅæÉäÍäÏäÓÞÕà×ÜÛØßÖÝÔãÐãÎãÊåÆçÂçÁåÅåÉãÍáÏßÓÝÕÛ×ÙÛÕßÓÝÏãËãÉãÅåÁç;PM1PEÈ¿ÂåÆçÈãÎãÐßÒßØÛØÛÜ×Ü×àÑàÏäÍäÇèÅæÁæÂæÆäÈäÎàÐâÒÜØÜØØÜÖÜÒàÒàÌäÊäÄèÄæÃæÃæÉäËäÑàÑâÕÜ×ÜÛØÛÖáÒßÒãÌãÊåÄåÄåÃçÃãÉãËßÑßÑÛÕÛ××Û×ÛÑáÏßÍãÇãÅåÁå;PM1PE;PM2FPPE=<sëITÀ;PM0PEÂåÆçÈãÎãÐßÒßØÛØÛÜ×Ü×àÑàÏäÍäÇèÅæÁæÂæÆäÈäÎàÐâÒÜØÜØØÜÖÜÒàÒàÌäÊäÄèÄæÃæÃæÉäËäÑàÑâÕÜ×ÜÛØÛÖáÒßÒãÌãÊåÄåÄåÃçÃãÉãËßÑßÑÛÕÛ××Û×ÛÑáÏßÍãÇãÅåÁå;PM1PEÈ¿ÂåÄåÊãÎáÎáÒÝÖÛØÛÜ×ÜÕÞÑâÍâÍäÉæÃæÁæÂæÄäÊàÎâÎÞÒÞÖÚØØÜÖÜÒÞÐâÎâÈäÆæÂæÁæÅæÇäÍàÏâÑÞÕÞ×ÚÙØÝÖÝÒáÐßÎãÈåÆåÂåÁåÅãÇáÍáÏÝÑÛÕÛ××ÙÕÝÑÝÍáÍßÉãÃåÁå;PM1PE;PM2FPPE=<këITÀ;PM0PEÂåÄåÊãÎáÎáÒÝÖÛØÛÜ×ÜÕÞÑâÍâÍäÉæÃæÁæÂæÄäÊàÎâÎÞÒÞÖÚØØÜÖÜÒÞÐâÎâÈäÆæÂæÁæÅæÇäÍàÏâÑÞÕÞ×ÚÙØÝÖÝÒáÐßÎãÈåÆåÂåÁåÅãÇáÍáÏÝÑÛÕÛ××ÙÕÝÑÝÍáÍßÉãÃåÁå;PM1PEÆ¿ÂåÆãÊãÌáÎÝÔßÔÛØÙÚ×ÜÓàÓÞÍâËäÉäÅæÁäÂäÆäÊâÌàÎÞÔÜÔÚØØÚÖÜÒàÐÞÌâÊäÄäÂæÁäÃäÉäËâÏàÑÞÕÜ×ÚÙØÛÖÝÒßÐáÌãÊãÄãÂåÁãÃãÉáËÝÏßÑÛÕÙ××ÙÓÛÓÝÍßËáÉãÅãÁã;PM1PE;PM2FPPE=<eëITÀ;PM0PEÂåÆãÊãÌáÎÝÔßÔÛØÙÚ×ÜÓàÓÞÍâËäÉäÅæÁäÂäÆäÊâÌàÎÞÔÜÔÚØØÚÖÜÒàÐÞÌâÊäÄäÂæÁäÃäÉäËâÏàÑÞÕÜ×ÚÙØÛÖÝÒßÐáÌãÊãÄãÂåÁãÃãÉáËÝÏßÑÛÕÙ××ÙÓÛÓÝÍßËáÉãÅãÁã;PM1PEÈ¿ÄåÄáÈãÎßÎÝÒÝÔÛØÙÚ×ÜÓÞÑÞÍàÍäÇâÃæÃäÄäÄâÈàÎàÎÞÒÜÔØØØÚÖÜÒÞÎÞÌàÊäÄâÂæÁäÃäÉâËàÍàÑÞÕÜ×Ø×ØÛÖÝÒßÎßÌáÊãÄãÂåÁáÃãÉßËÝÍÝÑÛÕÙ×××ÓÛÑÝÍßÍßÇáÃãÃã;PM1PE;PM2FT11,4FPPE=<]ëITÀ;PM0PEÄåÄáÈãÎßÎÝÒÝÔÛØÙÚ×ÜÓÞÑÞÍàÍäÇâÃæÃäÄäÄâÈàÎàÎÞÒÜÔØØØÚÖÜÒÞÎÞÌàÊäÄâÂæÁäÃäÉâËàÍàÑÞÕÜ×Ø×ØÛÖÝÒßÎßÌáÊãÄãÂåÁáÃãÉßËÝÍÝÑÛÕÙ×××ÓÛÑÝÍßÍßÇáÃãÃã;PM1PEÈ¿ÂãÆãÈßÌáÐÝÐÛÔÛØ×Ø×ÜÓÜÏÞÏâËàÇäÅäÁäÂâÆâÈàÌÞÐÞÐÚÔÚØÖØÖÜÐÜÐÞÌâÈàÄäÄäÃäÃâÇâËàÏÞÏÞÕÚÕÚÙÖÙÖÝÐÝÐßÌáÈáÄãÄãÃãÃßÇáËÝÏÛÏÛÕ×Õ×ÙÓÙÏÝÏÝËßÇáÅáÁã;PM1PE;PM2FPPE=<UëITÀ;PM0PEÂãÆãÈßÌáÐÝÐÛÔÛØ×Ø×ÜÓÜÏÞÏâËàÇäÅäÁäÂâÆâÈàÌÞÐÞÐÚÔÚØÖØÖÜÐÜÐÞÌâÈàÄäÄäÃäÃâÇâËàÏÞÏÞÕÚÕÚÙÖÙÖÝÐÝÐßÌáÈáÄãÄãÃãÃßÇáËÝÏÛÏÛÕ×Õ×ÙÓÙÏÝÏÝËßÇáÅáÁã;PM1PEÈ¿¿ãÆáÈßÌßÐÝÐÛÔÙÖÙÚÕÚÓÜÏÞÏàËàÇâÅä¿â¿äÆàÈÞÌàÐÜÐÚÔÚÖÔÚÖÚÐÜÎÞÌàÈàÆâÂäÁâÅäÇàËÞÍàÏÜÕÚÓÚÙÔÙÖÛÐßÎÝÌßÈãÆáÂãÁáÅßÇßËÝÍÛÏÙÕÙÓÕÙÓÙÏÛÏßËÝÇßÅã¿á;PM1PE;PM2FPPE=<MëITÀ;PM0PE¿ãÆáÈßÌßÐÝÐÛÔÙÖÙÚÕÚÓÜÏÞÏàËàÇâÅä¿â¿äÆàÈÞÌàÐÜÐÚÔÚÖÔÚÖÚÐÜÎÞÌàÈàÆâÂäÁâÅäÇàËÞÍàÏÜÕÚÓÚÙÔÙÖÛÐßÎÝÌßÈãÆáÂãÁáÅßÇßËÝÍÛÏÙÕÙÓÕÙÓÙÏÛÏßËÝÇßÅã¿á;PM1PEÈ¿¿ãÆßÊßÊßÎÛÒÛÒÙÖ×ØÕÚÑÜÑÜÍàÉàÉàÅä¿â¿àÆâÊÞÊÞÎÚÒÜÒØÖÔØÔÚÐÜÐÜÊàÈàÆàÂäÁâÅàÇâÉÞÏÞÏÚÓÜÓØ×ÔÛÔÙÐÝÐÝÊáÈßÆáÂãÁßÅßÇßÉÛÏÛÏÙÓ×ÓÕ×ÑÛÑÙÍÝÉÝÉáÅß¿á;PM1PE;PM2FPPE=<EëITÀ;PM0PE¿ãÆßÊßÊßÎÛÒÛÒÙÖ×ØÕÚÑÜÑÜÍàÉàÉàÅä¿â¿àÆâÊÞÊÞÎÚÒÜÒØÖÔØÔÚÐÜÐÜÊàÈàÆàÂäÁâÅàÇâÉÞÏÞÏÚÓÜÓØ×ÔÛÔÙÐÝÐÝÊáÈßÆáÂãÁßÅßÇßÉÛÏÛÏÙÓ×ÓÕ×ÑÛÑÙÍÝÉÝÉáÅß¿á;PM1PEÆ¿ÂáÆßÈßÌÝÌÛÒÛÒÙÔ×ØÓÚÑÜÑÜËÞËàÇàÅâÁâÂàÆÞÈàÌÜÌÜÒØÒØÔÔØÔÚÐÜÎÜÌÞÈàÆà¿â¿âÅàÇÞËàÍÜÏÜÓØÓØ×Ô×ÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÛÍÛÏÙÓ×ÓÓ×Ñ×ÑÛËÛËßÇÝÅßÁá;PM1PE;PM2FPPE=<?ëITÀ;PM0PEÂáÆßÈßÌÝÌÛÒÛÒÙÔ×ØÓÚÑÜÑÜËÞËàÇàÅâÁâÂàÆÞÈàÌÜÌÜÒØÒØÔÔØÔÚÐÜÎÜÌÞÈàÆà¿â¿âÅàÇÞËàÍÜÏÜÓØÓØ×Ô×ÔÛÐÛÎßÌÝÈßÆá¿á¿ßÅßÇÝËÛÍÛÏÙÓ×ÓÓ×Ñ×ÑÛËÛËßÇÝÅßÁá;PM1PEÈ¿ÂßÄáÈÝÌÝÌÛÒÙÒ×Ô×ØÓØÑÚÑÜËÞËÞÇâÃàÁàÂàÄàÈÜÌÞÌÚÒØÒÖÔÖØÒØÐÚÎÜÊÞÊÞÄâÂàÁàÃàÉàÉÜÍÞÏÚÑØÕÖÕÖ×ÒÙÐÝÎÛÊßÊßÄßÂßÁáÃÝÉÝÉÛÍÙÏ×Ñ×ÕÓÕÑ×ÑÙËÝËÛÇßÃßÁß;PM1PE;PM2FPPE=<wêITÀ;PM0PEÂßÄáÈÝÌÝÌÛÒÙÒ×Ô×ØÓØÑÚÑÜËÞËÞÇâÃàÁàÂàÄàÈÜÌÞÌÚÒØÒÖÔÖØÒØÐÚÎÜÊÞÊÞÄâÂàÁàÃàÉàÉÜÍÞÏÚÑØÕÖÕÖ×ÒÙÐÝÎÛÊßÊßÄßÂßÁáÃÝÉÝÉÛÍÙÏ×Ñ×ÕÓÕÑ×ÑÙËÝËÛÇßÃßÁß;PM1PEÈ¿Æ?ÀÔùÜõæíîåöÛúÓ@ÀÅ@ÀÆúÔôÜîææîÞöÒúÆ@ÀÅ@ÀÑúÝôåîíæóÞùÒ?ÀÆ?ÀÅùÑõÝíååíÛóÓùÅ?À;PM1PE;PM2FPPE=<oêITÀ;PM0PEÆ?ÀÔùÜõæíîåöÛúÓ@ÀÅ@ÀÆúÔôÜîææîÞöÒúÆ@ÀÅ@ÀÑúÝôåîíæóÞùÒ?ÀÆ?ÀÅùÑõÝíååíÛóÓùÅ?À;PM1PEÈ¿ÆýÒùÜñæíîåòÛúÑþÅüÆúÒôÜîæäîÞòÒúÆþÅüÑúÝôãîíäóÞùÒûÆýÅùÑñÝíãåíÛóÑùÅû;PM1PE;PM2FPPE=<gêITÀ;PM0PEÆýÒùÜñæíîåòÛúÑþÅüÆúÒôÜîæäîÞòÒúÆþÅüÑúÝôãîíäóÞùÒûÆýÅùÑñÝíãåíÛóÑùÅû;PM1PEÆ¿ÆûÒ÷ÜóäëìãôÛøÑüÅüÆøÒòÜìääìÜôÒøÆüÅüÑøÛòãìëäñÜ÷ÒûÆûÅ÷ÑóÛëããëÛñÑ÷Åû;PM1PE;PM2FPPE=<aêITÀ;PM0PEÆûÒ÷ÜóäëìãôÛøÑüÅüÆøÒòÜìääìÜôÒøÆüÅüÑøÛòãìëäñÜ÷ÒûÆûÅ÷ÑóÛëããëÛñÑ÷Åû;PM1PEÊ¿ÆûÐõÜïâëìáðÛöÏüÅúÆöÐòÜêâäìÜðÐöÆüÅúÏöÛòãêéäñÜõÐùÆûÅõÏïÛëãáéÛñÏõÅù;PM1PE;PM2FT11,5FPPE=<WêITÀ;PM0PEÆûÐõÜïâëìáðÛöÏüÅúÆöÐòÜêâäìÜðÐöÆüÅúÏöÛòãêéäñÜõÐùÆûÅõÏïÛëãáéÛñÏõÅù;PM1PEÆ¿Æ÷ÒõØïäéêãð×öÑøÅøÆöÒðØêäâêÚðÐöÆøÅøÏöÙðáêéâïÚõÐ÷Æ÷ÅõÏïÙéáãé×ïÑõÅ÷;PM1PE;PM2FPPE=<QêITÀ;PM0PEÆ÷ÒõØïäéêãð×öÑøÅøÆöÒðØêäâêÚðÐöÆøÅøÏöÙðáêéâïÚõÐ÷Æ÷ÅõÏïÙéáãé×ïÑõÅ÷;PM1PEÈ¿Æ÷ÐóÚíâçèáîÙôÏøÅöÆôÐðÚèââèØîÐôÆøÅöÏô×ðáèçâïØóÐõÆ÷ÅóÏí×çááçÙïÏóÅõ;PM1PE;PM2FPPE=<IêITÀ;PM0PEÆ÷ÐóÚíâçèáîÙôÏøÅöÆôÐðÚèââèØîÐôÆøÅöÏô×ðáèçâïØóÐõÆ÷ÅóÏí×çááçÙïÏóÅõ;PM1PEÈ¿ÆõÐñØíàçèßî×òÏöÅöÆòÐîØèààèØîÐòÆöÅöÏò×îßèçàíØñÐõÆõÅñÏí×çßßç×íÏñÅõ;PM1PE;PM2FPPE=<AêITÀ;PM0PEÆõÐñØíàçèßî×òÏöÅöÆòÐîØèààèØîÐòÆöÅöÏò×îßèçàíØñÐõÆõÅñÏí×çßßç×íÏñÅõ;PM1PEÈ¿ÄóÐñØëàåæßì×òÏôÃôÄðÐìØèààæØìÐòÄôÃôÏð×ìßèçàëØïÐóÄóÃñÏë×åßßç×ëÏïÃó;PM1PE;PM2FPPE=<yéITÀ;PM0PEÄóÐñØëàåæßì×òÏôÃôÄðÐìØèààæØìÐòÄôÃôÏð×ìßèçàëØïÐóÄóÃñÏë×åßßç×ëÏïÃó;PM1PEÈ¿ÄñÐïÖéàåæßêÕðÏòÃòÄîÐìÖæàÞæØêÎðÆòÅòÍî×ìÝæåÞëØíÎñÆñÅïÍé×åÝßåÕëÏíÃñ;PM1PE;PM2FPPE=<qéITÀ;PM0PEÄñÐïÖéàåæßêÕðÏòÃòÄîÐìÖæàÞæØêÎðÆòÅòÍî×ìÝæåÞëØíÎñÆñÅïÍé×åÝßåÕëÏíÃñ;PM1PEÆ¿ÆñÎíÖéÞãäÝêÕîÍòÅðÆîÎêÖäÞÞäØêÎîÄòÃðÍî×êÝäãÞéØíÎïÄñÃíÍé×ãÝÝãÕéÍíÅï;PM1PE;PM2FPPE=<kéITÀ;PM0PEÆñÎíÖéÞãäÝêÕîÍòÅðÆîÎêÖäÞÞäØêÎîÄòÃðÍî×êÝäãÞéØíÎïÄñÃíÍé×ãÝÝãÕéÍíÅï;PM1PEÈ¿ÄïÐëÔéÞáâÝêÓìÏðÃðÄìÐèÔäÞÜâÖêÎìÆðÅðÍìÕèÛäãÜçÖëÎïÆïÅëÍéÕáÛÝãÓçÏëÃï;PM1PE;PM2FPPE=<céITÀ;PM0PEÄïÐëÔéÞáâÝêÓìÏðÃðÄìÐèÔäÞÜâÖêÎìÆðÅðÍìÕèÛäãÜçÖëÎïÆïÅëÍéÕáÛÝãÓçÏëÃï;PM1PEÈ¿ÆíÌëÖåÜáâÛæÕìËîÅîÆêÌèÖâÜÜâÔæÎìÄîÃîÍêÓèÛâáÜçÔéÎíÄíÃëÍåÓáÛÛáÕçËéÅí;PM1PE;PM2FT11,6FPPE=<[éITÀ;PM0PEÆíÌëÖåÜáâÛæÕìËîÅîÆêÌèÖâÜÜâÔæÎìÄîÃîÍêÓèÛâáÜçÔéÎíÄíÃëÍåÓáÛÛáÕçËéÅí;PM1PEÈ¿ÄëÎéÔåÚáâÙæÓêÍìÃìÄêÎæÔàÚÜâÔæÌêÆìÅìËêÓæÛàßÜåÔéÌëÆëÅéËåÓáÛÙßÓåÍéÃë;PM1PE;PM2FPPE=<SéITÀ;PM0PEÄëÎéÔåÚáâÙæÓêÍìÃìÄêÎæÔàÚÜâÔæÌêÆìÅìËêÓæÛàßÜåÔéÌëÆëÅéËåÓáÛÙßÓåÍéÃë;PM1PEÆ¿ÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÜåÔçÌéÄëÃçËãÓßÛÙÝÓåËçÅé;PM1PE;PM2FPPE=<MéITÀ;PM0PEÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÜåÔçÌéÄëÃçËãÓßÛÙÝÓåËçÅé;PM1PEÊ¿ÄéÌåÔãØÝÞ×äÓæËêÃèÄèÌâÔÞØÚÞÔäÌæÄêÃèËèÓâÙÞÝÚáÔçÌçÄéÃåËãÓÝÙ×ÝÓáËçÃç;PM1PE;PM2FPPE=<CéITÀ;PM0PEÄéÌåÔãØÝÞ×äÓæËêÃèÄèÌâÔÞØÚÞÔäÌæÄêÃèËèÓâÙÞÝÚáÔçÌçÄéÃåËãÓÝÙ×ÝÓáËçÃç;PM1PEÆ¿ÄçÌåÔáØÛÜ×âÓæËèÃèÄäÌäÔÜØØÜÔâÌæÂèÁèËäÓä×ÜÛØãÔãÌçÂçÁåËáÓÛ××ÛÓãËãÃç;PM1PE;PM2FPPE=<}èITÀ;PM0PEÄçÌåÔáØÛÜ×âÓæËèÃèÄäÌäÔÜØØÜÔâÌæÂèÁèËäÓä×ÜÛØãÔãÌçÂçÁåËáÓÛ××ÛÓãËãÃç;PM1PEÈ¿ÄåÌãÒáØÙÚ×âÑäËæÃæÄäÌàÒÜØØÚÐâÌäÄæÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PE;PM2FPPE=<uèITÀ;PM0PEÄåÌãÒáØÙÚ×âÑäËæÃæÄäÌàÒÜØØÚÐâÌäÄæÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PEÈ¿ÄåÊáÒÝÖÛÜÕÞÑâÉæÃäÄâÊàÒÜÖÖÜÐÞÌâÄæÃäËâÏàÕÜÛÖßÐáÌãÄåÃáËÝÏÛÕÕÛÑßÉáÃã;PM1PE;PM2FPPE=<mèITÀ;PM0PEÄåÊáÒÝÖÛÜÕÞÑâÉæÃäÄâÊàÒÜÖÖÜÐÞÌâÄæÃäËâÏàÕÜÛÖßÐáÌãÄåÃáËÝÏÛÕÕÛÑßÉáÃã;PM1PEÈ¿ÂãÌßÐÝÔÛÜÓÞÏàËäÁäÂàÌÞÐÚÔÖÜÐÞÊàÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PE;PM2FPPE=<eèITÀ;PM0PEÂãÌßÐÝÔÛÜÓÞÏàËäÁäÂàÌÞÐÚÔÖÜÐÞÊàÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PEÈ¿ÄáÈßÐÛÔÙÚÓÜÏàÇâÃâÄÞÈÞÐØÔÔÚÐÜÊàÄâÃâÉÞÏÞÓØ×ÔÝÐÝÊáÄáÃßÉÛÏÙÓÓ×ÏÝÇÝÃá;PM1PE;PM2FT11,7FPPE=<]èITÀ;PM0PEÄáÈßÐÛÔÙÚÓÜÏàÇâÃâÄÞÈÞÐØÔÔÚÐÜÊàÄâÃâÉÞÏÞÓØ×ÔÝÐÝÊáÄáÃßÉÛÏÙÓÓ×ÏÝÇÝÃá;PM1PEÆ¿ÄßÊÝÎÛÔ×ØÓÜÍÞÉàÃàÄÞÊÜÎØÔÒØÐÜÈÞÄàÃàÇÞÏÜÑØ×ÒÛÐÝÈßÄßÃÝÇÛÏ×ÑÓ×ÍÛÉÝÃß;PM1PE;PM2FPPE=<WèITÀ;PM0PEÄßÊÝÎÛÔ×ØÓÜÍÞÉàÃàÄÞÊÜÎØÔÒØÐÜÈÞÄàÃàÇÞÏÜÑØ×ÒÛÐÝÈßÄßÃÝÇÛÏ×ÑÓ×ÍÛÉÝÃß;PM1PEÈ¿ÄßÈÛÎÙÔÕÖÓÚÍÜÇàÃÞÄÞÈØÎØÔÒÖÐÚÈÜÄàÃÞÇÞÏØÑØ×Ò×ÐÝÈÝÄßÃÛÇÙÏÕÑÓ×Í×ÇÝÃÝ;PM1PE;PM2FPPE=<OèITÀ;PM0PEÄßÈÛÎÙÔÕÖÓÚÍÜÇàÃÞÄÞÈØÎØÔÒÖÐÚÈÜÄàÃÞÇÞÏØÑØ×Ò×ÐÝÈÝÄßÃÛÇÙÏÕÑÓ×Í×ÇÝÃÝ;PM1PEÈ¿ÂÝÊÙÎ×ÒÕÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÖÌØÊÚÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PE;PM2FPPE=<GèITÀ;PM0PEÂÝÊÙÎ×ÒÕÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÖÌØÊÚÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PEÈ¿ÂÛÈÙÎ×ÐÓÔÏØÍÚÇÜÁÜÂÚÈÖÎÔÐÒÔÌØÊÚÂÜÁÜÉÚËÖÑÔÓÒÕÌÙÊÛÂÛÁÙÉ×ËÓÑÏÓÍÕÇÙÁÛ;PM1PE;PM2FPPE=<?èITÀ;PM0PEÂÛÈÙÎ×ÐÓÔÏØÍÚÇÜÁÜÂÚÈÖÎÔÐÒÔÌØÊÚÂÜÁÜÉÚËÖÑÔÓÒÕÌÙÊÛÂÛÁÙÉ×ËÓÑÏÓÍÕÇÙÁÛ;PM1PEÆ¿ÄÙÈ×Ì×ÐÑÒÏØËØÇÚÃÚÄØÈÖÌÔÐÐÒÌØÈØÂÚÁÚÇØËÖÏÔÓÐÕÌ×ÈÙÂÙÁ×Ç×ËÑÏÏÓËÕÇ×ÃÙ;PM1PE;PM2FPPE=<yçITÀ;PM0PEÄÙÈ×Ì×ÐÑÒÏØËØÇÚÃÚÄØÈÖÌÔÐÐÒÌØÈØÂÚÁÚÇØËÖÏÔÓÐÕÌ×ÈÙÂÙÁ×Ç×ËÑÏÏÓËÕÇ×ÃÙ;PM1PEÊ¿Â×Æ×ÌÓÐÑÒÏÔËØÅØÁØÂØÆÔÌÒÐÎÒÌÔÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PE;PM2FPPE=<oçITÀ;PM0PEÂ×Æ×ÌÓÐÑÒÏÔËØÅØÁØÂØÆÔÌÒÐÎÒÌÔÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PEÆ¿Â×ÈÓÊÕÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÖÆÔÂØÁÖÅÖÉÔÍÒÑÎÓÊÕÆÕÂ×ÁÓÅÕÉÏÍÍÑÉÓÇÕÁÕ;PM1PE;PM2FPPE=<içITÀ;PM0PEÂ×ÈÓÊÕÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÖÆÔÂØÁÖÅÖÉÔÍÒÑÎÓÊÕÆÕÂ×ÁÓÅÕÉÏÍÍÑÉÓÇÕÁÕ;PM1PEÈ¿ÂÕÆÓÊÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÌÒÆÔÂÖÁÖÅÔËÒËÐÏÌÑÌÓÆÕÂÕÁÓÅÑËÏËÍÏÉÑÅÓÁÕ;PM1PE;PM2FT11,8FPPE=<açITÀ;PM0PEÂÕÆÓÊÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÌÒÆÔÂÖÁÖÅÔËÒËÐÏÌÑÌÓÆÕÂÕÁÓÅÑËÏËÍÏÉÑÅÓÁÕ;PM1PEÈ¿ÂÓÆÑÈÑÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÒÆÒÄÔÃÒÅÔÇÐËÐÏÌÏÈÓÆÑÄÓÃÑÅÑÇÍËÍÏÇÏÅÓÁÑ;PM1PE;PM2FPPE=<YçITÀ;PM0PEÂÓÆÑÈÑÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÒÆÒÄÔÃÒÅÔÇÐËÐÏÌÏÈÓÆÑÄÓÃÑÅÑÇÍËÍÏÇÏÅÓÁÑ;PM1PEÈ¿ÂÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÒÂÒÄÐÈÌÌÌÎÈÐÆÒÂÒÁÒÅÒÇÐËÌËÌÏÈÑÆÑÂÑÁÑÅÏÇÍËËËÇÏÃÑÁÑ;PM1PE;PM2FPPE=<QçITÀ;PM0PEÂÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÒÂÒÄÐÈÌÌÌÎÈÐÆÒÂÒÁÒÅÒÇÐËÌËÌÏÈÑÆÑÂÑÁÑÅÏÇÍËËËÇÏÃÑÁÑ;PM1PEÈ¿¿ÑÆÍÈÏÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÐÆÎÂÒÁÐÅÐÅÎËÌËÌÍÆÏÆÏÂÑÁÍÅÏÅËËÉËÇÍÅÏ¿Ï;PM1PE;PM2FPPE=<IçITÀ;PM0PE¿ÑÆÍÈÏÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÐÆÎÂÒÁÐÅÐÅÎËÌËÌÍÆÏÆÏÂÑÁÍÅÏÅËËÉËÇÍÅÏ¿Ï;PM1PEÆ¿ÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÐÅÎÅÌÉÌËÊËÆÍÆÏ¿Ï¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PE;PM2FPPE=<CçITÀ;PM0PEÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÐÅÎÅÌÉÌËÊËÆÍÆÏ¿Ï¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PEÈ¿ÂÍÄÍÆÉÈËÌÇÊÅÎÃÎÁÎÂÎÄÊÆÊÈÊÌÆÊÄÎÂÎÁÎÃÎÅÊÉÊÉÊÉÆÍÄÍÂÍÁÍÃÉÅËÉÇÉÅÉÃÍÁÍ;PM1PE;PM2FPPE=<{æITÀ;PM0PEÂÍÄÍÆÉÈËÌÇÊÅÎÃÎÁÎÂÎÄÊÆÊÈÊÌÆÊÄÎÂÎÁÎÃÎÅÊÉÊÉÊÉÆÍÄÍÂÍÁÍÃÉÅËÉÇÉÅÉÃÍÁÍ;PM1PEÈ¿ÂËÄËÆÉÆÉÊÅÊÅÌÃÌÁÌÂÌÄÊÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÊÇÈÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÇÅÉÃËÁË;PM1PE;PM2FPPE=<sæITÀ;PM0PEÂËÄËÆÉÆÉÊÅÊÅÌÃÌÁÌÂÌÄÊÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÊÇÈÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÇÅÉÃËÁË;PM1PEÈ¿ÄÓÌÑÒËÔÃÔÄÐÌÌÒÆÔÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PE;PM2FPPE=<kæITÀ;PM0PEÄÓÌÑÒËÔÃÔÄÐÌÌÒÆÔÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PEÆ¿ÄÑÌÍÎËÒÃÒÄÎÌÊÎÄÒÃÒÉÎÍÊÑÄÑÃÍÉËÍÃÑ;PM1PE;PM2FPPE=<eæITÀ;PM0PEÄÑÌÍÎËÒÃÒÄÎÌÊÎÄÒÃÒÉÎÍÊÑÄÑÃÍÉËÍÃÑ;PM1PEÊ¿ÂÍÊËÌÉÎÁÎÂÌÊÈÌÄÎÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE;PM2FPPE=<[æITÀ;PM0PEÂÍÊËÌÉÎÁÎÂÌÊÈÌÄÎÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PEÆ¿ÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÊÉÆËÂËÁÉÅÇÉÁË;PM1PE;PM2FT11,1FPPE=<UæITÀ;PM0PEÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÊÉÆËÂËÁÉÅÇÉÁË;PM1PEÈ¿ÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÊÅÆÅÆÉÂÉÁÇÅÃÅÁÉ;PM1PE;PM2FPPE=<MæITÀ;PM0PEÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÊÅÆÅÆÉÂÉÁÇÅÃÅÁÉ;PM1PEÈ¿ÂÅÂÅÆÁÆÁÆÂÄÂÄÆÂÆÁÆÃÄÃÄÅÂÅÁÅÃÁÃÁÅ;PM1PE;PM2FPPE=<EæITÀ;PM0PEÂÅÂÅÆÁÆÁÆÂÄÂÄÆÂÆÁÆÃÄÃÄÅÂÅÁÅÃÁÃÁÅ;PM1PEÈ¿¿ÁÂÃÄÁ¿¿Ä¿ÄÂÂÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM1PE;PM2FPPE=<}åITÀ;PM0PE¿ÁÂÃÄÁ¿¿Ä¿ÄÂÂÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM2FPPE=<QèoXÀ;PM0PE¿bÉÄ¿¿aÉÿ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,2FPPE=<MèoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<KèoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<GèoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<EèoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<AèoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<?èoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<{çoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<yçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<uçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<sçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<oçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<mçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<içoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<gçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<cçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<açoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<]çoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<[çoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<WçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<UçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<QçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<OçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<KçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<IçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<EçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<CçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<?çoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<}æoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<yæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<wæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<sæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2RF2,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<qæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<mæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<kæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<gæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<eæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2RF3,8,8,0,0,0,0,0,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;FT11,3FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<aæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<_æoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<[æoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<YæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FT10,0FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<UæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<SæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<QæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPMC1,240PE=<aæmXÀ;PM0PEãÎÛÒÑÖËÚÅÚÃÜÁÚÁØÂâÄÞÄàÄÞÆÞÆÞÆÞÈÞÈÞÆÞÈÞÈÞÈÞÈÞÈÞÈÞ¿ßÃáÁáÃãÁåÅãÃãÁåÁáÁßÂáÄÛÆÙÊ×ÌÑÎÍËÕÅÕÅÕÁÕ¿×ÂÓÄÕÆÕ;PM2FTFPMC1,90PE=<QèoXÀ;PM0PE¿bÉÄ¿¿aÉÿ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<MèoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<KèoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<GèoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<EèoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<AèoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<?èoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<{çoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<yçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<uçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<sçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<oçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<mçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<içoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<gçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<cçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<açoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<]çoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<[çoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<WçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<UçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<QçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<OçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<KçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<IçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<EçoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<CçoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<?çoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<}æoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<yæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<wæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<sæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2RF4,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<qæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<mæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<kæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<gæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<eæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2RF5,8,8,0,0,0,0,0,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;FT11,5FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<aæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<_æoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<[æoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<YæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FT10,0FPPM0PE¿bÉÄ¿¿aÉÿ;PM2FPPE=<UæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<SæoXÀ;PM0PE¿bÉ¿¿aÉÁ¿;PM2FPPE=<QæoXÀ;PM0PE¿bÉ¿aÉ;PM1PE;PM2FPMC1,240PE=<WågYÀ;PM0PEÓÆÓÌÏÎÏÔÇÖÇØÁÜ¿ÜÆÜÌØÌØÐÒÔÐÔÊÖÄÖ¿ÔÅÔÉÐÏÎÑÊ×Æ×ÄÛÁÛÅÛÉ×Í×ÏÑÑÍÓÉÕÅÕ¿;PM2FTFPPE=<OågYÀ;PM0PEÑÄÍÊÍÌÉÒÅÒÃÖÁØÄØÄØÈÔÌÔÎÐÐÌÒÊÒÄÒ¿ÒÃÒÉÌÍÌÑÈÑÆÕ¿×Á×Ç×ÉÕËÑÏÏÍËÑÉÑÁÓ¿;PM2FPMC1,90PE=<]ùOIÀ;PM0PEXÑgÅÉÕUÑjÅÈÔ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<eùcIÀ;PM0PEVÑiÅÅ×WÑjÅÈØ;PM2FPPE=<mù{IÀ;PM0PEXÑiÅÇÓWÑhÅÈÖ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<uùQJÀ;PM0PEXÑgÅÉÕUÑjÅÈÔ;PM2FPPE=<}ùeJÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<Eú{JÀ;PM0PEXÑiÅÇÕWÑhÅÈØ;PM2FPPE=<MúSKÀ;PM0PEXÑgÅÇÕUÑjÅÆÔ;PM2FPPE=<SúgKÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<]ú}KÀ;PM0PEXÑiÅÇÕWÑjÅÈÖ;PM2FPPE=<eúSLÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<kúiLÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2FPPE=<uú?MÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<{úUMÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<CûkMÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2FPPE=<MûANÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<SûWNÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<[ûmNÀ;PM0PEVÑiÅÇÓWÑjÅÊÔ;PM2FPPE=<eûAOÀ;PM0PEXÑiÅÇ×UÑjÅÆØ;PM2FPPE=<kûYOÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<sûoOÀ;PM0PEVÑiÅÇÓUÑjÅÈÔ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<{ûCPÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<CüYPÀ;PM0PEVÑiÅÇ×UÑjÅÈØ;PM2FPPE=<KüqPÀ;PM0PEVÑiÅÇÓUÑjÅÈÔ;PM2FPPE=<SüEQÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<[ü[QÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<cüqQÀ;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2FPPE=<küGRÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<sü]RÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<{üsRÀ;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2FPPE=<CýISÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<Ký_SÀ;PM0PEXÑiÅÇÕWÑjÅÈÖ;PM2FPPE=<SýuSÀ;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<[ýKTÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<cýaTÀ;PM0PEXÑiÅÇÕWÑjÅÈÖ;PM2FPPE=<kýwTÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<qýMUÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<{ýcUÀ;PM0PEXÑiÅÇÓWÑjÅÈÔ;PM2FPPE=<CþwUÀ;PM0PEXÑiÅÇ×UÑjÅÆØ;PM2FPPE=<IþOVÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2FPPE=<SþeVÀ;PM0PEXÑiÅÇÓWÑjÅÈÔ;PM2FPPE=<[þyVÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<aþOWÀ;PM0PEVÑiÅÇ×WÑjÅÊØ;PM2FPPE=<kþgWÀ;PM0PEXÑiÅÇÓUÑjÅÆÔ;PM2FPPE=<qþ{WÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<yþQXÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<C?ÀgXÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<I?À}XÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<Q?ÀSYÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<Y?ÀiYÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<a?À?ZÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<i?ÀUZÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<q?ÀkZÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<y?ÀA[À;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<A@ÀW[À;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2FPPE=<I@Àm[À;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<Q@ÀC\À;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<Y@ÀY\À;PM0PEXÑiÅÉÓUÑjÅÈÔ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPPE=<a@Àm\À;PM0PEVÑiÅÇ×UÑjÅÈØ;PM2FPMC1,240PE=<Kì{[À;PM0PEïÍíÉïÅñÁï¿ñÂïÄñÄóÆñÄñÆóÄó¿ñ¿õÃóÅÙÃÛÁÛ¿ÛÂÛÄÛÄÛÈÛÈÙÊÙÊÙÌÙÎ×Î×ÐÕÐÕÒÉοÒÌÒÐÒÔÔØÒØÐÔÎÚÐÜÐÚÎÜÐÚÎÜÌÜÎÚÎÜÌÞÌÚÌÜÎÞÌÜÌÜÌÜÎØÎÖÒÔØÐÚÐÞÐÞÎäÐâÎäÎäÐäÐäÒàÒàÖÜØÚÖÐØÈÜÄÞ¿ÞÃÞÅÚÇÜÉæÑèÑêÓæ×âÙÜÝÔÝÆáÂã¿ãÄãÂáÂáÂãÂáÄãÂá¿áÂáÂãÁãÁã¿ãÃãÃÙÃÙÇÛÉ×Ë×ÏÕÓÑÕË;PM2FTFPMC1,90PE=<]ùOIÀ;PM0PEXÑgÅÉÕUÑjÅÈÔ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<eùcIÀ;PM0PEVÑiÅÅ×WÑjÅÈØ;PM2FPPE=<mù{IÀ;PM0PEXÑiÅÇÓWÑhÅÈÖ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<uùQJÀ;PM0PEXÑgÅÉÕUÑjÅÈÔ;PM2FPPE=<}ùeJÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<Eú{JÀ;PM0PEXÑiÅÇÕWÑhÅÈØ;PM2FPPE=<MúSKÀ;PM0PEXÑgÅÇÕUÑjÅÆÔ;PM2FPPE=<SúgKÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<]ú}KÀ;PM0PEXÑiÅÇÕWÑjÅÈÖ;PM2FPPE=<eúSLÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<kúiLÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2FPPE=<uú?MÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<{úUMÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<CûkMÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2FPPE=<MûANÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<SûWNÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<[ûmNÀ;PM0PEVÑiÅÇÓWÑjÅÊÔ;PM2FPPE=<eûAOÀ;PM0PEXÑiÅÇ×UÑjÅÆØ;PM2FPPE=<kûYOÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<sûoOÀ;PM0PEVÑiÅÇÓUÑjÅÈÔ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<{ûCPÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<CüYPÀ;PM0PEVÑiÅÇ×UÑjÅÈØ;PM2FPPE=<KüqPÀ;PM0PEVÑiÅÇÓUÑjÅÈÔ;PM2FPPE=<SüEQÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<[ü[QÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<cüqQÀ;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2FPPE=<küGRÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<sü]RÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2RF4,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<{üsRÀ;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2FPPE=<CýISÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<Ký_SÀ;PM0PEXÑiÅÇÕWÑjÅÈÖ;PM2FPPE=<SýuSÀ;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<[ýKTÀ;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<cýaTÀ;PM0PEXÑiÅÇÕWÑjÅÈÖ;PM2FPPE=<kýwTÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<qýMUÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2RF6,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<{ýcUÀ;PM0PEXÑiÅÇÓWÑjÅÈÔ;PM2FPPE=<CþwUÀ;PM0PEXÑiÅÇ×UÑjÅÆØ;PM2FPPE=<IþOVÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2FPPE=<SþeVÀ;PM0PEXÑiÅÇÓWÑjÅÈÔ;PM2FPPE=<[þyVÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<aþOWÀ;PM0PEVÑiÅÇ×WÑjÅÊØ;PM2FPPE=<kþgWÀ;PM0PEXÑiÅÇÓUÑjÅÆÔ;PM2FPPE=<qþ{WÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<yþQXÀ;PM0PEVÑiÅÇÕWÑjÅÊÖ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<C?ÀgXÀ;PM0PEXÑiÅÇÕUÑjÅÆÖ;PM2FPPE=<I?À}XÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<Q?ÀSYÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<Y?ÀiYÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<a?À?ZÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<i?ÀUZÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<q?ÀkZÀ;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<y?ÀA[À;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<A@ÀW[À;PM0PEXÑiÅÉÕUÑjÅÈÖ;PM2FPPE=<I@Àm[À;PM0PEVÑiÅÇÕUÑjÅÈÖ;PM2FPPE=<Q@ÀC\À;PM0PEVÑiÅÅÕWÑjÅÈÖ;PM2FPPE=<Y@ÀY\À;PM0PEXÑiÅÉÓUÑjÅÈÔ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<a@Àm\À;PM0PEVÑiÅÇ×UÑjÅÈØ;PM2FPPE=<_?ÀOVÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FT10,0FPPE=<_?ÀUVÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF4,8,8,0,0,0,0,0,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;FT11,4FPPE=<_?À]VÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀeVÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀkVÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF5,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<_?ÀsVÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀyVÀ;PM0PETÓ¿¿ÉSÓ¿¿Ê;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<_?ÀCWÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀIWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀQWÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<_?ÀWWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?À_WÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<_?ÀgWÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀmWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀuWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<_?À}WÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀEXÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<_?ÀKXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀSXÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<_?ÀYXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀaXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀiXÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<_?ÀoXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀwXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<_?À?YÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀGYÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,6FPPE=<_?ÀMYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀUYÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À[YÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<_?ÀcYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀkYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<_?ÀsYÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀyYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀAZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<_?ÀIZÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀOZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<_?ÀWZÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À]ZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀeZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<_?ÀmZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀuZÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<_?À{ZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀC[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀK[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<_?ÀQ[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀY[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<_?À_[À;PM0PETÓ¿¿ÉSÓ¿¿Ê;PM2FPPE=<_?Ài[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<_?Ào[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?Àw[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À}[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<_?ÀE\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀM\À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<_?ÀS\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?À[\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<_?Àc\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?Àk\À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?Àq\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<_?Ày\À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À?]À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<_?ÀG]À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀO]À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀU]À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,5FPMC1,240PE=<KëuZÀ;PM0PEÁÇÃÉÇÉÉËÍËÑÍÕÉÛËáÇçÇíÃóÁûÂEÀÄIÀÊUÀÌ×ÄÕÄ×ÂÕÂÕ¿Õ¿Õ¿×ÁÕ¿ÕÁÕÁ×ÁÕÃ×Á×Á×ÁÕÁ×ÂÕÂ×ÄÙÆ×Æ×Ê×È×ÊÕÌ×ÊÓÌÕÎÓÌÑÌÏÎÇÐÄÔÎØÔØØÖÖÐÔÊпÒËÒÉÔËÒÉÖÉÒÇÔÅÔÅâÃâ¿â¿äÄäÄäÆæÆäÆäÆâÄâÄâÂâ¿àÁÞÇÜÉèÉèÆæÐäØäÜâÜàÜÞÒÜÎØÈÔÄÒÄÐÁÌÁÈÁÊÁÌÍÌßÊéÈïÆïÄíÄß¿Ñ;PM2FTFPMC1,90PE=<_?ÀOVÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FT10,0FPPE=<_?ÀUVÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF6,8,8,0,0,0,0,0,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;FT11,6FPPE=<_?À]VÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀeVÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀkVÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF7,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<_?ÀsVÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀyVÀ;PM0PETÓ¿¿ÉSÓ¿¿Ê;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<_?ÀCWÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀIWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀQWÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<_?ÀWWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?À_WÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<_?ÀgWÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀmWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀuWÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<_?À}WÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀEXÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<_?ÀKXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀSXÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<_?ÀYXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀaXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀiXÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<_?ÀoXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀwXÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,7FPPE=<_?À?YÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀGYÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<_?ÀMYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀUYÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À[YÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<_?ÀcYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀkYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<_?ÀsYÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀyYÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀAZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<_?ÀIZÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀOZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<_?ÀWZÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À]ZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀeZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<_?ÀmZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀuZÀ;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<_?À{ZÀ;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀC[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀK[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<_?ÀQ[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀY[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<_?À_[À;PM0PETÓ¿¿ÉSÓ¿¿Ê;PM2FPPE=<_?Ài[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<_?Ào[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?Àw[À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À}[À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<_?ÀE\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀM\À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<_?ÀS\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?À[\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<_?Àc\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?Àk\À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?Àq\À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<_?Ày\À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?À?]À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<_?ÀG]À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2FPPE=<_?ÀO]À;PM0PETÓ¿¿ÅSÓ¿¿Æ;PM2FPPE=<_?ÀU]À;PM0PETÓ¿¿ÇSÓ¿¿È;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPMC1,240PE=<_þoJÀ;PM0PEÁÇPÃgÀÆÐQÃjÀÁÉ;PM2FT10,0FP1PE=<qKÀ]LÀ;PM0PE@ÀÛþÝüÙüÝüÙúÝúÛúÝúÝúÛúÝúÛüÝüßüÝþßÈÐ?ÀÞûÞûàùÞùÜûÞùÞ÷ÞùÜûÜ÷ÞûÜûÜûÜ?ÀÜýÜÇÍ;PM2FT11,3FP1PE=<WOÀmKÀ;PM0PEØÅÞÅÞÃâÅàÅÞÅÜÇÖÅÈÎ×ÊÝÆÝÆáÆßÆßÆÛÄ×ÆÃÏ;PM2FP1PE=<W]ÀSGÀ;PM0PEøÑöÑúÑöÑøÑúÑöÑøÑøÑøÑøÑøÑøÑøÏúÑøÍÄÐ÷Ð÷Ð÷ÒùÐõÒ÷ÒùÒõÒ÷Ò÷Ô÷Ò÷Ò÷Ò÷Ò÷Ò÷ÒÃÑ;PM2FP1PE=<WíaKÀ;PM0PEÔÈÖÊÒÌÔÌÒÌÒÎÒÌÒÌÇÎÓËÑËÑÍÑËÓËÏËÓÇÓÇÆÏ;PM2RF8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1;FT11,8FP1PE=<MîCKÀ;PM0PEÈËÌËÒÅпÅÐÇ¿ÉÄÉÆÁÊÑÅ;PM2FP1PE=<AîqIÀ;PM0PEÂÁÁÇÃÍÁÍÅÍ¿Ï¿ÍÒÆÁÈÂÌÄÌÄÐÄÌÂÎÅÌËÆÁÏ;PM2FP1PE=<wïsJÀ;PM0PE¿ÂÒÈÎÊÎÌÎÌÐÊÎÈÌÄпÂÐÓ¿ÑÅÏÇÍÉÏÍÍÉÍÉÍÇÆÏ;PM2FP1PE=<MñCKÀ;PM0PEÌÂÊ¿ÊÄÌ¿ÊÂÌÂÊÂÊÄÅÐÇÁËÃÇÁÉ¿ËÁÉÁËÁÉÁÂÏ;PM2FP1PE=<?î[LÀ;PM0PEÖÊÔÈÔÌÔÌÒÌÒÎÒÌÒÌÉÎÑËÑËÑËÑÍÓËÏÉÓÉÓÇÄÏ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FP1PE=<sî}KÀ;PM0PEÈËÌËÒÅοÃÐÇ¿ÉÄÉÈÃÈÏÅ;PM2FP1PE=<iîkJÀ;PM0PEÄ¿¿ÁÁÇÃÍÃÍÃÍÁÍÂÏÐÆ¿Ê¿ÊÆÎÄÎÂÌÄÎÅÎËÆÃÑ;PM2FP1PE=<]ðmKÀ;PM0PE¿ÂÒÈÎÊÎÌÎÌÐÊÎÈÌÄοÄÒÓ¿ÑÅÏÉÏÉÍÍÍÉÍÉÍÇ¿ÂÆÑ;PM2FP1PE=<sñ}KÀ;PM0PEÊÂÌÂÊÂÌ¿ÊÂÊÂÌÂÊÄÅÒÉÃÉÁÇÃË¿ÉÁÉÁËÁÉÁÂÏ;PM2FP1PE=<yøSUÀ;PM0PEÈÑØÁÞÎäÖâàÞæÔèÈêÁØÁØÁÚÃØÃØÅØÅÖÇÖÉÖÉÔÉÔÍÒÍÒÍÎÑÎÑÌçØïÚñÚùØýÚAÀÚGÀÚKÀÜMÀÚQÀÚUÀÜWÀÚYÀÜ]ÀÚ_ÀÜ_ÀÚcÀÜcÀÚeÀØeÀÜgÀØeÀÚeÀØgÀØeÀØcÀØeÀÖaÀÖ_ÀÖ_ÀÔ]ÀÔYÀÔËÅÍÑÍÛÉåÅéÂïÐïÜïÒ×ÐÕÐÕÎÓÎÓÎÓÎÓÎÓÐÓÐÕÒÓÒ×ÔÕØ×ÚÙÜÛâÝäáèãìçìçðçôéòëöéôçöçôåôãôáðÛðÙðÓòÕúÑþÓDÀÏHÀÑLÀÍRÀËTÀËVÀÇZÀÇ^ÀÁ`ÀÃbÀÂfÀÄfÀÈÐÂØÆÚÆÞÆâÈäÊäÈäÊäÈâÊàÆÚÆØÄÒÂÊÁÆÃ;PM2FT11,5FPPE=<SEÀoMÀ;PM0PEìÛìÛìÝìÛìÛîÛìÝìÛìÛìÛîÝìÙìÝìÛìÛîÛÄÆëÞëÚíÞëÜëÜëÜëÞíÜëÜëÜëÞëÜíÜëÜéÞíÜÃÇ;PM2FTFP1PE=<gIÀsJÀ;PM0PEâÕä×âÕä×à×ä×â×â×ÄÈáÖáØáØáØáØãØáØãÖÃÇ;PM2FP1PE=<eLÀQIÀ;PM0PEÔÏØÍØËÚÉÚËØÉØÉÖÍÄÈÕÌÙÌ×ÊÙÊ×Ì×ÌÕÌÕÒÃÇ;PM2FP1PE=<?OÀCFÀ;PM0PEÒÙÒÛÒÙÒÛÒÙÒ×Ö×Ø×ÄÈÕÔÓØÓÚÑÚÑÚÏÜÑÚÓÚÅÃ;PM2FP1PE=<SAÀANÀ;PM0PEÔÏÔÏÐÑÒÑÒÓÐÓÒÓÒÑÆÆÑÒÏÒÏÔÑÔÑÒÓÔÓÒÓÎÃÅ;PM2FP1PE=<eDÀULÀ;PM0PEÖÑÚÍÜËÜËÜËÜËÚËØÏÄÆ×ÐÛÎÙÌÝÌÛÊ×ÎÙÎ×ÒÃÇ;PM2FP1PE=<WFÀaIÀ;PM0PEÎ×Î×Ì×Ì×ÌÕÎÕÐÓÔÓÄÈÏÐÏÖÍÔÍØËØËØËØÍÖÇÃ;PM2FP1PE=<]FÀWIÀ;PM0PE¿ÂÂÃÂÁÂÁ¿ÃÈÄÁ¿ÄÁÂÃÄ¿ÂÅÇ;PM2FP1PE=<]IÀcGÀ;PM0PEØÍÚÍØÍØÏØÍØÍØÏÖÍÆÈ×Î×Î×Î×Ð×Î×Ð×Î×ÎÅÇ;PM2FP1PE=<oKÀIKÀ;PM0PEØÓØÓØÓØÓÖÓÖÓØÕØÓÄÈÕÔ×Ô×ÔÕÖ×Ô×Ô×Ô×ÒÃÅ;PM2FP1PE=<MLÀEKÀ;PM0PEÈÁÊÁÆÂÆÁÄÆÇÂÇÂÇÁÃÄÅÇ;PM2FP1PE=<[RÀAFÀ;PM0PEÚÓØÓØÕÚÓØÓØÓÚÓÚÕØÓØÕÚÑØÓØÕÚÑÚÓØÓÆÈÙÒÙÔ×ÔÙÔ×Ô×ÔÙÔ×ÔÙÖ×Ô×ÖÙÔ×Ô×ÔÙÔÙÖÃÇ;PM2FP1PE=<USÀQIÀ;PM0PE¿ØËÜÉÚËØËÜÉÚÉØËÜÉÚÉÚÉÚËÚÉÚÉÚÉÚËÚÉÂÆÙÌÙÊÙÌÙÈÙÌÙÊÙÌÙÈÙÌÙÊÙÌÙÊÙÌÙÊÙÌÙÌ¿ÅÇ;PM2FP1PE=<OXÀkFÀ;PM0PEèÓèÕæÕèÕæÓèÓæÓèÓÆÈçÒçÖåÔçÔçÖåÖçÔçÖÃÇ;PM2FP1PE=<YRÀIJÀ;PM0PEâÍâÍäÍâÍäËâÍâÍäÍÂÈáÎãÌáÎãÎáÎãÌáÎáÐÁÇ;PM2FP1PE=<aVÀOHÀ;PM0PEàÍâÍàÍàÑâÏàÏâÏâÍÂÈáÎßÐßÐáÐßÐáÐßÎáÌÁÅ;PM2FP1PE=<S[ÀEGÀ;PM0PEæÉèÇæÇæÉæÇæÉæÇæËÂÆåÌãÊçÊåÈåÈåÈåÊçÈÁÅ;PM2FP1PE=<QLÀWKÀ;PM0PEÎËÎÍÎËÌËÎËÎËÎËÌËÆÆÍÌÍÌÍÌËÎÍÌÍÌÍÎÍÌÃÇ;PM2FP1PE=<aNÀEJÀ;PM0PEÒÉÒÉÒÉÒËÒÇÒËÒÉÒÉÄÈÑÊÑÊÑÊÑÊÑÊÑÌÑÊÑÊÃÇ;PM2FP1PE=<aQÀqHÀ;PM0PEØËØÉØÉØÉØËØÇØËØÉÄÈ×Ê×Ê×Ê×Ê×Ê×Ì×Ê×ÊÃÅ;PM2FP1PE=<GVÀcFÀ;PM0PEæÑäÑæÑäÑæÏâÑæÑäÑÄÆãÒãÒåÒåÒáÒåÒãÒãÒÅÇ;PM2FP1PE=<m@ÀWRÀ;PM0PEÁ¿ÄÅÆÅÆÅÆÁÄÄÃÆÅÄÃÆÃÆÁ¿ÃÅ;PM2FT10,0FP1PE=<GAÀ}QÀ;PM0PE¿ÁÆÅÆÇÈÅÆÃÄÆÅÆÅÆÅÄÃÆÂÁÉ¿;PM2FP1PE=<CAÀeQÀ;PM0PEÿ¿×Ê¿¿ØÅ¿;PM2FP1PE=<MBÀWQÀ;PM0PEÂÉÁÅÁÇ¿ÇÁÇÃÅÁÇÁÉÈÁÂÈÂÊÂÆÂÈÂÈÂÈ¿ÈÂÊÉ¿;PM2FP1PE=<SBÀOQÀ;PM0PEÂÃÂÁÂÁÊ¿ÁÄÿÂÉ¿;PM2FP1PE=<OBÀCQÀ;PM0PEÿ¿ËÊ¿¿ÌÅ¿;PM2FP1PE=<}CÀUQÀ;PM0PEÁÁ¿ãÊ¿¿äÁÃÅÆ;PM1PEÁ¿¿ÁÂÂ;PM2FP1PE=<yCÀSQÀ;PM0PEÂÄÅÅÆÅÆÄÂÄÁÿÂÉ¿;PM2FP1PE=<wCÀMQÀ;PM0PEÁÁ¿ÃÊ¿¿ÄÁ¿ÅÂ;PM2FP1PE=<cCÀsPÀ;PM0PEÂÂÃÅÇÇÇÇÁÅÆÁÄÄÈÈÆÆÆÆ¿ÄÉ¿;PM2FP1PE=<]CÀkPÀ;PM0PEÅ¿¿ÇÊ¿¿Èÿ;PM2FP1PE=<?EÀUQÀ;PM0PE¿ËÈ¿¿Ì¿ÂÇÁ;PM2FP1PE=<UEÀYPÀ;PM0PE¿ÁÄÅÂÅÄÇÂÇÄÇÂÇÂÇÂÅÈÂÁÈÃÆÁÈÁÈÃÈÁÈÁÆÃÈÂÁÉ¿;PM2FP1PE=<QEÀgOÀ;PM0PEÿ¿ñÊ¿¿òÅ¿;PM2FP1PE=<{EÀeOÀ;PM0PEÅÃÈÂÄÄÂÆÄÆÅÄÃÅÃÃÁÁÁ¿ÃÅÄÆÿ¿ÅÊ¿;PM2FP1PE=<KFÀCQÀ;PM0PEÂÄÈÈÂÊÂÌÂο̿̿̿ÊÉ¿¿É¿Ë¿Ë¿Ë¿Í¿ÉÃÇÃÇ¿É;PM2FP1PE=<QFÀ}PÀ;PM0PEÃÅÊ¿¿ÊÉ¿ÃÃÄÄÿ¿ÃÈ¿;PM2FP1PE=<UFÀKQÀ;PM0PEÄÄ¿ÊÇ¿¿ÉÄÄ¿Ç;PM1PEÄ¿¿ÄÃÃ;PM2FP1PE=<[FÀOQÀ;PM0PEÄ¿¿ÄÄ¿Á¿¿ÈÿÁÃÁ¿Â¿É;PM2FP1PE=<gFÀGQÀ;PM0PEÄÿ¿ÁÄÃÄ¿¿ÊÁÁÁÂÃÂÆÃÉ¿;PM1PE¿ÃÄ¿ÃÄ;PM2FP1PE=<mFÀ?QÀ;PM0PEÂÿ¿ÁÂÁÊ¿ÁÄÃÄÁ¿¿ÂÂÁÉ¿;PM1PE¿Ã¿ÁÄ;PM2FP1PE=<kFÀWPÀ;PM0PEÁ¿éÊ¿¿êÁÂÅÃ;PM2FP1PE=<IGÀoOÀ;PM0PEÁÂàéÆÄÝêÁÂÃÇ;PM2FP1PE=<SGÀgOÀ;PM0PEÄÃÆÃÄÈÅÄÂÃÉ¿;PM1PE¿ÁÄÁÃÄ;PM2FP1PE=<YGÀuNÀ;PM0PEÆÉÂËÁÍ¿ÍÊ¿¿Î¿ÎÃÐÅÌÅÅ;PM2FP1PE=<wGÀuNÀ;PM0PEÄ¿ÄÁÂÂÄ¿ÄÉ¿ÂÁÁÿÿÃÂÄÄÅ;PM2FP1PE=<{GÀyNÀ;PM0PEÁÁÆÆÃÆÇÇÁÁÊ¿;PM2FP1PE=<CHÀKOÀ;PM0PE¿ÄÄÂÂÆÂÆÉ¿¿ÁÁÃÁÃÁÃÈÃ;PM2FP1PE=<cHÀkPÀ;PM0PEÆ¿ÆÌÂÎÄÊÂÌÄÌÂÌÄÌÂÌÇÄÁËÁËÁËÃËÁËÃËÃËÃËÆ¿ÅÃ;PM1PEÄÅÂÆÅ¿;PM2FP1PE=<sHÀYPÀ;PM0PE¿ÁÐÏÆÄÍÐÂÁÉ¿;PM2FP1PE=<qHÀsOÀ;PM0PEÁ¿çÊ¿¿èÃÂÃÃ;PM2FP1PE=<WIÀUOÀ;PM0PE¿ÁÊÅÌÇÈÇÈÅÄÄÇÊÇÈÉÈÉÆ¿ÁÅÃ;PM2FP1PE=<WIÀSOÀ;PM0PEÁ¿ÂÁÆÄ¿ÄÁ¿ÃÅ;PM2FP1PE=<eIÀAOÀ;PM0PEÂÁÄÃÂÃÂÅÄÁÄÆ¿ÂÃÄÁÆÃÂÂÁÉ¿;PM2FP1PE=<_IÀWNÀ;PM0PEÅÄ¿íÊ¿¿îÃÄÄÿÄÿ¿Ç;PM2FP1PE=<eIÀUNÀ;PM0PEÃÁÊ¿¿ÈÉ¿ÃÁÄÂÿ¿ÁÈÃ;PM2FP1PE=<WJÀuNÀ;PM0PEÁÃÌÆÐÊÎÈÊÌÇÄÅÇÍÉÑÇËÅÁÃÂÄÁÁ¿ÁÊ¿;PM2FP1PE=<]JÀoOÀ;PM0PEÂÄÂÎÂ̿пÌÉ¿¿Ë¿Ï¿Ë¿ÍÂÂÂÅ;PM1PE¿¿ÄÁÃ;PM2FP1PE=<wJÀEPÀ;PM0PE¿ÁÆÆÆÆÈÆÆÆÁÆÇÃÇÇÇÅÅÿÁÆÃ;PM2FP1PE=<IKÀWPÀ;PM0PEÆ¿ÄÄÄÄÂÆÂÄÅÄÁÁÃÅÁÅÃÃÆ¿ÅÃ;PM1PEÂÃÄÄÅ¿;PM2FP1PE=<OKÀEPÀ;PM0PEÁÂÂÿÅÄÅÂÃÆÄÁÄÁÄÁÆ¿ÂÁÂÂÁ¿ÂÁ¿ÃÃ;PM2FP1PE=<[KÀuOÀ;PM0PEÂÁÂÁÂÃÂÃÄÃÄÄ¿ÄÃÄÁÄÃÄÄÃÉ¿;PM1PE¿Á¿ÁÂ;PM2FP1PE=<OLÀyNÀ;PM0PEÂÁÆÅÈÅÈÇÈÇÈÅÆÇÆÇ¿ÇÊ¿ÃÊÃÊÇÈÇÊÉÈÇÆÅÆÅÄÂÁÉ¿;PM2FP1PE=<MLÀsNÀ;PM0PEÁÄ¿ÉÊ¿¿ÊÁÄÂÿÂÁÂÅÇ;PM2FP1PE=<SLÀmNÀ;PM0PEÂÁÄÃÆÈÅÄÂÁÇÃ;PM2FP1PE=<SLÀANÀ;PM0PE¿ÉÁÉ¿ËÂËÈÄ¿È¿Ì¿Ê¿ÊÇ¿;PM2FP1PE=<[LÀsMÀ;PM0PEÂÁÂÃÂÃÂÁ¿ÁÈ¿ÁÄ¿ÆÃÂÁÄÂÁÉ¿;PM2FP1PE=<[LÀiMÀ;PM0PEÁÄ¿ÅÂÁÂÃÁÁÊ¿ÁÄ¿ÄÁÂÂÄÃÂÃÅ;PM2FP1PE=<eLÀ_MÀ;PM0PEÂÁÈÇÄÆÅÆÂÁÉ¿;PM2FP1PE=<gLÀKMÀ;PM0PEÂÿÇÂÁÁÅÊ¿ÁÆ¿ÆÁÄÂÄÉ¿;PM2FP1PE=<AMÀGOÀ;PM0PE¿ÁÌÈÌÆÐÆÌÎÇÄÇÉÍÇÏÅÍÉ¿ÁÈ¿;PM2FP1PE=<EMÀsOÀ;PM0PEÄÄ¿èÇ¿¿çÄÆ¿É;PM1PEÄ¿¿ÄÃÃ;PM2FP1PE=<cMÀwOÀ;PM0PEÆ¿ÄÂÈÂÆÂÆÁ¿ÊÅÁÇ¿ÇÃÅÁÆ¿ÇÅ;PM1PEÂÁÄÂÅ¿;PM2FP1PE=<?NÀAOÀ;PM0PEÁÂÄÏÆÏÊËÊËÈÆËÌÉÌÅÌ¿ÎÁÄÅÅ;PM2FP1PE=<INÀmNÀ;PM0PEÁÂÂÇÂÅÄÁÄÅÆÆÃÄÁÄÁÄ¿ÄÁÂÅÃ;PM2FP1PE=<iNÀ}MÀ;PM0PEàïÆÄßòÅÅ;PM2FP1PE=<qNÀuMÀ;PM0PEÁÂÊÉÆÆÇÈÁÂÃÇ;PM2FP1PE=<COÀcMÀ;PM0PEÂÁÄÃÄÃÄÃÄÃÄÈÃÂÃÂÃÄÁÄÂÁÉ¿;PM2FP1PE=<GOÀYMÀ;PM0PEÂÅ¿ÁÂÁÊ¿ÁÄÁÂÁÄÇ¿;PM2FP1PE=<KOÀQMÀ;PM0PEÂÃÂÃÈ¿¿ÂÁÄ¿ÂÉ¿;PM2FP1PE=<EOÀ[LÀ;PM0PEÅ¿¿õÊ¿¿öÿ;PM2FP1PE=<yOÀsNÀ;PM0PEÁÁÊÆÈÄÊÄÆÆÈÆÈÆÈÈÆÈÃÄÇÇÅÅÇÅÇÅÇÃÇÃÇÅÇÃÃÁÈÃ;PM2FP1PE=<?PÀ{NÀ;PM0PEÁÃÈÌÇÄÅÉÁÁÊ¿;PM2FP1PE=<?PÀCOÀ;PM0PE¿ÈÉ¿¿ÇÊ¿;PM2FP1PE=<MPÀMOÀ;PM0PEÃÃÆÂÄÂÆÄÂÆÉ¿¿ÁÁÁÁ¿Ã¿ÃÅÄÆÿ¿ÅÈ¿;PM2FP1PE=<QPÀWOÀ;PM0PEÄ¿¿ÊÇ¿¿ÉÄ¿;PM2FP1PE=<SQÀGMÀ;PM0PEÁ¿ÆÅÄÉÆÇÆÉÆÉÄÇÂÇ¿ÇÊ¿ÁÊÁÈÅÊÅÊÃÊÅÊÅÈÃÈÁ¿ÃÅ;PM2FP1PE=<[QÀAMÀ;PM0PEÄÃÄÁÄÆÃÂÂÁÉ¿;PM1PE¿ÃÄ¿ÃÄ;PM2FP1PE=<mQÀ_LÀ;PM0PE¿ÁÆÇÆÇÆÉ¿ÅÊ¿ÃÈÅÌÅÊÃÆÂÁÉ¿;PM2FP1PE=<iQÀ{KÀ;PM0PEÿ¿ãÊ¿¿äÅ¿;PM2FP1PE=<mTÀAMÀ;PM0PEÂÃÊÇÌÅÊÇÌÇÌÅÌÇÊÅÊÇÄÆÉÈÉÈËÆÉÈËÈËÆÉÈËÆÄÁÉ¿;PM1PE¿Ã¿ÁÄ;PM2FP1PE=<qTÀ{LÀ;PM0PEÂÃÂÁ¿Á¿ÂÊ¿ÁÂÃÄ¿ɿ;PM2FP1PE=<oTÀYKÀ;PM0PEÁÄ¿eÀÊ¿¿fÀÁÂÅÅ;PM2FP1PE=<oUÀKJÀ;PM0PEÃÁDÀKÀÆÆAÀJÀÃÁ;PM2FP1PE=<EAÀ]RÀ;PM0PEÁÄÄÇÆÇÆÃÄÃÌÌÃÄÅÄÃÆÃÄÁÂÉË;PM2FP1PE=<aAÀ?RÀ;PM0PEÂÅÆÅÆÅÈÅÆÅÊÌÅÆÅÆÅÆÃÄÂÃÑ¿;PM2FP1PE=<YAÀgQÀ;PM0PEÇ¿¿×Ò¿¿ØÉ¿;PM2FP1PE=<gBÀ[QÀ;PM0PE¿Ç¿ÅÁÇ¿ÇÃÅÁÇÁÇÁÇÐÅÂÊÄÈÂÆÂÈÂÊ¿ÆÂÊ¿ÈÑ¿;PM2FP1PE=<mBÀQQÀ;PM0PEÄÅ¿ÃÂÁ¿ÂÒ¿ÁÈÿ¿ÁÑ¿;PM2FP1PE=<cBÀEQÀ;PM0PEÉ¿¿ËÒ¿¿ÌÇ¿;PM2FP1PE=<UDÀUQÀ;PM0PEÃÅ¿ãÒ¿¿äÃÅÉÌ;PM1PEÃÁ¿ÃÄÆ;PM2FP1PE=<SDÀUQÀ;PM0PEÄÆÅÅÊËÆÆÄÆÃÅÄ¿ÄÑ¿;PM2FP1PE=<SDÀOQÀ;PM0PE¿Á¿ÃÒ¿¿Ä¿ÁÑÄ;PM2FP1PE=<{CÀwPÀ;PM0PE¿ÆÁÅÇÅÇÉÅÇÒÿÂÈÈÈÆÆÈ¿ÄÏ¿;PM2FP1PE=<sCÀmPÀ;PM0PEÇ¿¿Éп¿ÊÇ¿;PM2FP1PE=<YEÀYQÀ;PM0PE¿Â¿Ëп¿Ì¿ÂÏÃ;PM2FP1PE=<oEÀ[PÀ;PM0PEÂÃÄÅ¿ÅÂÇÄÇÂÇÄÇÂÅÂÇÐÄÁÈÁÈÁÈÁÆÃÊÁÆÃÈÃÆÂÁÑ¿;PM2FP1PE=<gEÀiOÀ;PM0PEÇ¿¿ñÒ¿¿òÉ¿;PM2FP1PE=<MFÀgOÀ;PM0PEÉÇÊÂÆÆÂÄÄÆÍÊÃÅÃÿÁÇÇÈÈÇ¿¿ÇÒ¿;PM2FP1PE=<aFÀIQÀ;PM0PEÆÄÈÊÄÊÂ̿п̿̿̿ÊÑ¿¿ÉÂË¿Ë¿ËÁË¿ÉÃÇÃÅÆ¿Ñ;PM2FP1PE=<cFÀ?QÀ;PM0PEÇÉÊ¿¿ÒÉ¿ÇÇÈÈÇ¿¿Çп;PM2FP1PE=<kFÀQQÀ;PM0PEÈÈ¿ÊÏ¿¿ÉÈÈ¿Ï;PM1PEÈ¿¿ÈÇÇ;PM2FP1PE=<qFÀUQÀ;PM0PEÆ¿ÂÄ¿ÿ¿ÐÅÁÃÁ¿¿¿Ï;PM2FP1PE=<AGÀIQÀ;PM0PEÊÇÅÂÂÁÆÃÄ¿¿Ð¿ÁÂÅÂÈÇÑ¿;PM1PE¿ÇÊ¿ÉÈ;PM2FP1PE=<GGÀCQÀ;PM0PEÄÅÂÁ¿ÂÒ¿ÁÆÃÄÁÂÁ¿ÄÅÑ¿;PM1PE¿ÁÄÃÃÆ;PM2FP1PE=<EGÀ[PÀ;PM0PEÁÄ¿ëÒ¿¿ìÁÄÍÇ;PM2FP1PE=<aGÀuOÀ;PM0PEÃÄàéÎÈÝêÃÄÇÏ;PM2FP1PE=<kGÀiOÀ;PM0PEÄÇÆÃÈÐÅÂÄÅÏ¿;PM1PE¿ÅÄÁÃÈ;PM2FP1PE=<qGÀ{NÀ;PM0PEÄÅÂÍ¿Ë¿Íп¿Î¿ÎÁÐÇÎËË;PM2FP1PE=<IHÀ{NÀ;PM0PEÄƿĿ¿¿ÆÏ¿¿ÁÁÿÿÃÂÆÌË;PM2FP1PE=<MHÀ{NÀ;PM0PEÁÅÆÆËÌÅÅÁÅп;PM2FP1PE=<UHÀMOÀ;PM0PE¿ÂÄÄÂÄÂÈÏ¿ÃÅÁÃÁÿÁÐÁ;PM2FP1PE=<{HÀqPÀ;PM0PEÎÄÄÌÄÌÄÌÂÌÄÌÂÌÂÌÂÌÏÂÁËÁËÃÉÁËÃËÁÉÃÍÅËÐÄËË;PM1PEÈÉÆÎÍÃ;PM2FP1PE=<MIÀ[PÀ;PM0PEÂÅÐÏÌÌÏÐÄÅÑ¿;PM2FP1PE=<KIÀyOÀ;PM0PEÁÆ¿çÒ¿¿èÃÆËË;PM2FP1PE=<qIÀYOÀ;PM0PEÄÃÈÅÊÅÈÇÈÇÌÌÇÈÇÈËÊÉÆÂÃÍÇ;PM2FP1PE=<oIÀYOÀ;PM0PEÁ¿ÁÎÈ¿ÂÁÄÉÍ;PM2FP1PE=<}IÀCOÀ;PM0PEÂÅÂÁÂÃÂÅÆÃÊÎÃÄÁÆÃÄÂÅÏ¿;PM2FP1PE=<uIÀ]NÀ;PM0PEÇÈ¿íп¿îÇÈÈÇ¿ÈÇ¿¿Ï;PM2FP1PE=<wIÀWNÀ;PM0PEÇÅÊ¿¿ÐÉ¿ÇÇÈÈÇ¿¿ÇÐÁ;PM2FP1PE=<iJÀwNÀ;PM0PEÃÇÌÆÒÊÎÊÊÎÏÂÅÃËÇÏÇËÅÃÇÄÈÃÿÃп;PM2FP1PE=<qJÀuOÀ;PM0PEÆÆ¿ÎÂοοÎÏ¿¿Í¿ÍÁËÁÍÆÆÆÍ;PM1PEÄ¿ÂÆÅÅ;PM2FP1PE=<IKÀIPÀ;PM0PEÁÃÆÆÈÆÆÈÆÄÅÎÇÅÉÇÅÅÃÁÃÃÎÇ;PM2FP1PE=<cKÀ[PÀ;PM0PEÎÁÄÄÄÆÂÆÂÄÍÈÁÃÁÅÁÁÃÃÌÁÍÇ;PM1PEÆÉÈÈÍÂ;PM2FP1PE=<iKÀKPÀ;PM0PEÁÆÂÅ;PM1PE¿ÅÄÅÂÃÎÈÁÄ¿ÂÁÆÁÂÁÆÂÅ¿ÄÁÂËË;PM2FP1PE=<uKÀwOÀ;PM0PEÆÅÁ¿ÂÃÂÅÄÃÌÌ¿ÂÃÂÁÆÅÆÆÇÑ¿;PM1PE¿ÃÆÁÅÆ;PM2FP1PE=<iLÀ{NÀ;PM0PEÄÅÆÅÆÅÈÅÊÇÈÇÆÇÄÅ¿ÅÒ¿ÁÌÅÊÇÊÇÈÉÈÇÆÇÆÃÆÂÅÑ¿;PM2FP1PE=<eLÀyNÀ;PM0PEÃÈ¿ÉÒ¿¿ÊÃÈÄÇ¿ÄÃÄÉÏ;PM2FP1PE=<mLÀoNÀ;PM0PEÄÅÄÃÊÐÃÂÂÅÏÁ;PM2FP1PE=<mLÀCNÀ;PM0PE¿ÉÁÉ¿ËÂËпʿ̿ʿÊÏ¿;PM2FP1PE=<uLÀuMÀ;PM0PEÂÅÂÁÂÁ¿Ã¿п¿ÆÁÄÃÄÁÄÂÃÑ¿;PM2FP1PE=<uLÀoMÀ;PM0PEÁÆ¿ÃÂÿÁ¿ÁÒ¿¿ÄÁÆ¿ÂÃÆËË;PM2FP1PE=<}LÀaMÀ;PM0PEÂÅÆÇÌÌÅÈÂÅÏ¿;PM2FP1PE=<AMÀMMÀ;PM0PE¿ÅÂÅÂÿÃп¿ÆÁÆ¿Ä¿ÄÑ¿;PM2FP1PE=<SMÀIOÀ;PM0PEÁÅÌÈÎÆÐÈÌÎÏÈÅÉÍÅÍÅÏÉÁÅп;PM2FP1PE=<[MÀyOÀ;PM0PEÈÈ¿èÏ¿¿çÈÈ¿Ï;PM1PEÈ¿¿ÈÇÇ;PM2FP1PE=<{MÀ}OÀ;PM0PEÊ¿Ä¿ÈÂÆÂÄ¿¿ÐÅ¿É¿ÅÁÇÃÊÁËË;PM1PEÄÃÆÄÉ¿;PM2FP1PE=<YNÀEOÀ;PM0PEÁÄÄÑÆÏÌÍÊËÌÌÉÌÉÌÃÌÁÌÁÆÍÉ;PM2FP1PE=<cNÀsNÀ;PM0PE¿Æ¿ÇÂÅÆÅÂÃÎÊÃÆÁ¿¿ÄÁÄÁÄÍÉ;PM2FP1PE=<AOÀCNÀ;PM0PEÁÂàñÎÊßòËË;PM2FP1PE=<IOÀ{MÀ;PM0PEÁÂÊÉÌÌÉÊ¿ÂÉÏ;PM2FP1PE=<]OÀeMÀ;PM0PEÄÅÂÃÄÃÆÃÄÃÊÐÅÂÁÂÃÄÁÂÂÃÑ¿;PM2FP1PE=<aOÀ]MÀ;PM0PEÂÅÂÁ¿Á¿ÂÒ¿ÁÆÁÂÁ¿ÁÏ¿;PM2FP1PE=<cOÀSMÀ;PM0PE¿ÅÂÃп¿ÆÁÄÏ¿;PM2FP1PE=<[OÀ]LÀ;PM0PEÇ¿¿õп¿öÇ¿;PM2FP1PE=<KPÀyNÀ;PM0PEÃÁÊÆÈÄÊÄÈÆÈÆÈÆÈÈÆÈËÌÅÇÇÇÅÃÇÅÇÃÅÅÉÃÇÅÃÁÎÉ;PM2FP1PE=<QPÀ?OÀ;PM0PEÁÃÈÊÍÊÇÉ¿Åп;PM2FP1PE=<QPÀEOÀ;PM0PE¿ÆÏ¿¿Åп;PM2FP1PE=<_PÀOOÀ;PM0PEÇÇÈ¿ÆÄÆÆÂÈÏ¿Á¿Á¿ÁÁÇÇÈÈÇ¿¿Çп;PM2FP1PE=<gPÀYOÀ;PM0PEÈ¿¿ÊÏ¿¿ÉÈ¿;PM2FP1PE=<iQÀMMÀ;PM0PEÃÂÄÇÆÇÆÇÄÉÆÉÄÇÂÅÂÇпÁÊÁÊÅÊÅÊÃÈÅÌÅÈÃÆÃÄÅÍ;PM2FP1PE=<sQÀEMÀ;PM0PEÄÅÆÁÆÎÃÂÄÇÏ¿;PM1PE¿ÃÄÁÃÆ;PM2FP1PE=<GRÀaLÀ;PM0PEÂÅÄÅÆÇÆÉÂÅпÃÌÅÌÅÊÃÆÂÃÑ¿;PM2FP1PE=<?RÀ}KÀ;PM0PEÇ¿¿ãÒ¿¿äÉ¿;PM2FP1PE=<GUÀEMÀ;PM0PEÄÅÊÇÌÅÊÇÌÇÌÅÌÇÊÅÈÇÌÌÉÊËÆËÈÉÈËÆÉÈËÆÉÈÄÇÑ¿;PM1PE¿ÁÄÃÃÆ;PM2FP1PE=<KUÀ}LÀ;PM0PE¿ÃÄÅ¿ÁÂÒ¿ÁÆÃÄÂÁÑ¿;PM2FP1PE=<GUÀ_KÀ;PM0PEÃÆ¿cÀÒ¿¿dÀÁÆËË;PM2FP1PE=<EVÀMJÀ;PM0PEÅÅDÀKÀÌÌCÀLÀÅÅ;PM2FP1PE=<iúkVÀ;PM0PEåÏíÓïÓñÕë×áÕÕÕÅÕÊÊ¿ÐÅÔÉÒËÒÍÒÍÌÉÆÒ¿Ô¿ÖÂÔÂØÂÖÄÖÄÖÄØÄØÄÖÆÖÄÖÄÔÄÔÄÔÂ;PM2RF2,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1;FT11,2FPPE=<Cö}SÀ;PM0PEÔÌÔÐÐÖÐÚÐÞÎàÐäÎâÌäÎäÎàÌàÎÜÎÚÎÔÎÐÁÌ¿ÌÂÌÆÌÄÎÂÎÂÌÃÌOÀåùßãÝÙÝÏÙÏÙÓÛÛÝÈ×ÈÕÈ×ÆÕÊ×Æ×È×ÈÕÃÍÃÍÃÍÃËÃÍÃÍÃÍÃË;PM2RF3,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,3FPPE=<]öOOÀ;PM0PEÂàÄÞÂàÄÞÂÞÆàÄÞÆÞÆÞÈÜÈÞÊÜÊÜÌÜÎÚÐÚÃÊÁÌÇÐÇÒÇÒÉÎÉÌÉÆËÄË¿ÉÂË¿ËÁËÁÉÃÇÃÂÓÂ׿ÙÃÛÁÛÃÝÁßÅßÃáÅßÅáÃßÃßÅßÃÝÁÝÎÉÊÉÌËÈÍÊÍÈËÊËÌÉ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<GøqGÀ;PM0PEÅÒÁÒ¿ÔÂÖÄÖÂÖÄÔÂÖÉÊÉÈËÊÉÈÇÇÃÉÅÇÅÉÅÉÇÉËÉÍËÁÑÃÑÃÑÇÑÇÓÅÕÉ×Ç×ÐÆÒÆÔÈÖÄÔÆÔÄÒÄÐÂ;PM2FPPE=<aüAKÀ;PM0PEÄâÁâÁàÅàÅàÇàÅàÃâËØÅØÁÖ¿ÖÂØ¿ÖÂØ¿ÖÉÈÇÆÉÂÉÂÇ¿ËÁÉÁËÁÂÙ¿ÙÁ×Á×ÁÙÃÙÃ×Å×Å×Å×Å×Å×Å×Ã×ÃÙÅ×ØÉØÇØÇÖÇØÅÖÇØÇØÇ;PM2FPPE=<]AÀKIÀ;PM0PEÓØÓØÕÚÕÜÓÚÑÜËÜÅÜÅÏÅÓÁÓÁÕ¿Ó¿Õ¿ÕÁÓÖÇÒÅÔÅÔÅÔÅÔÅÒÅÔÅ;PM2FPPE=<qSÀAü;PM0PEÃÇÅÅÇÃÇÁÉÃÇÃÉÃÅÇÉÇÍÄÑÆÓÈÛÈáÂçÃñËëÇÝÎÓÜÍæÉìÉìÍäÑÜãàáÚÝÜÙÖ×ÔÕÒÑÒÓÎÏÎÑÎÑÌÏÌÑÊÓÌÓÌÕÌËÈÍÆÏÈÏÊÑÊÕÊÕÎ×ÎÛÐßÒßÔãÖçØëÚíÞñÞ÷âùæ?ÀèCÀìIÀîMÀòQÀöYÀú]ÀþcÀBÀiÀDÀoÀLÀwÀNÀ{ÀTÀCÁXÀIÁ\ÀÓÎßØíàóæûì?ÀòEÀôCÀôEÀöAÀòûòõîíèãàÕØÇÐÄÂÌÁÐÇØËÚÍÞÑÞÓâÓàÓâÓÞÓÜÑØÏÒËÎÇÆÃbÀEÀ\ÀAÀXÀýTÀûNÀ÷LÀóHÀóDÀï@ÀíþëüçúçøåôãöáòáòßòÝðßòÝðÝôÛòÝôÝöÝöÝøÝüÝüáBÀßBÀãHÀãð×ôÕòÓöÓôÓôÑôÑöÑôÓôÑôÕòÕò×ðÙîÛîßÞÕàÕà×àÙâÙÞÙÞÝÚÛÚßÖÝÔáÎáÌãÆå¿åÃç;PM2FPPE=<[÷EJÀ;PM0PEÅÛÃÝÅÝÃßÅáÁßÃãÁßÃãÁãÁßÁá¿ß¿á¿Ý¿Ýп¿Þ¿Þ¿âÂà¿âÄàÂäÂâÄàÂäÄàÄâÆàÄÞÄÞÆÜ¿ÂÏ¿;PM2FTFP1PE=<A÷KFÀ;PM0PEÅÉ¿ã¿ßÃÝÁÛÃÙÃÛÃÝÁÝпÄÜÂÞÆÚÄÜÂÜÂàÂàÁäÅÇÃÒ;PM1PEÅÿÅÆÊ;PM2FP1PE=<iô?FÀ;PM0PEÄ¿ÑÁÓÁÓ¿Ó¿Õ¿ÓÁÑÁÑÃÄÑÐÆÒÂÒ¿ÖÂÔ¿Ô¿ÖÂÒÂÄ¿ÉÐ;PM2FP1PE=<kóGEÀ;PM0PEáÇÏÓÃÑÇÉÊÏÌÒÆÒÈÌÚÆ¿Ò;PM2FP1PE=<WüSNÀ;PM0PE¿ÂÃÉÅÇÃÉÃÇÅÉÃÉÃÇÃÉÎÇÄÊÆÈÂÊÆÊÄÈÆÊÄÊÄÊÂÂÏÂ;PM2FP1PE=<sûkKÀ;PM0PE¿ÂÃÕÅÓÃÕÃÕÅÓÃÕÃÓÃÕÐÁÄÔÆÖÄÔÄÔÄÖÆÖÄÔÆÖÑÂ;PM2FP1PE=<OûYHÀ;PM0PEÅÅÃÙÃÙÃÙÃ×ÁÙÃ×ÃÙÃÙÒÁÂÚÄØÄÚÄÚÄØÂÚÄÚÄÚÇÇÁÐ;PM1PEÅ¿¿ÅÆÆ;PM2FP1PE=<gúYHÀ;PM0PEÈÆË¿ËÁËÁËÁÂÏÌÂÌ¿ÌÂÌÂÆÆÅÅÄÂÂÄÏÄ;PM2FP1PE=<uùwEÀ;PM0PEÃÃÅÓÅÓÅÑÅÕÃÑÅÓÅÓÅÓÐÃÆÔÆÒÆÔÆÔÆÔÆÔÆÔÆÔÁÃËÌ;PM2FP1PE=<køcDÀ;PM0PEÅÁÇËÉÉÇËÇÇÉÉÇËÇÉÇÇÌËÈÊÈÌÈÈÊÊÈÌÈÈÊÊÈÌÅÿÒ;PM1PEÁ¿ÃÁÆÂ;PM2FP1PE=<]÷aDÀ;PM0PEÆÄÉÁÉ¿Ë¿ÉÁÉÁÉ¿É¿Ë¿¿ÑÌ¿ÊÂÊ¿ÌÂÊ¿ÊÂÊ¿Ì¿ÄÄÃÃÄ¿¿ÄËÊ;PM2FP1PE=<QöCCÀ;PM0PEÉËÇËÉËËËÅËÉÇÉÍÉËÌÉÊÌÊÌÊÌÊÌÈÌÊÌÈÌÌÌÍÈ;PM2FP1PE=<aøiCÀ;PM0PEÅÅÃÏÅÍÁÍÅÍÒÅÄÐÄÎÄÎÆÐÅÅÅÐ;PM2FP1PE=<G÷wBÀ;PM0PEËÅËÅËÇÉÅËÅËÅËÅÇÅÆÏÌÆÌÈÊÆÌÆÌÆÌÈÊÆÌÆÇÎ;PM2FP1PE=<W?ÀsLÀ;PM0PE¿ÆÅÍÃÍÁÍÃËÃËÇÇÇÇÏÃÂÏÔÆÎÊÊÌÆÎÄÎÂÎÄÌÄÊÂÄÏ¿;PM2FP1PE=<c?ÀyIÀ;PM0PE¿ÃÄÛÄÙ¿ÕÂÕ¿Ó¿ÕÂÓ¿Õп¿ÖÁÔ¿Ö¿Ô¿ÖÁØÃÚÃÜ¿ÃÏÆ;PM2FP1PE=<mþAFÀ;PM0PE¿ÂÇáÅÝÅÝÅÝÅßÇÝÅÝÇáÐÅÈâÈàÆàÆàÆÞÆÞÆÞÈà¿ÂÏ¿;PM2FP1PE=<aþuCÀ;PM0PE¿ÏÃÑ¿ÑÁÑÃÏ¿ÑÁÓ¿Ïп¿ÐÂÒÂÒÂÐÂÒÂÒÂÔ¿ÐÏ¿;PM2FP1PE=<[þ[BÀ;PM0PEÉÇ¿É¿É¿Ë¿ÇÂË¿ÉÂÉ¿Éп¿ÊÁÊ¿Ê¿Ì¿È¿ÌÁÊ¿ÊÉÇÄÐ;PM1PEÉÄ¿ËÊÈ;PM2FP1PE=<GûSBÀ;PM0PEÙÃÏÇÍÇÍÅÓÃÙ¿çÆ÷ÐÃÏøÏêÇà¿ÔÆÐÈÎÈÐÆÔ¿Ò;PM2FP1PE=<QDÀWIÀ;PM0PE¿áÃÙÃÕÇÓÅÑÇÑÇÑÇÕÐÅÆÔÈÒÈÒÊÔÆÔÆØÂÞ¿âÏ¿;PM2FP1PE=<yCÀqEÀ;PM0PEÁÁÅáÃÝÃÛÃÛÁÛ¿ÙÁÙ¿Ûп¿ÜÂÚÂÚÂÚÂÜÄÜÆÞÆâÁÁÍÆ;PM2FP1PE=<{BÀUCÀ;PM0PEÁÁÕËÍÑÉÕÃÓÁÕ¿ÕÃÓÃÑÎÅÈÖÂÔÂÖÂÔÄÔÆÐÌÐÒÊÃÁÁÒ;PM2FP1PE=<O@ÀCCÀ;PM0PEÕÍÕÅÑÃ׿ÑÂÕÂÕÂ׿ÂÑÖÂÔÁÖÁÔÁØ¿ØÂØÊØÎÉÎ;PM2FP1PE=<?UÀaý;PM0PEÇÁØÇØÇØÅØÇØÉØÅØÇØÉÚÅØÅÞÅÜÅÞÃàÁàÁâ¿¿Òá¿ß¿ÝÂÝÆÛÄÙÆÙÆ×ÈÙÈ×È×È×ÈÕÈ×È×ÆÙÈÇÃÈÄÅÂÁÅÌÉ;PM2FP1PE=<}VÀw?À;PM0PE¿ÞÐÖÒÒÔÌÔÊÔÈÔÌÒÌÒËÊÍÑËÕÇÑÉÓËÑÏÑÓÏÛÍ¿ÄÏ;PM2FP1PE=<gYÀUBÀ;PM0PEÌØÊØÌÖÎÖÒÒÚÒâÐìÎÃÐíÍãÑÛÓÓÓÏÕËÙË×É×ÎÅ;PM2FP1PE=<AYÀsü;PM0PEÇÁàÃà¿àÂÞÂÞÁÞÅÞÍà×ÌÌáÚáÐáÈß¿Ý¿ßÁß¿ÝÂÅÁÆÂÃÂÁÃÌË;PM2FP1PE=<YZÀSþ;PM0PEÁÁZÀbÀËÌYÀaÀ¿ÁÎÇ;PM2FP1PE=<o_ÀICÀ;PM0PEèÊäÎÞÐàÐÚÔÚÔÖÖÒØÔÖÐÖÎÖÐØÌÖÌÔÌÒÊÒÍÈËÏËÓÉÓÍÕÍÕÍÕÏÕÑ×ÑÓÕÕ×ÓÙÑÛÏßÍáËãÉÂÑ;PM2FP1PE=<EZÀgý;PM0PEÛÉ×ÉÙÍÙÉ×ÉÕÅÕÁÓÂÅÏÚÃØÂØÆÜÌÚÌØÌÚÌØÈÃÐ;PM2FP1PE=<Q^Àkû;PM0PEÊÇÈ×Æá¿åÁçÅãËÝÍÕÌËÐÚÎàÆèÄêÁèÅäÉÜÏÒÇÑ;PM2FP1PE=<YaÀsý;PM0PEàÎÞÊàÈàÄÜÃÜÇÖÑÔÙÐÊ×ÜÛÔÝÊßÄáÃáÅáÍßÍÈÍ;PM2FP1PE=<WâeUÀ;PM0PEÐËÎÉÌÇÊÇÈÇÈÍÈÓÊÛÊÙÊÍÌÁÌÂÊÆÌÄÌ¿ÎÉÖÛÒÙÎÕÌÓÈÏÆÍÈËÈÇÖÉÖÅÔÅÐÁÊÂÆÈ¿ÌÅÒÙÎÍÌÁÌ¿ÈÆÊÄÌ¿ÌÇÌÏÒÙÒßØßØÝØÕØÍØ¿ÖÄÔÇÒÍÎÓÎÓÌÑÊÏÌÇÊÅÌÅÈÇÊÇÌÉÈÉÌËÌÉпÓÄÕÂÙÂÙÂÙÄÛÂ×ÂÓ;PM2FT11,3FPPE=<I^Àaû;PM0PEàÌÜÐØÖÖØÔÚÔÜÒÞÒÚåêéèíæïæóäóä÷ä÷âûâùäûàûâûâûâ÷äùâCÀðIÀòKÀöMÀôQÀøOÀöQÀöMÀöMÀôIÀòGÀðAÀê?ÀêõâïÞéÚéÜùæCÀîMÀöSÀüWÀBÀYÀBÀ[ÀBÀYÀBÀUÀþQÀúGÀòýîïàãØÓÊÑÄÏÂÉÂÇÁÃÅÁÇÂÍÆÑÞåâçæéèéìëðíôíöïöïüñüñþó@ÀñBÀõBÀóDÀõFÀóDÀóFÀõHÀõFÀóFÀóFÀóDÀóFÀñBÀñDÀñ@Àï@ÀïþëúíúéèãæßèáêÝæßèÛèÝèÝèÛæÛèÛæÝèÛäÝæÝæßÚËÚËØËÚËÚÍÚËØËÚËÚËÚËØËÚËÚÍÚËØËÚË;PM2FT11,4FPMC1,90PE=<I]À_ø;PM0PEÆýÒùÜóæëîåòÛúÑþÅüÆúÒôÜìææìÜôÒúÆþÅüÑúÛôåìëæóÜùÒûÆýÅùÑñÛíååëÛóÑùÅû;PM1PEÄ¿ÆûÒùÜñæíìãôÛøÑüÅüÆøÒôÜìäæîÚòÒúÆüÅüÑøÙôåìëäóÜ÷ÒûÆûÅ÷ÑóÛëãåëÛóÑ÷Åû;PM1PE;PM2FPPE=<E]À_ø;PM0PEÆûÒùÜñæíìãôÛøÑüÅüÆøÒôÜìäæîÚòÒúÆüÅüÑøÙôåìëäóÜ÷ÒûÆûÅ÷ÑóÛëãåëÛóÑ÷Åû;PM1PEÆ¿ÆûÐ÷ÜñäëìãòÛøÑüÅüÆöÒôÜêäæìÜòÐøÆüÅüÏöÛòåìéæóÚõÒûÆûÅ÷ÑñÙëåãëÛñÏõÅû;PM1PE;PM2FPPE=<?]À_ø;PM0PEÆûÐ÷ÜñäëìãòÛøÑüÅüÆöÒôÜêäæìÜòÐøÆüÅüÏöÛòåìéæóÚõÒûÆûÅ÷ÑñÙëåãëÛñÏõÅû;PM1PEÄ¿ÆûÐõÜñäëêáòÛöÏüÅúÆöÐòÜìââìÜòÒöÆüÅúÑöÛòáìëâñÜõÐùÆûÅõÏñÛéáãëÛñÏõÅù;PM1PE;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<{\À_ø;PM0PEÆûÐõÜñäëêáòÛöÏüÅúÆöÐòÜìââìÜòÒöÆüÅúÑöÛòáìëâñÜõÐùÆûÅõÏñÛéáãëÛñÏõÅù;PM1PEÄ¿ÆùÒõÚïâëìáðÙöÑúÅúÆöÒðÚêâäìÚðÐöÆúÅøÏöÙðãìéâïÜõÐùÆùÅõÏïÛëááëÙïÑõÅ÷;PM1PE;PM2FPPE=<w\À_ø;PM0PEÆùÒõÚïâëìáðÙöÑúÅúÆöÒðÚêâäìÚðÐöÆúÅøÏöÙðãìéâïÜõÐùÆùÅõÏïÛëááëÙïÑõÅ÷;PM1PEÆ¿ÆùÐóÚïâéêáðÙöÏøÅøÆôÐðÚêâäêØðÒôÆúÅøÑô×ðãêéäïØóÒ÷Æ÷ÅõÑï×éãáéÙïÏóÅ÷;PM1PE;PM2FPPE=<q\À_ø;PM0PEÆùÐóÚïâéêáðÙöÏøÅøÆôÐðÚêâäêØðÒôÆúÅøÑô×ðãêéäïØóÒ÷Æ÷ÅõÑï×éãáéÙïÏóÅ÷;PM1PEÄ¿Æ÷ÐóÚïâçèáðÙôÏøÅöÆöÐîÚêâàèÜðÎôÆøÅöÍöÛîßèéâíÚõÐõÆ÷ÅóÏïÙçááçÙíÏõÅõ;PM1PE;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<m\À_ø;PM0PEÆ÷ÐóÚïâçèáðÙôÏøÅöÆöÐîÚêâàèÜðÎôÆøÅöÍöÛîßèéâíÚõÐõÆ÷ÅóÏïÙçááçÙíÏõÅõ;PM1PEÆ¿Æ÷ÎñÚïâåèáîÙòÏøÅöÆôÐîÚèââæØðÐòÆøÅöÏò×ðáèçàíÚóÐõÆ÷ÅñÏíÙçßáçÙïÍñÅõ;PM1PE;PM2FPPE=<g\À_ø;PM0PEÆ÷ÎñÚïâåèáîÙòÏøÅöÆôÐîÚèââæØðÐòÆøÅöÏò×ðáèçàíÚóÐõÆ÷ÅñÏíÙçßáçÙïÍñÅõ;PM1PEÄ¿ÆõÐóØëàçèßî×òÏöÅöÆòÐîØèààèØìÐôÆöÅöÏò×îßæçâíØñÎõÆõÅñÍí×çáßå×íÏñÅõ;PM1PE;PM2FPPE=<c\À_ø;PM0PEÆõÐóØëàçèßî×òÏöÅöÆòÐîØèààèØìÐôÆöÅöÏò×îßæçâíØñÎõÆõÅñÍí×çáßå×íÏñÅõ;PM1PEÄ¿ÆõÐïØíàåèßìÙðÍöÅôÆòÎìÚæààæÚîÐðÄöÃôÏòÙìßæåàëÚñÐóÄõÃïÏëÙçßßå×ëÏñÅó;PM1PE;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<_\À_ø;PM0PEÆõÐïØíàåèßìÙðÍöÅôÆòÎìÚæààæÚîÐðÄöÃôÏòÙìßæåàëÚñÐóÄõÃïÏëÙçßßå×ëÏñÅó;PM1PEÆ¿ÄóÐïØëàçæÝì×ðÏôÃôÄðÐìØæÞàèØìÎðÆôÅòÍð×îßæåÞëØïÐóÆóÅïÏë×åÝßå×íÏïÃñ;PM1PE;PM2FPPE=<Y\À_ø;PM0PEÄóÐïØëàçæÝì×ðÏôÃôÄðÐìØæÞàèØìÎðÆôÅòÍð×îßæåÞëØïÐóÆóÅïÏë×åÝßå×íÏïÃñ;PM1PEÄ¿ÆóÎïØéÞåæÝì×ðÏòÃòÄðÐìØäÞàæÖêÐðÄôÃòÏðÕêßæãàëÖïÐñÄñÃïÏëÕåßÝå×éÍïÅñ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<U\À_ø;PM0PEÆóÎïØéÞåæÝì×ðÏòÃòÄðÐìØäÞàæÖêÐðÄôÃòÏðÕêßæãàëÖïÐñÄñÃïÏëÕåßÝå×éÍïÅñ;PM1PEÆ¿ÄóÎëØëÞãäßìÕîÍòÅòÆîÎêÖäààäÖìÐìÄôÃòÏîÕêßäãàéÖíÎñÆñÅíÍëÕãßÝã×éÍíÃñ;PM1PE;PM2FPPE=<O\À_ø;PM0PEÄóÎëØëÞãäßìÕîÍòÅòÆîÎêÖäààäÖìÐìÄôÃòÏîÕêßäãàéÖíÎñÆñÅíÍëÕãßÝã×éÍíÃñ;PM1PEÄ¿ÄñÐíÖçÜåæÛè×îÍòÃðÄîÎêØäÜÞæÖèÎîÆòÅðÍîÕèÝäãÞéØíÎïÄñÃíÍç×åÝÛãÕçÏíÃï;PM1PE;PM2FPPE=<K\À_ø;PM0PEÄñÐíÖçÜåæÛè×îÍòÃðÄîÎêØäÜÞæÖèÎîÆòÅðÍîÕèÝäãÞéØíÎïÄñÃíÍç×åÝÛãÕçÏíÃï;PM1PEÄ¿ÆïÎíÖçÞáâÝêÕìÍðÅðÆìÎèÖäÞÞâÖèÎîÄðÃðÍìÕèÝäãÞçÔëÐïÄïÃëÏéÓáÝÝãÕçÍëÅï;PM1PE;PM2FPPE=<G\À_ø;PM0PEÆïÎíÖçÞáâÝêÕìÍðÅðÆìÎèÖäÞÞâÖèÎîÄðÃðÍìÕèÝäãÞçÔëÐïÄïÃëÏéÓáÝÝãÕçÍëÅï;PM1PEÆ¿ÄïÎëÖçÜáâÝèÓìÍðÃîÄìÎèÔäÞÜâÖèÌìÆðÅîËìÕèÛâãÞçÖëÌíÆïÅëËçÕáÝÛáÕçÍëÃí;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<A\À_ø;PM0PEÄïÎëÖçÜáâÝèÓìÍðÃîÄìÎèÔäÞÜâÖèÌìÆðÅîËìÕèÛâãÞçÖëÌíÆïÅëËçÕáÝÛáÕçÍëÃí;PM1PEÄ¿ÆíÌëÖçÜßâÛæÕìÍîÃîÄêÎèÖâÜÜàÔèÎìÄîÃìÍìÓèÛâáÚçÖéÎíÄíÃëÍåÕáÙÛáÕçËëÅë;PM1PE;PM2FPPE=<}[À_ø;PM0PEÆíÌëÖçÜßâÛæÕìÍîÃîÄêÎèÖâÜÜàÔèÎìÄîÃìÍìÓèÛâáÚçÖéÎíÄíÃëÍåÕáÙÛáÕçËëÅë;PM1PEÆ¿ÄíÎéÔåÜáàÙæÕêËîÅîÆêÌäÖâÚÜâÔæÎêÄîÃìÍêÓæÛâáÜãÔéÌíÆíÅéËåÓßÛÛáÓåÍéÃë;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<w[À_ø;PM0PEÄíÎéÔåÜáàÙæÕêËîÅîÆêÌäÖâÚÜâÔæÎêÄîÃìÍêÓæÛâáÜãÔéÌíÆíÅéËåÓßÛÛáÓåÍéÃë;PM1PEÄ¿ÄíÌçÖåÚßâÛäÓêËìÃìÄèÌæÔàÜÜàÔæÌèÆîÅìËèÓæÛàßÜåÔçÌëÄëÃéËãÓáÛÙßÕåËçÃë;PM1PE;PM2FPPE=<s[À_ø;PM0PEÄíÌçÖåÚßâÛäÓêËìÃìÄèÌæÔàÜÜàÔæÌèÆîÅìËèÓæÛàßÜåÔçÌëÄëÃéËãÓáÛÙßÕåËçÃë;PM1PEÄ¿ÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÚåÖçÌéÄëÃçËãÕßÙÙÝÓåËçÅé;PM1PE;PM2FPPE=<o[À_ø;PM0PEÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÚåÖçÌéÄëÃçËãÕßÙÙÝÓåËçÅé;PM1PEÆ¿ÄéÌçÔãØßà×äÓèËêÃêÄèÌäÔÞØÚàÒäÌèÆêÅêËæÑäÙÞÝÜãÒçÌéÆéÅçËãÑßÛ×ÝÓãËåÃé;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<i[À_ø;PM0PEÄéÌçÔãØßà×äÓèËêÃêÄèÌäÔÞØÚàÒäÌèÆêÅêËæÑäÙÞÝÜãÒçÌéÆéÅçËãÑßÛ×ÝÓãËåÃé;PM1PEÄ¿ÄéÌåÔáØßàÙâÑæËêÃèÄæÌäÒÞÚÚàÒâÎæÂêÁèÍæÑäÙÞÝÚãÒåÌçÄéÃåËáÑßÙ×ÝÓãËåÃç;PM1PE;PM2FPPE=<e[À_ø;PM0PEÄéÌåÔáØßàÙâÑæËêÃèÄæÌäÒÞÚÚàÒâÎæÂêÁèÍæÑäÙÞÝÚãÒåÌçÄéÃåËáÑßÙ×ÝÓãËåÃç;PM1PEÆ¿ÂéÌãÔáØÝÞ×âÓäËêÃèÄæÌâÔÞØØÞÒâÌäÄêÃèËæÑà×ÞÝØáÔåÌçÄéÃãËáÓÝ××ÝÓßËåÁç;PM1PE;PM2FPPE=<_[À_ø;PM0PEÂéÌãÔáØÝÞ×âÓäËêÃèÄæÌâÔÞØØÞÒâÌäÄêÃèËæÑà×ÞÝØáÔåÌçÄéÃãËáÓÝ××ÝÓßËåÁç;PM1PEÄ¿ÄçÌãÒáØÛÜ×âÑäËèÃèÄäÌàÒÞØØÜÒâÌäÄèÃæËäÑâ×ÞÝØßÒãÌçÂçÁãËáÑÛ××ÝÑáËãÃå;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<[[À_ø;PM0PEÄçÌãÒáØÛÜ×âÑäËèÃèÄäÌàÒÞØØÜÒâÌäÄèÃæËäÑâ×ÞÝØßÒãÌçÂçÁãËáÑÛ××ÝÑáËãÃå;PM1PEÄ¿ÄçÌãÒßØÛÚ×âÏäËæÃæÄäÌàÐÜØØÜÐàÌäÄèÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PE;PM2FPPE=<W[À_ø;PM0PEÄçÌãÒßØÛÚ×âÏäËæÃæÄäÌàÐÜØØÜÐàÌäÄèÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PEÆ¿ÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PE;PM2FPPE=<Q[À_ø;PM0PEÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PEÄ¿ÄãÊãÒÝÖÛÚÓÞÑäÉäÃäÄâÊÞÒÜÔÖÜÐÞÌäÂäÁäËâÏÞÕÜÛÖÝÐáÊãÄãÃãÉÝÏÙÕÕÛÑÝÉáÃã;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<M[À_ø;PM0PEÄãÊãÒÝÖÛÚÓÞÑäÉäÃäÄâÊÞÒÜÔÖÜÐÞÌäÂäÁäËâÏÞÕÜÛÖÝÐáÊãÄãÃãÉÝÏÙÕÕÛÑÝÉáÃã;PM1PEÆ¿ÂãÌáÐÝÔÙÜÕÞÍàËäÃäÄàÌÞÎÚÖÖÚÐÞÊâÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PE;PM2FPPE=<G[À_ø;PM0PEÂãÌáÐÝÔÙÜÕÞÍàËäÃäÄàÌÞÎÚÖÖÚÐÞÊâÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PEÄ¿ÄãÊÝÐÝÔÙÚÓÞÑÞÇäÃâÄàÈÞÒØÔÖÚÐÞÊÞÄäÃâÉàÏÞÕØ×ÔÝÒßÊáÂãÁÝÉÝÑÙÓÓ×ÏÝÉßÃá;PM1PE;PM2FPPE=<C[À_ø;PM0PEÄãÊÝÐÝÔÙÚÓÞÑÞÇäÃâÄàÈÞÒØÔÖÚÐÞÊÞÄäÃâÉàÏÞÕØ×ÔÝÒßÊáÂãÁÝÉÝÑÙÓÓ×ÏÝÉßÃá;PM1PEÄ¿ÄáÊßÐÛÔ×ÚÓÚÏàÉâÃâÄÞÊÜÐÚÔÔØÐÜÈàÄâÃàÇàÏÜÓØÙÖÛÎÝÊáÄáÃßÉÙÍÙÕÓ×ÏÛÉßÃß;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<?[À_ø;PM0PEÄáÊßÐÛÔ×ÚÓÚÏàÉâÃâÄÞÊÜÐÚÔÔØÐÜÈàÄâÃàÇàÏÜÓØÙÖÛÎÝÊáÄáÃßÉÙÍÙÕÓ×ÏÛÉßÃß;PM1PEÆ¿ÄáÈÝÐÙÔ×ØÕÜÍÞÉàÁàÂÞÊÜÎØÖÔØÎÚÊÞÄâÃàÉÞÍÜÓØ×ÔÛÎÝÊßÄßÃÝÉÛÍ×ÓÓ×ÏÛÇÝÃß;PM1PE;PM2FPPE=<yZÀ_ø;PM0PEÄáÈÝÐÙÔ×ØÕÜÍÞÉàÁàÂÞÊÜÎØÖÔØÎÚÊÞÄâÃàÉÞÍÜÓØ×ÔÛÎÝÊßÄßÃÝÉÛÍ×ÓÓ×ÏÛÇÝÃß;PM1PEÄ¿ÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,7FPPE=<uZÀ_ø;PM0PEÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PEÆ¿ÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE;PM2FPPE=<oZÀ_ø;PM0PEÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE¿ÄÝÈÛÎÙÒÕÖÑÚÍÜÇÞÃÞÄÜÈØÎÖÒÔÖÌÚÈÜÄÞÃÞÇÚËÚÓÖÕÒ×ÎÛÈÝÄÝÃÛÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PE;PM2FPPE=<mZÀ_ø;PM0PEÄÝÈÛÎÙÒÕÖÑÚÍÜÇÞÃÞÄÜÈØÎÖÒÔÖÌÚÈÜÄÞÃÞÇÚËÚÓÖÕÒ×ÎÛÈÝÄÝÃÛÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PEÆ¿ÂÝÈÛÎ×ÒÓÖÑØÍÚÇÞÁÜÂÜÈØÎÖÒÐÔÎØÊÜÂÞÁÜÉÜÍØÏÖÕÐ×ÎÛÈÛÄÝÃÙÇ×ÍÕÏÑÕÍ×ÇÛÁÛ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<gZÀ_ø;PM0PEÂÝÈÛÎ×ÒÓÖÑØÍÚÇÞÁÜÂÜÈØÎÖÒÐÔÎØÊÜÂÞÁÜÉÜÍØÏÖÕÐ×ÎÛÈÛÄÝÃÙÇ×ÍÕÏÑÕÍ×ÇÛÁÛ;PM1PEÄ¿ÂÛÊÙÌ×ÒÕÔÏØÍÚÇÜÁÜÂÚÈØÎÔÐÐÖÎØÈÚÂÜÁÚÇÜÍØÏÔÓÐ×ÎÙÈÛÂÛÁÙÇ×ÍÓÏÑÓË×ÉÛÁÙ;PM1PE;PM2FPPE=<cZÀ_ø;PM0PEÂÛÊÙÌ×ÒÕÔÏØÍÚÇÜÁÜÂÚÈØÎÔÐÐÖÎØÈÚÂÜÁÚÇÜÍØÏÔÓÐ×ÎÙÈÛÂÛÁÙÇ×ÍÓÏÑÓË×ÉÛÁÙ;PM1PEÆ¿ÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PE;PM2FPPE=<]ZÀ_ø;PM0PEÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PEÄ¿ÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<YZÀ_ø;PM0PEÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PEÄ¿ÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PE;PM2FPPE=<UZÀ_ø;PM0PEÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PEÆ¿Â×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PE;PM2FPPE=<OZÀ_ø;PM0PEÂ×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PEÄ¿Â×ÈÕÊÓÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÔÆÖÂØÁÖÅÖÉÔÍÐÑÐÓÈÕÈÕÂ×ÁÓÇÕÇÏÏÍÏÉÓÇÕÁÕ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<KZÀ_ø;PM0PEÂ×ÈÕÊÓÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÔÆÖÂØÁÖÅÖÉÔÍÐÑÐÓÈÕÈÕÂ×ÁÓÇÕÇÏÏÍÏÉÓÇÕÁÕ;PM1PEÆ¿ÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃÖÄÔÆÒÊÒÎÌÐÌÔÆÔÂÖÁÔÅÖËÒËÒÑÌÑÌÓÆÕÂÕÁÓÅÓËÏËÍÑÉÑÅÕÁÓ;PM1PE;PM2FPPE=<EZÀ_ø;PM0PEÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃÖÄÔÆÒÊÒÎÌÐÌÔÆÔÂÖÁÔÅÖËÒËÒÑÌÑÌÓÆÕÂÕÁÓÅÓËÏËÍÑÉÑÅÕÁÓ;PM1PEÄ¿ÂÕÆÓÊÑÎÏÎËÒÉÔÅÖÁÖÂÒÆÒÊÐÌÎÐÈÒÆÔÄÖÃÔÅÔÇÒÍÐÏÌÑÊÑÆÕÂÕÁÓÅÑÉÍËÍÏÉÑÅÓÁÓ;PM1PE;PM2FPPE=<AZÀ_ø;PM0PEÂÕÆÓÊÑÎÏÎËÒÉÔÅÖÁÖÂÒÆÒÊÐÌÎÐÈÒÆÔÄÖÃÔÅÔÇÒÍÐÏÌÑÊÑÆÕÂÕÁÓÅÑÉÍËÍÏÉÑÅÓÁÓ;PM1PEÄ¿ÄÕÆÑÈÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÎÌÎÎÈÒÆÒÂÖÁÔÅÒÇÒÍÎÍÎÏÈÓÆÓÂÓÁÓÅÏÇÏÍËÍÇÑÅÑÃÓ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<}YÀ_ø;PM0PEÄÕÆÑÈÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÎÌÎÎÈÒÆÒÂÖÁÔÅÒÇÒÍÎÍÎÏÈÓÆÓÂÓÁÓÅÏÇÏÍËÍÇÑÅÑÃÓ;PM1PEÆ¿ÂÓÄÑÊÏÌÏÎÉÐÉÒÃÔÁÒÂÒÄÒÊÌÊÌÐÊÐÆÒÂÔÁÒÅÒÉÒËÌËÌÑÊÑÄÑÄÓÃÑÃÏÉÍËËËÉÑÃÑÁÑ;PM1PE;PM2FPPE=<wYÀ_ø;PM0PEÂÓÄÑÊÏÌÏÎÉÐÉÒÃÔÁÒÂÒÄÒÊÌÊÌÐÊÐÆÒÂÔÁÒÅÒÉÒËÌËÌÑÊÑÄÑÄÓÃÑÃÏÉÍËËËÉÑÃÑÁÑ;PM1PEÄ¿ÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<sYÀ_ø;PM0PEÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PEÆ¿¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PE;PM2FPPE=<mYÀ_ø;PM0PE¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PEÄ¿ÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PE;PM2FPPE=<iYÀ_ø;PM0PEÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PEÄ¿ÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<eYÀ_ø;PM0PEÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PEÆ¿¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PE;PM2FPPE=<_YÀ_ø;PM0PE¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PEÄ¿ÂÍÄËÆËÈÉÊÇÌÅÌÃÎÁÌÂÌÄÌÆÊÈÈÊÆÌÆ̿οÌÅÌÅÌÇÊÉÈËÆËÆË¿Í¿ËÅËÅÉÇÇÉÅËÃËÁË;PM1PE;PM2FPPE=<[YÀ_ø;PM0PEÂÍÄËÆËÈÉÊÇÌÅÌÃÎÁÌÂÌÄÌÆÊÈÈÊÆÌÆ̿οÌÅÌÅÌÇÊÉÈËÆËÆË¿Í¿ËÅËÅÉÇÇÉÅËÃËÁË;PM1PEÆ¿¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<UYÀ_ø;PM0PE¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PEÄ¿ÄÕÌÓÔËÖÃÖÄÒÌÌÔÆÖÅÔËÔÑÌÕÄÕÃÓËËÓÃÓ;PM1PE;PM2FPPE=<QYÀ_ø;PM0PEÄÕÌÓÔËÖÃÖÄÒÌÌÔÆÖÅÔËÔÑÌÕÄÕÃÓËËÓÃÓ;PM1PEÄ¿ÄÕÌÏÒËÔÃÔÄÐÌÌÐÄÖÃÔËÐÏÌÓÄÓÃÑËËÏÃÓ;PM1PE;PM2FPPE=<MYÀ_ø;PM0PEÄÕÌÏÒËÔÃÔÄÐÌÌÐÄÖÃÔËÐÏÌÓÄÓÃÑËËÏÃÓ;PM1PEÆ¿ÄÓÊÍÎËÔÁÒÂÐÌÊÎÄÔÃÒÉÎÏÌÑÄÓÃÍËÉÍÃÑ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<GYÀ_ø;PM0PEÄÓÊÍÎËÔÁÒÂÐÌÊÎÄÔÃÒÉÎÏÌÑÄÓÃÍËÉÍÃÑ;PM1PEÄ¿ÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PE;PM2FPPE=<CYÀ_ø;PM0PEÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PEÆ¿ÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE;PM2FPPE=<}XÀ_ø;PM0PEÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PEÄ¿ÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PE;PM2RF8,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<yXÀ_ø;PM0PEÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PEÄ¿ÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PE;PM2FPPE=<uXÀ_ø;PM0PEÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PEÆ¿ÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÈÅÈÅÄÉÄÉÃÇÃÃÇÁÇ;PM1PE;PM2FPPE=<oXÀ_ø;PM0PEÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÈÅÈÅÄÉÄÉÃÇÃÃÇÁÇ;PM1PEÄ¿ÂÇÄÅÆÃÈÁÆÂÆÄÆÆ¿È¿ÆÅÆÅÆÅ¿Ç¿ÅÅÃÅÁÅ;PM1PE;PM2RF1,8,8,0,0,0,0,0,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;FT11,1FPPE=<kXÀ_ø;PM0PEÂÇÄÅÆÃÈÁÆÂÆÄÆÆ¿È¿ÆÅÆÅÆÅ¿Ç¿ÅÅÃÅÁÅ;PM1PEÆ¿¿ÅÄÃÄÃÆÁÄÂÆÄÂÄÂÆÁÄÁÄÅÄÃÂÅÁÃÃÃÿÃ;PM1PE;PM2FPPE=<eXÀ_ø;PM0PE¿ÅÄÃÄÃÆÁÄÂÆÄÂÄÂÆÁÄÁÄÅÄÃÂÅÁÃÃÃÿÃ;PM1PEÄ¿ÂÿÃÄÁÄ¿Ä¿ÂÂÂÄÂÄÁÂÁÄÁÂÿÿÃÁ¿ÃÁÁ;PM1PE;PM2FPPE=<aXÀ_ø;PM0PEÂÿÃÄÁÄ¿Ä¿ÂÂÂÄÂÄÁÂÁÄÁÂÿÿÃÁ¿ÃÁÁ;PM1PEÄ¿¿ÁÂÁÂÁ¿Ä¿¿¿ÂÃÂÁ¿ÁÁÁÁ;PM1PE;PM2FT10,0FPPE=<]XÀ_ø;PM0PE¿ÁÂÁÂÁ¿Ä¿¿¿ÂÃÂÁ¿ÁÁÁÁ;PM1PE;PM2FPMC1,240PE=<yTÀGû;PM0PEÙÆÙÄÙÂÙ¿ÛÁ×ÃÙÉ×ËÍÔÍÔËÔÉÔÉÔÉÒËÔÉÔËÖÍÖÏÖÓÚÓÚ×ÜÝÞßàÜ¿ÚÁÚÅÚÅÚÇÚÇÚËØÉØËÚËØÍØËØÍØËØÍØÍÎÓÌ×Î×ÌÙÊÙÆÙ¿×Ã×;PM2FTFPMC1,90PE=<I]À_ø;PM0PEÆýÒùÜóæëîåòÛúÑþÅüÆúÒôÜìææìÜôÒúÆþÅüÑúÛôåìëæóÜùÒûÆýÅùÑñÛíååëÛóÑùÅû;PM1PEÄ¿ÆûÒùÜñæíìãôÛøÑüÅüÆøÒôÜìäæîÚòÒúÆüÅüÑøÙôåìëäóÜ÷ÒûÆûÅ÷ÑóÛëãåëÛóÑ÷Åû;PM1PE;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<E]À_ø;PM0PEÆûÒùÜñæíìãôÛøÑüÅüÆøÒôÜìäæîÚòÒúÆüÅüÑøÙôåìëäóÜ÷ÒûÆûÅ÷ÑóÛëãåëÛóÑ÷Åû;PM1PEÆ¿ÆûÐ÷ÜñäëìãòÛøÑüÅüÆöÒôÜêäæìÜòÐøÆüÅüÏöÛòåìéæóÚõÒûÆûÅ÷ÑñÙëåãëÛñÏõÅû;PM1PE;PM2FPPE=<?]À_ø;PM0PEÆûÐ÷ÜñäëìãòÛøÑüÅüÆöÒôÜêäæìÜòÐøÆüÅüÏöÛòåìéæóÚõÒûÆûÅ÷ÑñÙëåãëÛñÏõÅû;PM1PEÄ¿ÆûÐõÜñäëêáòÛöÏüÅúÆöÐòÜìââìÜòÒöÆüÅúÑöÛòáìëâñÜõÐùÆûÅõÏñÛéáãëÛñÏõÅù;PM1PE;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<{\À_ø;PM0PEÆûÐõÜñäëêáòÛöÏüÅúÆöÐòÜìââìÜòÒöÆüÅúÑöÛòáìëâñÜõÐùÆûÅõÏñÛéáãëÛñÏõÅù;PM1PEÄ¿ÆùÒõÚïâëìáðÙöÑúÅúÆöÒðÚêâäìÚðÐöÆúÅøÏöÙðãìéâïÜõÐùÆùÅõÏïÛëááëÙïÑõÅ÷;PM1PE;PM2FPPE=<w\À_ø;PM0PEÆùÒõÚïâëìáðÙöÑúÅúÆöÒðÚêâäìÚðÐöÆúÅøÏöÙðãìéâïÜõÐùÆùÅõÏïÛëááëÙïÑõÅ÷;PM1PEÆ¿ÆùÐóÚïâéêáðÙöÏøÅøÆôÐðÚêâäêØðÒôÆúÅøÑô×ðãêéäïØóÒ÷Æ÷ÅõÑï×éãáéÙïÏóÅ÷;PM1PE;PM2FPPE=<q\À_ø;PM0PEÆùÐóÚïâéêáðÙöÏøÅøÆôÐðÚêâäêØðÒôÆúÅøÑô×ðãêéäïØóÒ÷Æ÷ÅõÑï×éãáéÙïÏóÅ÷;PM1PEÄ¿Æ÷ÐóÚïâçèáðÙôÏøÅöÆöÐîÚêâàèÜðÎôÆøÅöÍöÛîßèéâíÚõÐõÆ÷ÅóÏïÙçááçÙíÏõÅõ;PM1PE;PM2RF4,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<m\À_ø;PM0PEÆ÷ÐóÚïâçèáðÙôÏøÅöÆöÐîÚêâàèÜðÎôÆøÅöÍöÛîßèéâíÚõÐõÆ÷ÅóÏïÙçááçÙíÏõÅõ;PM1PEÆ¿Æ÷ÎñÚïâåèáîÙòÏøÅöÆôÐîÚèââæØðÐòÆøÅöÏò×ðáèçàíÚóÐõÆ÷ÅñÏíÙçßáçÙïÍñÅõ;PM1PE;PM2FPPE=<g\À_ø;PM0PEÆ÷ÎñÚïâåèáîÙòÏøÅöÆôÐîÚèââæØðÐòÆøÅöÏò×ðáèçàíÚóÐõÆ÷ÅñÏíÙçßáçÙïÍñÅõ;PM1PEÄ¿ÆõÐóØëàçèßî×òÏöÅöÆòÐîØèààèØìÐôÆöÅöÏò×îßæçâíØñÎõÆõÅñÍí×çáßå×íÏñÅõ;PM1PE;PM2FPPE=<c\À_ø;PM0PEÆõÐóØëàçèßî×òÏöÅöÆòÐîØèààèØìÐôÆöÅöÏò×îßæçâíØñÎõÆõÅñÍí×çáßå×íÏñÅõ;PM1PEÄ¿ÆõÐïØíàåèßìÙðÍöÅôÆòÎìÚæààæÚîÐðÄöÃôÏòÙìßæåàëÚñÐóÄõÃïÏëÙçßßå×ëÏñÅó;PM1PE;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<_\À_ø;PM0PEÆõÐïØíàåèßìÙðÍöÅôÆòÎìÚæààæÚîÐðÄöÃôÏòÙìßæåàëÚñÐóÄõÃïÏëÙçßßå×ëÏñÅó;PM1PEÆ¿ÄóÐïØëàçæÝì×ðÏôÃôÄðÐìØæÞàèØìÎðÆôÅòÍð×îßæåÞëØïÐóÆóÅïÏë×åÝßå×íÏïÃñ;PM1PE;PM2FPPE=<Y\À_ø;PM0PEÄóÐïØëàçæÝì×ðÏôÃôÄðÐìØæÞàèØìÎðÆôÅòÍð×îßæåÞëØïÐóÆóÅïÏë×åÝßå×íÏïÃñ;PM1PEÄ¿ÆóÎïØéÞåæÝì×ðÏòÃòÄðÐìØäÞàæÖêÐðÄôÃòÏðÕêßæãàëÖïÐñÄñÃïÏëÕåßÝå×éÍïÅñ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<U\À_ø;PM0PEÆóÎïØéÞåæÝì×ðÏòÃòÄðÐìØäÞàæÖêÐðÄôÃòÏðÕêßæãàëÖïÐñÄñÃïÏëÕåßÝå×éÍïÅñ;PM1PEÆ¿ÄóÎëØëÞãäßìÕîÍòÅòÆîÎêÖäààäÖìÐìÄôÃòÏîÕêßäãàéÖíÎñÆñÅíÍëÕãßÝã×éÍíÃñ;PM1PE;PM2FPPE=<O\À_ø;PM0PEÄóÎëØëÞãäßìÕîÍòÅòÆîÎêÖäààäÖìÐìÄôÃòÏîÕêßäãàéÖíÎñÆñÅíÍëÕãßÝã×éÍíÃñ;PM1PEÄ¿ÄñÐíÖçÜåæÛè×îÍòÃðÄîÎêØäÜÞæÖèÎîÆòÅðÍîÕèÝäãÞéØíÎïÄñÃíÍç×åÝÛãÕçÏíÃï;PM1PE;PM2FPPE=<K\À_ø;PM0PEÄñÐíÖçÜåæÛè×îÍòÃðÄîÎêØäÜÞæÖèÎîÆòÅðÍîÕèÝäãÞéØíÎïÄñÃíÍç×åÝÛãÕçÏíÃï;PM1PEÄ¿ÆïÎíÖçÞáâÝêÕìÍðÅðÆìÎèÖäÞÞâÖèÎîÄðÃðÍìÕèÝäãÞçÔëÐïÄïÃëÏéÓáÝÝãÕçÍëÅï;PM1PE;PM2FPPE=<G\À_ø;PM0PEÆïÎíÖçÞáâÝêÕìÍðÅðÆìÎèÖäÞÞâÖèÎîÄðÃðÍìÕèÝäãÞçÔëÐïÄïÃëÏéÓáÝÝãÕçÍëÅï;PM1PEÆ¿ÄïÎëÖçÜáâÝèÓìÍðÃîÄìÎèÔäÞÜâÖèÌìÆðÅîËìÕèÛâãÞçÖëÌíÆïÅëËçÕáÝÛáÕçÍëÃí;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<A\À_ø;PM0PEÄïÎëÖçÜáâÝèÓìÍðÃîÄìÎèÔäÞÜâÖèÌìÆðÅîËìÕèÛâãÞçÖëÌíÆïÅëËçÕáÝÛáÕçÍëÃí;PM1PEÄ¿ÆíÌëÖçÜßâÛæÕìÍîÃîÄêÎèÖâÜÜàÔèÎìÄîÃìÍìÓèÛâáÚçÖéÎíÄíÃëÍåÕáÙÛáÕçËëÅë;PM1PE;PM2FPPE=<}[À_ø;PM0PEÆíÌëÖçÜßâÛæÕìÍîÃîÄêÎèÖâÜÜàÔèÎìÄîÃìÍìÓèÛâáÚçÖéÎíÄíÃëÍåÕáÙÛáÕçËëÅë;PM1PEÆ¿ÄíÎéÔåÜáàÙæÕêËîÅîÆêÌäÖâÚÜâÔæÎêÄîÃìÍêÓæÛâáÜãÔéÌíÆíÅéËåÓßÛÛáÓåÍéÃë;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<w[À_ø;PM0PEÄíÎéÔåÜáàÙæÕêËîÅîÆêÌäÖâÚÜâÔæÎêÄîÃìÍêÓæÛâáÜãÔéÌíÆíÅéËåÓßÛÛáÓåÍéÃë;PM1PEÄ¿ÄíÌçÖåÚßâÛäÓêËìÃìÄèÌæÔàÜÜàÔæÌèÆîÅìËèÓæÛàßÜåÔçÌëÄëÃéËãÓáÛÙßÕåËçÃë;PM1PE;PM2FPPE=<s[À_ø;PM0PEÄíÌçÖåÚßâÛäÓêËìÃìÄèÌæÔàÜÜàÔæÌèÆîÅìËèÓæÛàßÜåÔçÌëÄëÃéËãÓáÛÙßÕåËçÃë;PM1PEÄ¿ÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÚåÖçÌéÄëÃçËãÕßÙÙÝÓåËçÅé;PM1PE;PM2FPPE=<o[À_ø;PM0PEÆëÌçÔãÚßàÙäÓèËìÅêÆèÌæÔÞÚÜàÔäÌèÄìÃêËèÓæÛÞÝÚåÖçÌéÄëÃçËãÕßÙÙÝÓåËçÅé;PM1PEÆ¿ÄéÌçÔãØßà×äÓèËêÃêÄèÌäÔÞØÚàÒäÌèÆêÅêËæÑäÙÞÝÜãÒçÌéÆéÅçËãÑßÛ×ÝÓãËåÃé;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<i[À_ø;PM0PEÄéÌçÔãØßà×äÓèËêÃêÄèÌäÔÞØÚàÒäÌèÆêÅêËæÑäÙÞÝÜãÒçÌéÆéÅçËãÑßÛ×ÝÓãËåÃé;PM1PEÄ¿ÄéÌåÔáØßàÙâÑæËêÃèÄæÌäÒÞÚÚàÒâÎæÂêÁèÍæÑäÙÞÝÚãÒåÌçÄéÃåËáÑßÙ×ÝÓãËåÃç;PM1PE;PM2FPPE=<e[À_ø;PM0PEÄéÌåÔáØßàÙâÑæËêÃèÄæÌäÒÞÚÚàÒâÎæÂêÁèÍæÑäÙÞÝÚãÒåÌçÄéÃåËáÑßÙ×ÝÓãËåÃç;PM1PEÆ¿ÂéÌãÔáØÝÞ×âÓäËêÃèÄæÌâÔÞØØÞÒâÌäÄêÃèËæÑà×ÞÝØáÔåÌçÄéÃãËáÓÝ××ÝÓßËåÁç;PM1PE;PM2FPPE=<_[À_ø;PM0PEÂéÌãÔáØÝÞ×âÓäËêÃèÄæÌâÔÞØØÞÒâÌäÄêÃèËæÑà×ÞÝØáÔåÌçÄéÃãËáÓÝ××ÝÓßËåÁç;PM1PEÄ¿ÄçÌãÒáØÛÜ×âÑäËèÃèÄäÌàÒÞØØÜÒâÌäÄèÃæËäÑâ×ÞÝØßÒãÌçÂçÁãËáÑÛ××ÝÑáËãÃå;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<[[À_ø;PM0PEÄçÌãÒáØÛÜ×âÑäËèÃèÄäÌàÒÞØØÜÒâÌäÄèÃæËäÑâ×ÞÝØßÒãÌçÂçÁãËáÑÛ××ÝÑáËãÃå;PM1PEÄ¿ÄçÌãÒßØÛÚ×âÏäËæÃæÄäÌàÐÜØØÜÐàÌäÄèÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PE;PM2FPPE=<W[À_ø;PM0PEÄçÌãÒßØÛÚ×âÏäËæÃæÄäÌàÐÜØØÜÐàÌäÄèÃæËäÏà×ÜÛØßÐãÌåÄåÃãËáÏÙ××ÛÑßËãÃå;PM1PEÆ¿ÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PE;PM2FPPE=<Q[À_ø;PM0PEÄåÊáÒßÖÛÜÕàÑâËæÁäÂäÌÞÒÜÖØÜÒàÊâÄæÃäÉäÑÞ×ÜÛÖÝÒãÌãÄåÃáËßÑÛÕÕÛÑÝÉãÃã;PM1PEÄ¿ÄãÊãÒÝÖÛÚÓÞÑäÉäÃäÄâÊÞÒÜÔÖÜÐÞÌäÂäÁäËâÏÞÕÜÛÖÝÐáÊãÄãÃãÉÝÏÙÕÕÛÑÝÉáÃã;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<M[À_ø;PM0PEÄãÊãÒÝÖÛÚÓÞÑäÉäÃäÄâÊÞÒÜÔÖÜÐÞÌäÂäÁäËâÏÞÕÜÛÖÝÐáÊãÄãÃãÉÝÏÙÕÕÛÑÝÉáÃã;PM1PEÆ¿ÂãÌáÐÝÔÙÜÕÞÍàËäÃäÄàÌÞÎÚÖÖÚÐÞÊâÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PE;PM2FPPE=<G[À_ø;PM0PEÂãÌáÐÝÔÙÜÕÞÍàËäÃäÄàÌÞÎÚÖÖÚÐÞÊâÄäÃäÉàÏÞÕÚÙÖÝÐßÊãÄãÃßÉÝÏÛÕÓÙÏÝËßÁã;PM1PEÄ¿ÄãÊÝÐÝÔÙÚÓÞÑÞÇäÃâÄàÈÞÒØÔÖÚÐÞÊÞÄäÃâÉàÏÞÕØ×ÔÝÒßÊáÂãÁÝÉÝÑÙÓÓ×ÏÝÉßÃá;PM1PE;PM2FPPE=<C[À_ø;PM0PEÄãÊÝÐÝÔÙÚÓÞÑÞÇäÃâÄàÈÞÒØÔÖÚÐÞÊÞÄäÃâÉàÏÞÕØ×ÔÝÒßÊáÂãÁÝÉÝÑÙÓÓ×ÏÝÉßÃá;PM1PEÄ¿ÄáÊßÐÛÔ×ÚÓÚÏàÉâÃâÄÞÊÜÐÚÔÔØÐÜÈàÄâÃàÇàÏÜÓØÙÖÛÎÝÊáÄáÃßÉÙÍÙÕÓ×ÏÛÉßÃß;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<?[À_ø;PM0PEÄáÊßÐÛÔ×ÚÓÚÏàÉâÃâÄÞÊÜÐÚÔÔØÐÜÈàÄâÃàÇàÏÜÓØÙÖÛÎÝÊáÄáÃßÉÙÍÙÕÓ×ÏÛÉßÃß;PM1PEÆ¿ÄáÈÝÐÙÔ×ØÕÜÍÞÉàÁàÂÞÊÜÎØÖÔØÎÚÊÞÄâÃàÉÞÍÜÓØ×ÔÛÎÝÊßÄßÃÝÉÛÍ×ÓÓ×ÏÛÇÝÃß;PM1PE;PM2FPPE=<yZÀ_ø;PM0PEÄáÈÝÐÙÔ×ØÕÜÍÞÉàÁàÂÞÊÜÎØÖÔØÎÚÊÞÄâÃàÉÞÍÜÓØ×ÔÛÎÝÊßÄßÃÝÉÛÍ×ÓÓ×ÏÛÇÝÃß;PM1PEÄ¿ÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<uZÀ_ø;PM0PEÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PEÆ¿ÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE;PM2FPPE=<oZÀ_ø;PM0PEÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE¿ÄÝÈÛÎÙÒÕÖÑÚÍÜÇÞÃÞÄÜÈØÎÖÒÔÖÌÚÈÜÄÞÃÞÇÚËÚÓÖÕÒ×ÎÛÈÝÄÝÃÛÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PE;PM2FPPE=<mZÀ_ø;PM0PEÄÝÈÛÎÙÒÕÖÑÚÍÜÇÞÃÞÄÜÈØÎÖÒÔÖÌÚÈÜÄÞÃÞÇÚËÚÓÖÕÒ×ÎÛÈÝÄÝÃÛÇÙÍÕÑÑÕÍÙÇÙÃÝ;PM1PEÆ¿ÂÝÈÛÎ×ÒÓÖÑØÍÚÇÞÁÜÂÜÈØÎÖÒÐÔÎØÊÜÂÞÁÜÉÜÍØÏÖÕÐ×ÎÛÈÛÄÝÃÙÇ×ÍÕÏÑÕÍ×ÇÛÁÛ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,6FPPE=<gZÀ_ø;PM0PEÂÝÈÛÎ×ÒÓÖÑØÍÚÇÞÁÜÂÜÈØÎÖÒÐÔÎØÊÜÂÞÁÜÉÜÍØÏÖÕÐ×ÎÛÈÛÄÝÃÙÇ×ÍÕÏÑÕÍ×ÇÛÁÛ;PM1PEÄ¿ÂÛÊÙÌ×ÒÕÔÏØÍÚÇÜÁÜÂÚÈØÎÔÐÐÖÎØÈÚÂÜÁÚÇÜÍØÏÔÓÐ×ÎÙÈÛÂÛÁÙÇ×ÍÓÏÑÓË×ÉÛÁÙ;PM1PE;PM2FPPE=<cZÀ_ø;PM0PEÂÛÊÙÌ×ÒÕÔÏØÍÚÇÜÁÜÂÚÈØÎÔÐÐÖÎØÈÚÂÜÁÚÇÜÍØÏÔÓÐ×ÎÙÈÛÂÛÁÙÇ×ÍÓÏÑÓË×ÉÛÁÙ;PM1PEÆ¿ÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PE;PM2FPPE=<]ZÀ_ø;PM0PEÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PEÄ¿ÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<YZÀ_ø;PM0PEÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PEÄ¿ÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PE;PM2FPPE=<UZÀ_ø;PM0PEÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PEÆ¿Â×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PE;PM2FPPE=<OZÀ_ø;PM0PEÂ×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PEÄ¿Â×ÈÕÊÓÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÔÆÖÂØÁÖÅÖÉÔÍÐÑÐÓÈÕÈÕÂ×ÁÓÇÕÇÏÏÍÏÉÓÇÕÁÕ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<KZÀ_ø;PM0PEÂ×ÈÕÊÓÎÏÐÍÖÉÔÇØÁÖÂÖÈÔÊÒÎÎÐÊÔÆÖÂØÁÖÅÖÉÔÍÐÑÐÓÈÕÈÕÂ×ÁÓÇÕÇÏÏÍÏÉÓÇÕÁÕ;PM1PEÆ¿ÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃÖÄÔÆÒÊÒÎÌÐÌÔÆÔÂÖÁÔÅÖËÒËÒÑÌÑÌÓÆÕÂÕÁÓÅÓËÏËÍÑÉÑÅÕÁÓ;PM1PE;PM2FPPE=<EZÀ_ø;PM0PEÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃÖÄÔÆÒÊÒÎÌÐÌÔÆÔÂÖÁÔÅÖËÒËÒÑÌÑÌÓÆÕÂÕÁÓÅÓËÏËÍÑÉÑÅÕÁÓ;PM1PEÄ¿ÂÕÆÓÊÑÎÏÎËÒÉÔÅÖÁÖÂÒÆÒÊÐÌÎÐÈÒÆÔÄÖÃÔÅÔÇÒÍÐÏÌÑÊÑÆÕÂÕÁÓÅÑÉÍËÍÏÉÑÅÓÁÓ;PM1PE;PM2FPPE=<AZÀ_ø;PM0PEÂÕÆÓÊÑÎÏÎËÒÉÔÅÖÁÖÂÒÆÒÊÐÌÎÐÈÒÆÔÄÖÃÔÅÔÇÒÍÐÏÌÑÊÑÆÕÂÕÁÓÅÑÉÍËÍÏÉÑÅÓÁÓ;PM1PEÄ¿ÄÕÆÑÈÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÎÌÎÎÈÒÆÒÂÖÁÔÅÒÇÒÍÎÍÎÏÈÓÆÓÂÓÁÓÅÏÇÏÍËÍÇÑÅÑÃÓ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<}YÀ_ø;PM0PEÄÕÆÑÈÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÎÌÎÎÈÒÆÒÂÖÁÔÅÒÇÒÍÎÍÎÏÈÓÆÓÂÓÁÓÅÏÇÏÍËÍÇÑÅÑÃÓ;PM1PEÆ¿ÂÓÄÑÊÏÌÏÎÉÐÉÒÃÔÁÒÂÒÄÒÊÌÊÌÐÊÐÆÒÂÔÁÒÅÒÉÒËÌËÌÑÊÑÄÑÄÓÃÑÃÏÉÍËËËÉÑÃÑÁÑ;PM1PE;PM2FPPE=<wYÀ_ø;PM0PEÂÓÄÑÊÏÌÏÎÉÐÉÒÃÔÁÒÂÒÄÒÊÌÊÌÐÊÐÆÒÂÔÁÒÅÒÉÒËÌËÌÑÊÑÄÑÄÓÃÑÃÏÉÍËËËÉÑÃÑÁÑ;PM1PEÄ¿ÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<sYÀ_ø;PM0PEÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PEÆ¿¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PE;PM2FPPE=<mYÀ_ø;PM0PE¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PEÄ¿ÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PE;PM2FPPE=<iYÀ_ø;PM0PEÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PEÄ¿ÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<eYÀ_ø;PM0PEÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PEÆ¿¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PE;PM2FPPE=<_YÀ_ø;PM0PE¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PEÄ¿ÂÍÄËÆËÈÉÊÇÌÅÌÃÎÁÌÂÌÄÌÆÊÈÈÊÆÌÆ̿οÌÅÌÅÌÇÊÉÈËÆËÆË¿Í¿ËÅËÅÉÇÇÉÅËÃËÁË;PM1PE;PM2FPPE=<[YÀ_ø;PM0PEÂÍÄËÆËÈÉÊÇÌÅÌÃÎÁÌÂÌÄÌÆÊÈÈÊÆÌÆ̿οÌÅÌÅÌÇÊÉÈËÆËÆË¿Í¿ËÅËÅÉÇÇÉÅËÃËÁË;PM1PEÆ¿¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<UYÀ_ø;PM0PE¿ËÄËÆËÈÉÈÅÌÅÌÃÌÁÌÂÌÄÊÆÈÆÊÊÆÌÂÌÂÌÁÌÁÌÅÊÉÈÇÈÉÆËÄËÂËÁËÃËÅÇÇÇÇÅÉÃË¿Ë;PM1PEÄ¿ÄÕÌÓÔËÖÃÖÄÒÌÌÔÆÖÅÔËÔÑÌÕÄÕÃÓËËÓÃÓ;PM1PE;PM2FPPE=<QYÀ_ø;PM0PEÄÕÌÓÔËÖÃÖÄÒÌÌÔÆÖÅÔËÔÑÌÕÄÕÃÓËËÓÃÓ;PM1PEÄ¿ÄÕÌÏÒËÔÃÔÄÐÌÌÐÄÖÃÔËÐÏÌÓÄÓÃÑËËÏÃÓ;PM1PE;PM2FPPE=<MYÀ_ø;PM0PEÄÕÌÏÒËÔÃÔÄÐÌÌÐÄÖÃÔËÐÏÌÓÄÓÃÑËËÏÃÓ;PM1PEÆ¿ÄÓÊÍÎËÔÁÒÂÐÌÊÎÄÔÃÒÉÎÏÌÑÄÓÃÍËÉÍÃÑ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<GYÀ_ø;PM0PEÄÓÊÍÎËÔÁÒÂÐÌÊÎÄÔÃÒÉÎÏÌÑÄÓÃÍËÉÍÃÑ;PM1PEÄ¿ÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PE;PM2FPPE=<CYÀ_ø;PM0PEÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PEÆ¿ÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE;PM2FPPE=<}XÀ_ø;PM0PEÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PEÄ¿ÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PE;PM2RF6,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<yXÀ_ø;PM0PEÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PEÄ¿ÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PE;PM2FPPE=<uXÀ_ø;PM0PEÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PEÆ¿ÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÈÅÈÅÄÉÄÉÃÇÃÃÇÁÇ;PM1PE;PM2FPPE=<oXÀ_ø;PM0PEÂÉÄÇÈÃÊÁÊÂÆÄÆÈÂÊÁÈÅÈÅÄÉÄÉÃÇÃÃÇÁÇ;PM1PEÄ¿ÂÇÄÅÆÃÈÁÆÂÆÄÆÆ¿È¿ÆÅÆÅÆÅ¿Ç¿ÅÅÃÅÁÅ;PM1PE;PM2RF7,8,8,0,0,0,0,0,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;FT11,7FPPE=<kXÀ_ø;PM0PEÂÇÄÅÆÃÈÁÆÂÆÄÆÆ¿È¿ÆÅÆÅÆÅ¿Ç¿ÅÅÃÅÁÅ;PM1PEÆ¿¿ÅÄÃÄÃÆÁÄÂÆÄÂÄÂÆÁÄÁÄÅÄÃÂÅÁÃÃÃÿÃ;PM1PE;PM2FPPE=<eXÀ_ø;PM0PE¿ÅÄÃÄÃÆÁÄÂÆÄÂÄÂÆÁÄÁÄÅÄÃÂÅÁÃÃÃÿÃ;PM1PEÄ¿ÂÿÃÄÁÄ¿Ä¿ÂÂÂÄÂÄÁÂÁÄÁÂÿÿÃÁ¿ÃÁÁ;PM1PE;PM2FPPE=<aXÀ_ø;PM0PEÂÿÃÄÁÄ¿Ä¿ÂÂÂÄÂÄÁÂÁÄÁÂÿÿÃÁ¿ÃÁÁ;PM1PEÄ¿¿ÁÂÁÂÁ¿Ä¿¿¿ÂÃÂÁ¿ÁÁÁÁ;PM1PE;PM2FT10,0FPPE=<]XÀ_ø;PM0PE¿ÁÂÁÂÁ¿Ä¿¿¿ÂÃÂÁ¿ÁÁÁÁ;PM1PE;PM2FPMC1,240PE=<ihÀwï;PM0PEôáößöÝøÛøÝøÙöÝúÛôßöÝôáôãîåîéìëæïÎÊçòëìíêñèñäóâõÞ÷à÷Ü÷Þ÷ÜõÜùÜõÞñàóâÉÍ;PM2FTFP1PE=<AIÁeÙ;PM0PEúíøïüïüíüëüïþëþíþí@Àë@Àí@Àë@ÀëBÀëBÀëBÀíBÀëBÀéBÀíDÀéBÀëDÀëDÀëDÀëDÀéDÀíDÀéBÀëFÀëBÀëDÀëDÀéÊÎCÀêCÀîCÀêCÀìAÀìEÀìAÀìCÀêCÀìCÀìCÀìAÀìCÀìAÀìCÀêAÀîAÀìAÀì?Àì?Àì?ÀîAÀìýîýìýîýìûðûîûìûîùð÷îÉË;PM2FP1PE=<KJÁcÙ;PM0PEþíüíüíüïüïúïüïüïúïúñüïúñüïüïüïüñüïüïþïüï@Àïþí@ÀïBÀë@ÀíBÀíDÀëDÀëFÀëDÀéHÀéJÀéÈÎGÀêGÀêEÀêCÀìEÀìAÀìAÀîAÀî?Àî?Àî?ÀîýðûðýîýðûðûòûðûðùðùòûðùòûðûðùðùðûðûðûîûðýîÉÍ;PM2FT10,0FP1PE=<caÀqý;PM0PEÔÊÖÊÖÆÔÆÖÄÖÂÖÂÔ¿ÛÖÝØÝØÝØßØáÔáÒåÌáÊÝÎÙÐ×Ô×ÖÛÔÝØåÖÃÉ¿ÍÄÍÄÑÊÓÌ×Ò×Ö×ÔÓâÕèÕìÙèÙæÛÚÝÌá;PM2RF8,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,8FPPE=<mêYWÀ;PM0PE¿IÀÁùÉíÉáÏ×ÏÑÑÍÓÉÈÍÖÊÔÐÒÔÐÜÎäÈðÄüÁJÀÏ¿;PM2FTFP1PE=<uãW\À;PM0PEÐÆÌÈÊÆÈÈÆÈÄÈÂÈÄÆá¿Ý¿ÛÁÙÁÛÁÙÃÙÁÛÁÝ¿Ý¿ß¿ãÂçÆéÆëÊóÌÅÅÇÉÇÅÇÇÇÅÅÇÉÇÅÅäËäÉèÇæÃèÃêÁæÁè¿äÂäÂàÂàÄÚÂØÄÔÂÎÂ;PM2RF1,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,1FPPE=<këc[À;PM0PEßÄßÂßÄáÂáÄáÂáÄßÂáÄÝÆßÆÝÆÝÊÛÊÙÌ×ÎéÄá¿ÝÂÙÁ׿ÕÁ×ÁÛÁß¿ãÂëÂóÆ?ÀÆKÀÈWÀÎgÀÐËÃËÇÃÍÆÑæ¿è¿èÃêÃìÅìÇìÇîÉîËîÉðÉìËðÉîÇìÉîÇöËôËòÅìÅèÃæÁâ¿àÂÜÄÚÂØÆÖÄÒÆÐÄÎÄÌÄÈÆÊÆÈÈÊÆ;PM2FPMC1,90PE=<UçoWÀ;PM0PEÄáÈÝÐÙÔ×ØÕÜÍÞÉàÁàÂÞÊÜÎØÖÔØÎÚÊÞÄâÃàÉÞÍÜÓØ×ÔÛÎÝÊßÄßÃÝÉÛÍ×ÓÓ×ÏÛÇÝÃß;PM1PE¿ÄáÊÝÎÙÒ×ØÑÜÏÞÇàÃàÄÞÈÚÐØÒÔØÎÚÊÞÄâÃàÉÞÍÚÓØ×ÔÙÎÝÊßÂßÁÝÉÛÍ×ÓÑ×ÍÙÉÝÃß;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<SçoWÀ;PM0PEÄáÊÝÎÙÒ×ØÑÜÏÞÇàÃàÄÞÈÚÐØÒÔØÎÚÊÞÄâÃàÉÞÍÚÓØ×ÔÙÎÝÊßÂßÁÝÉÛÍ×ÓÑ×ÍÙÉÝÃß;PM1PE¿ÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PE;PM2FPPE=<QçoWÀ;PM0PEÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PE¿ÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PE;PM2FPPE=<OçoWÀ;PM0PEÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PEÄ¿ÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<KçoWÀ;PM0PEÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE¿ÄÝÈÝÌ×ÔÕÖÓØËÞÉÞÁÞÂÜÊÚÌÖÔÒÖÎØÈÞÄÞÃÞÇÜÍÚÑÔÕÔÙÎÛÈÝÄÝÃÝÇ×ÍÕÓÓÓËÙÇÛÃÝ;PM1PE;PM2FPPE=<IçoWÀ;PM0PEÄÝÈÝÌ×ÔÕÖÓØËÞÉÞÁÞÂÜÊÚÌÖÔÒÖÎØÈÞÄÞÃÞÇÜÍÚÑÔÕÔÙÎÛÈÝÄÝÃÝÇ×ÍÕÓÓÓËÙÇÛÃÝ;PM1PE¿ÄÝÈÛÎ×Ò×ÖÑÚËÚÇÞÃÞÄÚÈÚÌÖÒÒØÎØÈÜÄÞÃÞÇÚÍØÑØÕÒÙÌÙÊÝÂÝÁÙÉÙËÕÑÑ×Í×ÇÙÃÝ;PM1PE;PM2FPPE=<GçoWÀ;PM0PEÄÝÈÛÎ×Ò×ÖÑÚËÚÇÞÃÞÄÚÈÚÌÖÒÒØÎØÈÜÄÞÃÞÇÚÍØÑØÕÒÙÌÙÊÝÂÝÁÙÉÙËÕÑÑ×Í×ÇÙÃÝ;PM1PE¿ÂÝÊÛÎ×ÒÓÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÔÌØÊÜÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PE;PM2FPPE=<EçoWÀ;PM0PEÂÝÊÛÎ×ÒÓÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÔÌØÊÜÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PE¿ÄÝÈÙÎ×ÐÕÖÏØÍÚÉÞÁÜÂÚÊØÎÖÐÒÖÎØÈÚÂÞÁÜÇÚÍØÑÖÕÐ×ÐÙÈÛÂÝÁÙÇ×ÏÕÏÏÕÍ×ÇÙÃÛ;PM1PE;PM2FPPE=<CçoWÀ;PM0PEÄÝÈÙÎ×ÐÕÖÏØÍÚÉÞÁÜÂÚÊØÎÖÐÒÖÎØÈÚÂÞÁÜÇÚÍØÑÖÕÐ×ÐÙÈÛÂÝÁÙÇ×ÏÕÏÏÕÍ×ÇÙÃÛ;PM1PEÄ¿ÂÛÈÙÎ×ÐÕÖÑØËÚÇÜÃÜÄÚÈØÌÔÒÒÖÎØÈÚÂÜÁÚÇÜÍØÑÔÓÒ×ÌÙÊÛÂÛÁÙÉ×ËÕÑÏÓÍ×ÇÛÁÙ;PM1PE;PM2FPPE=<?çoWÀ;PM0PEÂÛÈÙÎ×ÐÕÖÑØËÚÇÜÃÜÄÚÈØÌÔÒÒÖÎØÈÚÂÜÁÚÇÜÍØÑÔÓÒ×ÌÙÊÛÂÛÁÙÉ×ËÕÑÏÓÍ×ÇÛÁÙ;PM1PE¿ÄÛÈÙÌÕÒÓÔÑÖËÚÉÜÁÜÂØÊØÌÔÒÐÔÎÖÈÚÂÜÁÚÇÚÍÖÏÖÓÐ×Î×ÈÛÂÛÁÙÇÕÍÓÏÑÕËÕÇÙÃÙ;PM1PE;PM2FPPE=<}æoWÀ;PM0PEÄÛÈÙÌÕÒÓÔÑÖËÚÉÜÁÜÂØÊØÌÔÒÐÔÎÖÈÚÂÜÁÚÇÚÍÖÏÖÓÐ×Î×ÈÛÂÛÁÙÇÕÍÓÏÑÕËÕÇÙÃÙ;PM1PEÄ¿ÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PE;PM2FPPE=<yæoWÀ;PM0PEÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PE¿ÂÛÈ×ÌÕÐÓÔÏÖËÚÇÚÁÚÂØÈÖÌÔÐÐÔÌÖÊØÂÜÁÚÉØËÖÏÔÓÐÕÌ×ÈÙÄÙÃÙÇÕËÓÏÏÓËÕÇ×ÁÙ;PM1PE;PM2FPPE=<wæoWÀ;PM0PEÂÛÈ×ÌÕÐÓÔÏÖËÚÇÚÁÚÂØÈÖÌÔÐÐÔÌÖÊØÂÜÁÚÉØËÖÏÔÓÐÕÌ×ÈÙÄÙÃÙÇÕËÓÏÏÓËÕÇ×ÁÙ;PM1PE¿ÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<uæoWÀ;PM0PEÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PE¿ÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁØÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁØÅØËÖÏÔÓÎÕÌ×È×ÂÙÁ×ÇÕËÑÍÏÓËÕÇ×Á×;PM1PE;PM2FPPE=<sæoWÀ;PM0PEÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁØÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁØÅØËÖÏÔÓÎÕÌ×È×ÂÙÁ×ÇÕËÑÍÏÓËÕÇ×Á×;PM1PE¿ÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PE;PM2FPPE=<qæoWÀ;PM0PEÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PEÄ¿Â×Æ×ÌÕÐÑÒÍÔËØÅØÃØÄØÆÔÌÒÎÎÒÌÖÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PE;PM2FPPE=<mæoWÀ;PM0PEÂ×Æ×ÌÕÐÑÒÍÔËØÅØÃØÄØÆÔÌÒÎÎÒÌÖÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PE¿Â×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PE;PM2FPPE=<kæoWÀ;PM0PEÂ×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PE¿Â×ÈÕÊÓÎÑÒÍÔÉÖÇØÁØÂÖÈÔÊÐÎÎÒÌÔÆÖÄØÃØÅÔËÖÍÐÏÎÓÌÕÆ×Â×ÁÕÅÓËÑÍÍÏÉÕÇÓÁ×;PM1PE;PM2FPPE=<iæoWÀ;PM0PEÂ×ÈÕÊÓÎÑÒÍÔÉÖÇØÁØÂÖÈÔÊÐÎÎÒÌÔÆÖÄØÃØÅÔËÖÍÐÏÎÓÌÕÆ×Â×ÁÕÅÓËÑÍÍÏÉÕÇÓÁ×;PM1PEÄ¿Â×ÈÕÈÑÐÑÐÍÔÉÔÅØÁÖÂÖÆÔÊÐÎÎÒÊÒÈÖÂØÁÖÇÖÉÒÍÒÏÎÓÊÕÆÕÄ×ÃÓÅÓÉÏÍÏÑÇÑÇÕÁÕ;PM1PE;PM2FPPE=<eæoWÀ;PM0PEÂ×ÈÕÈÑÐÑÐÍÔÉÔÅØÁÖÂÖÆÔÊÐÎÎÒÊÒÈÖÂØÁÖÇÖÉÒÍÒÏÎÓÊÕÆÕÄ×ÃÓÅÓÉÏÍÏÑÇÑÇÕÁÕ;PM1PE¿Â×ÆÓÌÓÌÏÒÍÒÉÔÅØÁÖÂÔÆÔÊÐÎÎÐÊÔÆÔÄØÃÖÅÔÉÔÍÐÏÎÓÊÓÆÕÂ×ÁÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PE;PM2FPPE=<cæoWÀ;PM0PEÂ×ÆÓÌÓÌÏÒÍÒÉÔÅØÁÖÂÔÆÔÊÐÎÎÐÊÔÆÔÄØÃÖÅÔÉÔÍÐÏÎÓÊÓÆÕÂ×ÁÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PE¿ÂÕÆÓÌÓÌÏÐËÔËÔÅÖÁÖÂÔÆÒÌÐÌÎÐÊÔÆÔÂÖÁÔÅÖÉÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÓÉÏÍËÏËÑÅÕÁÓ;PM1PE;PM2FPPE=<aæoWÀ;PM0PEÂÕÆÓÌÓÌÏÐËÔËÔÅÖÁÖÂÔÆÒÌÐÌÎÐÊÔÆÔÂÖÁÔÅÖÉÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÓÉÏÍËÏËÑÅÕÁÓ;PM1PE¿ÄÕÆÓÈÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÊÒÆÔÂÖÁÔÅÖÉÒËÎÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍÍÍÇÑÅÕÃÓ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<_æoWÀ;PM0PEÄÕÆÓÈÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÊÒÆÔÂÖÁÔÅÖÉÒËÎÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍÍÍÇÑÅÕÃÓ;PM1PEÄ¿ÂÕÆÓÊÑÌÏÎËÒÇÔÅÖÃÖÄÒÆÒÈÎÌÎÐÊÒÆÔÂÖÁÔÅÔÉÒÍÎÍÎÑÊÑÆÕÂÕÁÓÅÑÉÍÍËÍÉÑÅÓÁÓ;PM1PE;PM2FPPE=<[æoWÀ;PM0PEÂÕÆÓÊÑÌÏÎËÒÇÔÅÖÃÖÄÒÆÒÈÎÌÎÐÊÒÆÔÂÖÁÔÅÔÉÒÍÎÍÎÑÊÑÆÕÂÕÁÓÅÑÉÍÍËÍÉÑÅÓÁÓ;PM1PE¿ÂÕÆÑÊÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÐÌÌÎÊÒÆÒÂÖÁÔÅÒÉÒËÐÏÌÏÈÓÆÓÄÓÃÓÅÏÇÏËËÏÉÑÅÑÁÓ;PM1PE;PM2FPPE=<YæoWÀ;PM0PEÂÕÆÑÊÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÐÌÌÎÊÒÆÒÂÖÁÔÅÒÉÒËÐÏÌÏÈÓÆÓÄÓÃÓÅÏÇÏËËÏÉÑÅÑÁÓ;PM1PE¿ÂÓÆÓÈÏÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÐÆÔÄÔÃÒÅÔÇÐËÎÏÎÏÈÓÆÑÂÓÁÑÅÑÇÍÍÍÍÇÏÅÓÁÑ;PM1PE;PM2FPPE=<WæoWÀ;PM0PEÂÓÆÓÈÏÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÐÆÔÄÔÃÒÅÔÇÐËÎÏÎÏÈÓÆÑÂÓÁÑÅÑÇÍÍÍÍÇÏÅÓÁÑ;PM1PE¿ÂÓÆÑÊÏÌÏÎËÐÇÒÅÔÁÒÂÒÆÒÈÎÌÌÐÊÐÄÒÂÔÁÒÃÒÉÒËÎÍÌÑÊÑÄÑÂÓÁÑÃÏÉÍËËÍÉÑÅÑÁÑ;PM1PE;PM2FPPE=<UæoWÀ;PM0PEÂÓÆÑÊÏÌÏÎËÐÇÒÅÔÁÒÂÒÆÒÈÎÌÌÐÊÐÄÒÂÔÁÒÃÒÉÒËÎÍÌÑÊÑÄÑÂÓÁÑÃÏÉÍËËÍÉÑÅÑÁÑ;PM1PE¿ÄÓÄÏÊÑÊÍÎÉÒÉÐÅÔÁÒÂÒÆÐÊÎÊÌÎÊÒÄÐÂÔÁÒÃÒÉÐËÎÍÌÏÈÑÆÑÂÓÁÏÅÑÇÍËÉÍÉÏÃÑÃÑ;PM1PE;PM2FPPE=<SæoWÀ;PM0PEÄÓÄÏÊÑÊÍÎÉÒÉÐÅÔÁÒÂÒÆÐÊÎÊÌÎÊÒÄÐÂÔÁÒÃÒÉÐËÎÍÌÏÈÑÆÑÂÓÁÏÅÑÇÍËÉÍÉÏÃÑÃÑ;PM1PEÄ¿ÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PE;PM2FPPE=<OæoWÀ;PM0PEÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PE¿ÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÐÆÎÈÎÊÊÎÊÐÄÐÂÒÁÒÃÎÉÐÉÎÍÊÍÈÏÆÑÂÑÁÏÅÏÇËÉËÍÇÏÃÍÃÑ;PM1PE;PM2FPPE=<MæoWÀ;PM0PEÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÐÆÎÈÎÊÊÎÊÐÄÐÂÒÁÒÃÎÉÐÉÎÍÊÍÈÏÆÑÂÑÁÏÅÏÇËÉËÍÇÏÃÍÃÑ;PM1PEÄ¿¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PE;PM2FPPE=<IæoWÀ;PM0PE¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PE¿¿ÑÆÏÈÍÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÎÆÐÂÒÁÐÅÐÅÎËÌËÊÍÈÏÆÏÂÑÁÍÅÏÇËÉÉËÇÍÅÏ¿Ï;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<GæoWÀ;PM0PE¿ÑÆÏÈÍÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÎÆÐÂÒÁÐÅÐÅÎËÌËÊÍÈÏÆÏÂÑÁÍÅÏÇËÉÉËÇÍÅÏ¿Ï;PM1PE¿ÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PE;PM2FPPE=<EæoWÀ;PM0PEÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PE¿ÂÏÄÏÈÍÊËÌÇÌÇÐÃÐÁÐÂÎÄÎÈÊÈÌÌÆÎÆппÎÅÐÅÎËÊÉÌÍÆÍÆÏ¿Ï¿ÏÅËÅËËÉÉÇÍÃÏÁÍ;PM1PE;PM2FPPE=<CæoWÀ;PM0PEÂÏÄÏÈÍÊËÌÇÌÇÐÃÐÁÐÂÎÄÎÈÊÈÌÌÆÎÆппÎÅÐÅÎËÊÉÌÍÆÍÆÏ¿Ï¿ÏÅËÅËËÉÉÇÍÃÏÁÍ;PM1PE¿ÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PE;PM2FPPE=<AæoWÀ;PM0PEÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PEÄ¿¿ÏÆÍÆËÈËÌÇÌÇÐÃÎÁÎÂÎÄÎÈÊÈÈÌÈÌÄÎÂÐÁÎÃÎÇÎÇÊÉÈÍÈÍÄÍÂÍÁÏÃËÇËÇÇÉÅÍÅÍ¿Í;PM1PE;PM2FPPE=<}åoWÀ;PM0PE¿ÏÆÍÆËÈËÌÇÌÇÐÃÎÁÎÂÎÄÎÈÊÈÈÌÈÌÄÎÂÐÁÎÃÎÇÎÇÊÉÈÍÈÍÄÍÂÍÁÏÃËÇËÇÇÉÅÍÅÍ¿Í;PM1PE¿¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PE;PM2FPPE=<{åoWÀ;PM0PE¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PEÄ¿¿ÍÆÍÆËÈÇÊÉÌÅÌÃÎÁÌÂÎÄÌÆÊÊÈÈÆÌÄÎÂÎÁÌÃÎÅÌÇÊÉÈËÆÍÄËÂÍÁËÃËÅÉÇÇÉÅËÅÍ¿Ë;PM1PE;PM2FPPE=<wåoWÀ;PM0PE¿ÍÆÍÆËÈÇÊÉÌÅÌÃÎÁÌÂÎÄÌÆÊÊÈÈÆÌÄÎÂÎÁÌÃÎÅÌÇÊÉÈËÆÍÄËÂÍÁËÃËÅÉÇÇÉÅËÅÍ¿Ë;PM1PE¿¿ÍÄËÆËÈÉÊÇÌÅÌÃο̿ÌÄÌÆÊÈÈÊÆÌÄÌÂÎÁÌÃÌÅÌÇÊÉÈËÆËÄËÂÍÁËÃËÅÉÇÇÉÅËÃË¿Ë;PM1PE;PM2FPPE=<uåoWÀ;PM0PE¿ÍÄËÆËÈÉÊÇÌÅÌÃο̿ÌÄÌÆÊÈÈÊÆÌÄÌÂÎÁÌÃÌÅÌÇÊÉÈËÆËÄËÂÍÁËÃËÅÉÇÇÉÅËÃË¿Ë;PM1PE¿ÂÍÂËÆÉÊÉÈÇÊÅÌÃο̿ÌÄÌÆÈÈÈÊÆÊÄÌÂÎÁÌÃÌÅÌÇÈÇÈËÆËÄË¿Í¿ËÃÉÅÇÇÉÇÅËÁËÁË;PM1PE;PM2FPPE=<såoWÀ;PM0PEÂÍÂËÆÉÊÉÈÇÊÅÌÃο̿ÌÄÌÆÈÈÈÊÆÊÄÌÂÎÁÌÃÌÅÌÇÈÇÈËÆËÄË¿Í¿ËÃÉÅÇÇÉÇÅËÁËÁË;PM1PE¿ÂËÄËÆÉÆÉÊÇÊÅÌÁÌÁÌÂÌÂÊÆÈÈÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÈÇÊÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÉÅÇÃËÁË;PM1PE;PM2RF7,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<qåoWÀ;PM0PEÂËÄËÆÉÆÉÊÇÊÅÌÁÌÁÌÂÌÂÊÆÈÈÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÈÇÊÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÉÅÇÃËÁË;PM1PE¿ÂËÄËÄÉÈÇÊÇÈÃÌÃÌÁÌÂÊÄÊÄÊÈÆÈÆÊÄÌ¿ÌÃÖËÔÓÌÕÄËÁËÁÇÅÉÅÇÉÃÉÃÉÁË;PM1PE;PM2FPPE=<oåoWÀ;PM0PEÂËÄËÄÉÈÇÊÇÈÃÌÃÌÁÌÂÊÄÊÄÊÈÆÈÆÊÄÌ¿ÌÃÖËÔÓÌÕÄËÁËÁÇÅÉÅÇÉÃÉÃÉÁË;PM1PEÄ¿ÄÕÌÑÒËÖÅÖÆÒÌÌÒÄÖÃÔËÒÑÌÕÆÕÅÑËËÑÃÓ;PM1PE;PM2FPPE=<kåoWÀ;PM0PEÄÕÌÑÒËÖÅÖÆÒÌÌÒÄÖÃÔËÒÑÌÕÆÕÅÑËËÑÃÓ;PM1PE¿ÄÕÌÑÒÉÔÃÔÄÐÊÌÒÆÖÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PE;PM2FPPE=<iåoWÀ;PM0PEÄÕÌÑÒÉÔÃÔÄÐÊÌÒÆÖÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PE¿ÄÓÌÏÐËÔÃÒÄÒÌÌÐÄÔÃÒËÒÑÌÑÂÓÁÏËËÑÃÑ;PM1PE;PM2FPPE=<gåoWÀ;PM0PEÄÓÌÏÐËÔÃÒÄÒÌÌÐÄÔÃÒËÒÑÌÑÂÓÁÏËËÑÃÑ;PM1PE¿ÄÓÊÏÐÉÔÃÒÄÐÊÌÐÂÔÁÒËÐÏÊÑÄÓÃÏÉÉÏÃÑ;PM1PE;PM2FPPE=<eåoWÀ;PM0PEÄÓÊÏÐÉÔÃÒÄÐÊÌÐÂÔÁÒËÐÏÊÑÄÓÃÏÉÉÏÃÑ;PM1PEÄ¿ÄÑÊÏÎÇÒÃÐÄÎÈÌÐÄÒÃÐËÎÍÌÏÂÑÁÍËÉÍÃÏ;PM1PE;PM2FPPE=<aåoWÀ;PM0PEÄÑÊÏÎÇÒÃÐÄÎÈÌÐÄÒÃÐËÎÍÌÏÂÑÁÍËÉÍÃÏ;PM1PE¿ÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PE;PM2FPPE=<_åoWÀ;PM0PEÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PE¿ÄÏÈÍÎÇÐÃÐÄÌÈÈÎÄÐÃÎÇÎËÈÏÄÏÃÍÇÇÍÃÍ;PM1PE;PM2FPPE=<]åoWÀ;PM0PEÄÏÈÍÎÇÐÃÐÄÌÈÈÎÄÐÃÎÇÎËÈÏÄÏÃÍÇÇÍÃÍ;PM1PEÄ¿ÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE;PM2RF8,8,8,0,0,0,0,0,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;FT11,8FPPE=<YåoWÀ;PM0PEÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE¿ÂÍÈËÌÇÎÁÌÂÌÈÊÌÂÎÁÌÉÌËÈËÄÍÃËÇÇËÁË;PM1PE;PM2FPPE=<WåoWÀ;PM0PEÂÍÈËÌÇÎÁÌÂÌÈÊÌÂÎÁÌÉÌËÈËÄÍÃËÇÇËÁË;PM1PE¿ÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PE;PM2FPPE=<UåoWÀ;PM0PEÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PE¿ÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM1PE;PM2FPPE=<SåoWÀ;PM0PEÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM1PE¿ÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PE;PM2FPPE=<QåoWÀ;PM0PEÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PEÄ¿ÂËÄÇÈÃÌÃÊÄÈÄÆÈÂÌÁÈÅÊÇÆÉÂËÁÇÅÃÉÁÇ;PM1PE;PM2FPPE=<MåoWÀ;PM0PEÂËÄÇÈÃÌÃÊÄÈÄÆÈÂÌÁÈÅÊÇÆÉÂËÁÇÅÃÉÁÇ;PM1PE¿ÄÉÄÅÈÅÈÁÈÂÈÆÄÆÂÊÁÈÃÆÇÆÇÂÇÁÇÅÃÅÃÇ;PM1PE;PM2FPPE=<KåoWÀ;PM0PEÄÉÄÅÈÅÈÁÈÂÈÆÄÆÂÊÁÈÃÆÇÆÇÂÇÁÇÅÃÅÃÇ;PM1PEÄ¿¿ÇÆÇÆÃÈÁÆÂÈÄÄÈÂÈÁÆÃÈÇÄÅÂÇÁÅÃÅÇ¿Å;PM1PE;PM2FPPE=<GåoWÀ;PM0PE¿ÇÆÇÆÃÈÁÆÂÈÄÄÈÂÈÁÆÃÈÇÄÅÂÇÁÅÃÅÇ¿Å;PM1PE¿¿ÇÄÅÆÃÈ¿Æ¿ÆÄÄÆÂÈÁÆÃÆÅÄÅÂÇÁÅÃÃÅ¿Å;PM1PE;PM2FPPE=<EåoWÀ;PM0PE¿ÇÄÅÆÃÈ¿Æ¿ÆÄÄÆÂÈÁÆÃÆÅÄÅÂÇÁÅÃÃÅ¿Å;PM1PE¿ÂÅÂÅÆÃÆ¿Æ¿ÄÄÄÆÂÆÁÆÃÄÃÄÅ¿Å¿ÅÃÁÃÁÅ;PM1PE;PM2FT10,0FPPE=<CåoWÀ;PM0PEÂÅÂÅÆÃÆ¿Æ¿ÄÄÄÆÂÆÁÆÃÄÃÄÅ¿Å¿ÅÃÁÃÁÅ;PM1PE¿ÂÅÂÃÄÁÆÁÄÂÆÂÂÄ¿Æ¿ÄÁÄÅÄÿſÃÃÁÃÁÃ;PM1PE;PM2FPPE=<AåoWÀ;PM0PEÂÅÂÃÄÁÆÁÄÂÆÂÂÄ¿Æ¿ÄÁÄÅÄÿſÃÃÁÃÁÃ;PM1PE¿ÂÃÂÃÄÁÄÁÄÂÂÂÄÄ¿Ä¿ÂÃÄÁÂÃÂÃÁÃÁÁÃÁÁ;PM1PE;PM2FPPE=<?åoWÀ;PM0PEÂÃÂÃÄÁÄÁÄÂÂÂÄÄ¿Ä¿ÂÃÄÁÂÃÂÃÁÃÁÁÃÁÁ;PM1PEÄ¿¿ÃÂÁÄÁÂÁÂÂÄ¿ÂÂÄÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM1PE;PM2FPPE=<{äoWÀ;PM0PE¿ÃÂÁÄÁÂÁÂÂÄ¿ÂÂÄÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM1PE¿¿Ã¿ÂÁ¿¿ÂÂÂÄÁÂÁÂÁÂÁÁÁÁÁ¿¿Á;PM1PE;PM2FPPE=<yäoWÀ;PM0PE¿Ã¿ÂÁ¿¿ÂÂÂÄÁÂÁÂÁÂÁÁÁÁÁ¿¿Á;PM1PE¿¿ÁÂÁ¿¿Â¿ÂÁÂÁ¿Á¿ÁÁ;PM1PE;PM2FPPE=<wäoWÀ;PM0PE¿ÁÂÁ¿¿Â¿ÂÁÂÁ¿Á¿ÁÁ;PM1PE;PM2FPMC1,240PE=<OågYÀ;PM0PEÑÄÍÊÍÌÉÒÅÒÃÖÁØÄØÄØÈÔÌÔÎÐÐÌÒÊÒÄÒ¿ÒÃÒÉÌÍÌÑÈÑÆÕ¿×Á×Ç×ÉÕËÑÏÏÍËÑÉÑÁÓ¿;PM2FTFPMC1,90PE=<UçoWÀ;PM0PEÄáÈÝÐÙÔ×ØÕÜÍÞÉàÁàÂÞÊÜÎØÖÔØÎÚÊÞÄâÃàÉÞÍÜÓØ×ÔÛÎÝÊßÄßÃÝÉÛÍ×ÓÓ×ÏÛÇÝÃß;PM1PE¿ÄáÊÝÎÙÒ×ØÑÜÏÞÇàÃàÄÞÈÚÐØÒÔØÎÚÊÞÄâÃàÉÞÍÚÓØ×ÔÙÎÝÊßÂßÁÝÉÛÍ×ÓÑ×ÍÙÉÝÃß;PM1PE;PM2FT11,2FPPE=<SçoWÀ;PM0PEÄáÊÝÎÙÒ×ØÑÜÏÞÇàÃàÄÞÈÚÐØÒÔØÎÚÊÞÄâÃàÉÞÍÚÓØ×ÔÙÎÝÊßÂßÁÝÉÛÍ×ÓÑ×ÍÙÉÝÃß;PM1PE¿ÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PE;PM2FPPE=<QçoWÀ;PM0PEÄßÈÝÎÙÔ×ØÓÚÍÞÇàÃÞÄÞÈÜÎÖÔÔØÎÚÊÞÂàÁÞÉÞÍÚÓØÕÔÛÎÝÈÝÄßÃÝÇÙÍ×ÓÓ×ÍÙÇÝÃÝ;PM1PE¿ÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PE;PM2FPPE=<OçoWÀ;PM0PEÄßÈÛÐÛÒÕØÓÚÍÜÇàÃÞÄÞÈÚÎÖÔÔÖÎÜÈÜÄàÃÞÇÞÍÚÓÖÕÔÙÎÝÈÝÄßÃÛÇÙÍ×ÓÑÕÏÙÇÝÃÝ;PM1PEÄ¿ÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE;PM2FT11,3FPPE=<KçoWÀ;PM0PEÂßÊÛÎÙÒÕÖÑÚÏÜÇàÃÞÄÜÈÚÐØÒÒÖÎÚÈÜÄàÃÞÇÜÍÚÑØ×ÒÙÎÛÈÝÄßÃÛÇÙÍÕÑÑ×ÍÙÉÛÁÝ;PM1PE¿ÄÝÈÝÌ×ÔÕÖÓØËÞÉÞÁÞÂÜÊÚÌÖÔÒÖÎØÈÞÄÞÃÞÇÜÍÚÑÔÕÔÙÎÛÈÝÄÝÃÝÇ×ÍÕÓÓÓËÙÇÛÃÝ;PM1PE;PM2FPPE=<IçoWÀ;PM0PEÄÝÈÝÌ×ÔÕÖÓØËÞÉÞÁÞÂÜÊÚÌÖÔÒÖÎØÈÞÄÞÃÞÇÜÍÚÑÔÕÔÙÎÛÈÝÄÝÃÝÇ×ÍÕÓÓÓËÙÇÛÃÝ;PM1PE¿ÄÝÈÛÎ×Ò×ÖÑÚËÚÇÞÃÞÄÚÈÚÌÖÒÒØÎØÈÜÄÞÃÞÇÚÍØÑØÕÒÙÌÙÊÝÂÝÁÙÉÙËÕÑÑ×Í×ÇÙÃÝ;PM1PE;PM2FPPE=<GçoWÀ;PM0PEÄÝÈÛÎ×Ò×ÖÑÚËÚÇÞÃÞÄÚÈÚÌÖÒÒØÎØÈÜÄÞÃÞÇÚÍØÑØÕÒÙÌÙÊÝÂÝÁÙÉÙËÕÑÑ×Í×ÇÙÃÝ;PM1PE¿ÂÝÊÛÎ×ÒÓÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÔÌØÊÜÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PE;PM2FPPE=<EçoWÀ;PM0PEÂÝÊÛÎ×ÒÓÖÑØÍÚÉÞÁÜÂÜÊØÎÖÒÒÔÌØÊÜÂÞÁÜÉÜËØÑÖÕÒ×ÌÛÊÛÂÝÁÙÉ×ËÕÑÑÕÍ×ÉÛÁÛ;PM1PE¿ÄÝÈÙÎ×ÐÕÖÏØÍÚÉÞÁÜÂÚÊØÎÖÐÒÖÎØÈÚÂÞÁÜÇÚÍØÑÖÕÐ×ÐÙÈÛÂÝÁÙÇ×ÏÕÏÏÕÍ×ÇÙÃÛ;PM1PE;PM2FPPE=<CçoWÀ;PM0PEÄÝÈÙÎ×ÐÕÖÏØÍÚÉÞÁÜÂÚÊØÎÖÐÒÖÎØÈÚÂÞÁÜÇÚÍØÑÖÕÐ×ÐÙÈÛÂÝÁÙÇ×ÏÕÏÏÕÍ×ÇÙÃÛ;PM1PEÄ¿ÂÛÈÙÎ×ÐÕÖÑØËÚÇÜÃÜÄÚÈØÌÔÒÒÖÎØÈÚÂÜÁÚÇÜÍØÑÔÓÒ×ÌÙÊÛÂÛÁÙÉ×ËÕÑÏÓÍ×ÇÛÁÙ;PM1PE;PM2FPPE=<?çoWÀ;PM0PEÂÛÈÙÎ×ÐÕÖÑØËÚÇÜÃÜÄÚÈØÌÔÒÒÖÎØÈÚÂÜÁÚÇÜÍØÑÔÓÒ×ÌÙÊÛÂÛÁÙÉ×ËÕÑÏÓÍ×ÇÛÁÙ;PM1PE¿ÄÛÈÙÌÕÒÓÔÑÖËÚÉÜÁÜÂØÊØÌÔÒÐÔÎÖÈÚÂÜÁÚÇÚÍÖÏÖÓÐ×Î×ÈÛÂÛÁÙÇÕÍÓÏÑÕËÕÇÙÃÙ;PM1PE;PM2FPPE=<}æoWÀ;PM0PEÄÛÈÙÌÕÒÓÔÑÖËÚÉÜÁÜÂØÊØÌÔÒÐÔÎÖÈÚÂÜÁÚÇÚÍÖÏÖÓÐ×Î×ÈÛÂÛÁÙÇÕÍÓÏÑÕËÕÇÙÃÙ;PM1PEÄ¿ÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PE;PM2FPPE=<yæoWÀ;PM0PEÂÛÈ×Ì×ÐÓÖÏÖËÚÇÚÃÚÄÚÈÖÌÔÐÒÔÌØÈØÂÜÁÚÇØËØÑÔÓÐÕÌÙÊÙÂÙÁÙÉÕËÕÏÏÓË×Ç×ÁÙ;PM1PE¿ÂÛÈ×ÌÕÐÓÔÏÖËÚÇÚÁÚÂØÈÖÌÔÐÐÔÌÖÊØÂÜÁÚÉØËÖÏÔÓÐÕÌ×ÈÙÄÙÃÙÇÕËÓÏÏÓËÕÇ×ÁÙ;PM1PE;PM2FPPE=<wæoWÀ;PM0PEÂÛÈ×ÌÕÐÓÔÏÖËÚÇÚÁÚÂØÈÖÌÔÐÐÔÌÖÊØÂÜÁÚÉØËÖÏÔÓÐÕÌ×ÈÙÄÙÃÙÇÕËÓÏÏÓËÕÇ×ÁÙ;PM1PE¿ÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PE;PM2FT11,4FPPE=<uæoWÀ;PM0PEÂÛÈ×ÌÓÐÓÔÏÖËØÇÚÁÚÂØÈÖÌÒÐÐÔÌÔÈØÄÜÃÚÇØËÖÏÒÑÐÕÌ×ÈÙÂÙÁ×ÇÕËÓÏÏÑËÕÇ×ÁÙ;PM1PE¿ÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁØÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁØÅØËÖÏÔÓÎÕÌ×È×ÂÙÁ×ÇÕËÑÍÏÓËÕÇ×Á×;PM1PE;PM2FPPE=<sæoWÀ;PM0PEÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁØÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁØÅØËÖÏÔÓÎÕÌ×È×ÂÙÁ×ÇÕËÑÍÏÓËÕÇ×Á×;PM1PE¿ÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PE;PM2FPPE=<qæoWÀ;PM0PEÄÙÆÕÌÕÐÑÒÏÖËÖÇÚÁØÂØÈÖÌÒÐÎÒÌÖÈÖÂÚÁØÇØËÔÍÒÑÐÕÌ×È×ÂÙÁÕÇÕËÑÏÏÑËÓÅ×Ã×;PM1PEÄ¿Â×Æ×ÌÕÐÑÒÍÔËØÅØÃØÄØÆÔÌÒÎÎÒÌÖÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PE;PM2FPPE=<mæoWÀ;PM0PEÂ×Æ×ÌÕÐÑÒÍÔËØÅØÃØÄØÆÔÌÒÎÎÒÌÖÈØÂØÁØÇØËÔÍÒÑÎÓÌ×È×Â×Á×ÇÓËÑÍÏÑËÓÅ×Á×;PM1PE¿Â×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PE;PM2FPPE=<kæoWÀ;PM0PEÂ×È×ÊÓÎÑÒÍÔËØÅØÁØÂÖÆÔÌÒÎÐÒÊÔÈØÂØÁØÇÖÉÔÏÒÑÎÓÌÕÆ×Ä×Ã×ÅÓËÑÍÍÑÉÓÇÕÁ×;PM1PE¿Â×ÈÕÊÓÎÑÒÍÔÉÖÇØÁØÂÖÈÔÊÐÎÎÒÌÔÆÖÄØÃØÅÔËÖÍÐÏÎÓÌÕÆ×Â×ÁÕÅÓËÑÍÍÏÉÕÇÓÁ×;PM1PE;PM2FPPE=<iæoWÀ;PM0PEÂ×ÈÕÊÓÎÑÒÍÔÉÖÇØÁØÂÖÈÔÊÐÎÎÒÌÔÆÖÄØÃØÅÔËÖÍÐÏÎÓÌÕÆ×Â×ÁÕÅÓËÑÍÍÏÉÕÇÓÁ×;PM1PEÄ¿Â×ÈÕÈÑÐÑÐÍÔÉÔÅØÁÖÂÖÆÔÊÐÎÎÒÊÒÈÖÂØÁÖÇÖÉÒÍÒÏÎÓÊÕÆÕÄ×ÃÓÅÓÉÏÍÏÑÇÑÇÕÁÕ;PM1PE;PM2FPPE=<eæoWÀ;PM0PEÂ×ÈÕÈÑÐÑÐÍÔÉÔÅØÁÖÂÖÆÔÊÐÎÎÒÊÒÈÖÂØÁÖÇÖÉÒÍÒÏÎÓÊÕÆÕÄ×ÃÓÅÓÉÏÍÏÑÇÑÇÕÁÕ;PM1PE¿Â×ÆÓÌÓÌÏÒÍÒÉÔÅØÁÖÂÔÆÔÊÐÎÎÐÊÔÆÔÄØÃÖÅÔÉÔÍÐÏÎÓÊÓÆÕÂ×ÁÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PE;PM2FPPE=<cæoWÀ;PM0PEÂ×ÆÓÌÓÌÏÒÍÒÉÔÅØÁÖÂÔÆÔÊÐÎÎÐÊÔÆÔÄØÃÖÅÔÉÔÍÐÏÎÓÊÓÆÕÂ×ÁÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PE¿ÂÕÆÓÌÓÌÏÐËÔËÔÅÖÁÖÂÔÆÒÌÐÌÎÐÊÔÆÔÂÖÁÔÅÖÉÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÓÉÏÍËÏËÑÅÕÁÓ;PM1PE;PM2FPPE=<aæoWÀ;PM0PEÂÕÆÓÌÓÌÏÐËÔËÔÅÖÁÖÂÔÆÒÌÐÌÎÐÊÔÆÔÂÖÁÔÅÖÉÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÓÉÏÍËÏËÑÅÕÁÓ;PM1PE¿ÄÕÆÓÈÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÊÒÆÔÂÖÁÔÅÖÉÒËÎÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍÍÍÇÑÅÕÃÓ;PM1PE;PM2FT11,5FPPE=<_æoWÀ;PM0PEÄÕÆÓÈÑÎÏÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÌÐÊÒÆÔÂÖÁÔÅÖÉÒËÎÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍÍÍÇÑÅÕÃÓ;PM1PEÄ¿ÂÕÆÓÊÑÌÏÎËÒÇÔÅÖÃÖÄÒÆÒÈÎÌÎÐÊÒÆÔÂÖÁÔÅÔÉÒÍÎÍÎÑÊÑÆÕÂÕÁÓÅÑÉÍÍËÍÉÑÅÓÁÓ;PM1PE;PM2FPPE=<[æoWÀ;PM0PEÂÕÆÓÊÑÌÏÎËÒÇÔÅÖÃÖÄÒÆÒÈÎÌÎÐÊÒÆÔÂÖÁÔÅÔÉÒÍÎÍÎÑÊÑÆÕÂÕÁÓÅÑÉÍÍËÍÉÑÅÓÁÓ;PM1PE¿ÂÕÆÑÊÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÐÌÌÎÊÒÆÒÂÖÁÔÅÒÉÒËÐÏÌÏÈÓÆÓÄÓÃÓÅÏÇÏËËÏÉÑÅÑÁÓ;PM1PE;PM2FPPE=<YæoWÀ;PM0PEÂÕÆÑÊÑÌÍÐËÐÉÔÅÔÁÔÂÔÆÐÊÐÌÌÎÊÒÆÒÂÖÁÔÅÒÉÒËÐÏÌÏÈÓÆÓÄÓÃÓÅÏÇÏËËÏÉÑÅÑÁÓ;PM1PE¿ÂÓÆÓÈÏÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÐÆÔÄÔÃÒÅÔÇÐËÎÏÎÏÈÓÆÑÂÓÁÑÅÑÇÍÍÍÍÇÏÅÓÁÑ;PM1PE;PM2FPPE=<WæoWÀ;PM0PEÂÓÆÓÈÏÎÍÎÍÒÇÒÅÔÁÒÂÔÆÐÈÐÎÌÎÈÐÆÔÄÔÃÒÅÔÇÐËÎÏÎÏÈÓÆÑÂÓÁÑÅÑÇÍÍÍÍÇÏÅÓÁÑ;PM1PE¿ÂÓÆÑÊÏÌÏÎËÐÇÒÅÔÁÒÂÒÆÒÈÎÌÌÐÊÐÄÒÂÔÁÒÃÒÉÒËÎÍÌÑÊÑÄÑÂÓÁÑÃÏÉÍËËÍÉÑÅÑÁÑ;PM1PE;PM2FPPE=<UæoWÀ;PM0PEÂÓÆÑÊÏÌÏÎËÐÇÒÅÔÁÒÂÒÆÒÈÎÌÌÐÊÐÄÒÂÔÁÒÃÒÉÒËÎÍÌÑÊÑÄÑÂÓÁÑÃÏÉÍËËÍÉÑÅÑÁÑ;PM1PE¿ÄÓÄÏÊÑÊÍÎÉÒÉÐÅÔÁÒÂÒÆÐÊÎÊÌÎÊÒÄÐÂÔÁÒÃÒÉÐËÎÍÌÏÈÑÆÑÂÓÁÏÅÑÇÍËÉÍÉÏÃÑÃÑ;PM1PE;PM2FPPE=<SæoWÀ;PM0PEÄÓÄÏÊÑÊÍÎÉÒÉÐÅÔÁÒÂÒÆÐÊÎÊÌÎÊÒÄÐÂÔÁÒÃÒÉÐËÎÍÌÏÈÑÆÑÂÓÁÏÅÑÇÍËÉÍÉÏÃÑÃÑ;PM1PEÄ¿ÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PE;PM2FPPE=<OæoWÀ;PM0PEÂÑÆÑÈÏÌËÎËÎÇÒÅÒÁÒÂÐÆÐÈÎÌÌÌÈÐÄÒÂÒÁÒÃÐÇÐËÌÍÌÏÊÏÄÑÂÑÁÑÃÍÉÍËËËÇÏÅÏÁÑ;PM1PE¿ÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÐÆÎÈÎÊÊÎÊÐÄÐÂÒÁÒÃÎÉÐÉÎÍÊÍÈÏÆÑÂÑÁÏÅÏÇËÉËÍÇÏÃÍÃÑ;PM1PE;PM2FPPE=<MæoWÀ;PM0PEÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÐÆÎÈÎÊÊÎÊÐÄÐÂÒÁÒÃÎÉÐÉÎÍÊÍÈÏÆÑÂÑÁÏÅÏÇËÉËÍÇÏÃÍÃÑ;PM1PEÄ¿¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PE;PM2FPPE=<IæoWÀ;PM0PE¿ÑÆÏÈÍÊÍÎÉÎÇÐÅÒÁÐÂÒÆÎÈÌÊÌÎÆÎÆÐÂÒÁÐÅÐÅÐËÌËÌÍÆÑÆÏÂÑÁÏÅÍÅÍËÉËÇÏÅÏ¿Ï;PM1PE¿¿ÑÆÏÈÍÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÎÆÐÂÒÁÐÅÐÅÎËÌËÊÍÈÏÆÏÂÑÁÍÅÏÇËÉÉËÇÍÅÏ¿Ï;PM1PE;PM2FT11,6FPPE=<GæoWÀ;PM0PE¿ÑÆÏÈÍÊËÌÉÐÇÎÅҿпÐÆÎÈÌÊÌÌÆÎÆÐÂÒÁÐÅÐÅÎËÌËÊÍÈÏÆÏÂÑÁÍÅÏÇËÉÉËÇÍÅÏ¿Ï;PM1PE¿ÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PE;PM2FPPE=<EæoWÀ;PM0PEÂÑÄÍÈÍÊËÌÉÎÇÎÅҿпÎÆÐÈÌÊÈÌÊÎÄÎÂÒÁÐÃÎÉÎÇÌËÊÏÈÍÆÏ¿Ñ¿ÍÅÍÇËÉÉËÇÍÃÍÁÏ;PM1PE¿ÂÏÄÏÈÍÊËÌÇÌÇÐÃÐÁÐÂÎÄÎÈÊÈÌÌÆÎÆппÎÅÐÅÎËÊÉÌÍÆÍÆÏ¿Ï¿ÏÅËÅËËÉÉÇÍÃÏÁÍ;PM1PE;PM2FPPE=<CæoWÀ;PM0PEÂÏÄÏÈÍÊËÌÇÌÇÐÃÐÁÐÂÎÄÎÈÊÈÌÌÆÎÆппÎÅÐÅÎËÊÉÌÍÆÍÆÏ¿Ï¿ÏÅËÅËËÉÉÇÍÃÏÁÍ;PM1PE¿ÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PE;PM2FPPE=<AæoWÀ;PM0PEÂÏÄÍÈÍÊÉÊÉÎÇÎÃÐÁÐÂÎÄÌÈÌÊÊÊÆÎÆοпÎÅÐÅÌÉÌËÈËÈÍÄÏÂÏÁÍÃÍÇÉÇÉËÇËÃÏÁÍ;PM1PEÄ¿¿ÏÆÍÆËÈËÌÇÌÇÐÃÎÁÎÂÎÄÎÈÊÈÈÌÈÌÄÎÂÐÁÎÃÎÇÎÇÊÉÈÍÈÍÄÍÂÍÁÏÃËÇËÇÇÉÅÍÅÍ¿Í;PM1PE;PM2FPPE=<}åoWÀ;PM0PE¿ÏÆÍÆËÈËÌÇÌÇÐÃÎÁÎÂÎÄÎÈÊÈÈÌÈÌÄÎÂÐÁÎÃÎÇÎÇÊÉÈÍÈÍÄÍÂÍÁÏÃËÇËÇÇÉÅÍÅÍ¿Í;PM1PE¿¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PE;PM2FPPE=<{åoWÀ;PM0PE¿ÏÆËÆËÊËÊÇÌÅÎÅοοÎÆÌÆÊÈÊÌÆÌÄÌÂÐÁÎÃÌÅÌÉÌÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÉËÅËÅË¿Í;PM1PEÄ¿¿ÍÆÍÆËÈÇÊÉÌÅÌÃÎÁÌÂÎÄÌÆÊÊÈÈÆÌÄÎÂÎÁÌÃÎÅÌÇÊÉÈËÆÍÄËÂÍÁËÃËÅÉÇÇÉÅËÅÍ¿Ë;PM1PE;PM2FPPE=<wåoWÀ;PM0PE¿ÍÆÍÆËÈÇÊÉÌÅÌÃÎÁÌÂÎÄÌÆÊÊÈÈÆÌÄÎÂÎÁÌÃÎÅÌÇÊÉÈËÆÍÄËÂÍÁËÃËÅÉÇÇÉÅËÅÍ¿Ë;PM1PE¿¿ÍÄËÆËÈÉÊÇÌÅÌÃο̿ÌÄÌÆÊÈÈÊÆÌÄÌÂÎÁÌÃÌÅÌÇÊÉÈËÆËÄËÂÍÁËÃËÅÉÇÇÉÅËÃË¿Ë;PM1PE;PM2FPPE=<uåoWÀ;PM0PE¿ÍÄËÆËÈÉÊÇÌÅÌÃο̿ÌÄÌÆÊÈÈÊÆÌÄÌÂÎÁÌÃÌÅÌÇÊÉÈËÆËÄËÂÍÁËÃËÅÉÇÇÉÅËÃË¿Ë;PM1PE¿ÂÍÂËÆÉÊÉÈÇÊÅÌÃο̿ÌÄÌÆÈÈÈÊÆÊÄÌÂÎÁÌÃÌÅÌÇÈÇÈËÆËÄË¿Í¿ËÃÉÅÇÇÉÇÅËÁËÁË;PM1PE;PM2FPPE=<såoWÀ;PM0PEÂÍÂËÆÉÊÉÈÇÊÅÌÃο̿ÌÄÌÆÈÈÈÊÆÊÄÌÂÎÁÌÃÌÅÌÇÈÇÈËÆËÄË¿Í¿ËÃÉÅÇÇÉÇÅËÁËÁË;PM1PE¿ÂËÄËÆÉÆÉÊÇÊÅÌÁÌÁÌÂÌÂÊÆÈÈÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÈÇÊÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÉÅÇÃËÁË;PM1PE;PM2FT11,7FPPE=<qåoWÀ;PM0PEÂËÄËÆÉÆÉÊÇÊÅÌÁÌÁÌÂÌÂÊÆÈÈÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÈÇÊÇÈÉÆËÄË¿Ë¿ËÃÉÅÉÇÅÉÅÇÃËÁË;PM1PE¿ÂËÄËÄÉÈÇÊÇÈÃÌÃÌÁÌÂÊÄÊÄÊÈÆÈÆÊÄÌ¿ÌÃÖËÔÓÌÕÄËÁËÁÇÅÉÅÇÉÃÉÃÉÁË;PM1PE;PM2FPPE=<oåoWÀ;PM0PEÂËÄËÄÉÈÇÊÇÈÃÌÃÌÁÌÂÊÄÊÄÊÈÆÈÆÊÄÌ¿ÌÃÖËÔÓÌÕÄËÁËÁÇÅÉÅÇÉÃÉÃÉÁË;PM1PEÄ¿ÄÕÌÑÒËÖÅÖÆÒÌÌÒÄÖÃÔËÒÑÌÕÆÕÅÑËËÑÃÓ;PM1PE;PM2FPPE=<kåoWÀ;PM0PEÄÕÌÑÒËÖÅÖÆÒÌÌÒÄÖÃÔËÒÑÌÕÆÕÅÑËËÑÃÓ;PM1PE¿ÄÕÌÑÒÉÔÃÔÄÐÊÌÒÆÖÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PE;PM2FPPE=<iåoWÀ;PM0PEÄÕÌÑÒÉÔÃÔÄÐÊÌÒÆÖÅÔËÐÏÌÓÆÓÅÑËËÏÃÓ;PM1PE¿ÄÓÌÏÐËÔÃÒÄÒÌÌÐÄÔÃÒËÒÑÌÑÂÓÁÏËËÑÃÑ;PM1PE;PM2FPPE=<gåoWÀ;PM0PEÄÓÌÏÐËÔÃÒÄÒÌÌÐÄÔÃÒËÒÑÌÑÂÓÁÏËËÑÃÑ;PM1PE¿ÄÓÊÏÐÉÔÃÒÄÐÊÌÐÂÔÁÒËÐÏÊÑÄÓÃÏÉÉÏÃÑ;PM1PE;PM2FPPE=<eåoWÀ;PM0PEÄÓÊÏÐÉÔÃÒÄÐÊÌÐÂÔÁÒËÐÏÊÑÄÓÃÏÉÉÏÃÑ;PM1PEÄ¿ÄÑÊÏÎÇÒÃÐÄÎÈÌÐÄÒÃÐËÎÍÌÏÂÑÁÍËÉÍÃÏ;PM1PE;PM2FPPE=<aåoWÀ;PM0PEÄÑÊÏÎÇÒÃÐÄÎÈÌÐÄÒÃÐËÎÍÌÏÂÑÁÍËÉÍÃÏ;PM1PE¿ÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PE;PM2FPPE=<_åoWÀ;PM0PEÄÑÊËÌÉÒÃÐÄÎÊÊÌÂÒÁÐÉÎÍÈÏÄÑÃËÇÉÍÃÏ;PM1PE¿ÄÏÈÍÎÇÐÃÐÄÌÈÈÎÄÐÃÎÇÎËÈÏÄÏÃÍÇÇÍÃÍ;PM1PE;PM2FPPE=<]åoWÀ;PM0PEÄÏÈÍÎÇÐÃÐÄÌÈÈÎÄÐÃÎÇÎËÈÏÄÏÃÍÇÇÍÃÍ;PM1PEÄ¿ÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE;PM2FT11,8FPPE=<YåoWÀ;PM0PEÂÏÊËÌÇÎÃÎÄÌÈÈÌÄÐÃÎÇÌËÈÍÄÍÃËÇÉËÁÍ;PM1PE¿ÂÍÈËÌÇÎÁÌÂÌÈÊÌÂÎÁÌÉÌËÈËÄÍÃËÇÇËÁË;PM1PE;PM2FPPE=<WåoWÀ;PM0PEÂÍÈËÌÇÎÁÌÂÌÈÊÌÂÎÁÌÉÌËÈËÄÍÃËÇÇËÁË;PM1PE¿ÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PE;PM2FPPE=<UåoWÀ;PM0PEÂÍÈÉÊÇÎÁÌÂÌÈÆÊÄÎÃÌÅÌËÆËÂÍÁÉÅÇËÁË;PM1PE¿ÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM1PE;PM2FPPE=<SåoWÀ;PM0PEÂËÈÉÊÇÌÁÌÂÊÈÆÊÂÌÁÌÅÈÉÈËÂËÁÉÇÇÇÁË;PM1PE¿ÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PE;PM2FPPE=<QåoWÀ;PM0PEÄËÆÉÈÅÌÁÊÂÊÆÆÊÂÌÁÊÅÊÉÆÉÂËÁÇÅÅÉÃÉ;PM1PEÄ¿ÂËÄÇÈÃÌÃÊÄÈÄÆÈÂÌÁÈÅÊÇÆÉÂËÁÇÅÃÉÁÇ;PM1PE;PM2FPPE=<MåoWÀ;PM0PEÂËÄÇÈÃÌÃÊÄÈÄÆÈÂÌÁÈÅÊÇÆÉÂËÁÇÅÃÉÁÇ;PM1PE¿ÄÉÄÅÈÅÈÁÈÂÈÆÄÆÂÊÁÈÃÆÇÆÇÂÇÁÇÅÃÅÃÇ;PM1PE;PM2FPPE=<KåoWÀ;PM0PEÄÉÄÅÈÅÈÁÈÂÈÆÄÆÂÊÁÈÃÆÇÆÇÂÇÁÇÅÃÅÃÇ;PM1PEÄ¿¿ÇÆÇÆÃÈÁÆÂÈÄÄÈÂÈÁÆÃÈÇÄÅÂÇÁÅÃÅÇ¿Å;PM1PE;PM2FPPE=<GåoWÀ;PM0PE¿ÇÆÇÆÃÈÁÆÂÈÄÄÈÂÈÁÆÃÈÇÄÅÂÇÁÅÃÅÇ¿Å;PM1PE¿¿ÇÄÅÆÃÈ¿Æ¿ÆÄÄÆÂÈÁÆÃÆÅÄÅÂÇÁÅÃÃÅ¿Å;PM1PE;PM2FPPE=<EåoWÀ;PM0PE¿ÇÄÅÆÃÈ¿Æ¿ÆÄÄÆÂÈÁÆÃÆÅÄÅÂÇÁÅÃÃÅ¿Å;PM1PE¿ÂÅÂÅÆÃÆ¿Æ¿ÄÄÄÆÂÆÁÆÃÄÃÄÅ¿Å¿ÅÃÁÃÁÅ;PM1PE;PM2FT10,0FPPE=<CåoWÀ;PM0PEÂÅÂÅÆÃÆ¿Æ¿ÄÄÄÆÂÆÁÆÃÄÃÄÅ¿Å¿ÅÃÁÃÁÅ;PM1PE¿ÂÅÂÃÄÁÆÁÄÂÆÂÂÄ¿Æ¿ÄÁÄÅÄÿſÃÃÁÃÁÃ;PM1PE;PM2FPPE=<AåoWÀ;PM0PEÂÅÂÃÄÁÆÁÄÂÆÂÂÄ¿Æ¿ÄÁÄÅÄÿſÃÃÁÃÁÃ;PM1PE¿ÂÃÂÃÄÁÄÁÄÂÂÂÄÄ¿Ä¿ÂÃÄÁÂÃÂÃÁÃÁÁÃÁÁ;PM1PE;PM2FPPE=<?åoWÀ;PM0PEÂÃÂÃÄÁÄÁÄÂÂÂÄÄ¿Ä¿ÂÃÄÁÂÃÂÃÁÃÁÁÃÁÁ;PM1PEÄ¿¿ÃÂÁÄÁÂÁÂÂÄ¿ÂÂÄÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM1PE;PM2FPPE=<{äoWÀ;PM0PE¿ÃÂÁÄÁÂÁÂÂÄ¿ÂÂÄÁ¿ÄÿÁÂÁÁÿÁÿÁ;PM1PE¿¿Ã¿ÂÁ¿¿ÂÂÂÄÁÂÁÂÁÂÁÁÁÁÁ¿¿Á;PM1PE;PM2FPPE=<yäoWÀ;PM0PE¿Ã¿ÂÁ¿¿ÂÂÂÄÁÂÁÂÁÂÁÁÁÁÁ¿¿Á;PM1PE¿¿ÁÂÁ¿¿Â¿ÂÁÂÁ¿Á¿ÁÁ;PM1PE;PM2FPPE=<wäoWÀ;PM0PE¿ÁÂÁ¿¿Â¿ÂÁÂÁ¿Á¿ÁÁ;PM1PE;PM2FPPE=<kdÀEø;PM0PEÆ÷ÒóØïäéêãð×ôÑøÅøÆöÒðØêäâêÚðÐôÆøÅúÏôÙðáêéâïÚõÐ÷Æ÷ÅóÏïÙéáãé×ïÑóÅù;PM1PEÄ¿Æ÷ÐóÚïâçèáðÙôÏøÅøÆôÐðÚêâàèÜðÎôÆøÅúÍòÛðßêéâïÚóÐ÷Æ÷ÅóÏïÙçááéÙïÏñÅù;PM1PE;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<gdÀEø;PM0PEÆ÷ÐóÚïâçèáðÙôÏøÅøÆôÐðÚêâàèÜðÎôÆøÅúÍòÛðßêéâïÚóÐ÷Æ÷ÅóÏïÙçááéÙïÏñÅù;PM1PEÄ¿ÆõÐñÚïâçèáîÙôÍöÅøÆòÎîÚêââèØðÐòÆöÅøÏò×ðáèéâíØñÐ÷ÆõÅóÏí×çááçÙïÏñÅ÷;PM1PE;PM2FPPE=<cdÀEø;PM0PEÆõÐñÚïâçèáîÙôÍöÅøÆòÎîÚêââèØðÐòÆöÅøÏò×ðáèéâíØñÐ÷ÆõÅóÏí×çááçÙïÏñÅ÷;PM1PEÆ¿ÆõÐñØíàåèáî×òÏöÅöÆòÐîØèââæØîÐòÆöÅöÏô×ìáèçâíØñÐõÆõÅñÏí×çáßç×ëÏóÅõ;PM1PE;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<]dÀEø;PM0PEÆõÐñØíàåèáî×òÏöÅöÆòÐîØèââæØîÐòÆöÅöÏô×ìáèçâíØñÐõÆõÅñÏí×çáßç×ëÏóÅõ;PM1PEÄ¿ÄõÐïØíâåæßîÙðÏöÃöÄòÐîÚæààæÚîÎðÆöÅöÍòÙîßæåàíÚñÐõÄõÃïÏíÙåßáå×íÏñÃõ;PM1PE;PM2FPPE=<YdÀEø;PM0PEÄõÐïØíâåæßîÙðÏöÃöÄòÐîÚæààæÚîÎðÆöÅöÍòÙîßæåàíÚñÐõÄõÃïÏíÙåßáå×íÏñÃõ;PM1PEÄ¿ÄñÐñØëàåèáì×ðÍôÅôÆòÎìØæâàæØìÐòÄòÃôÏò×ìßæåàëØñÐóÆóÅïÏë×çßßå×ëÏñÃó;PM1PE;PM2FPPE=<UdÀEø;PM0PEÄñÐñØëàåèáì×ðÍôÅôÆòÎìØæâàæØìÐòÄòÃôÏò×ìßæåàëØñÐóÆóÅïÏë×çßßå×ëÏñÃó;PM1PEÄ¿ÆñÐïØëÞåæÝê×ðÏôÃôÄðÐìØäÞàæØìÐðÄòÃôÏð×ìßäãàëØïÐóÄóÃïÏé×åßÝã×ëÏïÅó;PM1PE;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<QdÀEø;PM0PEÆñÐïØëÞåæÝê×ðÏôÃôÄðÐìØäÞàæØìÐðÄòÃôÏð×ìßäãàëØïÐóÄóÃïÏé×åßÝã×ëÏïÅó;PM1PEÄ¿ÆñÎíØëÞãæßìÕîÏòÅòÆðÐêÖæààäÖìÐîÄòÃôÏîÕìßäåàéÖïÐñÄñÃíÏëÕåßÝã×ëÍíÅó;PM1PE;PM2FPPE=<MdÀEø;PM0PEÆñÎíØëÞãæßìÕîÏòÅòÆðÐêÖæààäÖìÐîÄòÃôÏîÕìßäåàéÖïÐñÄñÃíÏëÕåßÝã×ëÍíÅó;PM1PEÆ¿ÄïÎïØéÞãäÝê×ðÍðÃòÄîÎêØäÞàäÖêÎðÆðÅòÍîÕêßäãàéÖíÐñÄïÃïÏéÕãßÝã×éÍíÃñ;PM1PE;PM2FPPE=<GdÀEø;PM0PEÄïÎïØéÞãäÝê×ðÍðÃòÄîÎêØäÞàäÖêÎðÆðÅòÍîÕêßäãàéÖíÐñÄïÃïÏéÕãßÝã×éÍíÃñ;PM1PEÄ¿ÄïÐëÖéÜãäÝêÕîÍðÅòÆìÎêÖäÞÜäØêÎìÄðÃòÍì×êÛäãÞéÖëÎñÆïÅíÍéÕãÝÛãÕéÏëÃñ;PM1PE;PM2RF4,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<CdÀEø;PM0PEÄïÐëÖéÜãäÝêÕîÍðÅòÆìÎêÖäÞÜäØêÎìÄðÃòÍì×êÛäãÞéÖëÎñÆïÅíÍéÕãÝÛãÕéÏëÃñ;PM1PEÄ¿ÄïÎëÖçÞãäÝèÓìÏðÃðÄìÐêÔâÞÞäÖèÎìÆðÅðÍîÕèÝâáÞéÖëÎïÆïÅëÍçÕãÝÝáÕçÍíÃï;PM1PE;PM2FPPE=<?dÀEø;PM0PEÄïÎëÖçÞãäÝèÓìÏðÃðÄìÐêÔâÞÞäÖèÎìÆðÅðÍîÕèÝâáÞéÖëÎïÆïÅëÍçÕãÝÝáÕçÍíÃï;PM1PEÄ¿ÆíÌëÖçÜáäÝèÕìËîÅðÆìÌèÖâÞÜâÖèÎìÄîÃðÍìÕèÛâáÞçÔëÎïÄíÃëÍçÓãÝÛáÕçËëÅï;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<{cÀEø;PM0PEÆíÌëÖçÜáäÝèÕìËîÅðÆìÌèÖâÞÜâÖèÎìÄîÃðÍìÕèÛâáÞçÔëÎïÄíÃëÍçÓãÝÛáÕçËëÅï;PM1PEÆ¿ÄëÎëÔçÜáâÙèÕêÍîÃîÄìÎæÖâÚÜâÖèÌìÆìÅîËìÕèÛàáÜåÖëÎíÄíÃéÍçÕáÛÛßÓçÍëÃí;PM1PE;PM2FPPE=<ucÀEø;PM0PEÄëÎëÔçÜáâÙèÕêÍîÃîÄìÎæÖâÚÜâÖèÌìÆìÅîËìÕèÛàáÜåÖëÎíÄíÃéÍçÕáÛÛßÓçÍëÃí;PM1PE¿ÆëÌéÖçÚßâÛæÓêÍîÃîÄêÎæÔâÜÜàÔèÎêÄìÃîÍêÓæÛâáÜåÔéÎíÄíÃéÍåÓáÛÙáÕåËéÅí;PM1PE;PM2FPPE=<scÀEø;PM0PEÆëÌéÖçÚßâÛæÓêÍîÃîÄêÎæÔâÜÜàÔèÎêÄìÃîÍêÓæÛâáÜåÔéÎíÄíÃéÍåÓáÛÙáÕåËéÅí;PM1PEÆ¿ÄëÎçÔåÚáàÙèÓèÍìÃìÄêÎæÔàÚÚâÖæÌèÆìÅîËèÕæÙàßÜåÔéÌëÆëÅçËçÓßÛÙßÓåÍçÃí;PM1PE;PM2FPPE=<mcÀEø;PM0PEÄëÎçÔåÚáàÙèÓèÍìÃìÄêÎæÔàÚÚâÖæÌèÆìÅîËèÕæÙàßÜåÔéÌëÆëÅçËçÓßÛÙßÓåÍçÃí;PM1PEÄ¿ÆéÌéÔãÚßàÙäÓêËêÅìÆèÌäÔàÚÜàÔäÌêÄêÃìËèÓäÛâßÚãÔçÌëÄéÃéËãÓßÙÙáÓãËçÅë;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<icÀEø;PM0PEÆéÌéÔãÚßàÙäÓêËêÅìÆèÌäÔàÚÜàÔäÌêÄêÃìËèÓäÛâßÚãÔçÌëÄéÃéËãÓßÙÙáÓãËçÅë;PM1PEÄ¿ÄéÌçÔãÚßàÙäÑèËêÅêÆêÌäÒÞÚÚàÔäÌèÄêÃêËêÓäÙÞÝÜãÒéÌéÆéÅçËãÑßÛÙÝÓãËéÃé;PM1PE;PM2FPPE=<ecÀEø;PM0PEÄéÌçÔãÚßàÙäÑèËêÅêÆêÌäÒÞÚÚàÔäÌèÄêÃêËêÓäÙÞÝÜãÒéÌéÆéÅçËãÑßÛÙÝÓãËéÃé;PM1PEÄ¿ÆéÌåÒáÚßà×âÓæËêÃêÄæÌäÔÞØÚàÔâÌæÄêÃêËèÓâÙàÝØãÔåÌéÄéÃåËáÓß×ÙßÑáËçÅé;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<acÀEø;PM0PEÆéÌåÒáÚßà×âÓæËêÃêÄæÌäÔÞØÚàÔâÌæÄêÃêËèÓâÙàÝØãÔåÌéÄéÃåËáÓß×ÙßÑáËçÅé;PM1PEÆ¿ÄçÌåÒáÚÝÞÙâÑæËèÃêÄæÌâÒÞÚØÞÔâÌæÄèÃêËæÓâ×ÞÝØáÔåÌéÄçÃåËáÓÝ×ÙÝÑáËåÃé;PM1PE;PM2FPPE=<[cÀEø;PM0PEÄçÌåÒáÚÝÞÙâÑæËèÃêÄæÌâÒÞÚØÞÔâÌæÄèÃêËæÓâ×ÞÝØáÔåÌéÄçÃåËáÓÝ×ÙÝÑáËåÃé;PM1PEÄ¿ÂåÌåÔáØÝÜ×äÑäËèÃèÄæÌâÒÜØØÞÔâÌæÄæÃèËæÓâ×ÞÛØáÒåÌçÄçÃãËãÑÛ××ÝÓáËåÁç;PM1PE;PM2FPPE=<WcÀEø;PM0PEÂåÌåÔáØÝÜ×äÑäËèÃèÄæÌâÒÜØØÞÔâÌæÄæÃèËæÓâ×ÞÛØáÒåÌçÄçÃãËãÑÛ××ÝÓáËåÁç;PM1PEÄ¿ÄåÌãÒáØÛÜ×àÑäËèÃèÄäÌàÒÞØØÜÒâÌäÂæÁèËäÑà×ÞÝØßÒãÌçÄçÃãËßÑÛ××ÝÑßËãÃç;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<ScÀEø;PM0PEÄåÌãÒáØÛÜ×àÑäËèÃèÄäÌàÒÞØØÜÒâÌäÂæÁèËäÑà×ÞÝØßÒãÌçÄçÃãËßÑÛ××ÝÑßËãÃç;PM1PEÄ¿ÄåÌáÒßÖÝÜÕâÑâËæÁæÂäÌàÒÜÖØÞÒàÊâÄæÃèÉâÑà×ÞÛÖßÒãÊåÄåÃáÉáÑÛÕÕÝÑßËáÃç;PM1PE;PM2FPPE=<OcÀEø;PM0PEÄåÌáÒßÖÝÜÕâÑâËæÁæÂäÌàÒÜÖØÞÒàÊâÄæÃèÉâÑà×ÞÛÖßÒãÊåÄåÃáÉáÑÛÕÕÝÑßËáÃç;PM1PEÄ¿ÄãÊãÒÝØÛÜÕÞÑäËäÃæÄâÌàÒÜÖÖÜÒÞÊäÄäÃæÉâÑàÕÜÛÖßÒáÌåÂãÁãËÝÑÛÕ×ÛÑßÉáÃå;PM1PE;PM2FPPE=<KcÀEø;PM0PEÄãÊãÒÝØÛÜÕÞÑäËäÃæÄâÌàÒÜÖÖÜÒÞÊäÄäÃæÉâÑàÕÜÛÖßÒáÌåÂãÁãËÝÑÛÕ×ÛÑßÉáÃå;PM1PEÆ¿ÂãÌáÐÝÖÛÜÕÞÏâÉäÃäÄäÊÞÐÚÖÖÜÒÞÊâÄäÃäÉäÑÞÕÜÙÔÝÒãÊãÄãÃáÉÝÑÛÓÕÛÏÝËãÁã;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<EcÀEø;PM0PEÂãÌáÐÝÖÛÜÕÞÏâÉäÃäÄäÊÞÐÚÖÖÜÒÞÊâÄäÃäÉäÑÞÕÜÙÔÝÒãÊãÄãÃáÉÝÑÛÓÕÛÏÝËãÁã;PM1PEÄ¿ÄãÊßÐÝÖÙÚÕÞÏàÉäÃäÄàÊÞÐÜÖÔÚÐÞÌàÂäÁäËâÏÞÓÚÛÖÝÎßÌãÄãÃßËÝÍÙÕÕÙÏÝÉáÃã;PM1PE;PM2FPPE=<AcÀEø;PM0PEÄãÊßÐÝÖÙÚÕÞÏàÉäÃäÄàÊÞÐÜÖÔÚÐÞÌàÂäÁäËâÏÞÓÚÛÖÝÎßÌãÄãÃßËÝÍÙÕÕÙÏÝÉáÃã;PM1PEÄ¿ÄáÈßÒÝÔÙÚÓÞÏàÉâÃäÄàÊÜÐÚÔÖÚÐÞÊàÄâÃäÉàÏÜÕÜÙÔÛÐßÊãÄáÃßÉÝÏÙÓÓÛÑÛÇßÃã;PM1PE;PM2FPPE=<}bÀEø;PM0PEÄáÈßÒÝÔÙÚÓÞÏàÉâÃäÄàÊÜÐÚÔÖÚÐÞÊàÄâÃäÉàÏÜÕÜÙÔÛÐßÊãÄáÃßÉÝÏÙÓÓÛÑÛÇßÃã;PM1PEÄ¿ÄßÊßÐÛÔÙØÓÞÏÞÉâÃâÄàÊÜÐÚÔÔÚÐÜÈàÄàÃâÇàÏÜÓÚÙÔÛÐßÊáÂáÁÝÉÝÏ×ÓÓÙÏÛÉßÃá;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<ybÀEø;PM0PEÄßÊßÐÛÔÙØÓÞÏÞÉâÃâÄàÊÜÐÚÔÔÚÐÜÈàÄàÃâÇàÏÜÓÚÙÔÛÐßÊáÂáÁÝÉÝÏ×ÓÓÙÏÛÉßÃá;PM1PEÆ¿ÂßÊÝÎÛÖ×ØÓÚÏàÇàÃàÄàÈÜÐØÔÔØÎÜÊÞÄàÃâÉÞÍÜÓØ×ÔÛÎßÊßÄßÃßÉÙÍ×ÓÕ×ÍÛÉÝÁá;PM1PE;PM2FPPE=<sbÀEø;PM0PEÂßÊÝÎÛÖ×ØÓÚÏàÇàÃàÄàÈÜÐØÔÔØÎÜÊÞÄàÃâÉÞÍÜÓØ×ÔÛÎßÊßÄßÃßÉÙÍ×ÓÕ×ÍÛÉÝÁá;PM1PE¿ÄßÊÝÎÙÔ×ØÓÚÍÞÉàÁàÂÞÊÜÎØÔÒØÎÚÊÞÄàÃâÉÞÍÚÑØ×ÒÛÐÝÈßÄßÃÝÇÙÏ×ÑÓ×ÍÙÉÝÃá;PM1PE;PM2FPPE=<qbÀEø;PM0PEÄßÊÝÎÙÔ×ØÓÚÍÞÉàÁàÂÞÊÜÎØÔÒØÎÚÊÞÄàÃâÉÞÍÚÑØ×ÒÛÐÝÈßÄßÃÝÇÙÏ×ÑÓ×ÍÙÉÝÃá;PM1PEÆ¿ÄÝÈÝÎÙÔÕÖÓÚÍÞÇÞÃàÄÜÈÚÎØÔÒÖÐÚÈÞÄÞÃàÇÜÏÜÑÖ×ÔÙÎÛÈßÄÝÃÝÇÙÍÕÓÓÕÍÛÇÛÃß;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<kbÀEø;PM0PEÄÝÈÝÎÙÔÕÖÓÚÍÞÇÞÃàÄÜÈÚÎØÔÒÖÐÚÈÞÄÞÃàÇÜÏÜÑÖ×ÔÙÎÛÈßÄÝÃÝÇÙÍÕÓÓÕÍÛÇÛÃß;PM1PEÄ¿ÄÝÈÛÎÙÒÓÖÓÚÍÜÇÞÃÞÄÞÈØÎÖÔÔÔÌÚÈÜÄÞÃÞÇÞËØÓÖÕÔ×ÌÝÊÝÂÝÁÛÉÙËÕÓÑÕÍ×ÇÝÃÝ;PM1PE;PM2FPPE=<gbÀEø;PM0PEÄÝÈÛÎÙÒÓÖÓÚÍÜÇÞÃÞÄÞÈØÎÖÔÔÔÌÚÈÜÄÞÃÞÇÞËØÓÖÕÔ×ÌÝÊÝÂÝÁÛÉÙËÕÓÑÕÍ×ÇÝÃÝ;PM1PEÄ¿ÂÛÊÛÎ×ÒÕÔÑÚÍÜÉÜÁÞÂÚÊÚÎÖÒÒÖÌØÊÜÂÜÁÞÉÜËØÑÖÕÒÙÎÙÈÝÄÛÃÛÇÙÍÓÑÑÕÍ×ÉÛÁÝ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<cbÀEø;PM0PEÂÛÊÛÎ×ÒÕÔÑÚÍÜÉÜÁÞÂÚÊÚÎÖÒÒÖÌØÊÜÂÜÁÞÉÜËØÑÖÕÒÙÎÙÈÝÄÛÃÛÇÙÍÓÑÑÕÍ×ÉÛÁÝ;PM1PEÄ¿ÄÛÈÙÌ×ÒÓÖÑØÍÚÇÜÁÞÂÚÈØÎÔÒÒÔÎØÈÚÂÜÁÞÇÚÍØÑÔÓÒ×ÎÙÈÝÂÛÁÙÇ×ÍÕÑÑÓË×ÇÙÃÝ;PM1PE;PM2FPPE=<_bÀEø;PM0PEÄÛÈÙÌ×ÒÓÖÑØÍÚÇÜÁÞÂÚÈØÎÔÒÒÔÎØÈÚÂÜÁÞÇÚÍØÑÔÓÒ×ÎÙÈÝÂÛÁÙÇ×ÍÕÑÑÓË×ÇÙÃÝ;PM1PEÆ¿ÂÙÈÙÎÕÐÕÔÏØÍØÇÜÁÜÂÚÈÖÎÔÐÒÖÌÖÈÚÄÚÃÜÇÚËÖÑÔÓÒÕÌÙÊÛÂÛÁ×É×ËÓÑÏÓÍÕÇÙÁÛ;PM1PE;PM2FPPE=<YbÀEø;PM0PEÂÙÈÙÎÕÐÕÔÏØÍØÇÜÁÜÂÚÈÖÎÔÐÒÖÌÖÈÚÄÚÃÜÇÚËÖÑÔÓÒÕÌÙÊÛÂÛÁ×É×ËÓÑÏÓÍÕÇÙÁÛ;PM1PEÄ¿ÂÙÈ×Ì×ÐÑÔÑÖËÚÇÚÁÚÂÚÈÖÌÔÒÐÒÌØÊØÂÚÁÜÉØËØÏÒÓÒÕÌÙÈÙÂÙÁÙÇÕËÓÑÏÑË×Ç×ÁÛ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<UbÀEø;PM0PEÂÙÈ×Ì×ÐÑÔÑÖËÚÇÚÁÚÂÚÈÖÌÔÒÐÒÌØÊØÂÚÁÜÉØËØÏÒÓÒÕÌÙÈÙÂÙÁÙÇÕËÓÑÏÑË×Ç×ÁÛ;PM1PEÄ¿ÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁÚÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁÜÅØËÔÏÔÓÐÕÌ×ÆÙÄÙÃ×ÅÕËÑÏÏÓËÓÇ×ÁÛ;PM1PE;PM2FPPE=<QbÀEø;PM0PEÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁÚÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁÜÅØËÔÏÔÓÐÕÌ×ÆÙÄÙÃ×ÅÕËÑÏÏÓËÓÇ×ÁÛ;PM1PEÄ¿Ä×Æ×ÌÓÎÑÔÏÔËØÅØÁÚÂÖÆÔÌÒÐÐÒÌÔÈØÂØÁÚÇÖËÖÏÒÑÎÓÌÕÈÙÂ×Á×ÇÓËÓÍÍÑËÕÅÕÃÙ;PM1PE;PM2FPPE=<MbÀEø;PM0PEÄ×Æ×ÌÓÎÑÔÏÔËØÅØÁÚÂÖÆÔÌÒÐÐÒÌÔÈØÂØÁÚÇÖËÖÏÒÑÎÓÌÕÈÙÂ×Á×ÇÓËÓÍÍÑËÕÅÕÃÙ;PM1PEÄ¿Â×ÈÕÊÓÐÑÒÍÔËÖÅØÃØÄØÆÔÌÒÎÎÒÊÔÈÖÂØÁØÇØÉÔÍÒÑÎÓÌ×Æ×Â×ÁÕÅÓËÑÍÏÑÉÓÇ×Á×;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<IbÀEø;PM0PEÂ×ÈÕÊÓÐÑÒÍÔËÖÅØÃØÄØÆÔÌÒÎÎÒÊÔÈÖÂØÁØÇØÉÔÍÒÑÎÓÌ×Æ×Â×ÁÕÅÓËÑÍÏÑÉÓÇ×Á×;PM1PEÆ¿ÂÕÆÕÊÓÎÏÒÏÔÇÖÇÖÁØÂÔÈÖÈÐÐÎÐÊÔÈÖÂÖÁØÇÖÉÔÍÐÏÎÕÊÓÈ×ÂÕÁÕÇÓÉÑÍÍÏÉÓÅÕÁ×;PM1PE;PM2FPPE=<CbÀEø;PM0PEÂÕÆÕÊÓÎÏÒÏÔÇÖÇÖÁØÂÔÈÖÈÐÐÎÐÊÔÈÖÂÖÁØÇÖÉÔÍÐÏÎÕÊÓÈ×ÂÕÁÕÇÓÉÑÍÍÏÉÓÅÕÁ×;PM1PEÄ¿ÂÓÆÕÌÑÌÑÒËÒËÔÅÖÁÖÂÔÆÔÌÐÌÎÒÊÒÆÖÂÔÁÖÅÔÉÔÍÐÏÎÓÊÓÆÕÄÕÃÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PE;PM2FPPE=<?bÀEø;PM0PEÂÓÆÕÌÑÌÑÒËÒËÔÅÖÁÖÂÔÆÔÌÐÌÎÒÊÒÆÖÂÔÁÖÅÔÉÔÍÐÏÎÓÊÓÆÕÄÕÃÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PEÄ¿ÂÓÆÕÊÑÌÍÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÎÎÈÒÆÖÄÔÃÖÅÔÇÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍËÏÉÑÅÓÁÕ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<{aÀEø;PM0PEÂÓÆÕÊÑÌÍÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÎÎÈÒÆÖÄÔÃÖÅÔÇÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍËÏÉÑÅÓÁÕ;PM1PEÄ¿ÂÓÆÑÊÑÌÏÐËÐÇÔÅÔÃÔÄÔÆÐÈÐÌÌÐÊÒÆÒÂÔÁÖÅÒÉÒËÎÏÌÏÊÓÆÓÂÓÁÓÅÏÉÏËËÍÉÑÅÑÁÕ;PM1PE;PM2FPPE=<waÀEø;PM0PEÂÓÆÑÊÑÌÏÐËÐÇÔÅÔÃÔÄÔÆÐÈÐÌÌÐÊÒÆÒÂÔÁÖÅÒÉÒËÎÏÌÏÊÓÆÓÂÓÁÓÅÏÉÏËËÍÉÑÅÑÁÕ;PM1PEÆ¿ÂÑÄÑÊÑÌÍÎËÒÉÒÃÒÁÔÂÒÄÐÊÎÌÌÎÊÒÆÒÂÒÁÔÅÒÉÐËÐÍÌÏÈÑÆÓÂÑÁÑÅÑÇÍËËÏÉÏÃÑÁÓ;PM1PE;PM2FPPE=<qaÀEø;PM0PEÂÑÄÑÊÑÌÍÎËÒÉÒÃÒÁÔÂÒÄÐÊÎÌÌÎÊÒÆÒÂÒÁÔÅÒÉÐËÐÍÌÏÈÑÆÓÂÑÁÑÅÑÇÍËËÏÉÏÃÑÁÓ;PM1PE¿ÄÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÔÂÐÄÒÈÌÌÌÎÈÐÆÒÂÒÁÔÅÐÇÒËÌËÌÑÊÏÄÓÂÑÁÑÃÏÉÍËËËÇÑÃÏÃÓ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<oaÀEø;PM0PEÄÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÔÂÐÄÒÈÌÌÌÎÈÐÆÒÂÒÁÔÅÐÇÒËÌËÌÑÊÏÄÓÂÑÁÑÃÏÉÍËËËÇÑÃÏÃÓ;PM1PEÆ¿ÂÑÄÍÊÏÊÍÎÉÎÇÐÅÒÁÒÂÐÆÐÈÌÊÌÎÈÐÄÎÄÒÃÒÃÐÇÐËÎËÊÏÈÏÆÑÂÑÁÏÅÍÇÍÉÉÍÉÏÃÏÁÑ;PM1PE;PM2FPPE=<iaÀEø;PM0PEÂÑÄÍÊÏÊÍÎÉÎÇÐÅÒÁÒÂÐÆÐÈÌÊÌÎÈÐÄÎÄÒÃÒÃÐÇÐËÎËÊÏÈÏÆÑÂÑÁÏÅÍÇÍÉÉÍÉÏÃÏÁÑ;PM1PEÄ¿ÂÏÆÏÆÍÌËÌÉÎÇÐÅÐÁÒÂÎÆÐÈÌÊÊÌÈÎÆппÒÅÐÇÎÉÌËÊÏÈÍÆÑ¿Ï¿ÏÅÍÇËÉËËÅÍÅÏÁÑ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<eaÀEø;PM0PEÂÏÆÏÆÍÌËÌÉÎÇÐÅÐÁÒÂÎÆÐÈÌÊÊÌÈÎÆппÒÅÐÇÎÉÌËÊÏÈÍÆÑ¿Ï¿ÏÅÍÇËÉËËÅÍÅÏÁÑ;PM1PEÄ¿ÂÏÄÍÈÍÊËÌÉÎÇÎÃÐÁÒÂÎÄÌÈÌÊÌÌÆÎÆοпÒÅÎÅÎËÌËÊËÈÍÄÑÂÏÁÍÃÍÇËÉÉËÇÍÃÍÁÑ;PM1PE;PM2FPPE=<aaÀEø;PM0PEÂÏÄÍÈÍÊËÌÉÎÇÎÃÐÁÒÂÎÄÌÈÌÊÌÌÆÎÆοпÒÅÎÅÎËÌËÊËÈÍÄÑÂÏÁÍÃÍÇËÉÉËÇÍÃÍÁÑ;PM1PEÄ¿ÂÍÄÍÈÍÊÉÊÉÎÅÎÅοοÐÆÌÆÌÊÈÊÈÎÄÎÂÎÁÐÃÎÇÌÇÌËÊËÆÏÆÍ¿Í¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PE;PM2FPPE=<]aÀEø;PM0PEÂÍÄÍÈÍÊÉÊÉÎÅÎÅοοÐÆÌÆÌÊÈÊÈÎÄÎÂÎÁÐÃÎÇÌÇÌËÊËÆÏÆÍ¿Í¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PEÆ¿¿ÍÆËÆËÈËÊÇÌÅÎÃÎÁÎÂÎÄÌÆÊÈÊÌÆÌÄÌÂÎÁÐÃÌÅÌÉÊÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÇÉÅËÅË¿Ï;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<WaÀEø;PM0PE¿ÍÆËÆËÈËÊÇÌÅÎÃÎÁÎÂÎÄÌÆÊÈÊÌÆÌÄÌÂÎÁÐÃÌÅÌÉÊÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÇÉÅËÅË¿Ï;PM1PEÄ¿¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PE;PM2FPPE=<SaÀEø;PM0PE¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PEÄ¿ÂËÂËÆÉÈÉÊÅÊÅÌÃÌÁÌÂÌÄÌÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÌÇÈÇÈËÆËÄËÂËÁËÃÉÅÉÇÇÇÅËÁËÁË;PM1PE;PM2FPPE=<OaÀEø;PM0PEÂËÂËÆÉÈÉÊÅÊÅÌÃÌÁÌÂÌÄÌÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÌÇÈÇÈËÆËÄËÂËÁËÃÉÅÉÇÇÇÅËÁËÁË;PM1PEÄ¿ÆÓÌÓÒËÖÃÖÄÔÌÌÔÄÔÃÖËÔÓÌÕÄÕÃÑËËÓÅÕ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<KaÀEø;PM0PEÆÓÌÓÒËÖÃÖÄÔÌÌÔÄÔÃÖËÔÓÌÕÄÕÃÑËËÓÅÕ;PM1PEÄ¿ÆÓÊÑÒÉÔÅÔÆÒÊÌÒÄÔÃÖËÐÑÌÓÄÓÃÑËÉÏÅÕ;PM1PE;PM2FPPE=<GaÀEø;PM0PEÆÓÊÑÒÉÔÅÔÆÒÊÌÒÄÔÃÖËÐÑÌÓÄÓÃÑËÉÏÅÕ;PM1PEÆ¿ÂÑÌÏÐÉÒÃÔÄÐÊÊÐÄÒÃÔÉÐÏÊÓÄÑÃÏÉËÏÁÓ;PM1PE;PM2FPPE=<AaÀEø;PM0PEÂÑÌÏÐÉÒÃÔÄÐÊÊÐÄÒÃÔÉÐÏÊÓÄÑÃÏÉËÏÁÓ;PM1PEÄ¿ÄÏÊÍÎÉÐÃÒÄÎÊÊÎÂÐÁÒÉÎÍÊÑÄÏÃÍÉÉÍÃÑ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<}`ÀEø;PM0PEÄÏÊÍÎÉÐÃÒÄÎÊÊÎÂÐÁÒÉÎÍÊÑÄÏÃÍÉÉÍÃÑ;PM1PEÄ¿ÄÍÈÍÌÇÐÃÐÄÎÈÈÎÄÎÃÐÇÎÍÈÏÄÏÃËÇÇÍÃÏ;PM1PE;PM2FPPE=<y`ÀEø;PM0PEÄÍÈÍÌÇÐÃÐÄÎÈÈÎÄÎÃÐÇÎÍÈÏÄÏÃËÇÇÍÃÏ;PM1PEÄ¿ÂËÊËÌÇÌÃÎÄÌÈÈÌÂÌÁÎÇÌËÈÍÂËÁËÇÉËÁÍ;PM1PE;PM2FPPE=<u`ÀEø;PM0PEÂËÊËÌÇÌÃÎÄÌÈÈÌÂÌÁÎÇÌËÈÍÂËÁËÇÉËÁÍ;PM1PEÆ¿ÂËÆÇÊÇÌÁÌÂÊÈÈÈÂÌÁÌÇÊÉÈËÂËÁÉÇÅÉÁË;PM1PE;PM2RF5,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<o`ÀEø;PM0PEÂËÆÇÊÇÌÁÌÂÊÈÈÈÂÌÁÌÇÊÉÈËÂËÁÉÇÅÉÁË;PM1PE¿ÄÉÆÇÈÅÊÁÌÂÈÆÆÈÂÊÁÌÅÈÇÆËÂÉÁÇÅÅÇÃË;PM1PE;PM2FPPE=<m`ÀEø;PM0PEÄÉÆÇÈÅÊÁÌÂÈÆÆÈÂÊÁÌÅÈÇÆËÂÉÁÇÅÅÇÃË;PM1PEÆ¿ÂÇÄÅÈÅÈÁÈÂÈÆÄÆÄÈÃÊÃÆÇÆÇÂÇÁÇÅÃÅÁÉ;PM1PE;PM2FPPE=<g`ÀEø;PM0PEÂÇÄÅÈÅÈÁÈÂÈÆÄÆÄÈÃÊÃÆÇÆÇÂÇÁÇÅÃÅÁÉ;PM1PEÄ¿ÂÅÄÅÆÃÆÁÈÂÄÄÆÆ¿Æ¿ÈÅÄÃÆÇ¿Å¿ÅÅÃÃÁÇ;PM1PE;PM2RF6,8,8,0,0,0,0,0,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;FT11,6FPPE=<c`ÀEø;PM0PEÂÅÄÅÆÃÆÁÈÂÄÄÆÆ¿Æ¿ÈÅÄÃÆÇ¿Å¿ÅÅÃÃÁÇ;PM1PEÄ¿ÂÃÂÃÆÃÄÁÆÂÄÄÄÄ¿Ä¿ÆÃÄÃÄÅÂÃÁÅÃÁÃÁÅ;PM1PE;PM2FPPE=<_`ÀEø;PM0PEÂÃÂÃÆÃÄÁÆÂÄÄÄÄ¿Ä¿ÆÃÄÃÄÅÂÃÁÅÃÁÃÁÅ;PM1PEÄ¿ÂÁÂÃÂÁÄ¿Ä¿ÂÂÂÄÂÂÁÄÁÂÁÄÿÿÁÃÁÁÁÃ;PM1PE;PM2FPPE=<[`ÀEø;PM0PEÂÁÂÃÂÁÄ¿Ä¿ÂÂÂÄÂÂÁÄÁÂÁÄÿÿÁÃÁÁÁÃ;PM1PEÆ¿¿ÁÄÁ¿Â¿ÂÁÂÁÂÁ¿ÃÁ¿Á¿Á;PM1PE;PM2FT10,0FPPE=<U`ÀEø;PM0PE¿ÁÄÁ¿Â¿ÂÁÂÁÂÁ¿ÃÁ¿Á¿Á;PM2FPMC1,240PE=<s\ÀUø;PM0PEÕÛÑÕÏÓÏÍËÉÍÇÍÃÍ¿ÏÄÓÆÕÊÙÌÝÐáÐéÔíÖÕÖÑÒËÒËÐÅÐÃÐÃÐÁпÌÄÊÂÆÆÈÊÄÐÆÖÄÜÆÒÅÒÇÒÇÖÇÖÉØËØÉØËØÍØËÚÍØÏÖÍÖÏÖÑÔÏ;PM2FTFPMC1,90PE=<kdÀEø;PM0PEÆ÷ÒóØïäéêãð×ôÑøÅøÆöÒðØêäâêÚðÐôÆøÅúÏôÙðáêéâïÚõÐ÷Æ÷ÅóÏïÙéáãé×ïÑóÅù;PM1PEÄ¿Æ÷ÐóÚïâçèáðÙôÏøÅøÆôÐðÚêâàèÜðÎôÆøÅúÍòÛðßêéâïÚóÐ÷Æ÷ÅóÏïÙçááéÙïÏñÅù;PM1PE;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<gdÀEø;PM0PEÆ÷ÐóÚïâçèáðÙôÏøÅøÆôÐðÚêâàèÜðÎôÆøÅúÍòÛðßêéâïÚóÐ÷Æ÷ÅóÏïÙçááéÙïÏñÅù;PM1PEÄ¿ÆõÐñÚïâçèáîÙôÍöÅøÆòÎîÚêââèØðÐòÆöÅøÏò×ðáèéâíØñÐ÷ÆõÅóÏí×çááçÙïÏñÅ÷;PM1PE;PM2FPPE=<cdÀEø;PM0PEÆõÐñÚïâçèáîÙôÍöÅøÆòÎîÚêââèØðÐòÆöÅøÏò×ðáèéâíØñÐ÷ÆõÅóÏí×çááçÙïÏñÅ÷;PM1PEÆ¿ÆõÐñØíàåèáî×òÏöÅöÆòÐîØèââæØîÐòÆöÅöÏô×ìáèçâíØñÐõÆõÅñÏí×çáßç×ëÏóÅõ;PM1PE;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<]dÀEø;PM0PEÆõÐñØíàåèáî×òÏöÅöÆòÐîØèââæØîÐòÆöÅöÏô×ìáèçâíØñÐõÆõÅñÏí×çáßç×ëÏóÅõ;PM1PEÄ¿ÄõÐïØíâåæßîÙðÏöÃöÄòÐîÚæààæÚîÎðÆöÅöÍòÙîßæåàíÚñÐõÄõÃïÏíÙåßáå×íÏñÃõ;PM1PE;PM2FPPE=<YdÀEø;PM0PEÄõÐïØíâåæßîÙðÏöÃöÄòÐîÚæààæÚîÎðÆöÅöÍòÙîßæåàíÚñÐõÄõÃïÏíÙåßáå×íÏñÃõ;PM1PEÄ¿ÄñÐñØëàåèáì×ðÍôÅôÆòÎìØæâàæØìÐòÄòÃôÏò×ìßæåàëØñÐóÆóÅïÏë×çßßå×ëÏñÃó;PM1PE;PM2FPPE=<UdÀEø;PM0PEÄñÐñØëàåèáì×ðÍôÅôÆòÎìØæâàæØìÐòÄòÃôÏò×ìßæåàëØñÐóÆóÅïÏë×çßßå×ëÏñÃó;PM1PEÄ¿ÆñÐïØëÞåæÝê×ðÏôÃôÄðÐìØäÞàæØìÐðÄòÃôÏð×ìßäãàëØïÐóÄóÃïÏé×åßÝã×ëÏïÅó;PM1PE;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<QdÀEø;PM0PEÆñÐïØëÞåæÝê×ðÏôÃôÄðÐìØäÞàæØìÐðÄòÃôÏð×ìßäãàëØïÐóÄóÃïÏé×åßÝã×ëÏïÅó;PM1PEÄ¿ÆñÎíØëÞãæßìÕîÏòÅòÆðÐêÖæààäÖìÐîÄòÃôÏîÕìßäåàéÖïÐñÄñÃíÏëÕåßÝã×ëÍíÅó;PM1PE;PM2FPPE=<MdÀEø;PM0PEÆñÎíØëÞãæßìÕîÏòÅòÆðÐêÖæààäÖìÐîÄòÃôÏîÕìßäåàéÖïÐñÄñÃíÏëÕåßÝã×ëÍíÅó;PM1PEÆ¿ÄïÎïØéÞãäÝê×ðÍðÃòÄîÎêØäÞàäÖêÎðÆðÅòÍîÕêßäãàéÖíÐñÄïÃïÏéÕãßÝã×éÍíÃñ;PM1PE;PM2FPPE=<GdÀEø;PM0PEÄïÎïØéÞãäÝê×ðÍðÃòÄîÎêØäÞàäÖêÎðÆðÅòÍîÕêßäãàéÖíÐñÄïÃïÏéÕãßÝã×éÍíÃñ;PM1PEÄ¿ÄïÐëÖéÜãäÝêÕîÍðÅòÆìÎêÖäÞÜäØêÎìÄðÃòÍì×êÛäãÞéÖëÎñÆïÅíÍéÕãÝÛãÕéÏëÃñ;PM1PE;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<CdÀEø;PM0PEÄïÐëÖéÜãäÝêÕîÍðÅòÆìÎêÖäÞÜäØêÎìÄðÃòÍì×êÛäãÞéÖëÎñÆïÅíÍéÕãÝÛãÕéÏëÃñ;PM1PEÄ¿ÄïÎëÖçÞãäÝèÓìÏðÃðÄìÐêÔâÞÞäÖèÎìÆðÅðÍîÕèÝâáÞéÖëÎïÆïÅëÍçÕãÝÝáÕçÍíÃï;PM1PE;PM2FPPE=<?dÀEø;PM0PEÄïÎëÖçÞãäÝèÓìÏðÃðÄìÐêÔâÞÞäÖèÎìÆðÅðÍîÕèÝâáÞéÖëÎïÆïÅëÍçÕãÝÝáÕçÍíÃï;PM1PEÄ¿ÆíÌëÖçÜáäÝèÕìËîÅðÆìÌèÖâÞÜâÖèÎìÄîÃðÍìÕèÛâáÞçÔëÎïÄíÃëÍçÓãÝÛáÕçËëÅï;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<{cÀEø;PM0PEÆíÌëÖçÜáäÝèÕìËîÅðÆìÌèÖâÞÜâÖèÎìÄîÃðÍìÕèÛâáÞçÔëÎïÄíÃëÍçÓãÝÛáÕçËëÅï;PM1PEÆ¿ÄëÎëÔçÜáâÙèÕêÍîÃîÄìÎæÖâÚÜâÖèÌìÆìÅîËìÕèÛàáÜåÖëÎíÄíÃéÍçÕáÛÛßÓçÍëÃí;PM1PE;PM2FPPE=<ucÀEø;PM0PEÄëÎëÔçÜáâÙèÕêÍîÃîÄìÎæÖâÚÜâÖèÌìÆìÅîËìÕèÛàáÜåÖëÎíÄíÃéÍçÕáÛÛßÓçÍëÃí;PM1PE¿ÆëÌéÖçÚßâÛæÓêÍîÃîÄêÎæÔâÜÜàÔèÎêÄìÃîÍêÓæÛâáÜåÔéÎíÄíÃéÍåÓáÛÙáÕåËéÅí;PM1PE;PM2FPPE=<scÀEø;PM0PEÆëÌéÖçÚßâÛæÓêÍîÃîÄêÎæÔâÜÜàÔèÎêÄìÃîÍêÓæÛâáÜåÔéÎíÄíÃéÍåÓáÛÙáÕåËéÅí;PM1PEÆ¿ÄëÎçÔåÚáàÙèÓèÍìÃìÄêÎæÔàÚÚâÖæÌèÆìÅîËèÕæÙàßÜåÔéÌëÆëÅçËçÓßÛÙßÓåÍçÃí;PM1PE;PM2FPPE=<mcÀEø;PM0PEÄëÎçÔåÚáàÙèÓèÍìÃìÄêÎæÔàÚÚâÖæÌèÆìÅîËèÕæÙàßÜåÔéÌëÆëÅçËçÓßÛÙßÓåÍçÃí;PM1PEÄ¿ÆéÌéÔãÚßàÙäÓêËêÅìÆèÌäÔàÚÜàÔäÌêÄêÃìËèÓäÛâßÚãÔçÌëÄéÃéËãÓßÙÙáÓãËçÅë;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<icÀEø;PM0PEÆéÌéÔãÚßàÙäÓêËêÅìÆèÌäÔàÚÜàÔäÌêÄêÃìËèÓäÛâßÚãÔçÌëÄéÃéËãÓßÙÙáÓãËçÅë;PM1PEÄ¿ÄéÌçÔãÚßàÙäÑèËêÅêÆêÌäÒÞÚÚàÔäÌèÄêÃêËêÓäÙÞÝÜãÒéÌéÆéÅçËãÑßÛÙÝÓãËéÃé;PM1PE;PM2FPPE=<ecÀEø;PM0PEÄéÌçÔãÚßàÙäÑèËêÅêÆêÌäÒÞÚÚàÔäÌèÄêÃêËêÓäÙÞÝÜãÒéÌéÆéÅçËãÑßÛÙÝÓãËéÃé;PM1PEÄ¿ÆéÌåÒáÚßà×âÓæËêÃêÄæÌäÔÞØÚàÔâÌæÄêÃêËèÓâÙàÝØãÔåÌéÄéÃåËáÓß×ÙßÑáËçÅé;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<acÀEø;PM0PEÆéÌåÒáÚßà×âÓæËêÃêÄæÌäÔÞØÚàÔâÌæÄêÃêËèÓâÙàÝØãÔåÌéÄéÃåËáÓß×ÙßÑáËçÅé;PM1PEÆ¿ÄçÌåÒáÚÝÞÙâÑæËèÃêÄæÌâÒÞÚØÞÔâÌæÄèÃêËæÓâ×ÞÝØáÔåÌéÄçÃåËáÓÝ×ÙÝÑáËåÃé;PM1PE;PM2FPPE=<[cÀEø;PM0PEÄçÌåÒáÚÝÞÙâÑæËèÃêÄæÌâÒÞÚØÞÔâÌæÄèÃêËæÓâ×ÞÝØáÔåÌéÄçÃåËáÓÝ×ÙÝÑáËåÃé;PM1PEÄ¿ÂåÌåÔáØÝÜ×äÑäËèÃèÄæÌâÒÜØØÞÔâÌæÄæÃèËæÓâ×ÞÛØáÒåÌçÄçÃãËãÑÛ××ÝÓáËåÁç;PM1PE;PM2FPPE=<WcÀEø;PM0PEÂåÌåÔáØÝÜ×äÑäËèÃèÄæÌâÒÜØØÞÔâÌæÄæÃèËæÓâ×ÞÛØáÒåÌçÄçÃãËãÑÛ××ÝÓáËåÁç;PM1PEÄ¿ÄåÌãÒáØÛÜ×àÑäËèÃèÄäÌàÒÞØØÜÒâÌäÂæÁèËäÑà×ÞÝØßÒãÌçÄçÃãËßÑÛ××ÝÑßËãÃç;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<ScÀEø;PM0PEÄåÌãÒáØÛÜ×àÑäËèÃèÄäÌàÒÞØØÜÒâÌäÂæÁèËäÑà×ÞÝØßÒãÌçÄçÃãËßÑÛ××ÝÑßËãÃç;PM1PEÄ¿ÄåÌáÒßÖÝÜÕâÑâËæÁæÂäÌàÒÜÖØÞÒàÊâÄæÃèÉâÑà×ÞÛÖßÒãÊåÄåÃáÉáÑÛÕÕÝÑßËáÃç;PM1PE;PM2FPPE=<OcÀEø;PM0PEÄåÌáÒßÖÝÜÕâÑâËæÁæÂäÌàÒÜÖØÞÒàÊâÄæÃèÉâÑà×ÞÛÖßÒãÊåÄåÃáÉáÑÛÕÕÝÑßËáÃç;PM1PEÄ¿ÄãÊãÒÝØÛÜÕÞÑäËäÃæÄâÌàÒÜÖÖÜÒÞÊäÄäÃæÉâÑàÕÜÛÖßÒáÌåÂãÁãËÝÑÛÕ×ÛÑßÉáÃå;PM1PE;PM2FPPE=<KcÀEø;PM0PEÄãÊãÒÝØÛÜÕÞÑäËäÃæÄâÌàÒÜÖÖÜÒÞÊäÄäÃæÉâÑàÕÜÛÖßÒáÌåÂãÁãËÝÑÛÕ×ÛÑßÉáÃå;PM1PEÆ¿ÂãÌáÐÝÖÛÜÕÞÏâÉäÃäÄäÊÞÐÚÖÖÜÒÞÊâÄäÃäÉäÑÞÕÜÙÔÝÒãÊãÄãÃáÉÝÑÛÓÕÛÏÝËãÁã;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<EcÀEø;PM0PEÂãÌáÐÝÖÛÜÕÞÏâÉäÃäÄäÊÞÐÚÖÖÜÒÞÊâÄäÃäÉäÑÞÕÜÙÔÝÒãÊãÄãÃáÉÝÑÛÓÕÛÏÝËãÁã;PM1PEÄ¿ÄãÊßÐÝÖÙÚÕÞÏàÉäÃäÄàÊÞÐÜÖÔÚÐÞÌàÂäÁäËâÏÞÓÚÛÖÝÎßÌãÄãÃßËÝÍÙÕÕÙÏÝÉáÃã;PM1PE;PM2FPPE=<AcÀEø;PM0PEÄãÊßÐÝÖÙÚÕÞÏàÉäÃäÄàÊÞÐÜÖÔÚÐÞÌàÂäÁäËâÏÞÓÚÛÖÝÎßÌãÄãÃßËÝÍÙÕÕÙÏÝÉáÃã;PM1PEÄ¿ÄáÈßÒÝÔÙÚÓÞÏàÉâÃäÄàÊÜÐÚÔÖÚÐÞÊàÄâÃäÉàÏÜÕÜÙÔÛÐßÊãÄáÃßÉÝÏÙÓÓÛÑÛÇßÃã;PM1PE;PM2FPPE=<}bÀEø;PM0PEÄáÈßÒÝÔÙÚÓÞÏàÉâÃäÄàÊÜÐÚÔÖÚÐÞÊàÄâÃäÉàÏÜÕÜÙÔÛÐßÊãÄáÃßÉÝÏÙÓÓÛÑÛÇßÃã;PM1PEÄ¿ÄßÊßÐÛÔÙØÓÞÏÞÉâÃâÄàÊÜÐÚÔÔÚÐÜÈàÄàÃâÇàÏÜÓÚÙÔÛÐßÊáÂáÁÝÉÝÏ×ÓÓÙÏÛÉßÃá;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<ybÀEø;PM0PEÄßÊßÐÛÔÙØÓÞÏÞÉâÃâÄàÊÜÐÚÔÔÚÐÜÈàÄàÃâÇàÏÜÓÚÙÔÛÐßÊáÂáÁÝÉÝÏ×ÓÓÙÏÛÉßÃá;PM1PEÆ¿ÂßÊÝÎÛÖ×ØÓÚÏàÇàÃàÄàÈÜÐØÔÔØÎÜÊÞÄàÃâÉÞÍÜÓØ×ÔÛÎßÊßÄßÃßÉÙÍ×ÓÕ×ÍÛÉÝÁá;PM1PE;PM2FPPE=<sbÀEø;PM0PEÂßÊÝÎÛÖ×ØÓÚÏàÇàÃàÄàÈÜÐØÔÔØÎÜÊÞÄàÃâÉÞÍÜÓØ×ÔÛÎßÊßÄßÃßÉÙÍ×ÓÕ×ÍÛÉÝÁá;PM1PE¿ÄßÊÝÎÙÔ×ØÓÚÍÞÉàÁàÂÞÊÜÎØÔÒØÎÚÊÞÄàÃâÉÞÍÚÑØ×ÒÛÐÝÈßÄßÃÝÇÙÏ×ÑÓ×ÍÙÉÝÃá;PM1PE;PM2FPPE=<qbÀEø;PM0PEÄßÊÝÎÙÔ×ØÓÚÍÞÉàÁàÂÞÊÜÎØÔÒØÎÚÊÞÄàÃâÉÞÍÚÑØ×ÒÛÐÝÈßÄßÃÝÇÙÏ×ÑÓ×ÍÙÉÝÃá;PM1PEÆ¿ÄÝÈÝÎÙÔÕÖÓÚÍÞÇÞÃàÄÜÈÚÎØÔÒÖÐÚÈÞÄÞÃàÇÜÏÜÑÖ×ÔÙÎÛÈßÄÝÃÝÇÙÍÕÓÓÕÍÛÇÛÃß;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<kbÀEø;PM0PEÄÝÈÝÎÙÔÕÖÓÚÍÞÇÞÃàÄÜÈÚÎØÔÒÖÐÚÈÞÄÞÃàÇÜÏÜÑÖ×ÔÙÎÛÈßÄÝÃÝÇÙÍÕÓÓÕÍÛÇÛÃß;PM1PEÄ¿ÄÝÈÛÎÙÒÓÖÓÚÍÜÇÞÃÞÄÞÈØÎÖÔÔÔÌÚÈÜÄÞÃÞÇÞËØÓÖÕÔ×ÌÝÊÝÂÝÁÛÉÙËÕÓÑÕÍ×ÇÝÃÝ;PM1PE;PM2FPPE=<gbÀEø;PM0PEÄÝÈÛÎÙÒÓÖÓÚÍÜÇÞÃÞÄÞÈØÎÖÔÔÔÌÚÈÜÄÞÃÞÇÞËØÓÖÕÔ×ÌÝÊÝÂÝÁÛÉÙËÕÓÑÕÍ×ÇÝÃÝ;PM1PEÄ¿ÂÛÊÛÎ×ÒÕÔÑÚÍÜÉÜÁÞÂÚÊÚÎÖÒÒÖÌØÊÜÂÜÁÞÉÜËØÑÖÕÒÙÎÙÈÝÄÛÃÛÇÙÍÓÑÑÕÍ×ÉÛÁÝ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,2FPPE=<cbÀEø;PM0PEÂÛÊÛÎ×ÒÕÔÑÚÍÜÉÜÁÞÂÚÊÚÎÖÒÒÖÌØÊÜÂÜÁÞÉÜËØÑÖÕÒÙÎÙÈÝÄÛÃÛÇÙÍÓÑÑÕÍ×ÉÛÁÝ;PM1PEÄ¿ÄÛÈÙÌ×ÒÓÖÑØÍÚÇÜÁÞÂÚÈØÎÔÒÒÔÎØÈÚÂÜÁÞÇÚÍØÑÔÓÒ×ÎÙÈÝÂÛÁÙÇ×ÍÕÑÑÓË×ÇÙÃÝ;PM1PE;PM2FPPE=<_bÀEø;PM0PEÄÛÈÙÌ×ÒÓÖÑØÍÚÇÜÁÞÂÚÈØÎÔÒÒÔÎØÈÚÂÜÁÞÇÚÍØÑÔÓÒ×ÎÙÈÝÂÛÁÙÇ×ÍÕÑÑÓË×ÇÙÃÝ;PM1PEÆ¿ÂÙÈÙÎÕÐÕÔÏØÍØÇÜÁÜÂÚÈÖÎÔÐÒÖÌÖÈÚÄÚÃÜÇÚËÖÑÔÓÒÕÌÙÊÛÂÛÁ×É×ËÓÑÏÓÍÕÇÙÁÛ;PM1PE;PM2FPPE=<YbÀEø;PM0PEÂÙÈÙÎÕÐÕÔÏØÍØÇÜÁÜÂÚÈÖÎÔÐÒÖÌÖÈÚÄÚÃÜÇÚËÖÑÔÓÒÕÌÙÊÛÂÛÁ×É×ËÓÑÏÓÍÕÇÙÁÛ;PM1PEÄ¿ÂÙÈ×Ì×ÐÑÔÑÖËÚÇÚÁÚÂÚÈÖÌÔÒÐÒÌØÊØÂÚÁÜÉØËØÏÒÓÒÕÌÙÈÙÂÙÁÙÇÕËÓÑÏÑË×Ç×ÁÛ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,3FPPE=<UbÀEø;PM0PEÂÙÈ×Ì×ÐÑÔÑÖËÚÇÚÁÚÂÚÈÖÌÔÒÐÒÌØÊØÂÚÁÜÉØËØÏÒÓÒÕÌÙÈÙÂÙÁÙÇÕËÓÑÏÑË×Ç×ÁÛ;PM1PEÄ¿ÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁÚÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁÜÅØËÔÏÔÓÐÕÌ×ÆÙÄÙÃ×ÅÕËÑÏÏÓËÓÇ×ÁÛ;PM1PE;PM2FPPE=<QbÀEø;PM0PEÂÙÈ×ÌÕÐÑÒÏÖËØÇÚÁÚÂØÈÖÌÔÐÐÒÌÖÆØÂÚÁÜÅØËÔÏÔÓÐÕÌ×ÆÙÄÙÃ×ÅÕËÑÏÏÓËÓÇ×ÁÛ;PM1PEÄ¿Ä×Æ×ÌÓÎÑÔÏÔËØÅØÁÚÂÖÆÔÌÒÐÐÒÌÔÈØÂØÁÚÇÖËÖÏÒÑÎÓÌÕÈÙÂ×Á×ÇÓËÓÍÍÑËÕÅÕÃÙ;PM1PE;PM2FPPE=<MbÀEø;PM0PEÄ×Æ×ÌÓÎÑÔÏÔËØÅØÁÚÂÖÆÔÌÒÐÐÒÌÔÈØÂØÁÚÇÖËÖÏÒÑÎÓÌÕÈÙÂ×Á×ÇÓËÓÍÍÑËÕÅÕÃÙ;PM1PEÄ¿Â×ÈÕÊÓÐÑÒÍÔËÖÅØÃØÄØÆÔÌÒÎÎÒÊÔÈÖÂØÁØÇØÉÔÍÒÑÎÓÌ×Æ×Â×ÁÕÅÓËÑÍÏÑÉÓÇ×Á×;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<IbÀEø;PM0PEÂ×ÈÕÊÓÐÑÒÍÔËÖÅØÃØÄØÆÔÌÒÎÎÒÊÔÈÖÂØÁØÇØÉÔÍÒÑÎÓÌ×Æ×Â×ÁÕÅÓËÑÍÏÑÉÓÇ×Á×;PM1PEÆ¿ÂÕÆÕÊÓÎÏÒÏÔÇÖÇÖÁØÂÔÈÖÈÐÐÎÐÊÔÈÖÂÖÁØÇÖÉÔÍÐÏÎÕÊÓÈ×ÂÕÁÕÇÓÉÑÍÍÏÉÓÅÕÁ×;PM1PE;PM2FPPE=<CbÀEø;PM0PEÂÕÆÕÊÓÎÏÒÏÔÇÖÇÖÁØÂÔÈÖÈÐÐÎÐÊÔÈÖÂÖÁØÇÖÉÔÍÐÏÎÕÊÓÈ×ÂÕÁÕÇÓÉÑÍÍÏÉÓÅÕÁ×;PM1PEÄ¿ÂÓÆÕÌÑÌÑÒËÒËÔÅÖÁÖÂÔÆÔÌÐÌÎÒÊÒÆÖÂÔÁÖÅÔÉÔÍÐÏÎÓÊÓÆÕÄÕÃÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PE;PM2FPPE=<?bÀEø;PM0PEÂÓÆÕÌÑÌÑÒËÒËÔÅÖÁÖÂÔÆÔÌÐÌÎÒÊÒÆÖÂÔÁÖÅÔÉÔÍÐÏÎÓÊÓÆÕÄÕÃÓÅÑÉÑÍËÏËÓÅÓÁÕ;PM1PEÄ¿ÂÓÆÕÊÑÌÍÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÎÎÈÒÆÖÄÔÃÖÅÔÇÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍËÏÉÑÅÓÁÕ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<{aÀEø;PM0PEÂÓÆÕÊÑÌÍÐÍÒÉÔÅÖÁÖÂÔÆÒÊÐÎÎÎÈÒÆÖÄÔÃÖÅÔÇÒÍÐÏÎÑÊÓÆÕÂÕÁÓÅÑÉÏÍËÏÉÑÅÓÁÕ;PM1PEÄ¿ÂÓÆÑÊÑÌÏÐËÐÇÔÅÔÃÔÄÔÆÐÈÐÌÌÐÊÒÆÒÂÔÁÖÅÒÉÒËÎÏÌÏÊÓÆÓÂÓÁÓÅÏÉÏËËÍÉÑÅÑÁÕ;PM1PE;PM2FPPE=<waÀEø;PM0PEÂÓÆÑÊÑÌÏÐËÐÇÔÅÔÃÔÄÔÆÐÈÐÌÌÐÊÒÆÒÂÔÁÖÅÒÉÒËÎÏÌÏÊÓÆÓÂÓÁÓÅÏÉÏËËÍÉÑÅÑÁÕ;PM1PEÆ¿ÂÑÄÑÊÑÌÍÎËÒÉÒÃÒÁÔÂÒÄÐÊÎÌÌÎÊÒÆÒÂÒÁÔÅÒÉÐËÐÍÌÏÈÑÆÓÂÑÁÑÅÑÇÍËËÏÉÏÃÑÁÓ;PM1PE;PM2FPPE=<qaÀEø;PM0PEÂÑÄÑÊÑÌÍÎËÒÉÒÃÒÁÔÂÒÄÐÊÎÌÌÎÊÒÆÒÂÒÁÔÅÒÉÐËÐÍÌÏÈÑÆÓÂÑÁÑÅÑÇÍËËÏÉÏÃÑÁÓ;PM1PE¿ÄÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÔÂÐÄÒÈÌÌÌÎÈÐÆÒÂÒÁÔÅÐÇÒËÌËÌÑÊÏÄÓÂÑÁÑÃÏÉÍËËËÇÑÃÏÃÓ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<oaÀEø;PM0PEÄÑÄÑÈÏÌÍÎËÐÇÒÃÒÁÔÂÐÄÒÈÌÌÌÎÈÐÆÒÂÒÁÔÅÐÇÒËÌËÌÑÊÏÄÓÂÑÁÑÃÏÉÍËËËÇÑÃÏÃÓ;PM1PEÆ¿ÂÑÄÍÊÏÊÍÎÉÎÇÐÅÒÁÒÂÐÆÐÈÌÊÌÎÈÐÄÎÄÒÃÒÃÐÇÐËÎËÊÏÈÏÆÑÂÑÁÏÅÍÇÍÉÉÍÉÏÃÏÁÑ;PM1PE;PM2FPPE=<iaÀEø;PM0PEÂÑÄÍÊÏÊÍÎÉÎÇÐÅÒÁÒÂÐÆÐÈÌÊÌÎÈÐÄÎÄÒÃÒÃÐÇÐËÎËÊÏÈÏÆÑÂÑÁÏÅÍÇÍÉÉÍÉÏÃÏÁÑ;PM1PEÄ¿ÂÏÆÏÆÍÌËÌÉÎÇÐÅÐÁÒÂÎÆÐÈÌÊÊÌÈÎÆппÒÅÐÇÎÉÌËÊÏÈÍÆÑ¿Ï¿ÏÅÍÇËÉËËÅÍÅÏÁÑ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<eaÀEø;PM0PEÂÏÆÏÆÍÌËÌÉÎÇÐÅÐÁÒÂÎÆÐÈÌÊÊÌÈÎÆппÒÅÐÇÎÉÌËÊÏÈÍÆÑ¿Ï¿ÏÅÍÇËÉËËÅÍÅÏÁÑ;PM1PEÄ¿ÂÏÄÍÈÍÊËÌÉÎÇÎÃÐÁÒÂÎÄÌÈÌÊÌÌÆÎÆοпÒÅÎÅÎËÌËÊËÈÍÄÑÂÏÁÍÃÍÇËÉÉËÇÍÃÍÁÑ;PM1PE;PM2FPPE=<aaÀEø;PM0PEÂÏÄÍÈÍÊËÌÉÎÇÎÃÐÁÒÂÎÄÌÈÌÊÌÌÆÎÆοпÒÅÎÅÎËÌËÊËÈÍÄÑÂÏÁÍÃÍÇËÉÉËÇÍÃÍÁÑ;PM1PEÄ¿ÂÍÄÍÈÍÊÉÊÉÎÅÎÅοοÐÆÌÆÌÊÈÊÈÎÄÎÂÎÁÐÃÎÇÌÇÌËÊËÆÏÆÍ¿Í¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PE;PM2FPPE=<]aÀEø;PM0PEÂÍÄÍÈÍÊÉÊÉÎÅÎÅοοÐÆÌÆÌÊÈÊÈÎÄÎÂÎÁÐÃÎÇÌÇÌËÊËÆÏÆÍ¿Í¿ÍÅÍÅÉÉÉËÇËÃÍÁÏ;PM1PEÆ¿¿ÍÆËÆËÈËÊÇÌÅÎÃÎÁÎÂÎÄÌÆÊÈÊÌÆÌÄÌÂÎÁÐÃÌÅÌÉÊÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÇÉÅËÅË¿Ï;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<WaÀEø;PM0PE¿ÍÆËÆËÈËÊÇÌÅÎÃÎÁÎÂÎÄÌÆÊÈÊÌÆÌÄÌÂÎÁÐÃÌÅÌÉÊÉÊËÆÍÄÍÂÍÁÍÃËÅÉÉÇÉÅËÅË¿Ï;PM1PEÄ¿¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PE;PM2FPPE=<SaÀEø;PM0PE¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PEÄ¿ÂËÂËÆÉÈÉÊÅÊÅÌÃÌÁÌÂÌÄÌÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÌÇÈÇÈËÆËÄËÂËÁËÃÉÅÉÇÇÇÅËÁËÁË;PM1PE;PM2FPPE=<OaÀEø;PM0PEÂËÂËÆÉÈÉÊÅÊÅÌÃÌÁÌÂÌÄÌÆÈÆÈÊÆÊÄÌ¿Ì¿ÌÃÌÅÌÇÈÇÈËÆËÄËÂËÁËÃÉÅÉÇÇÇÅËÁËÁË;PM1PEÄ¿ÆÓÌÓÒËÖÃÖÄÔÌÌÔÄÔÃÖËÔÓÌÕÄÕÃÑËËÓÅÕ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<KaÀEø;PM0PEÆÓÌÓÒËÖÃÖÄÔÌÌÔÄÔÃÖËÔÓÌÕÄÕÃÑËËÓÅÕ;PM1PEÄ¿ÆÓÊÑÒÉÔÅÔÆÒÊÌÒÄÔÃÖËÐÑÌÓÄÓÃÑËÉÏÅÕ;PM1PE;PM2FPPE=<GaÀEø;PM0PEÆÓÊÑÒÉÔÅÔÆÒÊÌÒÄÔÃÖËÐÑÌÓÄÓÃÑËÉÏÅÕ;PM1PEÆ¿ÂÑÌÏÐÉÒÃÔÄÐÊÊÐÄÒÃÔÉÐÏÊÓÄÑÃÏÉËÏÁÓ;PM1PE;PM2FPPE=<AaÀEø;PM0PEÂÑÌÏÐÉÒÃÔÄÐÊÊÐÄÒÃÔÉÐÏÊÓÄÑÃÏÉËÏÁÓ;PM1PEÄ¿ÄÏÊÍÎÉÐÃÒÄÎÊÊÎÂÐÁÒÉÎÍÊÑÄÏÃÍÉÉÍÃÑ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<}`ÀEø;PM0PEÄÏÊÍÎÉÐÃÒÄÎÊÊÎÂÐÁÒÉÎÍÊÑÄÏÃÍÉÉÍÃÑ;PM1PEÄ¿ÄÍÈÍÌÇÐÃÐÄÎÈÈÎÄÎÃÐÇÎÍÈÏÄÏÃËÇÇÍÃÏ;PM1PE;PM2FPPE=<y`ÀEø;PM0PEÄÍÈÍÌÇÐÃÐÄÎÈÈÎÄÎÃÐÇÎÍÈÏÄÏÃËÇÇÍÃÏ;PM1PEÄ¿ÂËÊËÌÇÌÃÎÄÌÈÈÌÂÌÁÎÇÌËÈÍÂËÁËÇÉËÁÍ;PM1PE;PM2FPPE=<u`ÀEø;PM0PEÂËÊËÌÇÌÃÎÄÌÈÈÌÂÌÁÎÇÌËÈÍÂËÁËÇÉËÁÍ;PM1PEÆ¿ÂËÆÇÊÇÌÁÌÂÊÈÈÈÂÌÁÌÇÊÉÈËÂËÁÉÇÅÉÁË;PM1PE;PM2RF3,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<o`ÀEø;PM0PEÂËÆÇÊÇÌÁÌÂÊÈÈÈÂÌÁÌÇÊÉÈËÂËÁÉÇÅÉÁË;PM1PE¿ÄÉÆÇÈÅÊÁÌÂÈÆÆÈÂÊÁÌÅÈÇÆËÂÉÁÇÅÅÇÃË;PM1PE;PM2FPPE=<m`ÀEø;PM0PEÄÉÆÇÈÅÊÁÌÂÈÆÆÈÂÊÁÌÅÈÇÆËÂÉÁÇÅÅÇÃË;PM1PEÆ¿ÂÇÄÅÈÅÈÁÈÂÈÆÄÆÄÈÃÊÃÆÇÆÇÂÇÁÇÅÃÅÁÉ;PM1PE;PM2FPPE=<g`ÀEø;PM0PEÂÇÄÅÈÅÈÁÈÂÈÆÄÆÄÈÃÊÃÆÇÆÇÂÇÁÇÅÃÅÁÉ;PM1PEÄ¿ÂÅÄÅÆÃÆÁÈÂÄÄÆÆ¿Æ¿ÈÅÄÃÆÇ¿Å¿ÅÅÃÃÁÇ;PM1PE;PM2RF4,8,8,0,0,0,0,0,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;FT11,4FPPE=<c`ÀEø;PM0PEÂÅÄÅÆÃÆÁÈÂÄÄÆÆ¿Æ¿ÈÅÄÃÆÇ¿Å¿ÅÅÃÃÁÇ;PM1PEÄ¿ÂÃÂÃÆÃÄÁÆÂÄÄÄÄ¿Ä¿ÆÃÄÃÄÅÂÃÁÅÃÁÃÁÅ;PM1PE;PM2FPPE=<_`ÀEø;PM0PEÂÃÂÃÆÃÄÁÆÂÄÄÄÄ¿Ä¿ÆÃÄÃÄÅÂÃÁÅÃÁÃÁÅ;PM1PEÄ¿ÂÁÂÃÂÁÄ¿Ä¿ÂÂÂÄÂÂÁÄÁÂÁÄÿÿÁÃÁÁÁÃ;PM1PE;PM2FPPE=<[`ÀEø;PM0PEÂÁÂÃÂÁÄ¿Ä¿ÂÂÂÄÂÂÁÄÁÂÁÄÿÿÁÃÁÁÁÃ;PM1PEÆ¿¿ÁÄÁ¿Â¿ÂÁÂÁÂÁ¿ÃÁ¿Á¿Á;PM1PE;PM2FT10,0FPPE=<U`ÀEø;PM0PE¿ÁÄÁ¿Â¿ÂÁÂÁÂÁ¿ÃÁ¿Á¿Á;PM2FPMC1,240PE=<InÀ[ë;PM0PEæÙèÛæ×èÙæ×è×êÕè×èÓèÕêÓèÕêÑêÓêÑêÑÈÎéÒéÒéÔéÔéÔçÔéÖåÖéÖåÖçØçØåÚçÚåÚçÚÇÍ;PM2FP1PE=<[eÀcSÀ;PM0PEÑÄÓÆÑÄÓÄÑÄÓÆÑÄÑÆÕÍÓÍÓËÓÍÓËÕÍÓÍÓÍÓËÓÍÕÍÓËÕËÕËÕËÕËãÏßÏßÏßÑáÍãÏçËéÉËÁÉ¿ËÁÉ¿ÉÁËÁË¿ÉÁãÏ×ÑÍÏÅÏÃÑÄÑÂÏÄÑÈÇÆÇÊÇÆÅÈÇÆÇÈÇÈÇÈÅÆÇÊÇÆÇÐÊÒÆÖÄÔÆÒÆÎÌÆÒ¿ÜÃÎÁÎÃÊÁÆ¿ÆÁÈÁÆ¿ÈìÚîÚôÚöØøÚøØúØøÖöØôÖðÖîÖèÔâÒÜÔÒÒ;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<edÀYø;PM0PECÀôCÀôCÀôEÀôCÀôCÀôCÀôCÀòCÀôCÀôCÀôEÀòCÀôCÀôCÀôCÀôEÀòCÀôCÀôCÀôCÀöCÀôCÀôCÀöEÀôCÀöCÀöCÀöEÀöCÀøCÀøEÀøÓÔÓÔÓÒÓÒÓÒÓÒÓÒÓÒÓÔÓÔÕÖÓÖ×Ú×Ü×Þ×àÃÖÁοÈÁ¿ÂÁ¿¿Â¿Äôñöñøóúóøóüóüõ@Àõþõ@Àõ@Àõ@ÀõBÀ÷DÀõDÀ÷DÀõDÀõDÀõFÀõFÀóFÀóFÀóFÀóHÀñFÀñFÀñFÀïFÀïHÀíDÀíFÀëDÀéØÛØÝØÙÚÛÜÙÚÛÜÛÜÛÞÙÜÛÜÙÞÛÜÛÞÙÚÛÜÙ;PM2RF6,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,6FPPE=<Q{ÀQë;PM0PEÐÌÐÌÐÊÐÊÐÌÐÌÐÌÐÊÍÌÓÌÓÊ×Ì×Î×Î×ÐÓÐËÄÉÄÇÂÉÂÇÄËÆÏÊÏÎÉÊËÈËÈËÆËÆËÄËÆËÆÕÄÕÂÕÂÕÂÕÂÕÄÕÂÕÂÕÂÕÂÕÄÕÂÕÂÕÂÕÂÕÄÞËÞÍÜÍÜÏÜÍÜÏÜÍÜÍÎÅÎÅÎÅÌÅÐÅÌÅÎÃÎÅÂÍ¿Ë¿Ë¿ÍÞÕÚÏÜÍÚÉÚÇÚÇÚÇÜËÆÅÆÅÈÇÄÅ;PM2FPPE=<S}À]é;PM0PEä×ÜÍÔÇÐÁÌÄÈÂÊ¿ÒÃÄÐÓÆÍ¿ËÃÅÁË¿ÏÆÙÎãÚÁ¿ÇÏ;PM2FT10,0FP1PE=<[~ÀQè;PM0PE¿ÂÄÓÆÏÈËÈÇÊÅÌÃÌÅÌÅÈÐÍÆËÄÉÄÇÆÅÆÅÆÃÎÃÔ¿ÂÏÇ;PM2FP1PE=<QAÁAç;PM0PEÚËÚÅÚÇÚÇØÇØÉÒÍÌÍÐÈÏÒÓÐÙÌÙÈÙÈÛÈÙÈ×ÈÅÍ;PM2FP1MC1,90PE=<yVÁCì;PM0PElöIßÙíköJßÚî;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,7FPPE=<SWÁqì;PM0PElöIßÛíköJßÜî;PM2FPPE=<oWÁ_í;PM0PElöIßÙëköJßÚì;PM2FPPE=<IXÁKî;PM0PElöIßÙíköJßÚî;PM2FPPE=<cXÁyî;PM0PElöIßÙíköJßÚî;PM2FPPE=<}XÁgï;PM0PElöIßÙíköJßÚî;PM2FPPE=<WYÁUð;PM0PElöIßÙëmöHßÜî;PM2FPPE=<sYÁCñ;PM0PEnöGßÙímöJßÚì;PM2FPPE=<MZÁoñ;PM0PEnöIßÙímöJßÚî;PM2FPPE=<gZÁ]ò;PM0PEnöIßÛíköJßÚî;PM2FPPE=<A[ÁKó;PM0PElöIßÙíköJßÚî;PM2FPPE=<[[Áyó;PM0PElöIßÙëmöHßÜî;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<w[Ágô;PM0PEnöGßÙímöJßÚì;PM2FPPE=<Q\ÁSõ;PM0PEnöIßÙímöJßÚî;PM2FPPE=<k\ÁAö;PM0PEnöIßÛíköJßÚî;PM2FPPE=<E]Áoö;PM0PElöIßÙíköJßÚî;PM2FPPE=<_]Á]÷;PM0PElöIßÙëköHßÚî;PM2FPPE=<y]ÁKø;PM0PElöGßÙíköJßÚì;PM2FPPE=<S^Áwø;PM0PElöIßÙíköJßÚî;PM2FPPE=<m^Áeù;PM0PElöIßÛíköJßÜî;PM2FPPE=<I_ÁSú;PM0PElöIßÙíköJßÚî;PM2FPPE=<c_ÁAû;PM0PElöIßÙëköHßÚî;PM2FPPE=<}_Áoû;PM0PElöGßÙíköJßÚì;PM2FPPE=<W`Á[ü;PM0PElöIßÙíköJßÚî;PM2FPPE=<q`ÁIý;PM0PElöIßÛíköJßÜî;PM2FPPE=<MaÁwý;PM0PElöIß×ímöJßÚî;PM2FPPE=<gaÁeþ;PM0PEnöIßÙëmöHßÚî;PM2FPPE=<AbÁS?À;PM0PEnöGßÛíköJßÚì;PM2FPPE=<[bÁ?@À;PM0PElöIßÙíköJßÚî;PM2FPPE=<ubÁm@À;PM0PElöIßÙímöJßÜî;PM2FPPE=<QcÁ[AÀ;PM0PEnöIßÙímöJßÚî;PM2FPPE=<kcÁIBÀ;PM0PEnöIßÙëköHßØî;PM2FPPE=<CdÁwBÀ;PM0PElöGßÛíköJßÜì;PM2FPPE=<_dÁcCÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<ydÁQDÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<SeÁ?EÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<meÁmEÀ;PM0PElöIßÙëköHßÚî;PM2FPPE=<GfÁ[FÀ;PM0PElöGßÛíköJßÜì;PM2FPPE=<cfÁGGÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<}fÁuGÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<WgÁcHÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<qgÁQIÀ;PM0PElöIßÙëköHßÚî;PM2FPPE=<KhÁ?JÀ;PM0PElöGßÛíköJßÜì;PM2FPPE=<ghÁkJÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<AiÁYKÀ;PM0PElöIßÙíköJßÚî;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<[iÁGLÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<uiÁuLÀ;PM0PElöIßÙëköHßÚî;PM2FPMC1,240PE=<kgÀsRÀ;PM0PEKÀÒIÀÒGÀÔKÀÒGÀÔGÀÒGÀÖGÀÔGÀÖEÀÔEÀÖEÀÔCÀÖEÀØCÀÔCÀÖAÀÖCÀØ?ÀÖAÀÖ?ÀÖ?ÀÖýØ?ÀÔýÖûØûÔûÖùÔùÖùÔ÷ÖïÎñÒõÒõÒ÷ÒùÒûÔûÔýÔûÖýÔýÖûÖýÖûÖùØûÖ÷ÖõØóØñÖïØíÖéØçÖãØßÖÛÖÙÖÑÖÏÖÉÖÄÆÌÆÔÆÚÈàÈâÆèÆêÈêÆìÆêÆèÆæÄâÆÞÂØÂôÁæ¿ØÁÎÂÆ¿ÅÂÅ¿ÇÂÇÁÃÁÂÁÊÃÒÃÞÇìÇFÀÃDÀÅFÀÅBÀÅBÀÅBÀÅ@ÀÇ@ÀÉþÇþÇþÉþÉüÉüÉüÉüËúËüËúËüËüËúÍúËüËúÏüËüÍüÍüÍþÍüÍ@ÀÍüÍüÏúÏøÏøÏôÑôÑòÑòÑðÓîÑðÕìÓìÓìÕìÕê×êÕêÕê×êÙè×êÙêÙêÙêÙêÛìÛêÛîÛìÛîÝÝ×ÝÙÝ×ßÙßÙß×á×ßÙáÕß×á×ßÓßÕßÓßÓÝÑ;PM2FTFPMC1,90PE=<yVÁCì;PM0PElöIßÙíköJßÚî;PM2FT11,7FPPE=<SWÁqì;PM0PElöIßÛíköJßÜî;PM2FPPE=<oWÁ_í;PM0PElöIßÙëköJßÚì;PM2FPPE=<IXÁKî;PM0PElöIßÙíköJßÚî;PM2FPPE=<cXÁyî;PM0PElöIßÙíköJßÚî;PM2FPPE=<}XÁgï;PM0PElöIßÙíköJßÚî;PM2FPPE=<WYÁUð;PM0PElöIßÙëmöHßÜî;PM2FPPE=<sYÁCñ;PM0PEnöGßÙímöJßÚì;PM2FPPE=<MZÁoñ;PM0PEnöIßÙímöJßÚî;PM2FPPE=<gZÁ]ò;PM0PEnöIßÛíköJßÚî;PM2FPPE=<A[ÁKó;PM0PElöIßÙíköJßÚî;PM2FPPE=<[[Áyó;PM0PElöIßÙëmöHßÜî;PM2FT11,8FPPE=<w[Ágô;PM0PEnöGßÙímöJßÚì;PM2FPPE=<Q\ÁSõ;PM0PEnöIßÙímöJßÚî;PM2FPPE=<k\ÁAö;PM0PEnöIßÛíköJßÚî;PM2FPPE=<E]Áoö;PM0PElöIßÙíköJßÚî;PM2FPPE=<_]Á]÷;PM0PElöIßÙëköHßÚî;PM2FPPE=<y]ÁKø;PM0PElöGßÙíköJßÚì;PM2FPPE=<S^Áwø;PM0PElöIßÙíköJßÚî;PM2FPPE=<m^Áeù;PM0PElöIßÛíköJßÜî;PM2FPPE=<I_ÁSú;PM0PElöIßÙíköJßÚî;PM2FPPE=<c_ÁAû;PM0PElöIßÙëköHßÚî;PM2FPPE=<}_Áoû;PM0PElöGßÙíköJßÚì;PM2FPPE=<W`Á[ü;PM0PElöIßÙíköJßÚî;PM2FPPE=<q`ÁIý;PM0PElöIßÛíköJßÜî;PM2FPPE=<MaÁwý;PM0PElöIß×ímöJßÚî;PM2FPPE=<gaÁeþ;PM0PEnöIßÙëmöHßÚî;PM2FPPE=<AbÁS?À;PM0PEnöGßÛíköJßÚì;PM2FPPE=<[bÁ?@À;PM0PElöIßÙíköJßÚî;PM2FPPE=<ubÁm@À;PM0PElöIßÙímöJßÜî;PM2FPPE=<QcÁ[AÀ;PM0PEnöIßÙímöJßÚî;PM2FPPE=<kcÁIBÀ;PM0PEnöIßÙëköHßØî;PM2FPPE=<CdÁwBÀ;PM0PElöGßÛíköJßÜì;PM2FPPE=<_dÁcCÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<ydÁQDÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<SeÁ?EÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<meÁmEÀ;PM0PElöIßÙëköHßÚî;PM2FPPE=<GfÁ[FÀ;PM0PElöGßÛíköJßÜì;PM2FPPE=<cfÁGGÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<}fÁuGÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<WgÁcHÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<qgÁQIÀ;PM0PElöIßÙëköHßÚî;PM2FPPE=<KhÁ?JÀ;PM0PElöGßÛíköJßÜì;PM2FPPE=<ghÁkJÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<AiÁYKÀ;PM0PElöIßÙíköJßÚî;PM2FT11,1FPPE=<[iÁGLÀ;PM0PElöIßÙíköJßÚî;PM2FPPE=<uiÁuLÀ;PM0PElöIßÙëköHßÚî;PM2FPPE=<EvÀELÀ;PM0PE¿hÍ¿gÍ;PM1PE;PM2FT11,3FPPM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<ouÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<WuÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FT11,2FPPE=<?uÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<itÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<QtÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<{sÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<csÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<KsÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<srÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<]rÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<ErÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<mqÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<WqÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<?qÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FPPE=<ipÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<QpÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<yoÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<aoÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<KoÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<snÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<[nÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<EnÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<mmÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<WmÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<?mÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<glÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<OlÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<ykÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<akÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<IkÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<qjÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<[jÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<EjÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<miÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<UiÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<}hÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<ghÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<OhÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<wgÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<_gÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<IgÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<qfÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<[fÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<CfÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<keÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<UeÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<}dÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<edÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<MdÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<wcÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<_cÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<IcÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<qbÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<YbÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<CbÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<kaÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<SaÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<{`ÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<e`ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<M`ÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<w_ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<__ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<G_ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<o^ÀELÀ;PM0PE¿hÍ¿gÍ;PM1PE;PM2FPMC1,240PE=<iaÀqKÀ;PM0PEßÁáÃßÃßÃßÃá¿áÂáÄÝÂÛÄÛÆÛÈÙÈÛÈÛÈÛÈåÎåÎåÎçÎåÎåÎåÎåÐçÎåÎåÎåÎåÐçÎåÎåÎÏÆÏÄÑÄÍÆÑÆÏÄÏÆÏÄÅæÃæÃæÃæÅæÃäÅèÃæÃäÃèÅæÃäÃèÅæÃäÅèJÀÏJÀÍHÀÏJÀÏJÀÍJÀÏHÀÏJÀÍHÀÏJÀÏJÀÍHÀÏJÀÍJÀÏJÀÍHÀÏÑÉËÍÉÏÅÑÁÑÁÓÁÑÃÑÂÓÂÕÆÑÆÓÊÑÈÓÌÓÊÑÎÓÌÑÎÓÎÓÎÓÐÕÎÓÐ×ÒÓÔ×ÖÙÚÛÚÛÜÛÞ×âÓÕÃ×ÁÕÃ×ÁÕÁ×ÃÕÁ×Á;PM2FTFPMC1,90PE=<EvÀELÀ;PM0PE¿hÍ¿gÍ;PM1PE;PM2RF7,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<ouÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<WuÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<?uÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<itÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<QtÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<{sÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<csÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<KsÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<srÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<]rÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<ErÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<mqÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<WqÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<?qÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FT11,2FPPE=<ipÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<QpÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<yoÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<aoÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<KoÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<snÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<[nÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<EnÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<mmÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<WmÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<?mÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FT11,3FPPE=<glÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<OlÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<ykÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<akÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<IkÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<qjÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<[jÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<EjÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<miÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<UiÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<}hÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<ghÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FT11,4FPPE=<OhÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<wgÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<_gÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<IgÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<qfÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<[fÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<CfÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<keÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<UeÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<}dÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<edÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FT11,5FPPE=<MdÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<wcÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<_cÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<IcÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<qbÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<YbÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<CbÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<kaÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<SaÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<{`ÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<e`ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<M`ÀELÀ;PM0PE¿hÍÖ¿¿gÍÕ¿;PM2FPPE=<w_ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FT11,6FPPE=<__ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<G_ÀELÀ;PM0PE¿hÍØ¿¿gÍ׿;PM2FPPE=<o^ÀELÀ;PM0PE¿hÍ¿gÍ;PM1PE;PM2FPPE=<aaÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<s`ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<E`ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<U_ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<g^ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<w]ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<G]ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,5FPPE=<Y\ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<k[ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<{ZÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<KZÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<]YÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<mXÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<?XÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<OWÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<aVÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<qUÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,4FPPE=<CUÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<STÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<cSÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<uRÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<GRÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<WQÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<gPÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<yOÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<IOÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<[NÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<mMÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<}LÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FT11,3FPPE=<MLÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<_KÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<oJÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<?JÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<QIÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<cHÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<sGÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<EGÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<UFÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<eEÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<wDÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,2FPPE=<IDÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<YCÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<iBÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<{AÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<KAÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<]@ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<m?ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<??ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<O~ÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<a}ÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<q|ÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<A|ÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,8FPPE=<S{ÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<ezÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<uyÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<EyÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<WxÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<gwÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<yvÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<KvÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<[uÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<ktÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<}sÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<MsÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FT11,7FPPE=<]rÀABÀ;PM0PE¿ZÉ¿YÉ;PM1PE;PM2FPMC1,240PE=<_rÀQþ;PM0PE?ÀÌ?ÀÌýÌ?ÀÌ?ÀÌ?ÀÌ?ÀÌýÊ?ÀÌ?ÀÌ?ÀÌ?ÀÊ?ÀÌ?ÀÊ?ÀÌýÌ?ÀÊ?ÀÌ?ÀÊ?ÀÌýÊAÀÌ?ÀÊýÌ?ÀÌ?ÀÊ?ÀÊ?ÀÌ?ÀÌ?ÀÌ?ÀÊ?ÀÌ×Â×Ä×ÄÕÄ×Ä×Ä×Ä×Ä×Ä×Ä×ÂÕÂ×Â×Ä׿տÙÆ×ÂÙÄ׿׿׿×Ã×Á×ÃÕÁ×Å×ÅÕÅÕÅÕÅ×ÅÛÅÙÉÙÇ×Í×Ï×ÓÕÙ×ÝÁÝÃÛÂÙÂÙÄ×Æ×È×Æ×ÜÌÜÌÞÈÞÊÞÆÞÆÞÆàÄàÄàÄàÂàÄàÄâÄÞÄàÂÜ¿Ø¿Ú¿ÚÁÚ¿Ú¿Ú¿Ú¿Ú¿ÚÁÚ¿ÚÁØ¿Ü¿Ø¿Ú¿þËþËþËþÉþËþÉüË@ÀËüËþÉþËþËþËüÉþËþÉþËþËþÉüËþËþËþÉþËüÉ@ÀËüËþËþÉþËþËüËÌÞÌÞÌÞÊÞÌÞÌÞÊÞÌÞ;PM2FTFPMC1,90PE=<aaÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,6FPPE=<s`ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<E`ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<U_ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<g^ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<w]ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<G]ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,5FPPE=<Y\ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<k[ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<{ZÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<KZÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<]YÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<mXÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<?XÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<OWÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<aVÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<qUÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,4FPPE=<CUÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<STÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<cSÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<uRÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<GRÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<WQÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<gPÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<yOÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<IOÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<[NÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<mMÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<}LÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FT11,3FPPE=<MLÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<_KÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<oJÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<?JÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<QIÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<cHÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<sGÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<EGÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<UFÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<eEÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<wDÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,2FPPE=<IDÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<YCÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<iBÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<{AÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<KAÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<]@ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<m?ÁABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<??ÁABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<O~ÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<a}ÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<q|ÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<A|ÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FT11,8FPPE=<S{ÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<ezÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<uyÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<EyÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<WxÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<gwÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<yvÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<KvÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<[uÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<ktÀABÀ;PM0PE¿ZÉî¿¿YÉí¿;PM2FPPE=<}sÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FPPE=<MsÀABÀ;PM0PE¿ZÉð¿¿YÉï¿;PM2FT11,7FPPE=<]rÀABÀ;PM0PE¿ZÉ¿YÉ;PM1PE;PM2FPPE=<WYÁYû;PM0PEZ_À¿Y_À¿;PM1PE;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁuû;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁSü;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2FPPE=<WYÁmü;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<WYÁKý;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁgý;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁCþ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<WYÁ_þ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ{þ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁY?À;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<WYÁs?À;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁQ@À;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁm@À;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁIAÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<WYÁeAÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁABÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁ_BÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<WYÁyBÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁWCÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁsCÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<WYÁODÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁkDÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁGEÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁeEÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<WYÁ?FÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁ]FÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁyFÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,1FPPE=<WYÁUGÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁqGÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁMHÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,2FPPE=<WYÁkHÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2FPPE=<WYÁEIÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁcIÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<WYÁ?JÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ[JÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁwJÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<WYÁSKÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁqKÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2FPPE=<WYÁKLÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁiLÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<WYÁEMÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁaMÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ}MÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<WYÁYNÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁuNÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁSOÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<WYÁoOÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁKPÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁgPÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁCQÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<WYÁ_QÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ{QÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁYRÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<WYÁuRÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁQSÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁmSÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF2,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<WYÁITÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁeTÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁAUÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2RF3,8,8,0,0,0,0,0,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;FT11,3FPPE=<WYÁ_UÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ{UÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁWVÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FT10,0FPPE=<WYÁsVÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁOWÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPMC1,240PE=<SXÀuUÀ;PM0PEèÅìÅêÅîÃðÃðÃòÃòÁòÁôÃôÁö¿ôÁô¿öÁö¿ö¿ô¿ö¿ò¿ôÂò¿òÂò¿î¿îÂî¿ê¿êÂè¿æÂä¿Ú¿ÔÂÊÄÂÂÃÆËÆÑÆ×ÆÝÈáÈåÊëÊíÊóÊõÊõÌùÊûÌûÌýÊûÌýÊûÌûÊùÌ÷ÊõÊóÊïÈéÊéÆáÈ?ÀÎýÐýÒýÖûÖûØûÚùÜùÜùÞùÞùà÷âùà÷ä÷âùâ÷âùä÷â÷äùà÷âùâùàùÞùÞùÞûÚûÜûØýÖIÀÚIÀØIÀÖIÀÖIÀÔIÀÔIÀÒIÀÐIÀÒKÀÐIÀÐKÀÐIÀÐKÀÐKÀÎKÀÒëÈéÈëÈéÈëÈëÆëÈëÆéÆíÆëÄëÆëÆëÄëÄíÆëÄëÆëÄíÄëÆëÆëÄëÆëÆëÄëÆëÆëÈéÆëÆéÈÿÆÈÈÊÆÌÈÎÆÌÆÊ¿êÁêÃêÃìÃêÃêÃêÃìÃêÅêÃêÃêÅêÅêÃêÅêÅêÅêÅêÅêÅêÅêÅêÇêÅêÇêÇêÇêÅêÉêÇèÇêÇîÉîÉìÇîÉîÇîÇîÇìÉîÇìÇîÇìÇîÉìÇîÉìÇîÇìÉîÉìÇìÉìËìÉîÉìËìËìËìÍîÍêËìÍîÏNÀÝNÀãLÀåLÀéNÀíLÀíJÀïLÀñNÀïJÀïLÀíNÀíLÀéLÀåNÀáNÀÝöÑøÏøÏöÏöÍøÍöËøËøËöÉøÉøËøÇøÉöÇúÉöÇøÇøÉøÇøÇøÇøÉøÉøÉøÉøÉøÉøËøÍøËøÍÔÅÚÇÜÉÜÇàËÞËÞËÜÍÚËÖÍÔËÎËÈËÂÇÅÉÍÇñÏñÍïËïÉñÇïÇïÃñÅñÃïÁñ¿ñÁñÁñ¿ó¿ñÁç¿ë¿ïÂñÄõÂ÷ÆûÄûÆûÆýÆûÆ?ÀÈûÆûÈûÈ÷ÆõÆóÈñÆëÆéÄãÆßÂÙÄÓÂÍÄÇ¿ÆÃÐÁÖÃâÅ;PM2FTFPMC1,90PE=<WYÁYû;PM0PEZ_À¿Y_À¿;PM1PE;PM2RF4,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁuû;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁSü;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2FPPE=<WYÁmü;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<WYÁKý;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁgý;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁCþ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<WYÁ_þ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ{þ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁY?À;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<WYÁs?À;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁQ@À;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁm@À;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁIAÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<WYÁeAÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁABÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁ_BÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<WYÁyBÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁWCÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁsCÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<WYÁODÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁkDÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁGEÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁeEÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<WYÁ?FÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁ]FÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁyFÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<WYÁUGÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁqGÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁMHÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<WYÁkHÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2FPPE=<WYÁEIÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁcIÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<WYÁ?JÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ[JÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁwJÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<WYÁSKÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁqKÀ;PM0PEZ_À¿¿ÙY_À¿¿Ú;PM2FPPE=<WYÁKLÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁiLÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<WYÁEMÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁaMÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ}MÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<WYÁYNÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁuNÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁSOÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<WYÁoOÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁKPÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁgPÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁCQÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<WYÁ_QÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ{QÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPPE=<WYÁYRÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<WYÁuRÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁQSÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁmSÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2RF5,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<WYÁITÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁeTÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁAUÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2RF6,8,8,0,0,0,0,0,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;FT11,6FPPE=<WYÁ_UÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁ{UÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁWVÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FT10,0FPPE=<WYÁsVÀ;PM0PEZ_À¿¿ÛY_À¿¿Ü;PM2FPPE=<WYÁOWÀ;PM0PEZ_À¿¿ÝY_À¿¿Þ;PM2FPMC1,240PE=<csÀIPÀ;PM0PEÓÂÕÆÓÄÕÆ×ÆÕÆÕÆ×ÆÅHÀÅHÀÇJÀÇHÀÅJÀÇHÀÅJÀÉJÀÅHÀÇJÀÉJÀÇJÀÇJÀÉHÀÇLÀÉHÀÒÃÐÁÐÃÒÁÐÃÒÁÐÃÐÁÊIÀÌKÀÈIÀÌKÀÊIÀÌIÀÊKÀÊIÀÊIÀÌKÀÊIÀÊIÀÌIÀÊIÀÊIÀÊGÀ;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<OGÁaKÀ;PM0PEúÆüÆBÀÆBÀÄDÀÄDÀÄDÀÂBÀÆþÆüÆúÆôÊîÌæÌàÒØÒÇÆÓÑÝÏåÍíÉóÉ÷ÇûÅýÅAÀÃCÀÃCÀÃCÀÁAÀÅAÀÃûÅùÇ¿Å;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FP1PE=<MpÀ?QÀ;PM0PEøÌøÈúÈüÆüÈüÆüÆúÆüÈøÊöÌöÌòÐîÒîÖèÚÃÈçÙëÕíÑñÏõÍõËõÇûÇùÇûÅûÅûÅûÅùÉùÇ÷ÉÂÇ;PM2FP1PE=<UxÀKOÀ;PM0PEöÊüÆ@ÀÆBÀÆBÀÄBÀÄBÀÆBÀÆþÆúÆøÊòÈìÌäÌàÎÖÒÇÆÓÏÛÏãËëËñÇõÇùÇýÅAÀÅAÀÃAÀÃAÀÅAÀÅ?ÀÅûÅ÷ÇÂÇ;PM2FP1PE=<W?Á]MÀ;PM0PE\ÀÁRÀÂHÀÂ@ÀÄøÆôÆðÊêÈæÊèÈäÊæÊèÊèÈîÈðÈ¿ÆñÅíÇéÉåÇåÉåÉåÉçÉéÇíÇñÇ÷Ã?ÀÃGÀÃQÀ¿[À¿¿Å;PM2FP1PE=<OMÁ}IÀ;PM0PEøÈúÈúÈøÆúÆøÆúÆøÆøÈøÆúÈøÊøÌøÌøÎøÒÁÆ÷Ï÷Í÷Í÷É÷É÷Ç÷Ç÷Å÷ÅùÅ÷ÅùÅ÷ÅùÇùÇùÇÂÇ;PM2FP1PE=<GUÁoGÀ;PM0PEðÆôÄöÂö¿ø¿ø¿øÂöÂöÂòÄðÆîÈêÊäÌÞÎÚÔÅÈ×ÓÝÏãËçÉëÅïÅñÃõÁõ¿÷Á÷¿÷¿õÃõÁóÃïÿÇ;PM2FP1PE=<gYÁCFÀ;PM0PEÞÆâÆäÄæÂæÂæÂæÂæÄâÂäÆÞÈÚÊÖÌÒÒÌÔÆØÇ¿ÃÕËÑÏÍÓÍÙÇÝÇáÅáÃåÁåÁåÁåÃåÁãÃãÃÝÇÂÅ;PM2FP1PE=<wzÀAEÀ;PM0PEâÇäÉâËâËâÍàÍâÍàÏâÏàÏâÏàÏâÏàÍâÏâÍÂÆáÎßÐáÐßÐáÐßÎßÒáÐáÎßÐáÎáÌáÌáÌãÊáÊÁÇ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FP1PE=<I_Áoý;PM0PEHÀÍHÀÍJÀÍHÀÏJÀËHÀÍHÀÍJÀÍHÀÍHÀÍJÀÍHÀËJÀÍHÀÍHÀÍJÀÍHÀÍHÀÍHÀÍJÀÍJÀÍHÀÍHÀÏHÀÍHÀÏHÀÍJÀÏHÀÏHÀÏHÀÑHÀÏHÀÑÂÈGÀÐGÀÒGÀÐGÀÒGÀÎIÀÐGÀÐGÀÎGÀÐGÀÎGÀÎIÀÐGÀÎGÀÎIÀÎGÀÎIÀÌGÀÐGÀÌIÀÎGÀÎGÀÎIÀÎGÀÌIÀÐGÀÌGÀÎIÀÎGÀÎGÀÎIÀÐGÀÎÁÇ;PM2FP1PE=<ofÀyKÀ;PM0PEÔÃÖÃÒÁÔ¿ÖÁÒ¿Ô¿ÖÂÔÂÒÂÖ¿ÔÂÔ¿ÔÂÔ¿Ô¿¿ÊÓ¿ÓÁÓÁÓÁÓ¿ÕÁÑ¿ÓÃÕÂÓÁÑ¿Õ¿ÓÂÑÂÓÂÓÄÁÅ;PM2FT11,8FP1PE=<eyÀ]FÀ;PM0PENÀ¿NÀÉJÀËLÀÑLÀÓLÀ×JÀÛJÀÙJÀÝLÀÝJÀÛJÀÝLÀÙJÀ×LÀ×LÀÑÂÆIÀÔMÀÖIÀÚKÀÚIÀÜIÀÞIÀÞKÀÜIÀÜIÀÚKÀØKÀÔIÀÒMÀÎMÀÈMÀÄ¿É;PM2FP1PE=<qzÀ[FÀ;PM0PEÂÁJÀ¿¿ÊIÀ¿ÂÁÃÅ;PM2FP1PE=<wKÁKCÀ;PM0PEFÐOÂÄÆGÐPÂÁ¿¿Å;PM2FP1PE=<qYÁUBÀ;PM0PE¿ÃzÌñ¿ÆyÌò¿Á;PM2FP1PE=<YbÀsAÀ;PM0PEÌÓÎÓÎÕÌÓÎÕÌÓÎÓÎÓÆÄËÔÍÖÍÔËÔÍÔËÖÍÔÍÔÅÃ;PM2FT10,0FP1PE=<a_ÀOBÀ;PM0PE¿ÂwÀõÂÇxÀøÁÄ;PM2FP1PE=<UrÀiGÀ;PM0PE¿ÁfÅlÀÁÈeÅmÀÂÃ;PM2FT11,1FP1PE=<ITÁCþ;PM0PEÄ¿åâÅÇèáĿÿ¿¿ÃÈ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FP1PE=<kSÁuý;PM0PEÿÙÍÄÇÚÎÿÄÈ;PM1PEÁ¿Á¿Ä¿;PM2FP1PE=<QSÁQþ;PM0PEÂÄÛØÃÇÜÕÂÂ;PM2FP1PE=<KpÀCGÀ;PM0PEÄØ¿Ö¿Ö¿Ø¿ÔÄÖÈÖÎØÅÄÍ×É×Á×Ãӿ׿ÕÂÕÁÕÆÁ;PM2FP1PE=<ILÁEú;PM0PEüÏöÏðÏìÏæÏâÏàÑÜÑÜÑÚÑÜÑØÑÜÑÜÑÞÑâÑÄÈáÒÝÒÛÒÙÒÙÒÙÒÙÒÛÒÝÐßÒãÒåÐëÐïÐõÎûÐÁÅ;PM2FT11,8FP1PE=<KNÁ[ý;PM0PEÕ×ÓÙÑÛÑÙÕ×ÕÕÛÑãËÂÅäÌÞÐÚØÔØÒÜÒÚÖÚÔØÅÆ;PM2FP1PE=<wRÁCý;PM0PEåËéÉéÇéÇçËçÏáÓááÈÃÞÞâÖæÐèÊêÈêÈêÊèÌÃÈ;PM2FP1PE=<cSÁeú;PM0PEìÂäÇÞÍÞÑØÕÜÓÚÓÞÑÂÈÛÐÙÔÙÖÙÔÛÒßÐçÆë¿¿Ç;PM2FP1PE=<mCÁAû;PM0PEÌÛÎ×ÐÓÐÓÔÓÔÏÖÏØÏÖÍØÍÖÍØÍØÏÖÍØÏÔÏÄÈÓÐÕÐ×ÎÕÎ×Î×Ð×ÎÕÎÕÎÕÒÓÐÑÐÑÖÏÔÍØÉØÇÁ;PM2FP1PE=<kgÀe@À;PM0PEäãÞáÖãÐáÊåÈçÆéÆñÈ¿ÅòÅîÇæËæÍæ×âÛâåèÅÇ;PM2FP1PE=<YpÀW?À;PM0PEØÙÒÙÈ×Ä×Á׿ÙÂÙÆÙÆÂÃØ¿Ú¿ÚÁØÃÚÇÜÏÚÙÜÅÇ;PM2FP1PE=<?mÀ_?À;PM0PEàãÔáÊãÄáÄãÆãÊáÔãÆÆÑàËâÃâÃäÃäËäÑæáäÅÅ;PM2FP1PE=<QvÀAþ;PM0PEàÑÖ×ÒÙÎÙÌÝÊÝÌÛÎÛÈÄÏÚËÞÇÞËÜÍÜÑÜÙØßÔÃÇ;PM2FP1PE=<e}ÀKü;PM0PEXÀñúéâßÔÛÊ×Ê×ÌÛÚÝÄÄÕÞÍÚÇØÉÚÓÞåâ÷èWÀôÅÇ;PM2FP1PE=<S?ÁADÀ;PM0PEôÆìÆæÈÞÈÜÊØÊÒÌÎÌÎÌÌÌÌÌÌÌÎÌÎÌÒÊÒÊÁÈÕÉÑËÍËËËËËËËËËÍËÏËÑÉÕËÙÇÝÉåÇéÅóÿÇ;PM2FP1PE=<iDÁqBÀ;PM0PEÎÚÒÖÒÐÔÐÖÎÖÈØÊÚÆÚÈÚÄÚÆÚÆÚÆØÆØÈØÊÁÆ×É×ÇÙÅ×ÅÙÅÛÃ×ÅÙÅÙÅ×É×ÉÕËÕÏÓÓÏÕÏÙÈÃ;PM2FP1PE=<WJÁ]AÀ;PM0PEâÁÚÂØÄÒÈÎÊÎÌÎÎÌÌÒÐÒÎØÌÞÎäÌìÊöÆ@ÀÆ¿Æ?ÀÃ÷ÇíÇãËÝÍ×ÍÓÍÏÍÍÏËËÍËÏÉÏÅÓÅÙ¿á¿Ç;PM2FP1PE=<]JÁo?À;PM0PEÂĿοοο̿п̿οÎÇ¿¿Í¿Í¿Ë¿Ï¿Ë¿Í¿Í¿ÍÂÄÄÇ;PM1PE¿ÂÁÃ;PM2FP1PE=<WMÁKAÀ;PM0PEÐÞÔÒÔÌÚÈÚÄÚÆÜÄØÊÃÈ×ÉÙÅÙÃÙÃÙÇ×ÍÕÓÍÝÆÃ;PM2FP1PE=<[uÀOCÀ;PM0PEÄÁôæÃÆõåÂÃ;PM2FT11,2FP1PE=<cpÀGAÀ;PM0PEÁÃDÀÌÁÈEÀÍÁÁÂÂÁ¿¿ÁÈ¿;PM2FP1PE=<epÀiAÀ;PM0PEÄÄÁÞÇ¿ÂÝÄÆ¿É;PM1PEÆ¿ÁÄÃÃ;PM2FP1PE=<?qÀeAÀ;PM0PE¿ÃÚ¿¿ÊÙ¿¿Å;PM2FP1PE=<QoÀe?À;PM0PEÅ¿××ÄÅÚÖÅ¿ÆÈ;PM1PEÿÁ¿Æ¿;PM2FP1PE=<YnÀM@À;PM0PEÂÄùäÅÇüãÂÄ;PM2FP1PE=<OtÀk?À;PM0PE¿ÂÕçÆÅØê¿ÂÇ¿;PM2FP1PE=<QtÀA?À;PM0PEÁÁÄçÈ¿ÅèÁÃÁÆ;PM1PEÿÂÁÂÂ;PM2FP1PE=<{rÀmþ;PM0PEÁÄSÀ×ÂÅTÀÖ¿Ä;PM2FP1PE=<iuÀY?À;PM0PEÂÃàÜÃÈáÛÄÃ;PM2FP1PE=<EqÀIFÀ;PM0PEÄ¿öÚÅÈõÛÄ¿ÁÅ;PM2FP1PE=<_qÀ?FÀ;PM0PEÃÁÞÇÂÆÝÊÃÃÄÄÿ¿ÃÆÁ;PM2FP1PE=<gqÀ[FÀ;PM0PEÄ¿ÄÜÅÂÅÛÄÁ;PM2FP1PE=<goÀOEÀ;PM0PEÄ¿ÝÚÅÅÞÙĿÿÂÁÂÂÁÆ;PM2FP1PE=<snÀAEÀ;PM0PEÅÂíÏÂÅîÎÃÂÈÄ;PM1PEÃÄÁÁÆÁ;PM2FP1PE=<_nÀgEÀ;PM0PEÄÂ×äÇÃÚãÂÂ;PM2FP1PE=<elÀYBÀ;PM0PEÁ¿ôÑÂÆóÒÁ¿ÂÅ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FP1PE=<YmÀ_BÀ;PM0PEÂÃòÊÁÆñÇ¿Ã;PM2FP1PE=<IlÀc@À;PM0PEÂÂ÷¿¿Éø¿ÂÂÃÆ;PM2FP1PE=<ikÀO@À;PM0PEÁÄÝ×ÄÅÞÖÁÄ;PM2FP1PE=<MgÀ_BÀ;PM0PEÆÁøØÁÆùÕÆÁÇÃ;PM1PEÂÃÄÂÅÂ;PM2FP1PE=<UgÀ}AÀ;PM0PEÃÁÌßÈÄËÞÿ;PM2FP1PE=<OfÀsCÀ;PM0PEÁ¿àÅÄÈáÄÁ¿ÂÅ;PM2FP1PE=<ufÀ?DÀ;PM0PE¿äÌÁÆãÉ¿ÁÇ;PM2FP1PE=<WgÀoCÀ;PM0PEÄÁÞÍÂÈÝÎÂÁÇÃ;PM2FP1PE=<egÀWCÀ;PM0PEÃÁÒÕÈÄÓÖÁÁ;PM2FP1PE=<_eÀmBÀ;PM0PEÂÄÛÙÆÇÚÚÂÄÁÃÄÄÁ¿Ç¿;PM2FP1PE=<]eÀMBÀ;PM0PEÃÁÂÝÈ¿ÁÞÃÿÆ;PM1PEÿ¿ÁÄÂ;PM2FP1PE=<EeÀMBÀ;PM0PE¿Ä×ÿÅØ¿Ä;PM2FP1PE=<]{ÀuAÀ;PM0PEÃÁæáÄÆãâÁÃ;PM2FP1PE=<K{À]þ;PM0PEÅÁüÉÂÆûÌÃÁÄÂÁ¿ÁÁÈÃ;PM2FP1PE=<q{À??À;PM0PEÈ¿ÞâÇÄÝáÈ¿ÇÃ;PM1PEÂÃÆÄÇ¿;PM2FP1PE=<y{Àiþ;PM0PEÿÌÕÈÄËØÅ¿Æ¿ÁÂÃÁÂÅ;PM2FP1PE=<U|Àkþ;PM0PEÂÃÚÆÁÆÛÃÂÃ;PM2FP1PE=<KzÀQý;PM0PEÅÂñÛÄÇòÜÅÂÈÄ;PM1PEÁÂÿÆÁ;PM2FP1PE=<yyÀmý;PM0PEÄÄÕØÇÃÖÙÄÂ;PM2FP1PE=<YHÁE@À;PM0PE¿þÄ¿ÈýÅ¿ÃÅ;PM2FP1PE=<iHÁy?À;PM0PEÅÁÖÉÄÆÕÌÅÁÆÂÿÁÁÈÃ;PM2FP1PE=<CIÁW@À;PM0PEÆ¿ÔÞÇÄÓÛÄ¿ÁÅ;PM1PEÂÁÄÂÅ¿;PM2FP1PE=<YIÁM@À;PM0PE¿ÃÖÅÂÆÕÈÁÃ;PM2FP1PE=<YCÁYü;PM0PE¿ÁôËÂÆñοÁÃÃ;PM2FP1PE=<YCÁIü;PM0PE¿ÃÁÁÁÅÄÃÄÄ¿¿Â¿ÄÄÆÉ¿;PM2FP1PE=<qAÁqý;PM0PEÂÃâÌÁÈãËÂÃ;PM2FP1PE=<aAÁWü;PM0PEÿÅûÈ¿Æüÿ;PM2FP1PE=<yGÁIü;PM0PE¿ÃNÀÅ¿ÆMÀÆ¿Á;PM2FP1PE=<]KÁGû;PM0PEÄ¿òèÅÈïéÄ¿ÃÅ;PM1PEÂÁÂÂÿ;PM2FP1PE=<qKÁsú;PM0PEÃÁØÑÄÆÕÒÁÃ;PM2FP1PE=<iBÁ_AÀ;PM0PEÃÂñÄ¿ÅòÃÃÂÈÂ;PM1PEÁÂÁ¿ÄÁ;PM2FP1PE=<cBÁuAÀ;PM0PEÄÁÉØÇÁÊÙÄÁÃÂÂÁ¿¿È;PM2FP1PE=<SAÁ}AÀ;PM0PEÃÆKÀ¿ÇLÀÁÃÆÈÃ;PM1PEÄÆÇ¿ÄÅ;PM2FP1PE=<eAÁSBÀ;PM0PEÄÁÎØÇÄÍ×ÄÁ;PM2FP1PE=<aRÀQVÀ;PM0PEKÀÈMÀÈKÀÈMÀÊKÀÊKÀÌMÀÌKÀÌKÀÎKÀÎKÀÎKÀÎKÀÐKÀÒKÀÎKÀÒKÀÐKÀÒKÀÒKÀÒIÀÒKÀÒKÀÒKÀÒKÀÒIÀÒKÀÒKÀÒKÀÒKÀÒIÀÒKÀÒÇáLÀÑLÀÑLÀÑJÀÑLÀÑLÀÑLÀÑLÀÑJÀÑLÀÑLÀÑLÀÑLÀÑJÀÑNÀÑLÀÏJÀÏLÀÏNÀÑJÀÍNÀÏLÀÍNÀÍLÀÍLÀËLÀËNÀËLÀÉLÀÉNÀÇNÀÇNÀÇÂâ;PM2FT10,0FP1PE=<Mú{UÀ;PM0PEïÇïÅïÅïÅïÅïÃñÅïÁñÃïÁïÃï¿ñÁïÁï¿ñ¿ñ¿ï¿ïÂñ¿ïÂï¿ïÄñÂñÂïÂïÄñÂïÄïÄïÄñÄÁáðÃðÃòÃðÃòÁðÃðÁòÁðÁôÁðÁðÁò¿ðÁð¿ò¿ò¿ð¿ðÂòÂðÂòÂòÄðÂðÄòÄðÄòÆðÆðÆòÆðÈÅâ;PM2FP1PE=<CöMRÀ;PM0PE¿çÏçÛååãëÝïÙïÑëÉÆáðÌôÔòÚòâèèàìÖð¿ôáÃ;PM2FP1PE=<U@ÀWJÀ;PM0PEôÑôÏòÏöÑôÑòÕòÕðÙîÙêßæãâçàëÚïÔùÌýâÄÏDÀÓüÛößðåêçæíâïÜñÜóÖñÔõÒõÒóÒñÐñÐËÝ;PM2FP1PE=<mlÀ]?À;PM0PEZÀÓZÀÑZÀÑXÀÑZÀÑZÀÓZÀÑZÀÑZÀÑZÀÓXÀÑZÀÓXÀÑZÀÓZÀÓXÀÓZÀÓXÀÕXÀÕZÀÕXÀÕXÀ×XÀÕXÀÕXÀÙXÀÙXÀÙXÀÙXÀÛXÀÛTÀÝXÀÝÌÞWÀÞWÀÞUÀÜWÀÞWÀÚWÀÚWÀÚWÀØWÀÚWÀÖYÀØYÀÖWÀÖWÀÖYÀÔWÀÖYÀÔYÀÒWÀÖWÀÒYÀÔYÀÒYÀÒYÀÒWÀÔYÀÒYÀÔYÀÒYÀÒYÀÒYÀÒYÀÔÅá;PM2FP1PE=<MWÁ}÷;PM0PETÀÍTÀÍTÀÏVÀÍTÀËTÀÏVÀÍVÀÍTÀÍVÀÍVÀÍVÀÍVÀÍTÀÏXÀÍTÀÍVÀÍVÀÍVÀÏVÀÍTÀÏVÀÍTÀÏVÀÏTÀÏTÀÏVÀÏTÀÏTÀÏTÀÑTÀÑTÀÏÆâSÀÐQÀÒSÀÒUÀÎSÀÒSÀÐSÀÐUÀÐSÀÐWÀÎSÀÐUÀÎUÀÐUÀÎUÀÐSÀÎUÀÎUÀÎUÀÎUÀÐUÀÎSÀÎUÀÎUÀÎUÀÎSÀÎSÀÎUÀÎSÀÎSÀÎSÀÐSÀÎÅá;PM2FP1PE=<GaÁIý;PM0PEÑúÅôÆìÒæÜâæÞîØòÖúÐüÌþÊ@ÀÄþÂüÁöÃôÇÆâóÆùÆý¿?À¿?ÀÅAÀÇýËýÑõÕñÛéáßçÓïÉóÆùÖAÀÞÎ;PM2FP1PE=<UbÁw@À;PM0PE×à¿ÚÌÚÖÚÚÚÜÞÒâÃæÝÍ¿ÑËÓ×ÙÙÛÛßÏãÄëÞëØØ;PM2FP1PE=<oVÁAGÀ;PM0PEïÐïÐñÒñÔñÔñÖñÖñØïØïÜíÚëÞëÞçÞçâãâ××èáæãêÝîßìÝðÛðÙòÙò×ò×ôÓòÕòÑòÑòÑðÍÊÞ;PM2FP1PE=<axÀiNÀ;PM0PEýÎûÌýÎýÎûÎýÎûÌýÐýÎûÌûÐýÎûÎûÎûÎýÐûÎûÐýÎùÐûÐûÐûÐûÎûÒûÐûÒûÒùÒûÒûÒûÒÉÝüÓüÑüÑúÑüÑüÏüÑüÏüÑüÏüÏüÏþÍüÏüÍüÏþÍüÏþÍüÍüÍþÍüÍüÍþÍþÍüÍþÍüÍþËþÍüÍÈâ;PM2FP1PE=<Eþ_þ;PM0PEÆÕÁÓÇ×ËÙÓÙ××ÛÙÝÙá×ã×ãÕãÓåÑãÏãËáÉûÍýÏ?ÀËýËýËýÉ?ÀÉýÉ?ÀÇ?ÀÉ?ÀÇýÅ?ÀÇAÀÇýÅAÀÅ?ÀÇýÅAÀÅ?ÀÅýÅAÀÅ?ÀÇýÅ?ÀÇ?ÀÅ?ÀÇ?ÀÉýÇ?ÀÇýÉýÉCÀËGÀÍIÀÑKÀÑMÀÑMÀÕMÀÑIÀÓGÀÓCÀÑ?ÀÏùÏïËéÉßÅ×ÃÉÁÍÃÍÅÏÃÏÃÍÂÏÆËÌÅêÇÞÍÒÍÌÍÊÉÎÇÔ¿àÞJÀÞJÀÜHÀÞHÀÜJÀÞJÀÜHÀÜHÀÜHÀÜHÀÜFÀÜFÀÜHÀÚFÀÜFÀÜFÀÜFÀÜDÀÚFÀÜDÀÞBÀÚFÀÜBÀÞBÀÜBÀÜBÀÞBÀÞBÀÞþÞBÀÞ@ÀÞþÛÔÙÜÓäÑäËæÉàÅÜÁÒÇÎËÌÍÎÍÌËÎÉοÒÆÒÉØËÔÍÒËÖËÔÇÚÃÞÄäÄÊÆÌÈÊÆÊÆÊÈÊÆÌÄÌÁÐÁÒÃÒÁÒÁÐÂÒÈÒÌÐÐÆÐÄÌÄο̿ÊÅÈÉÊÏßÇÏÉÇÏÂÏÆÓÈÑÆÑÂÍÇÛ¿ÝÆÝÈßÊáÆß¿áÇãÈÉÊÉÊÉÊÉÊÉÈÉÊÉÊÉÌÓÌÓÌÓÌÓÌÓÊÓÌÓÌÓÐËÌÉÎÉÐÉÎÉÌÍÎÏÌÕÅÕÃ×Å×ÅÛÉÛËÛÑßÕÝßûßûÝùÝûÛýÝûÙýÛýÙû×ýÙ?ÀÙý×ý×ýÙ?À×ý×?À×?À×?À×ý×?ÀÙýÙ?À×?ÀÙ?ÀÛ?ÀÙýÛ?ÀÝýÛ?ÀÝýß?ÀÜÆÜÄÚÂÚÂÚÂÚÂØÂÚÂØÂØ¿ØÄØÂÖÄØÂÖÆÖÄHÀÔHÀÒFÀÒDÀÒFÀÒDÀÒFÀÒDÀÐDÀÒDÀÒDÀÐBÀÒFÀÐDÀÒBÀÒFÀÒDÀÔFÀÒDÀÔHÀÒFÀÔHÀÖHÀÔHÀÖJÀÖJÀØLÀÖLÀÚNÀÚNÀØPÀÜRÀÜòÐöÐøÎúÎüÌüÊüÆüÄú¿öÃôÉðËìÑæÙÞÝÚã;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<urÀAJÀ;PM0PEÏÃËÉÅÑÁÓÃÕÁÓÇÏÉÇCÀÕËÚÏÞÑÞÑàÏàÍâÉàÁàÞJÀÞHÀÜHÀÜHÀÞHÀÜHÀÜFÀÜHÀÜFÀÚFÀÜDÀÚFÀÜDÀÚDÀÜDÀÚBÀÜDÀÚDÀÜBÀÚBÀÜBÀÜBÀÜ@ÀÜ@ÀÜBÀÜ@ÀÞ@ÀÜ@ÀÞ@ÀÞþÞ@ÀÞþÛÖÙÜÓâÑæËæÉàÅÜÁÒÇÎËÌÍÌÍÎÍÎÅÎÁÒÆÒÉÖËÔÍÔËÔËÖÇÚÁÞÂäÄÊÆÊÆÌÈÊÈÊÆÊÆÌÂÊ¿ÒÁÒÃÒÁÒ¿ÐÂÒÆÐÌÐÐÆÎÆÎÂÎÄÌÃÊÃÈÉÈÏÝÇÑËÅÍÂÏÈÓÆÑÆÑÂÏÇÛ¿ÝÆÝÈßÊßÆá¿áÇáÊÉÊÉÈËÊÇÊÉÊÉÊÉÈÉÌÓÌÕÌÑÌÓÌÕÌÑÌÓÌÕÌËÐÇÎÉÌÉÐÉÌËÎÑÌÕÅÕÃ×ÅÙÅÙÉÛËÝÑÝÕÝßûßûÝûÝûÛûÝûÙýÛûÙ?ÀÙû×ýÙ?À×ý×?À×ýÙ?À×ý×?À×ý×?ÀÙ?À×?ÀÙ?À×ýÛ?ÀÙ?ÀÛ?ÀÙýÝ?ÀÛýÝ?ÀßýæÂØ¿ÐÄÌÄÐÄØÂæÄüÂæÄìÆîÆðÊôÊòÌôÎòÎîÌìÌèÌâÊÜÈÔÆÎÄ¿ËÅÑÇ×ÉÙËßËáÍåÍåÍéÍéÍéÍçÍçËçÇåÉáÅõËáÍÓÍÉËÅÉÉÇÏÃß¿;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<cjÀEà;PM0PEÁÒÃÒÁÒÃÒÁÒÃÒÁÒÃÒË¿ÇÅÇÇÃËÃËÁÏÃËÅÉÆÕÈÕÊÑÌÍÌÉÌ¿ÈÄÄÎ;PM2FT11,4FPPE=<ujÀoÜ;PM0PEÁÈ¿ÌÃÊÁÊÁÊÁÌÁÊ¿ÊÅÄÃÆÿÇÅ¿ÍÂÓÂÓÂÏÄÍÆÉÈÁÌÊ;PM2FPPE=<etÀMLÀ;PM0PEÌÎÊÒÊÒÈÔÆÖÂÔ¿ØÁÖÉÊËÈËÄËÄËÂËÂËÄËÄËÊÅÌÁοÒÁÒÁÔÃÖÇÖÅÏÅÍÅÏÅÍÃÏÃÏÅÍÅÏÃáÆÕÊÏÌÍÎÍÐÑÌÝÆéÐËÎÅÎÁÌ¿;PM2RF6,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,6FPPE=<WhÀcæ;PM0PEÔÉÔÁÒÆÔÊÔÊÔÌÒÊÖÆÉÒËÎËÌÍÊÍÊÍÊÍÊÏÌÉÔÉÒËÔËÒÉÔËÒÉÒÉÔËÊÉÌÉÊÉÌÉÌËÊÇÌËÊÆÚÂØÁÚÃÚÇÚÅÚÅÚÃÚÁÒ¿ÊÄÆÄÄÂÆÁÐÅÚÍèÄÖÎÌÔÆÐÈÇÎËÈËÈÉÂÉÃÇÁÉÁÇÃÇÁÉÃÇÅÇÅ¿ÉÁÇ¿É¿ÇÁÉÁÇ¿Ç¿Ç¿ÇÂÇÂÇ¿ÇÂÇ¿ÇÂÇÂÅÇÍÇËÇËÅËÇÍÅËÃËÃÍÄáÈÛÈÕÊÕÌÏÌÏÊÑÈÕÅÉ¿ÉÂÉÂÉÈÉÌÉÊÇÌËÈÉÈÇÄÉÄÅÄÓÄÑÄÕÆÑÆÓÈÓÊÕÌÓÆÇÆËÆÉÈÉÈËÊÉÌÅÎÅ;PM2FPMC1,90PE=<{sÀEFÀ;PM0PEÄGÀÄGÀÊGÀÌEÀÐCÀÒCÀØAÀØ?ÀÞ?ÀÞýäùäùè÷êõìóðïðïôëöéøçúãúãþÝ@ÀÝ@À×BÀ×DÀÑDÀÏFÀËHÀÉHÀÃHÀÃJÀÄHÀÄFÀÊHÀÌDÀÐDÀÒBÀØ@ÀØ@ÀÞüÞüäúäøèöêôìððððìôêöèøäúäúÞþÞ@ÀØ@ÀØBÀÒDÀÐDÀÌFÀÊHÀÄHÀÂHÀÁJÀÃHÀÉFÀËHÀÏDÀÑBÀ×BÀ×BÀÝ@ÀÝüãüãøçúéöëòïòïîóîõê÷æùæûâûà?ÀÜ?ÀÚAÀÖCÀÔCÀÐGÀÌEÀÊGÀÄIÀÂGÀÁGÀÃGÀÉEÀËCÀÏCÀÓAÀÕ?ÀÙ?ÀÛýßùáùå÷åõéóíïíïñëñéõçùã÷ãûÝûÝ?À×AÀ×AÀÑAÀÏCÀËGÀÉEÀÃGÀÃIÀ;PM1PEÖ¿ÂGÀÆEÀÈGÀÎCÀÎAÀÔCÀÖ?ÀØ?ÀÜýàûâûä÷æõêõìñîñòíòëöéöåøãüáüßþÛ@À×@ÀÕDÀÓBÀÍFÀÍFÀÇFÀÅHÀÁHÀÂHÀÆFÀÈDÀÎDÀÎDÀÔ@ÀÖ@ÀØþÜüàúâúäöæöêòìðîðòêòêöèöäøâüàüÚþÚ@ÀÖ@ÀÒDÀÐBÀÎDÀÈHÀÄFÀÄHÀÃHÀÃHÀÇFÀÍDÀÏDÀÑBÀÕBÀÙ@ÀÙþßüáúãøçøéôéôïðïðñêõêõèùäùâûÞýÜ?ÀÚ?ÀÖCÀÒCÀÐCÀÎEÀÈGÀÄGÀÂGÀÁEÀÃEÀÇEÀÍAÀÏCÀÑ?ÀÕ?ÀÙýÛûÝûá÷ãõçõéñéñïíïëóéóå÷ã÷áùßûÛý×?ÀÕAÀÓAÀÍCÀÍCÀÇEÀÅGÀÁGÀ;PM1PE;PM2FT11,5FPPE=<esÀEFÀ;PM0PEÂGÀÆEÀÈGÀÎCÀÎAÀÔCÀÖ?ÀØ?ÀÜýàûâûä÷æõêõìñîñòíòëöéöåøãüáüßþÛ@À×@ÀÕDÀÓBÀÍFÀÍFÀÇFÀÅHÀÁHÀÂHÀÆFÀÈDÀÎDÀÎDÀÔ@ÀÖ@ÀØþÜüàúâúäöæöêòìðîðòêòêöèöäøâüàüÚþÚ@ÀÖ@ÀÒDÀÐBÀÎDÀÈHÀÄFÀÄHÀÃHÀÃHÀÇFÀÍDÀÏDÀÑBÀÕBÀÙ@ÀÙþßüáúãøçøéôéôïðïðñêõêõèùäùâûÞýÜ?ÀÚ?ÀÖCÀÒCÀÐCÀÎEÀÈGÀÄGÀÂGÀÁEÀÃEÀÇEÀÍAÀÏCÀÑ?ÀÕ?ÀÙýÛûÝûá÷ãõçõéñéñïíïëóéóå÷ã÷áùßûÛý×?ÀÕAÀÓAÀÍCÀÍCÀÇEÀÅGÀÁGÀ;PM1PEØ¿¿EÀÆEÀÈEÀÌAÀÐCÀÔ?ÀÖ?ÀØýÚýàûàùäõæõêõìïîïðíðëöéöåöãúßüßþÙþ×@ÀÕ@ÀÓDÀÏBÀËFÀÇFÀÅFÀ¿HÀ¿FÀÆDÀÈDÀÌDÀÐ@ÀÔ@ÀÖþØþÚüàøàøäöæôêòìðîîðìðèöèöäöàúÞüÜþØþÖ@ÀÔ@ÀÎDÀÌBÀÊFÀÆFÀ¿FÀ¿HÀÅDÀÉFÀËDÀÍBÀÓBÀÕ@À×þÛüÝüßúãøçöçôëòíðïîñìóèõæ÷ä÷âûÞýÜýØ?ÀÖ?ÀÒCÀÐCÀÌCÀÈEÀÆGÀÂEÀÁEÀÅEÀÇAÀËCÀÏ?ÀÑ?ÀÕý×ýÛûÝùáõãõåõçïëïííïëñéóåõã÷ßùßûÙû×ýÕ?ÀÓAÀÏAÀËCÀÇEÀÅCÀ¿GÀ;PM1PE;PM2FPPE=<MsÀEFÀ;PM0PE¿EÀÆEÀÈEÀÌAÀÐCÀÔ?ÀÖ?ÀØýÚýàûàùäõæõêõìïîïðíðëöéöåöãúßüßþÙþ×@ÀÕ@ÀÓDÀÏBÀËFÀÇFÀÅFÀ¿HÀ¿FÀÆDÀÈDÀÌDÀÐ@ÀÔ@ÀÖþØþÚüàøàøäöæôêòìðîîðìðèöèöäöàúÞüÜþØþÖ@ÀÔ@ÀÎDÀÌBÀÊFÀÆFÀ¿FÀ¿HÀÅDÀÉFÀËDÀÍBÀÓBÀÕ@À×þÛüÝüßúãøçöçôëòíðïîñìóèõæ÷ä÷âûÞýÜýØ?ÀÖ?ÀÒCÀÐCÀÌCÀÈEÀÆGÀÂEÀÁEÀÅEÀÇAÀËCÀÏ?ÀÑ?ÀÕý×ýÛûÝùáõãõåõçïëïííïëñéóåõã÷ßùßûÙû×ýÕ?ÀÓAÀÏAÀËCÀÇEÀÅCÀ¿GÀ;PM1PEÔ¿ÂEÀÆCÀÈCÀÌCÀÐ?ÀÒ?ÀÖ?ÀØýÚûÞùâ÷â÷æóèóìñìíîëòëôçôåøáøáúÝüÙ@À×þÕ@ÀÑBÀÏBÀËDÀÇFÀÅDÀÁFÀÂFÀÆDÀÈBÀÌBÀÐ@ÀÒþÖþØüÚüÞøâøâôæôèðìðììîìòæôèôâøâøÞúÚüØþÖ@ÀÒ@ÀÐ@ÀÌDÀÈDÀÆDÀ¿FÀ¿FÀÅFÀÇBÀËDÀÏ@ÀÑBÀÕþ×þÙüÝüáøáöçöåôëðëðïìïêóèóæ÷ä÷âûÞûÚýØýÖ?ÀÒAÀÎAÀÌCÀÊEÀÆEÀ¿CÀ¿EÀÅCÀÉAÀËAÀÍ?ÀÑýÕ?À×ûÙùÝ÷á÷ãóåóçñéíëëïëïçóåõáõá÷ÝûÙû×ýÕýÑAÀÏ?ÀËCÀÇAÀÅEÀÁEÀ;PM1PE;PM2FT11,7FPPE=<yrÀEFÀ;PM0PEÂEÀÆCÀÈCÀÌCÀÐ?ÀÒ?ÀÖ?ÀØýÚûÞùâ÷â÷æóèóìñìíîëòëôçôåøáøáúÝüÙ@À×þÕ@ÀÑBÀÏBÀËDÀÇFÀÅDÀÁFÀÂFÀÆDÀÈBÀÌBÀÐ@ÀÒþÖþØüÚüÞøâøâôæôèðìðììîìòæôèôâøâøÞúÚüØþÖ@ÀÒ@ÀÐ@ÀÌDÀÈDÀÆDÀ¿FÀ¿FÀÅFÀÇBÀËDÀÏ@ÀÑBÀÕþ×þÙüÝüáøáöçöåôëðëðïìïêóèóæ÷ä÷âûÞûÚýØýÖ?ÀÒAÀÎAÀÌCÀÊEÀÆEÀ¿CÀ¿EÀÅCÀÉAÀËAÀÍ?ÀÑýÕ?À×ûÙùÝ÷á÷ãóåóçñéíëëïëïçóåõáõá÷ÝûÙû×ýÕýÑAÀÏ?ÀËCÀÇAÀÅEÀÁEÀ;PM1PEØ¿¿CÀÆCÀÊAÀÌAÀÎ?ÀÒ?ÀÔýØûÜùÜùà÷äõäóèñêñìíîëòéòçôãöãøßúÛúÛü×þÓ@ÀÑ@ÀÍBÀËDÀÉBÀÅDÀ¿FÀ¿BÀÆDÀÊBÀÌ@ÀÎþÒ@ÀÔüØúÜúÜøàöäôäòèòêììîîêòæòæôâöâøÜúÜúØüÔþÒ@ÀÎ@ÀÌBÀÈBÀÆDÀÂDÀÁDÀÅDÀÇDÀËBÀÍþÑ@ÀÓþ×üÛüÛúáøáöåôåòéðíîëìñêñèóæõâ÷àùÞùÜûØ?ÀÔýÒ?ÀÎAÀÌCÀÈAÀÆEÀÂCÀÁAÀÅCÀÇAÀË?ÀÍ?ÀÑýÓû×ùÛùÝ÷ßõáóåñçñéíëëíéïçñãóãõß÷ÛùÛû×ûÓýÑ?ÀÍýËAÀÉCÀÅCÀ¿CÀ;PM1PE;PM2FPPE=<arÀEFÀ;PM0PE¿CÀÆCÀÊAÀÌAÀÎ?ÀÒ?ÀÔýØûÜùÜùà÷äõäóèñêñìíîëòéòçôãöãøßúÛúÛü×þÓ@ÀÑ@ÀÍBÀËDÀÉBÀÅDÀ¿FÀ¿BÀÆDÀÊBÀÌ@ÀÎþÒ@ÀÔüØúÜúÜøàöäôäòèòêììîîêòæòæôâöâøÜúÜúØüÔþÒ@ÀÎ@ÀÌBÀÈBÀÆDÀÂDÀÁDÀÅDÀÇDÀËBÀÍþÑ@ÀÓþ×üÛüÛúáøáöåôåòéðíîëìñêñèóæõâ÷àùÞùÜûØ?ÀÔýÒ?ÀÎAÀÌCÀÈAÀÆEÀÂCÀÁAÀÅCÀÇAÀË?ÀÍ?ÀÑýÓû×ùÛùÝ÷ßõáóåñçñéíëëíéïçñãóãõß÷ÛùÛû×ûÓýÑ?ÀÍýËAÀÉCÀÅCÀ¿CÀ;PM1PEÖ¿¿AÀÆCÀÈ?ÀÌAÀÎ?ÀÒýÔûØûÚùÞ÷ÞõäõäóèñèïìëìëðçòçôãöãöÝøÝúÙü×üÓ@ÀÑþÍBÀË@ÀÇDÀÅBÀ¿DÀ¿DÀÆ@ÀÈ@ÀÌ@ÀÎþÒþÔúØüÚøÞöÞöäôäðèðèîìììèðèòäôâöàöÜøÜúØüÔüÒþÎ@ÀÊBÀÊ@ÀÆDÀ¿BÀ¿DÀÅBÀÉBÀÉ@ÀÍ@ÀÑþÓþ×úÛüÛøßöáöãôçðçðëîíìïèïèóäõâõà÷ÜûÚùØýÖýÒ?ÀÎ?ÀÊ?ÀÈCÀÆCÀÂAÀÁCÀÅ?ÀÇAÀÉýÍ?ÀÑûÕû×ùÙ÷ÛõßõáóãñçïçëëëíçïçïãóãõÝõÝ÷Ùû×ùÓýÑýÍ?ÀË?ÀÇAÀÅAÀ¿CÀ;PM1PE;PM2FPPE=<KrÀEFÀ;PM0PE¿AÀÆCÀÈ?ÀÌAÀÎ?ÀÒýÔûØûÚùÞ÷ÞõäõäóèñèïìëìëðçòçôãöãöÝøÝúÙü×üÓ@ÀÑþÍBÀË@ÀÇDÀÅBÀ¿DÀ¿DÀÆ@ÀÈ@ÀÌ@ÀÎþÒþÔúØüÚøÞöÞöäôäðèðèîìììèðèòäôâöàöÜøÜúØüÔüÒþÎ@ÀÊBÀÊ@ÀÆDÀ¿BÀ¿DÀÅBÀÉBÀÉ@ÀÍ@ÀÑþÓþ×úÛüÛøßöáöãôçðçðëîíìïèïèóäõâõà÷ÜûÚùØýÖýÒ?ÀÎ?ÀÊ?ÀÈCÀÆCÀÂAÀÁCÀÅ?ÀÇAÀÉýÍ?ÀÑûÕû×ùÙ÷ÛõßõáóãñçïçëëëíçïçïãóãõÝõÝ÷Ùû×ùÓýÑýÍ?ÀË?ÀÇAÀÅAÀ¿CÀ;PM1PEÖ¿ÈCÁÒ}Àà{ÀêwÀøoÀ@ÀiÀJÀaÀTÀ[À\ÀSÀbÀIÀjÀ?ÀrÀ÷vÀé|Àß~ÀÑDÁÇDÁÈ@ÁÒ|ÀàvÀêrÀøhÀ@ÀdÀJÀ\ÀTÀTÀ\ÀJÀbÀ@ÀjÀöpÀìxÀà|ÀÒ~ÀÈDÁÇDÁÑ@Áß|ÀëvÀõpÀ?ÀjÀIÀdÀSÀ\À[ÀTÀcÀJÀgÀ@ÀqÀöuÀì{ÀÞ?ÁÔCÁÈCÁÇ}ÀÓ{ÀÝuÀëqÀõiÀ?ÀaÀIÀ[ÀSÀSÀ[ÀIÀcÀ?ÀiÀ÷oÀéuÀß{ÀÑ?ÁÇCÁ;PM1PE;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FPPE=<uqÀEFÀ;PM0PEÈCÁÒ}Àà{ÀêwÀøoÀ@ÀiÀJÀaÀTÀ[À\ÀSÀbÀIÀjÀ?ÀrÀ÷vÀé|Àß~ÀÑDÁÇDÁÈ@ÁÒ|ÀàvÀêrÀøhÀ@ÀdÀJÀ\ÀTÀTÀ\ÀJÀbÀ@ÀjÀöpÀìxÀà|ÀÒ~ÀÈDÁÇDÁÑ@Áß|ÀëvÀõpÀ?ÀjÀIÀdÀSÀ\À[ÀTÀcÀJÀgÀ@ÀqÀöuÀì{ÀÞ?ÁÔCÁÈCÁÇ}ÀÓ{ÀÝuÀëqÀõiÀ?ÀaÀIÀ[ÀSÀSÀ[ÀIÀcÀ?ÀiÀ÷oÀéuÀß{ÀÑ?ÁÇCÁ;PM1PEÖ¿ÆAÁÒ}ÀàwÀìsÀômÀ@ÀiÀHÀaÀRÀYÀZÀQÀbÀGÀjÀ?ÀnÀótÀëzÀß~ÀÑ@ÁÅBÁÆ~ÀÒzÀàtÀìnÀôhÀ@ÀdÀHÀZÀRÀPÀZÀJÀbÀ@ÀjÀônÀìtÀÞxÀÔ~ÀÆBÁÅBÁÓ~ÀÝzÀëtÀónÀ?ÀhÀIÀbÀOÀZÀYÀRÀcÀJÀgÀ@ÀmÀôsÀìyÀÞ}ÀÔAÁÆ?ÁÅ}ÀÓyÀÝsÀëmÀóiÀ?ÀaÀIÀYÀQÀQÀYÀGÀaÀ?ÀgÀómÀësÀßyÀÑ}ÀÅAÁ;PM1PE;PM2FPPE=<_qÀEFÀ;PM0PEÆAÁÒ}ÀàwÀìsÀômÀ@ÀiÀHÀaÀRÀYÀZÀQÀbÀGÀjÀ?ÀnÀótÀëzÀß~ÀÑ@ÁÅBÁÆ~ÀÒzÀàtÀìnÀôhÀ@ÀdÀHÀZÀRÀPÀZÀJÀbÀ@ÀjÀônÀìtÀÞxÀÔ~ÀÆBÁÅBÁÓ~ÀÝzÀëtÀónÀ?ÀhÀIÀbÀOÀZÀYÀRÀcÀJÀgÀ@ÀmÀôsÀìyÀÞ}ÀÔAÁÆ?ÁÅ}ÀÓyÀÝsÀëmÀóiÀ?ÀaÀIÀYÀQÀQÀYÀGÀaÀ?ÀgÀómÀësÀßyÀÑ}ÀÅAÁ;PM1PEÖ¿Æ}ÀÔ{ÀÞwÀêqÀôkÀþeÀHÀ_ÀRÀWÀXÀQÀ`ÀGÀfÀýnÀórÀévÀÝ|ÀÓ~ÀÅ@ÁÆ|ÀÔvÀÞrÀênÀôfÀþ`ÀHÀXÀRÀPÀXÀHÀ`À@ÀfÀòlÀêrÀàxÀÔ|ÀÆ~ÀÅ@ÁÓ|ÀßvÀérÀñnÀ?ÀfÀGÀ`ÀOÀXÀWÀPÀ_ÀHÀeÀþmÀôqÀêuÀà{ÀÒ?ÁÆ}ÀÅ{ÀÑuÀßqÀémÀóeÀý_ÀGÀWÀOÀQÀWÀGÀ_ÀýeÀómÀéqÀÝuÀÓ{ÀÅ?Á;PM1PE;PM2FPPE=<IqÀEFÀ;PM0PEÆ}ÀÔ{ÀÞwÀêqÀôkÀþeÀHÀ_ÀRÀWÀXÀQÀ`ÀGÀfÀýnÀórÀévÀÝ|ÀÓ~ÀÅ@ÁÆ|ÀÔvÀÞrÀênÀôfÀþ`ÀHÀXÀRÀPÀXÀHÀ`À@ÀfÀòlÀêrÀàxÀÔ|ÀÆ~ÀÅ@ÁÓ|ÀßvÀérÀñnÀ?ÀfÀGÀ`ÀOÀXÀWÀPÀ_ÀHÀeÀþmÀôqÀêuÀà{ÀÒ?ÁÆ}ÀÅ{ÀÑuÀßqÀémÀóeÀý_ÀGÀWÀOÀQÀWÀGÀ_ÀýeÀómÀéqÀÝuÀÓ{ÀÅ?Á;PM1PEÖ¿Æ{ÀÔyÀÞuÀèmÀôkÀücÀHÀ]ÀNÀWÀXÀMÀ^ÀGÀdÀûlÀópÀçtÀÝzÀÓ|ÀÅ~ÀÆxÀÔvÀÞpÀèjÀôfÀü^ÀHÀVÀNÀPÀXÀFÀ^ÀþdÀôlÀènÀÞvÀÔzÀÆ|ÀÅ~ÀÓxÀÝvÀçpÀójÀýfÀEÀ^ÀOÀVÀUÀPÀ]ÀFÀeÀþiÀôoÀèuÀÞwÀÔ}ÀÆ{ÀÅyÀÓsÀÝoÀçkÀócÀý]ÀEÀWÀOÀMÀUÀGÀ]ÀûeÀóiÀçoÀÝuÀÓwÀÅ}À;PM1PE;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<spÀEFÀ;PM0PEÆ{ÀÔyÀÞuÀèmÀôkÀücÀHÀ]ÀNÀWÀXÀMÀ^ÀGÀdÀûlÀópÀçtÀÝzÀÓ|ÀÅ~ÀÆxÀÔvÀÞpÀèjÀôfÀü^ÀHÀVÀNÀPÀXÀFÀ^ÀþdÀôlÀènÀÞvÀÔzÀÆ|ÀÅ~ÀÓxÀÝvÀçpÀójÀýfÀEÀ^ÀOÀVÀUÀPÀ]ÀFÀeÀþiÀôoÀèuÀÞwÀÔ}ÀÆ{ÀÅyÀÓsÀÝoÀçkÀócÀý]ÀEÀWÀOÀMÀUÀGÀ]ÀûeÀóiÀçoÀÝuÀÓwÀÅ}À;PM1PEÖ¿ÆyÀÒuÀÞsÀêmÀòiÀüaÀDÀ[ÀNÀUÀVÀMÀ\ÀCÀbÀûjÀñnÀétÀÝvÀÑzÀÅ|ÀÆvÀÒtÀÞnÀêjÀòbÀü\ÀDÀVÀNÀNÀVÀDÀ\ÀübÀòjÀènÀÞtÀÒvÀÆzÀÅzÀÑxÀÝrÀçpÀñhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀaÀüiÀòmÀèsÀÞuÀÒ{ÀÆyÀÅuÀÑsÀÝmÀçiÀñaÀû[ÀEÀUÀMÀMÀSÀCÀ[ÀûcÀñgÀéoÀÝqÀÑwÀÅyÀ;PM1PE;PM2FPPE=<]pÀEFÀ;PM0PEÆyÀÒuÀÞsÀêmÀòiÀüaÀDÀ[ÀNÀUÀVÀMÀ\ÀCÀbÀûjÀñnÀétÀÝvÀÑzÀÅ|ÀÆvÀÒtÀÞnÀêjÀòbÀü\ÀDÀVÀNÀNÀVÀDÀ\ÀübÀòjÀènÀÞtÀÒvÀÆzÀÅzÀÑxÀÝrÀçpÀñhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀaÀüiÀòmÀèsÀÞuÀÒ{ÀÆyÀÅuÀÑsÀÝmÀçiÀñaÀû[ÀEÀUÀMÀMÀSÀCÀ[ÀûcÀñgÀéoÀÝqÀÑwÀÅyÀ;PM1PEÖ¿ÆwÀÒuÀÞoÀækÀôeÀúaÀDÀ[ÀLÀQÀRÀKÀ\ÀCÀbÀùfÀólÀårÀÝtÀÑxÀÅxÀÆvÀÒrÀÞlÀæfÀôbÀúZÀDÀTÀLÀLÀRÀDÀ\ÀúbÀòfÀèlÀÞpÀÒvÀÆxÀÅxÀÑvÀÝpÀçlÀñhÀùbÀCÀZÀKÀTÀSÀLÀYÀDÀaÀúeÀòkÀèqÀÜuÀÒwÀÆwÀÅsÀÑqÀÛkÀçeÀñaÀù[ÀCÀQÀKÀKÀSÀCÀYÀùaÀógÀåkÀÝoÀÑuÀÅwÀ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<GpÀEFÀ;PM0PEÆwÀÒuÀÞoÀækÀôeÀúaÀDÀ[ÀLÀQÀRÀKÀ\ÀCÀbÀùfÀólÀårÀÝtÀÑxÀÅxÀÆvÀÒrÀÞlÀæfÀôbÀúZÀDÀTÀLÀLÀRÀDÀ\ÀúbÀòfÀèlÀÞpÀÒvÀÆxÀÅxÀÑvÀÝpÀçlÀñhÀùbÀCÀZÀKÀTÀSÀLÀYÀDÀaÀúeÀòkÀèqÀÜuÀÒwÀÆwÀÅsÀÑqÀÛkÀçeÀñaÀù[ÀCÀQÀKÀKÀSÀCÀYÀùaÀógÀåkÀÝoÀÑuÀÅwÀ;PM1PEØ¿ÆuÀÒqÀÚmÀèiÀðeÀü]ÀBÀYÀJÀQÀRÀIÀZÀAÀ^ÀûfÀïjÀçnÀÙtÀÑtÀÅvÀÆtÀÒnÀÚjÀèfÀð^ÀüZÀBÀRÀJÀJÀRÀBÀZÀü^ÀðfÀæjÀÜnÀÒrÀÆvÀÅvÀÑtÀÛnÀåjÀïfÀû^ÀAÀXÀIÀTÀQÀJÀYÀBÀ]ÀúeÀðiÀèmÀÜsÀÒuÀÆsÀÅsÀÑmÀÛiÀçeÀï]ÀùYÀAÀQÀIÀIÀSÀAÀWÀû]ÀïeÀçiÀÙmÀÑsÀÅuÀ;PM1PE;PM2FPPE=<ooÀEFÀ;PM0PEÆuÀÒqÀÚmÀèiÀðeÀü]ÀBÀYÀJÀQÀRÀIÀZÀAÀ^ÀûfÀïjÀçnÀÙtÀÑtÀÅvÀÆtÀÒnÀÚjÀèfÀð^ÀüZÀBÀRÀJÀJÀRÀBÀZÀü^ÀðfÀæjÀÜnÀÒrÀÆvÀÅvÀÑtÀÛnÀåjÀïfÀû^ÀAÀXÀIÀTÀQÀJÀYÀBÀ]ÀúeÀðiÀèmÀÜsÀÒuÀÆsÀÅsÀÑmÀÛiÀçeÀï]ÀùYÀAÀQÀIÀIÀSÀAÀWÀû]ÀïeÀçiÀÙmÀÑsÀÅuÀ;PM1PEÔ¿ÆqÀÒqÀÜkÀægÀðcÀú[À@ÀWÀJÀOÀPÀIÀXÀ?À\ÀùdÀïhÀålÀÛrÀÑrÀÅtÀÆpÀÒnÀÜhÀæbÀð^ÀúXÀ@ÀPÀJÀJÀPÀ@ÀXÀú\ÀðdÀæhÀÜlÀÐrÀÆrÀÅtÀÏpÀÛnÀåfÀïdÀù^À?ÀXÀIÀPÀOÀJÀWÀ@À]ÀúaÀðgÀämÀÞoÀÐsÀÆqÀÅqÀÏkÀÝgÀãcÀï[ÀùWÀ?ÀOÀIÀIÀOÀ?ÀWÀù]ÀïcÀåeÀÛmÀÑoÀÅsÀ;PM1PE;PM2FPPE=<[oÀEFÀ;PM0PEÆqÀÒqÀÜkÀægÀðcÀú[À@ÀWÀJÀOÀPÀIÀXÀ?À\ÀùdÀïhÀålÀÛrÀÑrÀÅtÀÆpÀÒnÀÜhÀæbÀð^ÀúXÀ@ÀPÀJÀJÀPÀ@ÀXÀú\ÀðdÀæhÀÜlÀÐrÀÆrÀÅtÀÏpÀÛnÀåfÀïdÀù^À?ÀXÀIÀPÀOÀJÀWÀ@À]ÀúaÀðgÀämÀÞoÀÐsÀÆqÀÅqÀÏkÀÝgÀãcÀï[ÀùWÀ?ÀOÀIÀIÀOÀ?ÀWÀù]ÀïcÀåeÀÛmÀÑoÀÅsÀ;PM1PEØ¿ÆqÀÐmÀÜiÀæeÀî_Àø[À@ÀUÀFÀOÀPÀEÀVÀ?À\À÷`ÀífÀåjÀÛnÀÏrÀÅrÀÆpÀÐhÀÜfÀæbÀî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀø\Àî`ÀæfÀÜjÀÐnÀÆrÀÅrÀÏnÀÛjÀåfÀíbÀ÷\À?ÀVÀGÀNÀMÀHÀUÀ@À[ÀøaÀîeÀægÀÚoÀÒqÀÆqÀÅmÀÑiÀÙeÀå_Àí[À÷UÀ?ÀOÀGÀEÀMÀ?ÀUÀ÷[ÀíaÀåeÀÛiÀÏmÀÅqÀ;PM1PE;PM2FPPE=<CoÀEFÀ;PM0PEÆqÀÐmÀÜiÀæeÀî_Àø[À@ÀUÀFÀOÀPÀEÀVÀ?À\À÷`ÀífÀåjÀÛnÀÏrÀÅrÀÆpÀÐhÀÜfÀæbÀî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀø\Àî`ÀæfÀÜjÀÐnÀÆrÀÅrÀÏnÀÛjÀåfÀíbÀ÷\À?ÀVÀGÀNÀMÀHÀUÀ@À[ÀøaÀîeÀægÀÚoÀÒqÀÆqÀÅmÀÑiÀÙeÀå_Àí[À÷UÀ?ÀOÀGÀEÀMÀ?ÀUÀ÷[ÀíaÀåeÀÛiÀÏmÀÅqÀ;PM1PEÖ¿ÆoÀÎkÀÜgÀäcÀð]ÀöYÀþSÀFÀMÀNÀEÀTÀýZÀõ`ÀïbÀãjÀÛlÀÍnÀÅpÀÆlÀÎhÀÜdÀä`ÀðZÀöTÀþNÀFÀFÀNÀþTÀöZÀð^ÀädÀÚhÀÐlÀÆpÀÅpÀÏlÀÙhÀãdÀï`ÀõXÀýTÀEÀNÀMÀHÀSÀþYÀö_ÀîcÀägÀÜkÀÐoÀÆmÀÅkÀÏiÀÛaÀã_ÀíYÀõSÀýMÀGÀEÀMÀýSÀõWÀï_ÀãcÀÛgÀÍkÀÅoÀ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<mnÀEFÀ;PM0PEÆoÀÎkÀÜgÀäcÀð]ÀöYÀþSÀFÀMÀNÀEÀTÀýZÀõ`ÀïbÀãjÀÛlÀÍnÀÅpÀÆlÀÎhÀÜdÀä`ÀðZÀöTÀþNÀFÀFÀNÀþTÀöZÀð^ÀädÀÚhÀÐlÀÆpÀÅpÀÏlÀÙhÀãdÀï`ÀõXÀýTÀEÀNÀMÀHÀSÀþYÀö_ÀîcÀägÀÜkÀÐoÀÆmÀÅkÀÏiÀÛaÀã_ÀíYÀõSÀýMÀGÀEÀMÀýSÀõWÀï_ÀãcÀÛgÀÍkÀÅoÀ;PM1PEÖ¿ÆkÀÐiÀÚeÀäaÀì[ÀöYÀþQÀFÀIÀJÀEÀRÀýZÀõ\ÀëbÀãfÀÙjÀÏlÀÅnÀÆjÀÐfÀÚbÀä\ÀìZÀöPÀþLÀFÀFÀJÀþRÀöZÀì\ÀäbÀÚfÀÐjÀÆlÀÅnÀÏjÀÙfÀãbÀë\ÀõXÀýRÀEÀLÀKÀFÀOÀüYÀö[ÀîaÀäeÀÚiÀÐmÀÆkÀÅiÀÏeÀÙaÀã[ÀíYÀõQÀûIÀEÀEÀKÀýQÀõWÀë[ÀãaÀÙeÀÏiÀÅmÀ;PM1PE;PM2FPPE=<WnÀEFÀ;PM0PEÆkÀÐiÀÚeÀäaÀì[ÀöYÀþQÀFÀIÀJÀEÀRÀýZÀõ\ÀëbÀãfÀÙjÀÏlÀÅnÀÆjÀÐfÀÚbÀä\ÀìZÀöPÀþLÀFÀFÀJÀþRÀöZÀì\ÀäbÀÚfÀÐjÀÆlÀÅnÀÏjÀÙfÀãbÀë\ÀõXÀýRÀEÀLÀKÀFÀOÀüYÀö[ÀîaÀäeÀÚiÀÐmÀÆkÀÅiÀÏeÀÙaÀã[ÀíYÀõQÀûIÀEÀEÀKÀýQÀõWÀë[ÀãaÀÙeÀÏiÀÅmÀ;PM1PEÖ¿ÄiÀÒgÀØcÀä_Àì[ÀôUÀüOÀDÀIÀJÀCÀPÀûVÀó\Àë`ÀãdÀ×hÀÑjÀÃlÀÄhÀÒdÀØ`ÀäZÀìXÀôPÀüJÀDÀDÀJÀüPÀôVÀì\Àä`ÀØdÀÒhÀÄjÀÃlÀÑhÀ×dÀã`ÀëZÀóVÀûRÀCÀJÀIÀBÀOÀüWÀöYÀì_ÀâcÀÚgÀÐkÀÆiÀÅgÀÏcÀÙ_Àá[ÀëUÀõOÀûIÀAÀCÀIÀûQÀóUÀëYÀã_À×cÀÑgÀÃkÀ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<AnÀEFÀ;PM0PEÄiÀÒgÀØcÀä_Àì[ÀôUÀüOÀDÀIÀJÀCÀPÀûVÀó\Àë`ÀãdÀ×hÀÑjÀÃlÀÄhÀÒdÀØ`ÀäZÀìXÀôPÀüJÀDÀDÀJÀüPÀôVÀì\Àä`ÀØdÀÒhÀÄjÀÃlÀÑhÀ×dÀã`ÀëZÀóVÀûRÀCÀJÀIÀBÀOÀüWÀöYÀì_ÀâcÀÚgÀÐkÀÆiÀÅgÀÏcÀÙ_Àá[ÀëUÀõOÀûIÀAÀCÀIÀûQÀóUÀëYÀã_À×cÀÑgÀÃkÀ;PM1PEÖ¿ÆgÀÎeÀÚaÀâ[ÀìYÀôSÀúOÀBÀGÀHÀAÀPÀùTÀóZÀë^Àá`ÀÙfÀÍhÀÅjÀÆfÀÎ`ÀÚ^ÀâZÀìTÀôPÀúHÀBÀBÀHÀúPÀôTÀêZÀä\ÀØbÀÐfÀÆhÀÅhÀÏfÀ×bÀã^ÀéZÀóTÀùNÀAÀHÀGÀBÀOÀüSÀôYÀê]Àä_ÀØeÀÐiÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóOÀûGÀAÀAÀGÀùMÀóSÀëYÀá]ÀÙaÀÍeÀÅgÀ;PM1PE;PM2FPPE=<kmÀEFÀ;PM0PEÆgÀÎeÀÚaÀâ[ÀìYÀôSÀúOÀBÀGÀHÀAÀPÀùTÀóZÀë^Àá`ÀÙfÀÍhÀÅjÀÆfÀÎ`ÀÚ^ÀâZÀìTÀôPÀúHÀBÀBÀHÀúPÀôTÀêZÀä\ÀØbÀÐfÀÆhÀÅhÀÏfÀ×bÀã^ÀéZÀóTÀùNÀAÀHÀGÀBÀOÀüSÀôYÀê]Àä_ÀØeÀÐiÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóOÀûGÀAÀAÀGÀùMÀóSÀëYÀá]ÀÙaÀÍeÀÅgÀ;PM1PEÖ¿ÄeÀÐcÀÚ_ÀâYÀêWÀòQÀúMÀþGÀHÀýNÀùRÀñXÀé\Àá`ÀÙbÀÏfÀÃfÀÄdÀÐ`ÀÚ\ÀâXÀêRÀòLÀúHÀþ@ÀHÀúNÀòRÀêXÀâZÀÚ`ÀÎdÀÆfÀÅfÀÍdÀÙ`Àá\ÀéVÀñTÀùLÀ?ÀHÀGÀ@ÀKÀúQÀòWÀê[Àâ_ÀØcÀÐeÀÆeÀÅaÀÏ_À×[ÀáWÀéQÀñMÀùGÀ?ÀýGÀùKÀñSÀéUÀá[ÀÙ_ÀÏcÀÃeÀ;PM1PE;PM2FPPE=<UmÀEFÀ;PM0PEÄeÀÐcÀÚ_ÀâYÀêWÀòQÀúMÀþGÀHÀýNÀùRÀñXÀé\Àá`ÀÙbÀÏfÀÃfÀÄdÀÐ`ÀÚ\ÀâXÀêRÀòLÀúHÀþ@ÀHÀúNÀòRÀêXÀâZÀÚ`ÀÎdÀÆfÀÅfÀÍdÀÙ`Àá\ÀéVÀñTÀùLÀ?ÀHÀGÀ@ÀKÀúQÀòWÀê[Àâ_ÀØcÀÐeÀÆeÀÅaÀÏ_À×[ÀáWÀéQÀñMÀùGÀ?ÀýGÀùKÀñSÀéUÀá[ÀÙ_ÀÏcÀÃeÀ;PM1PEÖ¿ÆcÀÐ_ÀØ]ÀàYÀèUÀòOÀøIÀ@ÀEÀFÀ?ÀJÀ÷RÀñTÀçZÀß^À×bÀÏbÀÅdÀÆbÀÐ^ÀØZÀàTÀèRÀòJÀøFÀ@À@ÀFÀøJÀòPÀèVÀàZÀØ^ÀÐ`ÀÄdÀÃdÀÏbÀ×\ÀßZÀçVÀñRÀ÷JÀ?ÀFÀEÀ@ÀIÀøQÀðSÀêYÀà]ÀØaÀÐcÀÄaÀÃaÀÏ]À×YÀßSÀéQÀïIÀ÷EÀ?À?ÀEÀ÷IÀñQÀçUÀßYÀ×[ÀÏaÀÅcÀ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<?mÀEFÀ;PM0PEÆcÀÐ_ÀØ]ÀàYÀèUÀòOÀøIÀ@ÀEÀFÀ?ÀJÀ÷RÀñTÀçZÀß^À×bÀÏbÀÅdÀÆbÀÐ^ÀØZÀàTÀèRÀòJÀøFÀ@À@ÀFÀøJÀòPÀèVÀàZÀØ^ÀÐ`ÀÄdÀÃdÀÏbÀ×\ÀßZÀçVÀñRÀ÷JÀ?ÀFÀEÀ@ÀIÀøQÀðSÀêYÀà]ÀØaÀÐcÀÄaÀÃaÀÏ]À×YÀßSÀéQÀïIÀ÷EÀ?À?ÀEÀ÷IÀñQÀçUÀßYÀ×[ÀÏaÀÅcÀ;PM1PEÖ¿Æ_ÀÎ_ÀØ[ÀàWÀèSÀðMÀöIÀþCÀDÀýJÀõNÀïTÀçXÀß\À×`ÀÍ`ÀÅbÀÆ`ÀÎ\ÀØVÀàTÀèPÀðJÀöBÀþþDÀøJÀðNÀèTÀàXÀØ\ÀÎ`ÀÆ`ÀÅbÀÍ`À×ZÀßXÀçTÀïPÀ÷HÀýDÀAÀþIÀøOÀðSÀèUÀà[ÀØ_ÀÎaÀÄ_ÀÃ_ÀÍ[À×WÀßSÀçMÀïIÀ÷CÀýýCÀõGÀïOÀçSÀßWÀ×YÀÍ_ÀÅaÀ;PM1PE;PM2FPPE=<ilÀEFÀ;PM0PEÆ_ÀÎ_ÀØ[ÀàWÀèSÀðMÀöIÀþCÀDÀýJÀõNÀïTÀçXÀß\À×`ÀÍ`ÀÅbÀÆ`ÀÎ\ÀØVÀàTÀèPÀðJÀöBÀþþDÀøJÀðNÀèTÀàXÀØ\ÀÎ`ÀÆ`ÀÅbÀÍ`À×ZÀßXÀçTÀïPÀ÷HÀýDÀAÀþIÀøOÀðSÀèUÀà[ÀØ_ÀÎaÀÄ_ÀÃ_ÀÍ[À×WÀßSÀçMÀïIÀ÷CÀýýCÀõGÀïOÀçSÀßWÀ×YÀÍ_ÀÅaÀ;PM1PEØ¿Ä]ÀÎ]ÀØWÀÞWÀèOÀîMÀöGÀüAÀBÀûHÀõNÀíRÀçVÀÝXÀ×^ÀÍ^ÀÃ`ÀÄ^ÀÎXÀØVÀÞRÀèLÀîHÀöBÀüüBÀöHÀðNÀèPÀÞXÀØXÀÎ^ÀÄ^ÀÃ`ÀÍ\À×ZÀÝVÀçRÀïLÀõHÀûBÀAÀüGÀöKÀðQÀæUÀàWÀÖ]ÀÐ_ÀÄ]ÀÃ]ÀÏWÀÕUÀßQÀåMÀïGÀõAÀûûAÀõGÀíKÀçQÀÝUÀ×YÀÍ[ÀÃ_À;PM1PE;PM2FPPE=<QlÀEFÀ;PM0PEÄ]ÀÎ]ÀØWÀÞWÀèOÀîMÀöGÀüAÀBÀûHÀõNÀíRÀçVÀÝXÀ×^ÀÍ^ÀÃ`ÀÄ^ÀÎXÀØVÀÞRÀèLÀîHÀöBÀüüBÀöHÀðNÀèPÀÞXÀØXÀÎ^ÀÄ^ÀÃ`ÀÍ\À×ZÀÝVÀçRÀïLÀõHÀûBÀAÀüGÀöKÀðQÀæUÀàWÀÖ]ÀÐ_ÀÄ]ÀÃ]ÀÏWÀÕUÀßQÀåMÀïGÀõAÀûûAÀõGÀíKÀçQÀÝUÀ×YÀÍ[ÀÃ_À;PM1PEÔ¿Æ]ÀÌYÀØUÀÞSÀèOÀìKÀöCÀúAÀBÀùDÀõLÀëPÀçTÀÝXÀ×ZÀË\ÀÅ^ÀÆZÀÌXÀØTÀÞPÀèJÀìFÀöBÀúúBÀôDÀîLÀæPÀàTÀÖVÀÎZÀÄ^ÀÃ^ÀÍZÀÕXÀßTÀåNÀíLÀóFÀù@ÀAÀüEÀôIÀîOÀæSÀàWÀÖYÀÎ]ÀÄ[ÀÃYÀÍWÀÕSÀßOÀåKÀíCÀóAÀûù?ÀõEÀëKÀçMÀÝSÀ×WÀËYÀÅ]À;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<}kÀEFÀ;PM0PEÆ]ÀÌYÀØUÀÞSÀèOÀìKÀöCÀúAÀBÀùDÀõLÀëPÀçTÀÝXÀ×ZÀË\ÀÅ^ÀÆZÀÌXÀØTÀÞPÀèJÀìFÀöBÀúúBÀôDÀîLÀæPÀàTÀÖVÀÎZÀÄ^ÀÃ^ÀÍZÀÕXÀßTÀåNÀíLÀóFÀù@ÀAÀüEÀôIÀîOÀæSÀàWÀÖYÀÎ]ÀÄ[ÀÃYÀÍWÀÕSÀßOÀåKÀíCÀóAÀûù?ÀõEÀëKÀçMÀÝSÀ×WÀËYÀÅ]À;PM1PEØ¿ÄYÀÎWÀÖUÀÞQÀäMÀîGÀòCÀú?À@ÀùDÀñJÀíNÀãPÀÝVÀÕXÀÍZÀÃ\ÀÄXÀÎTÀÖRÀÞNÀäJÀîDÀò@Àúú@ÀòDÀîHÀäNÀÞRÀÖVÀÎXÀÄZÀÃ\ÀÍXÀÕTÀÝRÀãNÀíJÀñDÀù@À?ÀøCÀôIÀìMÀæQÀÞSÀÖWÀÌ[ÀÆYÀÅWÀËUÀÕOÀÝMÀåIÀëCÀó?À÷ù?ÀñCÀíIÀãMÀÝQÀÕSÀÍWÀÃ[À;PM1PE;PM2FPPE=<ekÀEFÀ;PM0PEÄYÀÎWÀÖUÀÞQÀäMÀîGÀòCÀú?À@ÀùDÀñJÀíNÀãPÀÝVÀÕXÀÍZÀÃ\ÀÄXÀÎTÀÖRÀÞNÀäJÀîDÀò@Àúú@ÀòDÀîHÀäNÀÞRÀÖVÀÎXÀÄZÀÃ\ÀÍXÀÕTÀÝRÀãNÀíJÀñDÀù@À?ÀøCÀôIÀìMÀæQÀÞSÀÖWÀÌ[ÀÆYÀÅWÀËUÀÕOÀÝMÀåIÀëCÀó?À÷ù?ÀñCÀíIÀãMÀÝQÀÕSÀÍWÀÃ[À;PM1PEÖ¿ÄWÀÎUÀÔSÀÞMÀäKÀìGÀòCÀøûü÷DÀñHÀëLÀãNÀÝTÀÓVÀÍXÀÃZÀÄVÀÎRÀÔPÀÞLÀäHÀìBÀòþøøüòDÀìHÀäLÀÜNÀÖTÀÎVÀÄXÀÃZÀÍVÀÕRÀÛPÀãLÀëHÀñBÀ÷þýøAÀòGÀìKÀäOÀÜQÀÖUÀÎYÀÄWÀÃUÀÍSÀÕMÀÛKÀãGÀëCÀñû÷÷ýñAÀëGÀãKÀÝOÀÓQÀÍUÀÃYÀ;PM1PE;PM2FPPE=<OkÀEFÀ;PM0PEÄWÀÎUÀÔSÀÞMÀäKÀìGÀòCÀøûü÷DÀñHÀëLÀãNÀÝTÀÓVÀÍXÀÃZÀÄVÀÎRÀÔPÀÞLÀäHÀìBÀòþøøüòDÀìHÀäLÀÜNÀÖTÀÎVÀÄXÀÃZÀÍVÀÕRÀÛPÀãLÀëHÀñBÀ÷þýøAÀòGÀìKÀäOÀÜQÀÖUÀÎYÀÄWÀÃUÀÍSÀÕMÀÛKÀãGÀëCÀñû÷÷ýñAÀëGÀãKÀÝOÀÓQÀÍUÀÃYÀ;PM1PEÖ¿ÄUÀÌSÀÖOÀÜMÀäIÀêEÀò?ÀöûüõBÀñDÀéJÀãNÀÛPÀÕTÀËVÀÃXÀÄTÀÌPÀÖNÀÜHÀäFÀêBÀòüööüò@ÀêFÀäJÀÜNÀÔPÀÌTÀÆVÀÅVÀËTÀÓRÀÛNÀãHÀéFÀñ@ÀõüûøAÀòEÀêGÀäMÀÚOÀÖSÀÌWÀÆUÀÅSÀËOÀÕMÀÙIÀãCÀéAÀñû÷õûñ?ÀéEÀãGÀÛMÀÕQÀËSÀÃUÀ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<yjÀEFÀ;PM0PEÄUÀÌSÀÖOÀÜMÀäIÀêEÀò?ÀöûüõBÀñDÀéJÀãNÀÛPÀÕTÀËVÀÃXÀÄTÀÌPÀÖNÀÜHÀäFÀêBÀòüööüò@ÀêFÀäJÀÜNÀÔPÀÌTÀÆVÀÅVÀËTÀÓRÀÛNÀãHÀéFÀñ@ÀõüûøAÀòEÀêGÀäMÀÚOÀÖSÀÌWÀÆUÀÅSÀËOÀÕMÀÙIÀãCÀéAÀñû÷õûñ?ÀéEÀãGÀÛMÀÕQÀËSÀÃUÀ;PM1PEÖ¿ÄSÀÌQÀÔMÀÜKÀäGÀèCÀðýôûüó@ÀïBÀçHÀãLÀÛPÀÓPÀËTÀÃTÀÄRÀÌPÀÔLÀÜHÀäBÀè@ÀðúôöüðþèDÀäHÀÚLÀÖNÀÌRÀÄTÀÃTÀËRÀÕPÀÙJÀãHÀçDÀï@Àõúùö?ÀðAÀèGÀâKÀÜOÀÔQÀÌSÀÆSÀÅOÀËOÀÓKÀÛGÀáAÀç?Àïûõóùï?ÀçCÀãGÀÛIÀÓOÀËQÀÃSÀ;PM1PE;PM2FPPE=<cjÀEFÀ;PM0PEÄSÀÌQÀÔMÀÜKÀäGÀèCÀðýôûüó@ÀïBÀçHÀãLÀÛPÀÓPÀËTÀÃTÀÄRÀÌPÀÔLÀÜHÀäBÀè@ÀðúôöüðþèDÀäHÀÚLÀÖNÀÌRÀÄTÀÃTÀËRÀÕPÀÙJÀãHÀçDÀï@Àõúùö?ÀðAÀèGÀâKÀÜOÀÔQÀÌSÀÆSÀÅOÀËOÀÓKÀÛGÀáAÀç?Àïûõóùï?ÀçCÀãGÀÛIÀÓOÀËQÀÃSÀ;PM1PEÖ¿ÄQÀÎMÀÒMÀÚGÀäGÀèAÀìûôùúóþëBÀçFÀãJÀÙLÀÑPÀÍPÀÃRÀÄPÀÎLÀÒJÀÚFÀäBÀèþìøôôúîüèBÀâHÀÜHÀÒNÀÎNÀÄRÀÃRÀÍPÀÑLÀÛJÀáFÀçBÀíþóø÷ôýîAÀèEÀâIÀÚKÀÔOÀÎQÀÂOÀÁOÀÍKÀÓIÀÙEÀáAÀçýíùóó÷ëýçAÀãEÀÙIÀÑKÀÍOÀÃQÀ;PM1PE;PM2FPPE=<MjÀEFÀ;PM0PEÄQÀÎMÀÒMÀÚGÀäGÀèAÀìûôùúóþëBÀçFÀãJÀÙLÀÑPÀÍPÀÃRÀÄPÀÎLÀÒJÀÚFÀäBÀèþìøôôúîüèBÀâHÀÜHÀÒNÀÎNÀÄRÀÃRÀÍPÀÑLÀÛJÀáFÀçBÀíþóø÷ôýîAÀèEÀâIÀÚKÀÔOÀÎQÀÂOÀÁOÀÍKÀÓIÀÙEÀáAÀçýíùóó÷ëýçAÀãEÀÙIÀÑKÀÍOÀÃQÀ;PM1PEÖ¿ÄMÀÌMÀÒKÀÜEÀàCÀèAÀìûòõøñüë@ÀçDÀßHÀÛJÀÑNÀËNÀÃPÀÄNÀÌJÀÒHÀÜDÀà@ÀèüìøòòöìüèBÀàDÀÚFÀÔLÀÌNÀÄNÀÃPÀËNÀÓJÀÙFÀßFÀç@Àëüñø÷òûì?ÀèCÀàGÀÚIÀÔMÀÌOÀÄMÀÃMÀËIÀÓGÀÙCÀß?Àçûë÷ññ÷ëûç?ÀßEÀÛEÀÑIÀËMÀÃOÀ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<wiÀEFÀ;PM0PEÄMÀÌMÀÒKÀÜEÀàCÀèAÀìûòõøñüë@ÀçDÀßHÀÛJÀÑNÀËNÀÃPÀÄNÀÌJÀÒHÀÜDÀà@ÀèüìøòòöìüèBÀàDÀÚFÀÔLÀÌNÀÄNÀÃPÀËNÀÓJÀÙFÀßFÀç@Àëüñø÷òûì?ÀèCÀàGÀÚIÀÔMÀÌOÀÄMÀÃMÀËIÀÓGÀÙCÀß?Àçûë÷ññ÷ëûç?ÀßEÀÛEÀÑIÀËMÀÃOÀ;PM1PEÖ¿ÄKÀÌKÀÒGÀÚEÀàAÀæýìùðõöïúëþåBÀßFÀÙHÀÑLÀËLÀÃNÀÄLÀÌHÀÒDÀÚBÀà@ÀæøìöðòöìúæþÞBÀÜFÀÒHÀÌLÀÂLÀÁNÀËJÀÑHÀÛFÀÝBÀåþëúñöõò÷ê?ÀèAÀÞCÀÚGÀÒKÀÌMÀÄKÀÃKÀËGÀÑEÀÙAÀÝýçùéõñïõëùåýßAÀÙEÀÑGÀËIÀÃMÀ;PM1PE;PM2FPPE=<aiÀEFÀ;PM0PEÄKÀÌKÀÒGÀÚEÀàAÀæýìùðõöïúëþåBÀßFÀÙHÀÑLÀËLÀÃNÀÄLÀÌHÀÒDÀÚBÀà@ÀæøìöðòöìúæþÞBÀÜFÀÒHÀÌLÀÂLÀÁNÀËJÀÑHÀÛFÀÝBÀåþëúñöõò÷ê?ÀèAÀÞCÀÚGÀÒKÀÌMÀÄKÀÃKÀËGÀÑEÀÙAÀÝýçùéõñïõëùåýßAÀÙEÀÑGÀËIÀÃMÀ;PM1PEÖ¿ÄIÀÊIÀÔEÀØCÀàýäýê÷ðóôïøéþã@ÀßBÀ×HÀÓHÀÉJÀÃLÀÄHÀÊHÀÔBÀØ@ÀàþäøêôððôêøäþàþØDÀÒFÀÌJÀÄJÀÃJÀËJÀÑFÀ×DÀß@Àãüéúïòóð÷êýæ?ÀàAÀØGÀÒGÀÌKÀÂIÀÁGÀËGÀÑAÀ×?Àßýå÷éóïïñéùãûß?À×CÀÓEÀÉIÀÃIÀ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<KiÀEFÀ;PM0PEÄIÀÊIÀÔEÀØCÀàýäýê÷ðóôïøéþã@ÀßBÀ×HÀÓHÀÉJÀÃLÀÄHÀÊHÀÔBÀØ@ÀàþäøêôððôêøäþàþØDÀÒFÀÌJÀÄJÀÃJÀËJÀÑFÀ×DÀß@Àãüéúïòóð÷êýæ?ÀàAÀØGÀÒGÀÌKÀÂIÀÁGÀËGÀÑAÀ×?Àßýå÷éóïïñéùãûß?À×CÀÓEÀÉIÀÃIÀ;PM1PEØ¿ÂGÀÌEÀÒCÀØAÀÞýâùê÷îñòíøéúáþÝBÀ×DÀÑFÀËHÀÁJÀÂFÀÌDÀÒBÀØþÞúâøêòîîòêøâúÞþØBÀÒDÀÊFÀÄHÀÃJÀÉFÀÑDÀ×BÀÝüáüéöíôñì÷êùäýÞAÀØCÀÒEÀÊIÀÄGÀÃEÀÉCÀÑAÀ×ýÝùã÷éñëíóéõáûÝû×AÀÑCÀËEÀÁIÀ;PM1PE;PM2FPPE=<shÀEFÀ;PM0PEÂGÀÌEÀÒCÀØAÀÞýâùê÷îñòíøéúáþÝBÀ×DÀÑFÀËHÀÁJÀÂFÀÌDÀÒBÀØþÞúâøêòîîòêøâúÞþØBÀÒDÀÊFÀÄHÀÃJÀÉFÀÑDÀ×BÀÝüáüéöíôñì÷êùäýÞAÀØCÀÒEÀÊIÀÄGÀÃEÀÉCÀÑAÀ×ýÝùã÷éñëíóéõáûÝû×AÀÑCÀËEÀÁIÀ;PM1PEÖ¿ÄEÀÊCÀÒAÀÖ?ÀÜûä÷èõìïðëöçúãüÛþÕBÀÑDÀÉFÀÃHÀÄBÀÊBÀÒ@ÀÖüÜøäöèðìîðèöâøÞüÖ@ÀÒBÀÊDÀÄFÀÃHÀÉBÀÑBÀÕ@ÀÝüáøçöíðïîõè÷âûÞ?ÀÖAÀÐAÀÌGÀÄEÀÃCÀËAÀÏýÕûÝùáõçïíëïçõã÷ÛûÕ?ÀÑAÀÉAÀÃGÀ;PM1PE;PM2FPPE=<]hÀEFÀ;PM0PEÄEÀÊCÀÒAÀÖ?ÀÜûä÷èõìïðëöçúãüÛþÕBÀÑDÀÉFÀÃHÀÄBÀÊBÀÒ@ÀÖüÜøäöèðìîðèöâøÞüÖ@ÀÒBÀÊDÀÄFÀÃHÀÉBÀÑBÀÕ@ÀÝüáøçöíðïîõè÷âûÞ?ÀÖAÀÐAÀÌGÀÄEÀÃCÀËAÀÏýÕûÝùáõçïíëïçõã÷ÛûÕ?ÀÑAÀÉAÀÃGÀ;PM1PEÖ¿ÄCÀÈAÀÒ?ÀÖûÜûâõæóìïîéôåöáüÛüÕ@ÀÑBÀÇDÀÃFÀÄBÀÈþÒþÖúÜøâôæîêìðæôâöÜüÖüÐ@ÀÊBÀÄDÀÃDÀÉBÀÏ@ÀÕþÛúáøåôëîíìóæ÷âùÚýØýÐAÀÊEÀÄCÀÃAÀÉ?ÀÏû×ûÙõáóåíëëíåóá÷ÛùÕýÑ?ÀÇAÀÃCÀ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,1FPPE=<GhÀEFÀ;PM0PEÄCÀÈAÀÒ?ÀÖûÜûâõæóìïîéôåöáüÛüÕ@ÀÑBÀÇDÀÃFÀÄBÀÈþÒþÖúÜøâôæîêìðæôâöÜüÖüÐ@ÀÊBÀÄDÀÃDÀÉBÀÏ@ÀÕþÛúáøåôëîíìóæ÷âùÚýØýÐAÀÊEÀÄCÀÃAÀÉ?ÀÏû×ûÙõáóåíëëíåóá÷ÛùÕýÑ?ÀÇAÀÃCÀ;PM1PEÖ¿ÄAÀÊ?ÀÐûÔûÜ÷àõæïèïðçðåößøÛüÓþÏþÉBÀÃBÀÄ@ÀÊþÐüÔøÜôàòæîèêðäðâöÚøÖüÐüÊ@ÀÄBÀÃBÀÉ@ÀÏþÕüÙøáôãòéîíêñäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁýÉýÏûÕ÷ÛõßïãïéçíåñßóÛ÷ÓûÏýÉ?ÀÃAÀ;PM1PE;PM2FPPE=<qgÀEFÀ;PM0PEÄAÀÊ?ÀÐûÔûÜ÷àõæïèïðçðåößøÛüÓþÏþÉBÀÃBÀÄ@ÀÊþÐüÔøÜôàòæîèêðäðâöÚøÖüÐüÊ@ÀÄBÀÃBÀÉ@ÀÏþÕüÙøáôãòéîíêñäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁýÉýÏûÕ÷ÛõßïãïéçíåñßóÛ÷ÓûÏýÉ?ÀÃAÀ;PM1PEÖ¿Ä?ÀÊûÎûÖùÚõÞóäïèëìçðãôÝöÙúÕüÍþÉþÃ@ÀÄþÊüÎúÖöÚòÞðäîèæìäðàôÚöÖúÎüÊüÄ@ÀÃ@ÀÉþÍüÕøÙößôãðåìíèïäñàõÚùÖûÎýÊ?ÀÄýÃýÉûÍùÕõÙóßïãëççëãïÝóÙõÕ÷ÍûÉýÃ?À;PM1PE;PM2FPPE=<[gÀEFÀ;PM0PEÄ?ÀÊûÎûÖùÚõÞóäïèëìçðãôÝöÙúÕüÍþÉþÃ@ÀÄþÊüÎúÖöÚòÞðäîèæìäðàôÚöÖúÎüÊüÄ@ÀÃ@ÀÉþÍüÕøÙößôãðåìíèïäñàõÚùÖûÎýÊ?ÀÄýÃýÉûÍùÕõÙóßïãëççëãïÝóÙõÕ÷ÍûÉýÃ?À;PM1PEÖ¿ÄûÈûÐùÔ÷ØóÞïäïæéìåîãòÝò×øÓúÏüÇüÃþÄüÈúÐöÔôØòÞîäêæèêâðÞðÚôÔøÎúÊüÂüÁþÉüÍúÓöÙôÝòáîçêéèíâñÞóÚõÔùÎûÈýÄûÃûÇùÍ÷ÓñÙñÝíáëçåéãíÝñ×óÓõÏùÇûÃý;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<EgÀEFÀ;PM0PEÄûÈûÐùÔ÷ØóÞïäïæéìåîãòÝò×øÓúÏüÇüÃþÄüÈúÐöÔôØòÞîäêæèêâðÞðÚôÔøÎúÊüÂüÁþÉüÍúÓöÙôÝòáîçêéèíâñÞóÚõÔùÎûÈýÄûÃûÇùÍ÷ÓñÙñÝíáëçåéãíÝñ×óÓõÏùÇûÃý;PM1PEÖ¿ÂùÊùÎ÷ÔõØñÜíâíæçèåîáîÛô×öÓöÍúÉúÁüÂúÊöÎöÔòØðÜîâèææèàîÞîØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðßìåêçäíâïÞñØõÒõÎùÊûÂùÁùÉõÍõÑó×íÝíáçãåéáëÛï×ñÓõÍ÷É÷Áû;PM1PE;PM2FPPE=<ofÀEFÀ;PM0PEÂùÊùÎ÷ÔõØñÜíâíæçèåîáîÛô×öÓöÍúÉúÁüÂúÊöÎöÔòØðÜîâèææèàîÞîØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðßìåêçäíâïÞñØõÒõÎùÊûÂùÁùÉõÍõÑó×íÝíáçãåéáëÛï×ñÓõÍ÷É÷Áû;PM1PEØ¿Â÷È÷ÎóÒóØïÜíàéäçèãêßîÛð×ôÑöÍöÇøÁúÂöÈöÎòÒðØðÜêàèääèàêÜîØðÒôÎôÈøÂøÁøÇøÍôÑô×ðÛðßêãæçäéâïÚïØñÒõÐõÈùÂ÷ÁõÇõÏóÑï×íÙéáçããåßéÛï×ïÑóÍóÇ÷Á÷;PM1PE;PM2FPPE=<WfÀEFÀ;PM0PEÂ÷È÷ÎóÒóØïÜíàéäçèãêßîÛð×ôÑöÍöÇøÁúÂöÈöÎòÒðØðÜêàèääèàêÜîØðÒôÎôÈøÂøÁøÇøÍôÑô×ðÛðßêãæçäéâïÚïØñÒõÐõÈùÂ÷ÁõÇõÏóÑï×íÙéáçããåßéÛï×ïÑóÍóÇ÷Á÷;PM1PEÔ¿ÄõÈóÌóÒñØíÚëàéâãæãêÝêÙð×ðÑôËôÇöÃöÄöÈôÌðÒðØêÚêÞæäâäàêÚìÖîÒòÎôÈôÂöÁöÇöÍòÑòÕîÙìßêáæåâéàéÚïÖïÒóÎõÈõÂõÁóÇóÍïÑïÕéÙéßåááåßéÙë×íÑñËñÇõÃõ;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<CfÀEFÀ;PM0PEÄõÈóÌóÒñØíÚëàéâãæãêÝêÙð×ðÑôËôÇöÃöÄöÈôÌðÒðØêÚêÞæäâäàêÚìÖîÒòÎôÈôÂöÁöÇöÍòÑòÕîÙìßêáæåâéàéÚïÖïÒóÎõÈõÂõÁóÇóÍïÑïÕéÙéßåááåßéÙë×íÑñËñÇõÃõ;PM1PEØ¿ÂóÈñÌñÒíÔíÜéÜåâãäáèÝêÙìÓîÑòËòÇôÁöÂòÈòÌîÒìÔêÚèÞäââäÜæÚêÖîÒîÌòÈòÂôÁöÇòËðÑðÕìÙêÛèáäãâçÜéÚëÔíÒñÌñÊõÂóÁñÉñËíÑëÓéÙçÛãááãÛçÛéÓëÑïËïÇñÁõ;PM1PE;PM2FPPE=<keÀEFÀ;PM0PEÂóÈñÌñÒíÔíÜéÜåâãäáèÝêÙìÓîÑòËòÇôÁöÂòÈòÌîÒìÔêÚèÞäââäÜæÚêÖîÒîÌòÈòÂôÁöÇòËðÑðÕìÙêÛèáäãâçÜéÚëÔíÒñÌñÊõÂóÁñÉñËíÑëÓéÙçÛãááãÛçÛéÓëÑïËïÇñÁõ;PM1PEÖ¿ÂñÆïÌíÒíÔéÚéÚãâãâßæÛè×êÓîÑîËðÅòÃôÄðÆîÌîÒêÔèØæÜâààäÜäÚêÔêÐîÌîÈðÂòÁòÇðËðÏîÓêÙèÛæßâáàåÜçÚéÔíÐíÌïÈóÂñÁïÇíËíÏéÓçÙåÛáßááÙåÙçÓéÑíËïÅïÁñ;PM1PE;PM2FPPE=<UeÀEFÀ;PM0PEÂñÆïÌíÒíÔéÚéÚãâãâßæÛè×êÓîÑîËðÅòÃôÄðÆîÌîÒêÔèØæÜâààäÜäÚêÔêÐîÌîÈðÂòÁòÇðËðÏîÓêÙèÛæßâáàåÜçÚéÔíÐíÌïÈóÂñÁïÇíËíÏéÓçÙåÛáßááÙåÙçÓéÑíËïÅïÁñ;PM1PEÖ¿ÂïÈíÌëÐéÒéØåÚãÞáâÝäÙæ×êÓêÍîËìÇðÁðÂîÈìÌìÎèÔèØäÚàÞÞâÜäØæÒêÐêÌìÈîÂðÁðÇîËìÏìÑè×æÛäÝâßÞãÚçØçÔëÐëÌíÆïÄïÃëÅíËéÏéÓå×ãÙáÝÝáÙã×åÑçÏëËëÇíÁï;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<?eÀEFÀ;PM0PEÂïÈíÌëÐéÒéØåÚãÞáâÝäÙæ×êÓêÍîËìÇðÁðÂîÈìÌìÎèÔèØäÚàÞÞâÜäØæÒêÐêÌìÈîÂðÁðÇîËìÏìÑè×æÛäÝâßÞãÚçØçÔëÐëÌíÆïÄïÃëÅíËéÏéÓå×ãÙáÝÝáÙã×åÑçÏëËëÇíÁï;PM1PEÖ¿ÂíÈëÊéÎçÔåÖåÚáÜßàÛâÙæÕæÓèÍêËîÅìÁîÂìÆêÌêÎæÔæÖâÚàÜÜàÚâÖæÔæÎèÊêÈìÂîÁîÇìÉêÍêÓæÕäÙäÛÞßÞáØåØåÒéÐéÊëÈíÂëÁíÇéÉçÏåÑå×á×ßÝÛÝÙãÕãÓåÍéÉéÇëÁí;PM1PE;PM2FPPE=<idÀEFÀ;PM0PEÂíÈëÊéÎçÔåÖåÚáÜßàÛâÙæÕæÓèÍêËîÅìÁîÂìÆêÌêÎæÔæÖâÚàÜÜàÚâÖæÔæÎèÊêÈìÂîÁîÇìÉêÍêÓæÕäÙäÛÞßÞáØåØåÒéÐéÊëÈíÂëÁíÇéÉçÏåÑå×á×ßÝÛÝÙãÕãÓåÍéÉéÇëÁí;PM1PEÖ¿ÂéÆéÌéÎåÒåÔáÚßÚÝÞÙàÙäÓäÑæÍêËêÅêÁìÂêÆèÌèÎäÒäÔàÚÞÚÚÞÚàÔâÒæÎæÊêÆêÄêÃìÅêÉèÍæÑæÓâÙâÙÞÝÚßØãÖãÒçÎçÊéÆëÂéÁéÅéÉåÍãÑãÕß×ÝÙÙÝÙáÓáÑåÍåËçÅéÁë;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<SdÀEFÀ;PM0PEÂéÆéÌéÎåÒåÔáÚßÚÝÞÙàÙäÓäÑæÍêËêÅêÁìÂêÆèÌèÎäÒäÔàÚÞÚÚÞÚàÔâÒæÎæÊêÆêÄêÃìÅêÉèÍæÑæÓâÙâÙÞÝÚßØãÖãÒçÎçÊéÆëÂéÁéÅéÉåÍãÑãÕß×ÝÙÙÝÙáÓáÑåÍåËçÅéÁë;PM1PEÖ¿ÂçÆçÊåÎåÐáÔáØÝÚÛÜÛÞÕâÓâÑæËæÉèÅèÁêÂèÆæÊäÌäÒâÔÞÖÜÜÚÜØÞÔâÐâÎæÊæÆèÂèÁêÅæÉèÍäÏäÓà×ÞÙÞÛÚÝÖáÖãÐãÎåÈçÆéÄçÃçÅåÇåÍáÏáÕÝÕÛÙÙÝ×ÝÓßÏãÍãÉçÅåÁé;PM1PE;PM2FPPE=<}cÀEFÀ;PM0PEÂçÆçÊåÎåÐáÔáØÝÚÛÜÛÞÕâÓâÑæËæÉèÅèÁêÂèÆæÊäÌäÒâÔÞÖÜÜÚÜØÞÔâÐâÎæÊæÆèÂèÁêÅæÉèÍäÏäÓà×ÞÙÞÛÚÝÖáÖãÐãÎåÈçÆéÄçÃçÅåÇåÍáÏáÕÝÕÛÙÙÝ×ÝÓßÏãÍãÉçÅåÁé;PM1PEÖ¿ÄåÄåÊãÌáÐáÔÝÖÝØÙÚÙÞÓÞÓâÏäËäÉäÅæÁèÂäÆäÊäÌàÐàÔÜÔÜÚØÚÖÞÔÞÎâÎâÊäÄæÂæÁæÃæÉäÍâÍâÓàÕÜ×ÚÛÚÛÖßÒßÐãÎãÊãÄçÂåÁãÃãÉãÍáÏÝÑÝÕÙÙ×ÙÕÛÓßÏáËáÉãÃåÃå;PM1PE;PM2FPPE=<gcÀEFÀ;PM0PEÄåÄåÊãÌáÐáÔÝÖÝØÙÚÙÞÓÞÓâÏäËäÉäÅæÁèÂäÆäÊäÌàÐàÔÜÔÜÚØÚÖÞÔÞÎâÎâÊäÄæÂæÁæÃæÉäÍâÍâÓàÕÜ×ÚÛÚÛÖßÒßÐãÎãÊãÄçÂåÁãÃãÉãÍáÏÝÑÝÕÙÙ×ÙÕÛÓßÏáËáÉãÃåÃå;PM1PEÖ¿ÂãÆãÈáÌßÐßÒÛÔÛÖÙÚÕÜÓÜÑàÏâËàÇäÅäÁäÂäÆâÈâÌàÐÜÒÜÔØÖØÚÔÜÒÜÐàÌàÈâÄäÄäÃäÃäÇâËâÏÞÑÞÓÜ×Ø×ØÛÔÛÒßÐáÌáÈãÄãÂãÁãÃßÇáËßÏÛÑÛÓÙ×Õ×ÓÛÑÝÏÝËáÇáÅãÁã;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<QcÀEFÀ;PM0PEÂãÆãÈáÌßÐßÒÛÔÛÖÙÚÕÜÓÜÑàÏâËàÇäÅäÁäÂäÆâÈâÌàÐÜÒÜÔØÖØÚÔÜÒÜÐàÌàÈâÄäÄäÃäÃäÇâËâÏÞÑÞÓÜ×Ø×ØÛÔÛÒßÐáÌáÈãÄãÂãÁãÃßÇáËßÏÛÑÛÓÙ×Õ×ÓÛÑÝÏÝËáÇáÅãÁã;PM1PEØ¿¿áÆßÈßÌßÎÛÐÛÔÙÖÕÖÕÚÓÜÏÞÍÞËàÇâÅàÁâÂâÆàÈÞÌÞÎÚÐÜÔÖÖÖÖÒÚÒÜÎÜÊàÊàÆà¿â¿âÅâÉÞÉàÍÜÑÜÑÚÕØÕÖÛÒÙÒÝÎÝÊßÈáÆáÂßÁáÅßÇÝÉÝÍÛÑÙÑÕÕÕ×ÓÙÏÛÍÛËßÇÝÅá¿á;PM1PE;PM2FPPE=<ybÀEFÀ;PM0PE¿áÆßÈßÌßÎÛÐÛÔÙÖÕÖÕÚÓÜÏÞÍÞËàÇâÅàÁâÂâÆàÈÞÌÞÎÚÐÜÔÖÖÖÖÒÚÒÜÎÜÊàÊàÆà¿â¿âÅâÉÞÉàÍÜÑÜÑÚÕØÕÖÛÒÙÒÝÎÝÊßÈáÆáÂßÁáÅßÇÝÉÝÍÛÑÙÑÕÕÕ×ÓÙÏÛÍÛËßÇÝÅá¿á;PM1PEÔ¿ÆýÔùÜõæíîåöÛúÓþÅ@ÀÆúÔôÜðæäîÞöÒúÆþÅþÑüÝôãðïäóÞùÒ?ÀÆýÅùÑõÝíãåïÛóÓûÅý;PM1PE;PM2FPPE=<ebÀEFÀ;PM0PEÆýÔùÜõæíîåöÛúÓþÅ@ÀÆúÔôÜðæäîÞöÒúÆþÅþÑüÝôãðïäóÞùÒ?ÀÆýÅùÑõÝíãåïÛóÓûÅý;PM1PEØ¿ÆùÐõÚñäéêãòÙöÏúÅüÆöÐðÚêääêÜòÐöÆúÅüÏöÛðãêéäïÚõÒûÆùÅõÑñÙéããéÙïÏõÅû;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<MbÀEFÀ;PM0PEÆùÐõÚñäéêãòÙöÏúÅüÆöÐðÚêääêÜòÐöÆúÅüÏöÛðãêéäïÚõÒûÆùÅõÑñÙéããéÙïÏõÅû;PM1PEÖ¿ÆõÎñØíâçæßî×òÏöÅöÆôÐìØèààèØîÐòÆöÅöÏò×îßèçàëØóÐõÆõÅñÏí×åßáç×íÍñÅõ;PM1PE;PM2FPPE=<waÀEFÀ;PM0PEÆõÎñØíâçæßî×òÏöÅöÆôÐìØèààèØîÐòÆöÅöÏò×îßèçàëØóÐõÆõÅñÏí×åßáç×íÍñÅõ;PM1PEÖ¿ÄïÐíÖéÞãäÝê×îÍðÃòÄîÎêØäÞÞäÖêÎîÆðÅòÍîÕêÝäãÞéÖíÎñÆïÅíÍéÕãÝÝãÕéÏíÃñ;PM1PE;PM2FPPE=<aaÀEFÀ;PM0PEÄïÐíÖéÞãäÝê×îÍðÃòÄîÎêØäÞÞäÖêÎîÆðÅòÍîÕêÝäãÞéÖíÎñÆïÅíÍéÕãÝÝãÕéÏíÃñ;PM1PEÖ¿ÄëÎéÔåÜßàÛæÓêÍìÃîÄêÎæÔàÜÜàÔæÎêÄìÃìÍêÓèÛàßÜåÔéÌíÆëÅéËåÓßÛÛßÓçÍéÃë;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<KaÀEFÀ;PM0PEÄëÎéÔåÜßàÛæÓêÍìÃîÄêÎæÔàÜÜàÔæÎêÄìÃìÍêÓèÛàßÜåÔéÌíÆëÅéËåÓßÛÛßÓçÍéÃë;PM1PEÖ¿ÄçÌåÔáØÝÞ×àÑæËèÃêÄäÌâÒÞØØÞÔâÌæÄèÃêËäÓâ×ÞÝØáÔãÌéÂçÁåËßÓÝ××ÝÓáËãÃé;PM1PE;PM2FPPE=<u`ÀEFÀ;PM0PEÄçÌåÔáØÝÞ×àÑæËèÃêÄäÌâÒÞØØÞÔâÌæÄèÃêËäÓâ×ÞÝØáÔãÌéÂçÁåËßÓÝ××ÝÓáËãÃé;PM1PEÖ¿ÄãÊáÒÝÔÙÜÕÞÏàÉäÃäÄâÊÞÐÚÖÖÚÒÞÊâÄäÃäÉâÑÞÕÚÙÖÝÐáÌãÄãÃßËÝÏÛÕÓÙÑÝÉáÃã;PM1PE;PM2FPPE=<_`ÀEFÀ;PM0PEÄãÊáÒÝÔÙÜÕÞÏàÉäÃäÄâÊÞÐÚÖÖÚÒÞÊâÄäÃäÉâÑÞÕÚÙÖÝÐáÌãÄãÃßËÝÏÛÕÓÙÑÝÉáÃã;PM1PEÖ¿ÄÝÈÝÐÙÒ×ØÓÚÍÞÇÞÃàÄÜÈÜÎØÔÒØÎÚÊÞÂÞÁàÉÜÍÚÑØ×ÔÛÎÛÈßÄÝÃÝÇÙÍ×ÓÑ×ÏÙÇÛÃß;PM1PE;PM2RF1,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<I`ÀEFÀ;PM0PEÄÝÈÝÐÙÒ×ØÓÚÍÞÇÞÃàÄÜÈÜÎØÔÒØÎÚÊÞÂÞÁàÉÜÍÚÑØ×ÔÛÎÛÈßÄÝÃÝÇÙÍ×ÓÑ×ÏÙÇÛÃß;PM1PEÖ¿ÂÙÊÙÌÕÐÓÔÑØËØÇÚÁÜÂØÈØÌÔÒÐÔÌÖÈÚÄÚÃÚÇÚËÖÏÖÓÐ×Ì×ÈÛÂÙÁ×Ç×ËÓÏÏÕËÕÉÙÁÙ;PM1PE;PM2FPPE=<s_ÀEFÀ;PM0PEÂÙÊÙÌÕÐÓÔÑØËØÇÚÁÜÂØÈØÌÔÒÐÔÌÖÈÚÄÚÃÚÇÚËÖÏÖÓÐ×Ì×ÈÛÂÙÁ×Ç×ËÓÏÏÕËÕÉÙÁÙ;PM1PEØ¿ÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃØÄÔÆÔÊÐÎÎÐÊÔÆÔÂÖÁØÅÔÉÒÍÒÏÌÓÌÓÆ×ÂÕÁÓÅÓËÏËÍÑÉÑÅÓÁ×;PM1PE;PM2FPPE=<[_ÀEFÀ;PM0PEÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃØÄÔÆÔÊÐÎÎÐÊÔÆÔÂÖÁØÅÔÉÒÍÒÏÌÓÌÓÆ×ÂÕÁÓÅÓËÏËÍÑÉÑÅÓÁ×;PM1PEÔ¿ÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÒÆÐÈÌÊÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎËÊÏÊÑÄÑÂÑÁÏÃÏÉËÉËÍÇÍÃÑÃÑ;PM1PE;PM2RF2,8,8,0,0,0,0,0,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;FT11,2FPPE=<G_ÀEFÀ;PM0PEÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÒÆÐÈÌÊÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎËÊÏÊÑÄÑÂÑÁÏÃÏÉËÉËÍÇÍÃÑÃÑ;PM1PEØ¿¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PE;PM2FPPE=<o^ÀEFÀ;PM0PE¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PEÖ¿ÂÏÊÏÐÉÐÃÒÄÎÊÊÐÄÐÃÒÉÎÍÊÑÄÏÃÏÉÉÍÁÑ;PM1PE;PM2FPPE=<Y^ÀEFÀ;PM0PEÂÏÊÏÐÉÐÃÒÄÎÊÊÐÄÐÃÒÉÎÍÊÑÄÏÃÏÉÉÍÁÑ;PM1PEÖ¿ÂÇÆÇÆÃÈÁÊÂÆÄÆÈÂÈÁÈÅÈÅÄÉÄÇÃÅÃÅÇÁÇ;PM1PE;PM2FT10,0FPPE=<C^ÀEFÀ;PM0PEÂÇÆÇÆÃÈÁÊÂÆÄÆÈÂÈÁÈÅÈÅÄÉÄÇÃÅÃÅÇÁÇ;PM2FPMC1,240PE=<[LÀwBÀ;PM0PEIÀÍEÀËCÀËAÀËAÀÉýËýÉûÉûËùÉùÉ÷ÉõÉ÷Ç÷ËõÉõÉ÷ÉõÉ÷É÷É÷ËùËûÉûËûËýÍ?ÀËAÀÍCÀÍEÀÍGÀÏáÇßÇßÇáÅßÇáÅßÇáÅ×ËÓËÏËÍËÍÉÏËÏÅÓÅÉ¿ÇÂÅ¿ÉÂÇÂÉ¿ËÃÍÁÅÇÃÍÁÑÃÏÇÎÅÊÁÊ¿ÆÂÈÂÈÂÆ¿ÈÊÄÈÂÈÂÈÂÈÂÌÂÎÂÔ¿ÐÈÎÊÎÊÎÊÎÊÐÈÎÈÒÆNÀÔNÀÒLÀÒJÀÒHÀÐFÀÐDÀÐDÀÎBÀÐ@ÀÎBÀÎ@ÀÎþÌ@ÀÎþÎþÎþÎþÎ@ÀÎþÎ@ÀÐ@ÀÎBÀÐBÀÒDÀÐDÀÒFÀÔHÀÒJÀÔLÀÖNÀÖNÀØðÈêÄäÄäÄâ¿àÃâÃâÇÆÑÇÓÕÑÝÏçÑëÍïËíÉ;PM2FTFPMC1,90PE=<{sÀEFÀ;PM0PEÄGÀÄGÀÊGÀÌEÀÐCÀÒCÀØAÀØ?ÀÞ?ÀÞýäùäùè÷êõìóðïðïôëöéøçúãúãþÝ@ÀÝ@À×BÀ×DÀÑDÀÏFÀËHÀÉHÀÃHÀÃJÀÄHÀÄFÀÊHÀÌDÀÐDÀÒBÀØ@ÀØ@ÀÞüÞüäúäøèöêôìððððìôêöèøäúäúÞþÞ@ÀØ@ÀØBÀÒDÀÐDÀÌFÀÊHÀÄHÀÂHÀÁJÀÃHÀÉFÀËHÀÏDÀÑBÀ×BÀ×BÀÝ@ÀÝüãüãøçúéöëòïòïîóîõê÷æùæûâûà?ÀÜ?ÀÚAÀÖCÀÔCÀÐGÀÌEÀÊGÀÄIÀÂGÀÁGÀÃGÀÉEÀËCÀÏCÀÓAÀÕ?ÀÙ?ÀÛýßùáùå÷åõéóíïíïñëñéõçùã÷ãûÝûÝ?À×AÀ×AÀÑAÀÏCÀËGÀÉEÀÃGÀÃIÀ;PM1PEÖ¿ÂGÀÆEÀÈGÀÎCÀÎAÀÔCÀÖ?ÀØ?ÀÜýàûâûä÷æõêõìñîñòíòëöéöåøãüáüßþÛ@À×@ÀÕDÀÓBÀÍFÀÍFÀÇFÀÅHÀÁHÀÂHÀÆFÀÈDÀÎDÀÎDÀÔ@ÀÖ@ÀØþÜüàúâúäöæöêòìðîðòêòêöèöäøâüàüÚþÚ@ÀÖ@ÀÒDÀÐBÀÎDÀÈHÀÄFÀÄHÀÃHÀÃHÀÇFÀÍDÀÏDÀÑBÀÕBÀÙ@ÀÙþßüáúãøçøéôéôïðïðñêõêõèùäùâûÞýÜ?ÀÚ?ÀÖCÀÒCÀÐCÀÎEÀÈGÀÄGÀÂGÀÁEÀÃEÀÇEÀÍAÀÏCÀÑ?ÀÕ?ÀÙýÛûÝûá÷ãõçõéñéñïíïëóéóå÷ã÷áùßûÛý×?ÀÕAÀÓAÀÍCÀÍCÀÇEÀÅGÀÁGÀ;PM1PE;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<esÀEFÀ;PM0PEÂGÀÆEÀÈGÀÎCÀÎAÀÔCÀÖ?ÀØ?ÀÜýàûâûä÷æõêõìñîñòíòëöéöåøãüáüßþÛ@À×@ÀÕDÀÓBÀÍFÀÍFÀÇFÀÅHÀÁHÀÂHÀÆFÀÈDÀÎDÀÎDÀÔ@ÀÖ@ÀØþÜüàúâúäöæöêòìðîðòêòêöèöäøâüàüÚþÚ@ÀÖ@ÀÒDÀÐBÀÎDÀÈHÀÄFÀÄHÀÃHÀÃHÀÇFÀÍDÀÏDÀÑBÀÕBÀÙ@ÀÙþßüáúãøçøéôéôïðïðñêõêõèùäùâûÞýÜ?ÀÚ?ÀÖCÀÒCÀÐCÀÎEÀÈGÀÄGÀÂGÀÁEÀÃEÀÇEÀÍAÀÏCÀÑ?ÀÕ?ÀÙýÛûÝûá÷ãõçõéñéñïíïëóéóå÷ã÷áùßûÛý×?ÀÕAÀÓAÀÍCÀÍCÀÇEÀÅGÀÁGÀ;PM1PEØ¿¿EÀÆEÀÈEÀÌAÀÐCÀÔ?ÀÖ?ÀØýÚýàûàùäõæõêõìïîïðíðëöéöåöãúßüßþÙþ×@ÀÕ@ÀÓDÀÏBÀËFÀÇFÀÅFÀ¿HÀ¿FÀÆDÀÈDÀÌDÀÐ@ÀÔ@ÀÖþØþÚüàøàøäöæôêòìðîîðìðèöèöäöàúÞüÜþØþÖ@ÀÔ@ÀÎDÀÌBÀÊFÀÆFÀ¿FÀ¿HÀÅDÀÉFÀËDÀÍBÀÓBÀÕ@À×þÛüÝüßúãøçöçôëòíðïîñìóèõæ÷ä÷âûÞýÜýØ?ÀÖ?ÀÒCÀÐCÀÌCÀÈEÀÆGÀÂEÀÁEÀÅEÀÇAÀËCÀÏ?ÀÑ?ÀÕý×ýÛûÝùáõãõåõçïëïííïëñéóåõã÷ßùßûÙû×ýÕ?ÀÓAÀÏAÀËCÀÇEÀÅCÀ¿GÀ;PM1PE;PM2FPPE=<MsÀEFÀ;PM0PE¿EÀÆEÀÈEÀÌAÀÐCÀÔ?ÀÖ?ÀØýÚýàûàùäõæõêõìïîïðíðëöéöåöãúßüßþÙþ×@ÀÕ@ÀÓDÀÏBÀËFÀÇFÀÅFÀ¿HÀ¿FÀÆDÀÈDÀÌDÀÐ@ÀÔ@ÀÖþØþÚüàøàøäöæôêòìðîîðìðèöèöäöàúÞüÜþØþÖ@ÀÔ@ÀÎDÀÌBÀÊFÀÆFÀ¿FÀ¿HÀÅDÀÉFÀËDÀÍBÀÓBÀÕ@À×þÛüÝüßúãøçöçôëòíðïîñìóèõæ÷ä÷âûÞýÜýØ?ÀÖ?ÀÒCÀÐCÀÌCÀÈEÀÆGÀÂEÀÁEÀÅEÀÇAÀËCÀÏ?ÀÑ?ÀÕý×ýÛûÝùáõãõåõçïëïííïëñéóåõã÷ßùßûÙû×ýÕ?ÀÓAÀÏAÀËCÀÇEÀÅCÀ¿GÀ;PM1PEÔ¿ÂEÀÆCÀÈCÀÌCÀÐ?ÀÒ?ÀÖ?ÀØýÚûÞùâ÷â÷æóèóìñìíîëòëôçôåøáøáúÝüÙ@À×þÕ@ÀÑBÀÏBÀËDÀÇFÀÅDÀÁFÀÂFÀÆDÀÈBÀÌBÀÐ@ÀÒþÖþØüÚüÞøâøâôæôèðìðììîìòæôèôâøâøÞúÚüØþÖ@ÀÒ@ÀÐ@ÀÌDÀÈDÀÆDÀ¿FÀ¿FÀÅFÀÇBÀËDÀÏ@ÀÑBÀÕþ×þÙüÝüáøáöçöåôëðëðïìïêóèóæ÷ä÷âûÞûÚýØýÖ?ÀÒAÀÎAÀÌCÀÊEÀÆEÀ¿CÀ¿EÀÅCÀÉAÀËAÀÍ?ÀÑýÕ?À×ûÙùÝ÷á÷ãóåóçñéíëëïëïçóåõáõá÷ÝûÙû×ýÕýÑAÀÏ?ÀËCÀÇAÀÅEÀÁEÀ;PM1PE;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<yrÀEFÀ;PM0PEÂEÀÆCÀÈCÀÌCÀÐ?ÀÒ?ÀÖ?ÀØýÚûÞùâ÷â÷æóèóìñìíîëòëôçôåøáøáúÝüÙ@À×þÕ@ÀÑBÀÏBÀËDÀÇFÀÅDÀÁFÀÂFÀÆDÀÈBÀÌBÀÐ@ÀÒþÖþØüÚüÞøâøâôæôèðìðììîìòæôèôâøâøÞúÚüØþÖ@ÀÒ@ÀÐ@ÀÌDÀÈDÀÆDÀ¿FÀ¿FÀÅFÀÇBÀËDÀÏ@ÀÑBÀÕþ×þÙüÝüáøáöçöåôëðëðïìïêóèóæ÷ä÷âûÞûÚýØýÖ?ÀÒAÀÎAÀÌCÀÊEÀÆEÀ¿CÀ¿EÀÅCÀÉAÀËAÀÍ?ÀÑýÕ?À×ûÙùÝ÷á÷ãóåóçñéíëëïëïçóåõáõá÷ÝûÙû×ýÕýÑAÀÏ?ÀËCÀÇAÀÅEÀÁEÀ;PM1PEØ¿¿CÀÆCÀÊAÀÌAÀÎ?ÀÒ?ÀÔýØûÜùÜùà÷äõäóèñêñìíîëòéòçôãöãøßúÛúÛü×þÓ@ÀÑ@ÀÍBÀËDÀÉBÀÅDÀ¿FÀ¿BÀÆDÀÊBÀÌ@ÀÎþÒ@ÀÔüØúÜúÜøàöäôäòèòêììîîêòæòæôâöâøÜúÜúØüÔþÒ@ÀÎ@ÀÌBÀÈBÀÆDÀÂDÀÁDÀÅDÀÇDÀËBÀÍþÑ@ÀÓþ×üÛüÛúáøáöåôåòéðíîëìñêñèóæõâ÷àùÞùÜûØ?ÀÔýÒ?ÀÎAÀÌCÀÈAÀÆEÀÂCÀÁAÀÅCÀÇAÀË?ÀÍ?ÀÑýÓû×ùÛùÝ÷ßõáóåñçñéíëëíéïçñãóãõß÷ÛùÛû×ûÓýÑ?ÀÍýËAÀÉCÀÅCÀ¿CÀ;PM1PE;PM2FPPE=<arÀEFÀ;PM0PE¿CÀÆCÀÊAÀÌAÀÎ?ÀÒ?ÀÔýØûÜùÜùà÷äõäóèñêñìíîëòéòçôãöãøßúÛúÛü×þÓ@ÀÑ@ÀÍBÀËDÀÉBÀÅDÀ¿FÀ¿BÀÆDÀÊBÀÌ@ÀÎþÒ@ÀÔüØúÜúÜøàöäôäòèòêììîîêòæòæôâöâøÜúÜúØüÔþÒ@ÀÎ@ÀÌBÀÈBÀÆDÀÂDÀÁDÀÅDÀÇDÀËBÀÍþÑ@ÀÓþ×üÛüÛúáøáöåôåòéðíîëìñêñèóæõâ÷àùÞùÜûØ?ÀÔýÒ?ÀÎAÀÌCÀÈAÀÆEÀÂCÀÁAÀÅCÀÇAÀË?ÀÍ?ÀÑýÓû×ùÛùÝ÷ßõáóåñçñéíëëíéïçñãóãõß÷ÛùÛû×ûÓýÑ?ÀÍýËAÀÉCÀÅCÀ¿CÀ;PM1PEÖ¿¿AÀÆCÀÈ?ÀÌAÀÎ?ÀÒýÔûØûÚùÞ÷ÞõäõäóèñèïìëìëðçòçôãöãöÝøÝúÙü×üÓ@ÀÑþÍBÀË@ÀÇDÀÅBÀ¿DÀ¿DÀÆ@ÀÈ@ÀÌ@ÀÎþÒþÔúØüÚøÞöÞöäôäðèðèîìììèðèòäôâöàöÜøÜúØüÔüÒþÎ@ÀÊBÀÊ@ÀÆDÀ¿BÀ¿DÀÅBÀÉBÀÉ@ÀÍ@ÀÑþÓþ×úÛüÛøßöáöãôçðçðëîíìïèïèóäõâõà÷ÜûÚùØýÖýÒ?ÀÎ?ÀÊ?ÀÈCÀÆCÀÂAÀÁCÀÅ?ÀÇAÀÉýÍ?ÀÑûÕû×ùÙ÷ÛõßõáóãñçïçëëëíçïçïãóãõÝõÝ÷Ùû×ùÓýÑýÍ?ÀË?ÀÇAÀÅAÀ¿CÀ;PM1PE;PM2FPPE=<KrÀEFÀ;PM0PE¿AÀÆCÀÈ?ÀÌAÀÎ?ÀÒýÔûØûÚùÞ÷ÞõäõäóèñèïìëìëðçòçôãöãöÝøÝúÙü×üÓ@ÀÑþÍBÀË@ÀÇDÀÅBÀ¿DÀ¿DÀÆ@ÀÈ@ÀÌ@ÀÎþÒþÔúØüÚøÞöÞöäôäðèðèîìììèðèòäôâöàöÜøÜúØüÔüÒþÎ@ÀÊBÀÊ@ÀÆDÀ¿BÀ¿DÀÅBÀÉBÀÉ@ÀÍ@ÀÑþÓþ×úÛüÛøßöáöãôçðçðëîíìïèïèóäõâõà÷ÜûÚùØýÖýÒ?ÀÎ?ÀÊ?ÀÈCÀÆCÀÂAÀÁCÀÅ?ÀÇAÀÉýÍ?ÀÑûÕû×ùÙ÷ÛõßõáóãñçïçëëëíçïçïãóãõÝõÝ÷Ùû×ùÓýÑýÍ?ÀË?ÀÇAÀÅAÀ¿CÀ;PM1PEÖ¿ÈCÁÒ}Àà{ÀêwÀøoÀ@ÀiÀJÀaÀTÀ[À\ÀSÀbÀIÀjÀ?ÀrÀ÷vÀé|Àß~ÀÑDÁÇDÁÈ@ÁÒ|ÀàvÀêrÀøhÀ@ÀdÀJÀ\ÀTÀTÀ\ÀJÀbÀ@ÀjÀöpÀìxÀà|ÀÒ~ÀÈDÁÇDÁÑ@Áß|ÀëvÀõpÀ?ÀjÀIÀdÀSÀ\À[ÀTÀcÀJÀgÀ@ÀqÀöuÀì{ÀÞ?ÁÔCÁÈCÁÇ}ÀÓ{ÀÝuÀëqÀõiÀ?ÀaÀIÀ[ÀSÀSÀ[ÀIÀcÀ?ÀiÀ÷oÀéuÀß{ÀÑ?ÁÇCÁ;PM1PE;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<uqÀEFÀ;PM0PEÈCÁÒ}Àà{ÀêwÀøoÀ@ÀiÀJÀaÀTÀ[À\ÀSÀbÀIÀjÀ?ÀrÀ÷vÀé|Àß~ÀÑDÁÇDÁÈ@ÁÒ|ÀàvÀêrÀøhÀ@ÀdÀJÀ\ÀTÀTÀ\ÀJÀbÀ@ÀjÀöpÀìxÀà|ÀÒ~ÀÈDÁÇDÁÑ@Áß|ÀëvÀõpÀ?ÀjÀIÀdÀSÀ\À[ÀTÀcÀJÀgÀ@ÀqÀöuÀì{ÀÞ?ÁÔCÁÈCÁÇ}ÀÓ{ÀÝuÀëqÀõiÀ?ÀaÀIÀ[ÀSÀSÀ[ÀIÀcÀ?ÀiÀ÷oÀéuÀß{ÀÑ?ÁÇCÁ;PM1PEÖ¿ÆAÁÒ}ÀàwÀìsÀômÀ@ÀiÀHÀaÀRÀYÀZÀQÀbÀGÀjÀ?ÀnÀótÀëzÀß~ÀÑ@ÁÅBÁÆ~ÀÒzÀàtÀìnÀôhÀ@ÀdÀHÀZÀRÀPÀZÀJÀbÀ@ÀjÀônÀìtÀÞxÀÔ~ÀÆBÁÅBÁÓ~ÀÝzÀëtÀónÀ?ÀhÀIÀbÀOÀZÀYÀRÀcÀJÀgÀ@ÀmÀôsÀìyÀÞ}ÀÔAÁÆ?ÁÅ}ÀÓyÀÝsÀëmÀóiÀ?ÀaÀIÀYÀQÀQÀYÀGÀaÀ?ÀgÀómÀësÀßyÀÑ}ÀÅAÁ;PM1PE;PM2FPPE=<_qÀEFÀ;PM0PEÆAÁÒ}ÀàwÀìsÀômÀ@ÀiÀHÀaÀRÀYÀZÀQÀbÀGÀjÀ?ÀnÀótÀëzÀß~ÀÑ@ÁÅBÁÆ~ÀÒzÀàtÀìnÀôhÀ@ÀdÀHÀZÀRÀPÀZÀJÀbÀ@ÀjÀônÀìtÀÞxÀÔ~ÀÆBÁÅBÁÓ~ÀÝzÀëtÀónÀ?ÀhÀIÀbÀOÀZÀYÀRÀcÀJÀgÀ@ÀmÀôsÀìyÀÞ}ÀÔAÁÆ?ÁÅ}ÀÓyÀÝsÀëmÀóiÀ?ÀaÀIÀYÀQÀQÀYÀGÀaÀ?ÀgÀómÀësÀßyÀÑ}ÀÅAÁ;PM1PEÖ¿Æ}ÀÔ{ÀÞwÀêqÀôkÀþeÀHÀ_ÀRÀWÀXÀQÀ`ÀGÀfÀýnÀórÀévÀÝ|ÀÓ~ÀÅ@ÁÆ|ÀÔvÀÞrÀênÀôfÀþ`ÀHÀXÀRÀPÀXÀHÀ`À@ÀfÀòlÀêrÀàxÀÔ|ÀÆ~ÀÅ@ÁÓ|ÀßvÀérÀñnÀ?ÀfÀGÀ`ÀOÀXÀWÀPÀ_ÀHÀeÀþmÀôqÀêuÀà{ÀÒ?ÁÆ}ÀÅ{ÀÑuÀßqÀémÀóeÀý_ÀGÀWÀOÀQÀWÀGÀ_ÀýeÀómÀéqÀÝuÀÓ{ÀÅ?Á;PM1PE;PM2FPPE=<IqÀEFÀ;PM0PEÆ}ÀÔ{ÀÞwÀêqÀôkÀþeÀHÀ_ÀRÀWÀXÀQÀ`ÀGÀfÀýnÀórÀévÀÝ|ÀÓ~ÀÅ@ÁÆ|ÀÔvÀÞrÀênÀôfÀþ`ÀHÀXÀRÀPÀXÀHÀ`À@ÀfÀòlÀêrÀàxÀÔ|ÀÆ~ÀÅ@ÁÓ|ÀßvÀérÀñnÀ?ÀfÀGÀ`ÀOÀXÀWÀPÀ_ÀHÀeÀþmÀôqÀêuÀà{ÀÒ?ÁÆ}ÀÅ{ÀÑuÀßqÀémÀóeÀý_ÀGÀWÀOÀQÀWÀGÀ_ÀýeÀómÀéqÀÝuÀÓ{ÀÅ?Á;PM1PEÖ¿Æ{ÀÔyÀÞuÀèmÀôkÀücÀHÀ]ÀNÀWÀXÀMÀ^ÀGÀdÀûlÀópÀçtÀÝzÀÓ|ÀÅ~ÀÆxÀÔvÀÞpÀèjÀôfÀü^ÀHÀVÀNÀPÀXÀFÀ^ÀþdÀôlÀènÀÞvÀÔzÀÆ|ÀÅ~ÀÓxÀÝvÀçpÀójÀýfÀEÀ^ÀOÀVÀUÀPÀ]ÀFÀeÀþiÀôoÀèuÀÞwÀÔ}ÀÆ{ÀÅyÀÓsÀÝoÀçkÀócÀý]ÀEÀWÀOÀMÀUÀGÀ]ÀûeÀóiÀçoÀÝuÀÓwÀÅ}À;PM1PE;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<spÀEFÀ;PM0PEÆ{ÀÔyÀÞuÀèmÀôkÀücÀHÀ]ÀNÀWÀXÀMÀ^ÀGÀdÀûlÀópÀçtÀÝzÀÓ|ÀÅ~ÀÆxÀÔvÀÞpÀèjÀôfÀü^ÀHÀVÀNÀPÀXÀFÀ^ÀþdÀôlÀènÀÞvÀÔzÀÆ|ÀÅ~ÀÓxÀÝvÀçpÀójÀýfÀEÀ^ÀOÀVÀUÀPÀ]ÀFÀeÀþiÀôoÀèuÀÞwÀÔ}ÀÆ{ÀÅyÀÓsÀÝoÀçkÀócÀý]ÀEÀWÀOÀMÀUÀGÀ]ÀûeÀóiÀçoÀÝuÀÓwÀÅ}À;PM1PEÖ¿ÆyÀÒuÀÞsÀêmÀòiÀüaÀDÀ[ÀNÀUÀVÀMÀ\ÀCÀbÀûjÀñnÀétÀÝvÀÑzÀÅ|ÀÆvÀÒtÀÞnÀêjÀòbÀü\ÀDÀVÀNÀNÀVÀDÀ\ÀübÀòjÀènÀÞtÀÒvÀÆzÀÅzÀÑxÀÝrÀçpÀñhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀaÀüiÀòmÀèsÀÞuÀÒ{ÀÆyÀÅuÀÑsÀÝmÀçiÀñaÀû[ÀEÀUÀMÀMÀSÀCÀ[ÀûcÀñgÀéoÀÝqÀÑwÀÅyÀ;PM1PE;PM2FPPE=<]pÀEFÀ;PM0PEÆyÀÒuÀÞsÀêmÀòiÀüaÀDÀ[ÀNÀUÀVÀMÀ\ÀCÀbÀûjÀñnÀétÀÝvÀÑzÀÅ|ÀÆvÀÒtÀÞnÀêjÀòbÀü\ÀDÀVÀNÀNÀVÀDÀ\ÀübÀòjÀènÀÞtÀÒvÀÆzÀÅzÀÑxÀÝrÀçpÀñhÀûdÀCÀ\ÀMÀTÀUÀNÀ[ÀFÀaÀüiÀòmÀèsÀÞuÀÒ{ÀÆyÀÅuÀÑsÀÝmÀçiÀñaÀû[ÀEÀUÀMÀMÀSÀCÀ[ÀûcÀñgÀéoÀÝqÀÑwÀÅyÀ;PM1PEÖ¿ÆwÀÒuÀÞoÀækÀôeÀúaÀDÀ[ÀLÀQÀRÀKÀ\ÀCÀbÀùfÀólÀårÀÝtÀÑxÀÅxÀÆvÀÒrÀÞlÀæfÀôbÀúZÀDÀTÀLÀLÀRÀDÀ\ÀúbÀòfÀèlÀÞpÀÒvÀÆxÀÅxÀÑvÀÝpÀçlÀñhÀùbÀCÀZÀKÀTÀSÀLÀYÀDÀaÀúeÀòkÀèqÀÜuÀÒwÀÆwÀÅsÀÑqÀÛkÀçeÀñaÀù[ÀCÀQÀKÀKÀSÀCÀYÀùaÀógÀåkÀÝoÀÑuÀÅwÀ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<GpÀEFÀ;PM0PEÆwÀÒuÀÞoÀækÀôeÀúaÀDÀ[ÀLÀQÀRÀKÀ\ÀCÀbÀùfÀólÀårÀÝtÀÑxÀÅxÀÆvÀÒrÀÞlÀæfÀôbÀúZÀDÀTÀLÀLÀRÀDÀ\ÀúbÀòfÀèlÀÞpÀÒvÀÆxÀÅxÀÑvÀÝpÀçlÀñhÀùbÀCÀZÀKÀTÀSÀLÀYÀDÀaÀúeÀòkÀèqÀÜuÀÒwÀÆwÀÅsÀÑqÀÛkÀçeÀñaÀù[ÀCÀQÀKÀKÀSÀCÀYÀùaÀógÀåkÀÝoÀÑuÀÅwÀ;PM1PEØ¿ÆuÀÒqÀÚmÀèiÀðeÀü]ÀBÀYÀJÀQÀRÀIÀZÀAÀ^ÀûfÀïjÀçnÀÙtÀÑtÀÅvÀÆtÀÒnÀÚjÀèfÀð^ÀüZÀBÀRÀJÀJÀRÀBÀZÀü^ÀðfÀæjÀÜnÀÒrÀÆvÀÅvÀÑtÀÛnÀåjÀïfÀû^ÀAÀXÀIÀTÀQÀJÀYÀBÀ]ÀúeÀðiÀèmÀÜsÀÒuÀÆsÀÅsÀÑmÀÛiÀçeÀï]ÀùYÀAÀQÀIÀIÀSÀAÀWÀû]ÀïeÀçiÀÙmÀÑsÀÅuÀ;PM1PE;PM2FPPE=<ooÀEFÀ;PM0PEÆuÀÒqÀÚmÀèiÀðeÀü]ÀBÀYÀJÀQÀRÀIÀZÀAÀ^ÀûfÀïjÀçnÀÙtÀÑtÀÅvÀÆtÀÒnÀÚjÀèfÀð^ÀüZÀBÀRÀJÀJÀRÀBÀZÀü^ÀðfÀæjÀÜnÀÒrÀÆvÀÅvÀÑtÀÛnÀåjÀïfÀû^ÀAÀXÀIÀTÀQÀJÀYÀBÀ]ÀúeÀðiÀèmÀÜsÀÒuÀÆsÀÅsÀÑmÀÛiÀçeÀï]ÀùYÀAÀQÀIÀIÀSÀAÀWÀû]ÀïeÀçiÀÙmÀÑsÀÅuÀ;PM1PEÔ¿ÆqÀÒqÀÜkÀægÀðcÀú[À@ÀWÀJÀOÀPÀIÀXÀ?À\ÀùdÀïhÀålÀÛrÀÑrÀÅtÀÆpÀÒnÀÜhÀæbÀð^ÀúXÀ@ÀPÀJÀJÀPÀ@ÀXÀú\ÀðdÀæhÀÜlÀÐrÀÆrÀÅtÀÏpÀÛnÀåfÀïdÀù^À?ÀXÀIÀPÀOÀJÀWÀ@À]ÀúaÀðgÀämÀÞoÀÐsÀÆqÀÅqÀÏkÀÝgÀãcÀï[ÀùWÀ?ÀOÀIÀIÀOÀ?ÀWÀù]ÀïcÀåeÀÛmÀÑoÀÅsÀ;PM1PE;PM2FPPE=<[oÀEFÀ;PM0PEÆqÀÒqÀÜkÀægÀðcÀú[À@ÀWÀJÀOÀPÀIÀXÀ?À\ÀùdÀïhÀålÀÛrÀÑrÀÅtÀÆpÀÒnÀÜhÀæbÀð^ÀúXÀ@ÀPÀJÀJÀPÀ@ÀXÀú\ÀðdÀæhÀÜlÀÐrÀÆrÀÅtÀÏpÀÛnÀåfÀïdÀù^À?ÀXÀIÀPÀOÀJÀWÀ@À]ÀúaÀðgÀämÀÞoÀÐsÀÆqÀÅqÀÏkÀÝgÀãcÀï[ÀùWÀ?ÀOÀIÀIÀOÀ?ÀWÀù]ÀïcÀåeÀÛmÀÑoÀÅsÀ;PM1PEØ¿ÆqÀÐmÀÜiÀæeÀî_Àø[À@ÀUÀFÀOÀPÀEÀVÀ?À\À÷`ÀífÀåjÀÛnÀÏrÀÅrÀÆpÀÐhÀÜfÀæbÀî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀø\Àî`ÀæfÀÜjÀÐnÀÆrÀÅrÀÏnÀÛjÀåfÀíbÀ÷\À?ÀVÀGÀNÀMÀHÀUÀ@À[ÀøaÀîeÀægÀÚoÀÒqÀÆqÀÅmÀÑiÀÙeÀå_Àí[À÷UÀ?ÀOÀGÀEÀMÀ?ÀUÀ÷[ÀíaÀåeÀÛiÀÏmÀÅqÀ;PM1PE;PM2FPPE=<CoÀEFÀ;PM0PEÆqÀÐmÀÜiÀæeÀî_Àø[À@ÀUÀFÀOÀPÀEÀVÀ?À\À÷`ÀífÀåjÀÛnÀÏrÀÅrÀÆpÀÐhÀÜfÀæbÀî\ÀøVÀ@ÀNÀFÀHÀPÀ@ÀVÀø\Àî`ÀæfÀÜjÀÐnÀÆrÀÅrÀÏnÀÛjÀåfÀíbÀ÷\À?ÀVÀGÀNÀMÀHÀUÀ@À[ÀøaÀîeÀægÀÚoÀÒqÀÆqÀÅmÀÑiÀÙeÀå_Àí[À÷UÀ?ÀOÀGÀEÀMÀ?ÀUÀ÷[ÀíaÀåeÀÛiÀÏmÀÅqÀ;PM1PEÖ¿ÆoÀÎkÀÜgÀäcÀð]ÀöYÀþSÀFÀMÀNÀEÀTÀýZÀõ`ÀïbÀãjÀÛlÀÍnÀÅpÀÆlÀÎhÀÜdÀä`ÀðZÀöTÀþNÀFÀFÀNÀþTÀöZÀð^ÀädÀÚhÀÐlÀÆpÀÅpÀÏlÀÙhÀãdÀï`ÀõXÀýTÀEÀNÀMÀHÀSÀþYÀö_ÀîcÀägÀÜkÀÐoÀÆmÀÅkÀÏiÀÛaÀã_ÀíYÀõSÀýMÀGÀEÀMÀýSÀõWÀï_ÀãcÀÛgÀÍkÀÅoÀ;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<mnÀEFÀ;PM0PEÆoÀÎkÀÜgÀäcÀð]ÀöYÀþSÀFÀMÀNÀEÀTÀýZÀõ`ÀïbÀãjÀÛlÀÍnÀÅpÀÆlÀÎhÀÜdÀä`ÀðZÀöTÀþNÀFÀFÀNÀþTÀöZÀð^ÀädÀÚhÀÐlÀÆpÀÅpÀÏlÀÙhÀãdÀï`ÀõXÀýTÀEÀNÀMÀHÀSÀþYÀö_ÀîcÀägÀÜkÀÐoÀÆmÀÅkÀÏiÀÛaÀã_ÀíYÀõSÀýMÀGÀEÀMÀýSÀõWÀï_ÀãcÀÛgÀÍkÀÅoÀ;PM1PEÖ¿ÆkÀÐiÀÚeÀäaÀì[ÀöYÀþQÀFÀIÀJÀEÀRÀýZÀõ\ÀëbÀãfÀÙjÀÏlÀÅnÀÆjÀÐfÀÚbÀä\ÀìZÀöPÀþLÀFÀFÀJÀþRÀöZÀì\ÀäbÀÚfÀÐjÀÆlÀÅnÀÏjÀÙfÀãbÀë\ÀõXÀýRÀEÀLÀKÀFÀOÀüYÀö[ÀîaÀäeÀÚiÀÐmÀÆkÀÅiÀÏeÀÙaÀã[ÀíYÀõQÀûIÀEÀEÀKÀýQÀõWÀë[ÀãaÀÙeÀÏiÀÅmÀ;PM1PE;PM2FPPE=<WnÀEFÀ;PM0PEÆkÀÐiÀÚeÀäaÀì[ÀöYÀþQÀFÀIÀJÀEÀRÀýZÀõ\ÀëbÀãfÀÙjÀÏlÀÅnÀÆjÀÐfÀÚbÀä\ÀìZÀöPÀþLÀFÀFÀJÀþRÀöZÀì\ÀäbÀÚfÀÐjÀÆlÀÅnÀÏjÀÙfÀãbÀë\ÀõXÀýRÀEÀLÀKÀFÀOÀüYÀö[ÀîaÀäeÀÚiÀÐmÀÆkÀÅiÀÏeÀÙaÀã[ÀíYÀõQÀûIÀEÀEÀKÀýQÀõWÀë[ÀãaÀÙeÀÏiÀÅmÀ;PM1PEÖ¿ÄiÀÒgÀØcÀä_Àì[ÀôUÀüOÀDÀIÀJÀCÀPÀûVÀó\Àë`ÀãdÀ×hÀÑjÀÃlÀÄhÀÒdÀØ`ÀäZÀìXÀôPÀüJÀDÀDÀJÀüPÀôVÀì\Àä`ÀØdÀÒhÀÄjÀÃlÀÑhÀ×dÀã`ÀëZÀóVÀûRÀCÀJÀIÀBÀOÀüWÀöYÀì_ÀâcÀÚgÀÐkÀÆiÀÅgÀÏcÀÙ_Àá[ÀëUÀõOÀûIÀAÀCÀIÀûQÀóUÀëYÀã_À×cÀÑgÀÃkÀ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<AnÀEFÀ;PM0PEÄiÀÒgÀØcÀä_Àì[ÀôUÀüOÀDÀIÀJÀCÀPÀûVÀó\Àë`ÀãdÀ×hÀÑjÀÃlÀÄhÀÒdÀØ`ÀäZÀìXÀôPÀüJÀDÀDÀJÀüPÀôVÀì\Àä`ÀØdÀÒhÀÄjÀÃlÀÑhÀ×dÀã`ÀëZÀóVÀûRÀCÀJÀIÀBÀOÀüWÀöYÀì_ÀâcÀÚgÀÐkÀÆiÀÅgÀÏcÀÙ_Àá[ÀëUÀõOÀûIÀAÀCÀIÀûQÀóUÀëYÀã_À×cÀÑgÀÃkÀ;PM1PEÖ¿ÆgÀÎeÀÚaÀâ[ÀìYÀôSÀúOÀBÀGÀHÀAÀPÀùTÀóZÀë^Àá`ÀÙfÀÍhÀÅjÀÆfÀÎ`ÀÚ^ÀâZÀìTÀôPÀúHÀBÀBÀHÀúPÀôTÀêZÀä\ÀØbÀÐfÀÆhÀÅhÀÏfÀ×bÀã^ÀéZÀóTÀùNÀAÀHÀGÀBÀOÀüSÀôYÀê]Àä_ÀØeÀÐiÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóOÀûGÀAÀAÀGÀùMÀóSÀëYÀá]ÀÙaÀÍeÀÅgÀ;PM1PE;PM2FPPE=<kmÀEFÀ;PM0PEÆgÀÎeÀÚaÀâ[ÀìYÀôSÀúOÀBÀGÀHÀAÀPÀùTÀóZÀë^Àá`ÀÙfÀÍhÀÅjÀÆfÀÎ`ÀÚ^ÀâZÀìTÀôPÀúHÀBÀBÀHÀúPÀôTÀêZÀä\ÀØbÀÐfÀÆhÀÅhÀÏfÀ×bÀã^ÀéZÀóTÀùNÀAÀHÀGÀBÀOÀüSÀôYÀê]Àä_ÀØeÀÐiÀÄgÀÃeÀÏ_À×]ÀãYÀéSÀóOÀûGÀAÀAÀGÀùMÀóSÀëYÀá]ÀÙaÀÍeÀÅgÀ;PM1PEÖ¿ÄeÀÐcÀÚ_ÀâYÀêWÀòQÀúMÀþGÀHÀýNÀùRÀñXÀé\Àá`ÀÙbÀÏfÀÃfÀÄdÀÐ`ÀÚ\ÀâXÀêRÀòLÀúHÀþ@ÀHÀúNÀòRÀêXÀâZÀÚ`ÀÎdÀÆfÀÅfÀÍdÀÙ`Àá\ÀéVÀñTÀùLÀ?ÀHÀGÀ@ÀKÀúQÀòWÀê[Àâ_ÀØcÀÐeÀÆeÀÅaÀÏ_À×[ÀáWÀéQÀñMÀùGÀ?ÀýGÀùKÀñSÀéUÀá[ÀÙ_ÀÏcÀÃeÀ;PM1PE;PM2FPPE=<UmÀEFÀ;PM0PEÄeÀÐcÀÚ_ÀâYÀêWÀòQÀúMÀþGÀHÀýNÀùRÀñXÀé\Àá`ÀÙbÀÏfÀÃfÀÄdÀÐ`ÀÚ\ÀâXÀêRÀòLÀúHÀþ@ÀHÀúNÀòRÀêXÀâZÀÚ`ÀÎdÀÆfÀÅfÀÍdÀÙ`Àá\ÀéVÀñTÀùLÀ?ÀHÀGÀ@ÀKÀúQÀòWÀê[Àâ_ÀØcÀÐeÀÆeÀÅaÀÏ_À×[ÀáWÀéQÀñMÀùGÀ?ÀýGÀùKÀñSÀéUÀá[ÀÙ_ÀÏcÀÃeÀ;PM1PEÖ¿ÆcÀÐ_ÀØ]ÀàYÀèUÀòOÀøIÀ@ÀEÀFÀ?ÀJÀ÷RÀñTÀçZÀß^À×bÀÏbÀÅdÀÆbÀÐ^ÀØZÀàTÀèRÀòJÀøFÀ@À@ÀFÀøJÀòPÀèVÀàZÀØ^ÀÐ`ÀÄdÀÃdÀÏbÀ×\ÀßZÀçVÀñRÀ÷JÀ?ÀFÀEÀ@ÀIÀøQÀðSÀêYÀà]ÀØaÀÐcÀÄaÀÃaÀÏ]À×YÀßSÀéQÀïIÀ÷EÀ?À?ÀEÀ÷IÀñQÀçUÀßYÀ×[ÀÏaÀÅcÀ;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<?mÀEFÀ;PM0PEÆcÀÐ_ÀØ]ÀàYÀèUÀòOÀøIÀ@ÀEÀFÀ?ÀJÀ÷RÀñTÀçZÀß^À×bÀÏbÀÅdÀÆbÀÐ^ÀØZÀàTÀèRÀòJÀøFÀ@À@ÀFÀøJÀòPÀèVÀàZÀØ^ÀÐ`ÀÄdÀÃdÀÏbÀ×\ÀßZÀçVÀñRÀ÷JÀ?ÀFÀEÀ@ÀIÀøQÀðSÀêYÀà]ÀØaÀÐcÀÄaÀÃaÀÏ]À×YÀßSÀéQÀïIÀ÷EÀ?À?ÀEÀ÷IÀñQÀçUÀßYÀ×[ÀÏaÀÅcÀ;PM1PEÖ¿Æ_ÀÎ_ÀØ[ÀàWÀèSÀðMÀöIÀþCÀDÀýJÀõNÀïTÀçXÀß\À×`ÀÍ`ÀÅbÀÆ`ÀÎ\ÀØVÀàTÀèPÀðJÀöBÀþþDÀøJÀðNÀèTÀàXÀØ\ÀÎ`ÀÆ`ÀÅbÀÍ`À×ZÀßXÀçTÀïPÀ÷HÀýDÀAÀþIÀøOÀðSÀèUÀà[ÀØ_ÀÎaÀÄ_ÀÃ_ÀÍ[À×WÀßSÀçMÀïIÀ÷CÀýýCÀõGÀïOÀçSÀßWÀ×YÀÍ_ÀÅaÀ;PM1PE;PM2FPPE=<ilÀEFÀ;PM0PEÆ_ÀÎ_ÀØ[ÀàWÀèSÀðMÀöIÀþCÀDÀýJÀõNÀïTÀçXÀß\À×`ÀÍ`ÀÅbÀÆ`ÀÎ\ÀØVÀàTÀèPÀðJÀöBÀþþDÀøJÀðNÀèTÀàXÀØ\ÀÎ`ÀÆ`ÀÅbÀÍ`À×ZÀßXÀçTÀïPÀ÷HÀýDÀAÀþIÀøOÀðSÀèUÀà[ÀØ_ÀÎaÀÄ_ÀÃ_ÀÍ[À×WÀßSÀçMÀïIÀ÷CÀýýCÀõGÀïOÀçSÀßWÀ×YÀÍ_ÀÅaÀ;PM1PEØ¿Ä]ÀÎ]ÀØWÀÞWÀèOÀîMÀöGÀüAÀBÀûHÀõNÀíRÀçVÀÝXÀ×^ÀÍ^ÀÃ`ÀÄ^ÀÎXÀØVÀÞRÀèLÀîHÀöBÀüüBÀöHÀðNÀèPÀÞXÀØXÀÎ^ÀÄ^ÀÃ`ÀÍ\À×ZÀÝVÀçRÀïLÀõHÀûBÀAÀüGÀöKÀðQÀæUÀàWÀÖ]ÀÐ_ÀÄ]ÀÃ]ÀÏWÀÕUÀßQÀåMÀïGÀõAÀûûAÀõGÀíKÀçQÀÝUÀ×YÀÍ[ÀÃ_À;PM1PE;PM2FPPE=<QlÀEFÀ;PM0PEÄ]ÀÎ]ÀØWÀÞWÀèOÀîMÀöGÀüAÀBÀûHÀõNÀíRÀçVÀÝXÀ×^ÀÍ^ÀÃ`ÀÄ^ÀÎXÀØVÀÞRÀèLÀîHÀöBÀüüBÀöHÀðNÀèPÀÞXÀØXÀÎ^ÀÄ^ÀÃ`ÀÍ\À×ZÀÝVÀçRÀïLÀõHÀûBÀAÀüGÀöKÀðQÀæUÀàWÀÖ]ÀÐ_ÀÄ]ÀÃ]ÀÏWÀÕUÀßQÀåMÀïGÀõAÀûûAÀõGÀíKÀçQÀÝUÀ×YÀÍ[ÀÃ_À;PM1PEÔ¿Æ]ÀÌYÀØUÀÞSÀèOÀìKÀöCÀúAÀBÀùDÀõLÀëPÀçTÀÝXÀ×ZÀË\ÀÅ^ÀÆZÀÌXÀØTÀÞPÀèJÀìFÀöBÀúúBÀôDÀîLÀæPÀàTÀÖVÀÎZÀÄ^ÀÃ^ÀÍZÀÕXÀßTÀåNÀíLÀóFÀù@ÀAÀüEÀôIÀîOÀæSÀàWÀÖYÀÎ]ÀÄ[ÀÃYÀÍWÀÕSÀßOÀåKÀíCÀóAÀûù?ÀõEÀëKÀçMÀÝSÀ×WÀËYÀÅ]À;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<}kÀEFÀ;PM0PEÆ]ÀÌYÀØUÀÞSÀèOÀìKÀöCÀúAÀBÀùDÀõLÀëPÀçTÀÝXÀ×ZÀË\ÀÅ^ÀÆZÀÌXÀØTÀÞPÀèJÀìFÀöBÀúúBÀôDÀîLÀæPÀàTÀÖVÀÎZÀÄ^ÀÃ^ÀÍZÀÕXÀßTÀåNÀíLÀóFÀù@ÀAÀüEÀôIÀîOÀæSÀàWÀÖYÀÎ]ÀÄ[ÀÃYÀÍWÀÕSÀßOÀåKÀíCÀóAÀûù?ÀõEÀëKÀçMÀÝSÀ×WÀËYÀÅ]À;PM1PEØ¿ÄYÀÎWÀÖUÀÞQÀäMÀîGÀòCÀú?À@ÀùDÀñJÀíNÀãPÀÝVÀÕXÀÍZÀÃ\ÀÄXÀÎTÀÖRÀÞNÀäJÀîDÀò@Àúú@ÀòDÀîHÀäNÀÞRÀÖVÀÎXÀÄZÀÃ\ÀÍXÀÕTÀÝRÀãNÀíJÀñDÀù@À?ÀøCÀôIÀìMÀæQÀÞSÀÖWÀÌ[ÀÆYÀÅWÀËUÀÕOÀÝMÀåIÀëCÀó?À÷ù?ÀñCÀíIÀãMÀÝQÀÕSÀÍWÀÃ[À;PM1PE;PM2FPPE=<ekÀEFÀ;PM0PEÄYÀÎWÀÖUÀÞQÀäMÀîGÀòCÀú?À@ÀùDÀñJÀíNÀãPÀÝVÀÕXÀÍZÀÃ\ÀÄXÀÎTÀÖRÀÞNÀäJÀîDÀò@Àúú@ÀòDÀîHÀäNÀÞRÀÖVÀÎXÀÄZÀÃ\ÀÍXÀÕTÀÝRÀãNÀíJÀñDÀù@À?ÀøCÀôIÀìMÀæQÀÞSÀÖWÀÌ[ÀÆYÀÅWÀËUÀÕOÀÝMÀåIÀëCÀó?À÷ù?ÀñCÀíIÀãMÀÝQÀÕSÀÍWÀÃ[À;PM1PEÖ¿ÄWÀÎUÀÔSÀÞMÀäKÀìGÀòCÀøûü÷DÀñHÀëLÀãNÀÝTÀÓVÀÍXÀÃZÀÄVÀÎRÀÔPÀÞLÀäHÀìBÀòþøøüòDÀìHÀäLÀÜNÀÖTÀÎVÀÄXÀÃZÀÍVÀÕRÀÛPÀãLÀëHÀñBÀ÷þýøAÀòGÀìKÀäOÀÜQÀÖUÀÎYÀÄWÀÃUÀÍSÀÕMÀÛKÀãGÀëCÀñû÷÷ýñAÀëGÀãKÀÝOÀÓQÀÍUÀÃYÀ;PM1PE;PM2FPPE=<OkÀEFÀ;PM0PEÄWÀÎUÀÔSÀÞMÀäKÀìGÀòCÀøûü÷DÀñHÀëLÀãNÀÝTÀÓVÀÍXÀÃZÀÄVÀÎRÀÔPÀÞLÀäHÀìBÀòþøøüòDÀìHÀäLÀÜNÀÖTÀÎVÀÄXÀÃZÀÍVÀÕRÀÛPÀãLÀëHÀñBÀ÷þýøAÀòGÀìKÀäOÀÜQÀÖUÀÎYÀÄWÀÃUÀÍSÀÕMÀÛKÀãGÀëCÀñû÷÷ýñAÀëGÀãKÀÝOÀÓQÀÍUÀÃYÀ;PM1PEÖ¿ÄUÀÌSÀÖOÀÜMÀäIÀêEÀò?ÀöûüõBÀñDÀéJÀãNÀÛPÀÕTÀËVÀÃXÀÄTÀÌPÀÖNÀÜHÀäFÀêBÀòüööüò@ÀêFÀäJÀÜNÀÔPÀÌTÀÆVÀÅVÀËTÀÓRÀÛNÀãHÀéFÀñ@ÀõüûøAÀòEÀêGÀäMÀÚOÀÖSÀÌWÀÆUÀÅSÀËOÀÕMÀÙIÀãCÀéAÀñû÷õûñ?ÀéEÀãGÀÛMÀÕQÀËSÀÃUÀ;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<yjÀEFÀ;PM0PEÄUÀÌSÀÖOÀÜMÀäIÀêEÀò?ÀöûüõBÀñDÀéJÀãNÀÛPÀÕTÀËVÀÃXÀÄTÀÌPÀÖNÀÜHÀäFÀêBÀòüööüò@ÀêFÀäJÀÜNÀÔPÀÌTÀÆVÀÅVÀËTÀÓRÀÛNÀãHÀéFÀñ@ÀõüûøAÀòEÀêGÀäMÀÚOÀÖSÀÌWÀÆUÀÅSÀËOÀÕMÀÙIÀãCÀéAÀñû÷õûñ?ÀéEÀãGÀÛMÀÕQÀËSÀÃUÀ;PM1PEÖ¿ÄSÀÌQÀÔMÀÜKÀäGÀèCÀðýôûüó@ÀïBÀçHÀãLÀÛPÀÓPÀËTÀÃTÀÄRÀÌPÀÔLÀÜHÀäBÀè@ÀðúôöüðþèDÀäHÀÚLÀÖNÀÌRÀÄTÀÃTÀËRÀÕPÀÙJÀãHÀçDÀï@Àõúùö?ÀðAÀèGÀâKÀÜOÀÔQÀÌSÀÆSÀÅOÀËOÀÓKÀÛGÀáAÀç?Àïûõóùï?ÀçCÀãGÀÛIÀÓOÀËQÀÃSÀ;PM1PE;PM2FPPE=<cjÀEFÀ;PM0PEÄSÀÌQÀÔMÀÜKÀäGÀèCÀðýôûüó@ÀïBÀçHÀãLÀÛPÀÓPÀËTÀÃTÀÄRÀÌPÀÔLÀÜHÀäBÀè@ÀðúôöüðþèDÀäHÀÚLÀÖNÀÌRÀÄTÀÃTÀËRÀÕPÀÙJÀãHÀçDÀï@Àõúùö?ÀðAÀèGÀâKÀÜOÀÔQÀÌSÀÆSÀÅOÀËOÀÓKÀÛGÀáAÀç?Àïûõóùï?ÀçCÀãGÀÛIÀÓOÀËQÀÃSÀ;PM1PEÖ¿ÄQÀÎMÀÒMÀÚGÀäGÀèAÀìûôùúóþëBÀçFÀãJÀÙLÀÑPÀÍPÀÃRÀÄPÀÎLÀÒJÀÚFÀäBÀèþìøôôúîüèBÀâHÀÜHÀÒNÀÎNÀÄRÀÃRÀÍPÀÑLÀÛJÀáFÀçBÀíþóø÷ôýîAÀèEÀâIÀÚKÀÔOÀÎQÀÂOÀÁOÀÍKÀÓIÀÙEÀáAÀçýíùóó÷ëýçAÀãEÀÙIÀÑKÀÍOÀÃQÀ;PM1PE;PM2FPPE=<MjÀEFÀ;PM0PEÄQÀÎMÀÒMÀÚGÀäGÀèAÀìûôùúóþëBÀçFÀãJÀÙLÀÑPÀÍPÀÃRÀÄPÀÎLÀÒJÀÚFÀäBÀèþìøôôúîüèBÀâHÀÜHÀÒNÀÎNÀÄRÀÃRÀÍPÀÑLÀÛJÀáFÀçBÀíþóø÷ôýîAÀèEÀâIÀÚKÀÔOÀÎQÀÂOÀÁOÀÍKÀÓIÀÙEÀáAÀçýíùóó÷ëýçAÀãEÀÙIÀÑKÀÍOÀÃQÀ;PM1PEÖ¿ÄMÀÌMÀÒKÀÜEÀàCÀèAÀìûòõøñüë@ÀçDÀßHÀÛJÀÑNÀËNÀÃPÀÄNÀÌJÀÒHÀÜDÀà@ÀèüìøòòöìüèBÀàDÀÚFÀÔLÀÌNÀÄNÀÃPÀËNÀÓJÀÙFÀßFÀç@Àëüñø÷òûì?ÀèCÀàGÀÚIÀÔMÀÌOÀÄMÀÃMÀËIÀÓGÀÙCÀß?Àçûë÷ññ÷ëûç?ÀßEÀÛEÀÑIÀËMÀÃOÀ;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<wiÀEFÀ;PM0PEÄMÀÌMÀÒKÀÜEÀàCÀèAÀìûòõøñüë@ÀçDÀßHÀÛJÀÑNÀËNÀÃPÀÄNÀÌJÀÒHÀÜDÀà@ÀèüìøòòöìüèBÀàDÀÚFÀÔLÀÌNÀÄNÀÃPÀËNÀÓJÀÙFÀßFÀç@Àëüñø÷òûì?ÀèCÀàGÀÚIÀÔMÀÌOÀÄMÀÃMÀËIÀÓGÀÙCÀß?Àçûë÷ññ÷ëûç?ÀßEÀÛEÀÑIÀËMÀÃOÀ;PM1PEÖ¿ÄKÀÌKÀÒGÀÚEÀàAÀæýìùðõöïúëþåBÀßFÀÙHÀÑLÀËLÀÃNÀÄLÀÌHÀÒDÀÚBÀà@ÀæøìöðòöìúæþÞBÀÜFÀÒHÀÌLÀÂLÀÁNÀËJÀÑHÀÛFÀÝBÀåþëúñöõò÷ê?ÀèAÀÞCÀÚGÀÒKÀÌMÀÄKÀÃKÀËGÀÑEÀÙAÀÝýçùéõñïõëùåýßAÀÙEÀÑGÀËIÀÃMÀ;PM1PE;PM2FPPE=<aiÀEFÀ;PM0PEÄKÀÌKÀÒGÀÚEÀàAÀæýìùðõöïúëþåBÀßFÀÙHÀÑLÀËLÀÃNÀÄLÀÌHÀÒDÀÚBÀà@ÀæøìöðòöìúæþÞBÀÜFÀÒHÀÌLÀÂLÀÁNÀËJÀÑHÀÛFÀÝBÀåþëúñöõò÷ê?ÀèAÀÞCÀÚGÀÒKÀÌMÀÄKÀÃKÀËGÀÑEÀÙAÀÝýçùéõñïõëùåýßAÀÙEÀÑGÀËIÀÃMÀ;PM1PEÖ¿ÄIÀÊIÀÔEÀØCÀàýäýê÷ðóôïøéþã@ÀßBÀ×HÀÓHÀÉJÀÃLÀÄHÀÊHÀÔBÀØ@ÀàþäøêôððôêøäþàþØDÀÒFÀÌJÀÄJÀÃJÀËJÀÑFÀ×DÀß@Àãüéúïòóð÷êýæ?ÀàAÀØGÀÒGÀÌKÀÂIÀÁGÀËGÀÑAÀ×?Àßýå÷éóïïñéùãûß?À×CÀÓEÀÉIÀÃIÀ;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,6FPPE=<KiÀEFÀ;PM0PEÄIÀÊIÀÔEÀØCÀàýäýê÷ðóôïøéþã@ÀßBÀ×HÀÓHÀÉJÀÃLÀÄHÀÊHÀÔBÀØ@ÀàþäøêôððôêøäþàþØDÀÒFÀÌJÀÄJÀÃJÀËJÀÑFÀ×DÀß@Àãüéúïòóð÷êýæ?ÀàAÀØGÀÒGÀÌKÀÂIÀÁGÀËGÀÑAÀ×?Àßýå÷éóïïñéùãûß?À×CÀÓEÀÉIÀÃIÀ;PM1PEØ¿ÂGÀÌEÀÒCÀØAÀÞýâùê÷îñòíøéúáþÝBÀ×DÀÑFÀËHÀÁJÀÂFÀÌDÀÒBÀØþÞúâøêòîîòêøâúÞþØBÀÒDÀÊFÀÄHÀÃJÀÉFÀÑDÀ×BÀÝüáüéöíôñì÷êùäýÞAÀØCÀÒEÀÊIÀÄGÀÃEÀÉCÀÑAÀ×ýÝùã÷éñëíóéõáûÝû×AÀÑCÀËEÀÁIÀ;PM1PE;PM2FPPE=<shÀEFÀ;PM0PEÂGÀÌEÀÒCÀØAÀÞýâùê÷îñòíøéúáþÝBÀ×DÀÑFÀËHÀÁJÀÂFÀÌDÀÒBÀØþÞúâøêòîîòêøâúÞþØBÀÒDÀÊFÀÄHÀÃJÀÉFÀÑDÀ×BÀÝüáüéöíôñì÷êùäýÞAÀØCÀÒEÀÊIÀÄGÀÃEÀÉCÀÑAÀ×ýÝùã÷éñëíóéõáûÝû×AÀÑCÀËEÀÁIÀ;PM1PEÖ¿ÄEÀÊCÀÒAÀÖ?ÀÜûä÷èõìïðëöçúãüÛþÕBÀÑDÀÉFÀÃHÀÄBÀÊBÀÒ@ÀÖüÜøäöèðìîðèöâøÞüÖ@ÀÒBÀÊDÀÄFÀÃHÀÉBÀÑBÀÕ@ÀÝüáøçöíðïîõè÷âûÞ?ÀÖAÀÐAÀÌGÀÄEÀÃCÀËAÀÏýÕûÝùáõçïíëïçõã÷ÛûÕ?ÀÑAÀÉAÀÃGÀ;PM1PE;PM2FPPE=<]hÀEFÀ;PM0PEÄEÀÊCÀÒAÀÖ?ÀÜûä÷èõìïðëöçúãüÛþÕBÀÑDÀÉFÀÃHÀÄBÀÊBÀÒ@ÀÖüÜøäöèðìîðèöâøÞüÖ@ÀÒBÀÊDÀÄFÀÃHÀÉBÀÑBÀÕ@ÀÝüáøçöíðïîõè÷âûÞ?ÀÖAÀÐAÀÌGÀÄEÀÃCÀËAÀÏýÕûÝùáõçïíëïçõã÷ÛûÕ?ÀÑAÀÉAÀÃGÀ;PM1PEÖ¿ÄCÀÈAÀÒ?ÀÖûÜûâõæóìïîéôåöáüÛüÕ@ÀÑBÀÇDÀÃFÀÄBÀÈþÒþÖúÜøâôæîêìðæôâöÜüÖüÐ@ÀÊBÀÄDÀÃDÀÉBÀÏ@ÀÕþÛúáøåôëîíìóæ÷âùÚýØýÐAÀÊEÀÄCÀÃAÀÉ?ÀÏû×ûÙõáóåíëëíåóá÷ÛùÕýÑ?ÀÇAÀÃCÀ;PM1PE;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,7FPPE=<GhÀEFÀ;PM0PEÄCÀÈAÀÒ?ÀÖûÜûâõæóìïîéôåöáüÛüÕ@ÀÑBÀÇDÀÃFÀÄBÀÈþÒþÖúÜøâôæîêìðæôâöÜüÖüÐ@ÀÊBÀÄDÀÃDÀÉBÀÏ@ÀÕþÛúáøåôëîíìóæ÷âùÚýØýÐAÀÊEÀÄCÀÃAÀÉ?ÀÏû×ûÙõáóåíëëíåóá÷ÛùÕýÑ?ÀÇAÀÃCÀ;PM1PEÖ¿ÄAÀÊ?ÀÐûÔûÜ÷àõæïèïðçðåößøÛüÓþÏþÉBÀÃBÀÄ@ÀÊþÐüÔøÜôàòæîèêðäðâöÚøÖüÐüÊ@ÀÄBÀÃBÀÉ@ÀÏþÕüÙøáôãòéîíêñäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁýÉýÏûÕ÷ÛõßïãïéçíåñßóÛ÷ÓûÏýÉ?ÀÃAÀ;PM1PE;PM2FPPE=<qgÀEFÀ;PM0PEÄAÀÊ?ÀÐûÔûÜ÷àõæïèïðçðåößøÛüÓþÏþÉBÀÃBÀÄ@ÀÊþÐüÔøÜôàòæîèêðäðâöÚøÖüÐüÊ@ÀÄBÀÃBÀÉ@ÀÏþÕüÙøáôãòéîíêñäóà÷ÜûÖýÐ?ÀÊAÀÂAÀÁýÉýÏûÕ÷ÛõßïãïéçíåñßóÛ÷ÓûÏýÉ?ÀÃAÀ;PM1PEÖ¿Ä?ÀÊûÎûÖùÚõÞóäïèëìçðãôÝöÙúÕüÍþÉþÃ@ÀÄþÊüÎúÖöÚòÞðäîèæìäðàôÚöÖúÎüÊüÄ@ÀÃ@ÀÉþÍüÕøÙößôãðåìíèïäñàõÚùÖûÎýÊ?ÀÄýÃýÉûÍùÕõÙóßïãëççëãïÝóÙõÕ÷ÍûÉýÃ?À;PM1PE;PM2FPPE=<[gÀEFÀ;PM0PEÄ?ÀÊûÎûÖùÚõÞóäïèëìçðãôÝöÙúÕüÍþÉþÃ@ÀÄþÊüÎúÖöÚòÞðäîèæìäðàôÚöÖúÎüÊüÄ@ÀÃ@ÀÉþÍüÕøÙößôãðåìíèïäñàõÚùÖûÎýÊ?ÀÄýÃýÉûÍùÕõÙóßïãëççëãïÝóÙõÕ÷ÍûÉýÃ?À;PM1PEÖ¿ÄûÈûÐùÔ÷ØóÞïäïæéìåîãòÝò×øÓúÏüÇüÃþÄüÈúÐöÔôØòÞîäêæèêâðÞðÚôÔøÎúÊüÂüÁþÉüÍúÓöÙôÝòáîçêéèíâñÞóÚõÔùÎûÈýÄûÃûÇùÍ÷ÓñÙñÝíáëçåéãíÝñ×óÓõÏùÇûÃý;PM1PE;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,8FPPE=<EgÀEFÀ;PM0PEÄûÈûÐùÔ÷ØóÞïäïæéìåîãòÝò×øÓúÏüÇüÃþÄüÈúÐöÔôØòÞîäêæèêâðÞðÚôÔøÎúÊüÂüÁþÉüÍúÓöÙôÝòáîçêéèíâñÞóÚõÔùÎûÈýÄûÃûÇùÍ÷ÓñÙñÝíáëçåéãíÝñ×óÓõÏùÇûÃý;PM1PEÖ¿ÂùÊùÎ÷ÔõØñÜíâíæçèåîáîÛô×öÓöÍúÉúÁüÂúÊöÎöÔòØðÜîâèææèàîÞîØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðßìåêçäíâïÞñØõÒõÎùÊûÂùÁùÉõÍõÑó×íÝíáçãåéáëÛï×ñÓõÍ÷É÷Áû;PM1PE;PM2FPPE=<ofÀEFÀ;PM0PEÂùÊùÎ÷ÔõØñÜíâíæçèåîáîÛô×öÓöÍúÉúÁüÂúÊöÎöÔòØðÜîâèææèàîÞîØòÒöÐøÈúÄúÃüÇøÏøÑö×òÝðßìåêçäíâïÞñØõÒõÎùÊûÂùÁùÉõÍõÑó×íÝíáçãåéáëÛï×ñÓõÍ÷É÷Áû;PM1PEØ¿Â÷È÷ÎóÒóØïÜíàéäçèãêßîÛð×ôÑöÍöÇøÁúÂöÈöÎòÒðØðÜêàèääèàêÜîØðÒôÎôÈøÂøÁøÇøÍôÑô×ðÛðßêãæçäéâïÚïØñÒõÐõÈùÂ÷ÁõÇõÏóÑï×íÙéáçããåßéÛï×ïÑóÍóÇ÷Á÷;PM1PE;PM2FPPE=<WfÀEFÀ;PM0PEÂ÷È÷ÎóÒóØïÜíàéäçèãêßîÛð×ôÑöÍöÇøÁúÂöÈöÎòÒðØðÜêàèääèàêÜîØðÒôÎôÈøÂøÁøÇøÍôÑô×ðÛðßêãæçäéâïÚïØñÒõÐõÈùÂ÷ÁõÇõÏóÑï×íÙéáçããåßéÛï×ïÑóÍóÇ÷Á÷;PM1PEÔ¿ÄõÈóÌóÒñØíÚëàéâãæãêÝêÙð×ðÑôËôÇöÃöÄöÈôÌðÒðØêÚêÞæäâäàêÚìÖîÒòÎôÈôÂöÁöÇöÍòÑòÕîÙìßêáæåâéàéÚïÖïÒóÎõÈõÂõÁóÇóÍïÑïÕéÙéßåááåßéÙë×íÑñËñÇõÃõ;PM1PE;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,1FPPE=<CfÀEFÀ;PM0PEÄõÈóÌóÒñØíÚëàéâãæãêÝêÙð×ðÑôËôÇöÃöÄöÈôÌðÒðØêÚêÞæäâäàêÚìÖîÒòÎôÈôÂöÁöÇöÍòÑòÕîÙìßêáæåâéàéÚïÖïÒóÎõÈõÂõÁóÇóÍïÑïÕéÙéßåááåßéÙë×íÑñËñÇõÃõ;PM1PEØ¿ÂóÈñÌñÒíÔíÜéÜåâãäáèÝêÙìÓîÑòËòÇôÁöÂòÈòÌîÒìÔêÚèÞäââäÜæÚêÖîÒîÌòÈòÂôÁöÇòËðÑðÕìÙêÛèáäãâçÜéÚëÔíÒñÌñÊõÂóÁñÉñËíÑëÓéÙçÛãááãÛçÛéÓëÑïËïÇñÁõ;PM1PE;PM2FPPE=<keÀEFÀ;PM0PEÂóÈñÌñÒíÔíÜéÜåâãäáèÝêÙìÓîÑòËòÇôÁöÂòÈòÌîÒìÔêÚèÞäââäÜæÚêÖîÒîÌòÈòÂôÁöÇòËðÑðÕìÙêÛèáäãâçÜéÚëÔíÒñÌñÊõÂóÁñÉñËíÑëÓéÙçÛãááãÛçÛéÓëÑïËïÇñÁõ;PM1PEÖ¿ÂñÆïÌíÒíÔéÚéÚãâãâßæÛè×êÓîÑîËðÅòÃôÄðÆîÌîÒêÔèØæÜâààäÜäÚêÔêÐîÌîÈðÂòÁòÇðËðÏîÓêÙèÛæßâáàåÜçÚéÔíÐíÌïÈóÂñÁïÇíËíÏéÓçÙåÛáßááÙåÙçÓéÑíËïÅïÁñ;PM1PE;PM2FPPE=<UeÀEFÀ;PM0PEÂñÆïÌíÒíÔéÚéÚãâãâßæÛè×êÓîÑîËðÅòÃôÄðÆîÌîÒêÔèØæÜâààäÜäÚêÔêÐîÌîÈðÂòÁòÇðËðÏîÓêÙèÛæßâáàåÜçÚéÔíÐíÌïÈóÂñÁïÇíËíÏéÓçÙåÛáßááÙåÙçÓéÑíËïÅïÁñ;PM1PEÖ¿ÂïÈíÌëÐéÒéØåÚãÞáâÝäÙæ×êÓêÍîËìÇðÁðÂîÈìÌìÎèÔèØäÚàÞÞâÜäØæÒêÐêÌìÈîÂðÁðÇîËìÏìÑè×æÛäÝâßÞãÚçØçÔëÐëÌíÆïÄïÃëÅíËéÏéÓå×ãÙáÝÝáÙã×åÑçÏëËëÇíÁï;PM1PE;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<?eÀEFÀ;PM0PEÂïÈíÌëÐéÒéØåÚãÞáâÝäÙæ×êÓêÍîËìÇðÁðÂîÈìÌìÎèÔèØäÚàÞÞâÜäØæÒêÐêÌìÈîÂðÁðÇîËìÏìÑè×æÛäÝâßÞãÚçØçÔëÐëÌíÆïÄïÃëÅíËéÏéÓå×ãÙáÝÝáÙã×åÑçÏëËëÇíÁï;PM1PEÖ¿ÂíÈëÊéÎçÔåÖåÚáÜßàÛâÙæÕæÓèÍêËîÅìÁîÂìÆêÌêÎæÔæÖâÚàÜÜàÚâÖæÔæÎèÊêÈìÂîÁîÇìÉêÍêÓæÕäÙäÛÞßÞáØåØåÒéÐéÊëÈíÂëÁíÇéÉçÏåÑå×á×ßÝÛÝÙãÕãÓåÍéÉéÇëÁí;PM1PE;PM2FPPE=<idÀEFÀ;PM0PEÂíÈëÊéÎçÔåÖåÚáÜßàÛâÙæÕæÓèÍêËîÅìÁîÂìÆêÌêÎæÔæÖâÚàÜÜàÚâÖæÔæÎèÊêÈìÂîÁîÇìÉêÍêÓæÕäÙäÛÞßÞáØåØåÒéÐéÊëÈíÂëÁíÇéÉçÏåÑå×á×ßÝÛÝÙãÕãÓåÍéÉéÇëÁí;PM1PEÖ¿ÂéÆéÌéÎåÒåÔáÚßÚÝÞÙàÙäÓäÑæÍêËêÅêÁìÂêÆèÌèÎäÒäÔàÚÞÚÚÞÚàÔâÒæÎæÊêÆêÄêÃìÅêÉèÍæÑæÓâÙâÙÞÝÚßØãÖãÒçÎçÊéÆëÂéÁéÅéÉåÍãÑãÕß×ÝÙÙÝÙáÓáÑåÍåËçÅéÁë;PM1PE;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<SdÀEFÀ;PM0PEÂéÆéÌéÎåÒåÔáÚßÚÝÞÙàÙäÓäÑæÍêËêÅêÁìÂêÆèÌèÎäÒäÔàÚÞÚÚÞÚàÔâÒæÎæÊêÆêÄêÃìÅêÉèÍæÑæÓâÙâÙÞÝÚßØãÖãÒçÎçÊéÆëÂéÁéÅéÉåÍãÑãÕß×ÝÙÙÝÙáÓáÑåÍåËçÅéÁë;PM1PEÖ¿ÂçÆçÊåÎåÐáÔáØÝÚÛÜÛÞÕâÓâÑæËæÉèÅèÁêÂèÆæÊäÌäÒâÔÞÖÜÜÚÜØÞÔâÐâÎæÊæÆèÂèÁêÅæÉèÍäÏäÓà×ÞÙÞÛÚÝÖáÖãÐãÎåÈçÆéÄçÃçÅåÇåÍáÏáÕÝÕÛÙÙÝ×ÝÓßÏãÍãÉçÅåÁé;PM1PE;PM2FPPE=<}cÀEFÀ;PM0PEÂçÆçÊåÎåÐáÔáØÝÚÛÜÛÞÕâÓâÑæËæÉèÅèÁêÂèÆæÊäÌäÒâÔÞÖÜÜÚÜØÞÔâÐâÎæÊæÆèÂèÁêÅæÉèÍäÏäÓà×ÞÙÞÛÚÝÖáÖãÐãÎåÈçÆéÄçÃçÅåÇåÍáÏáÕÝÕÛÙÙÝ×ÝÓßÏãÍãÉçÅåÁé;PM1PEÖ¿ÄåÄåÊãÌáÐáÔÝÖÝØÙÚÙÞÓÞÓâÏäËäÉäÅæÁèÂäÆäÊäÌàÐàÔÜÔÜÚØÚÖÞÔÞÎâÎâÊäÄæÂæÁæÃæÉäÍâÍâÓàÕÜ×ÚÛÚÛÖßÒßÐãÎãÊãÄçÂåÁãÃãÉãÍáÏÝÑÝÕÙÙ×ÙÕÛÓßÏáËáÉãÃåÃå;PM1PE;PM2FPPE=<gcÀEFÀ;PM0PEÄåÄåÊãÌáÐáÔÝÖÝØÙÚÙÞÓÞÓâÏäËäÉäÅæÁèÂäÆäÊäÌàÐàÔÜÔÜÚØÚÖÞÔÞÎâÎâÊäÄæÂæÁæÃæÉäÍâÍâÓàÕÜ×ÚÛÚÛÖßÒßÐãÎãÊãÄçÂåÁãÃãÉãÍáÏÝÑÝÕÙÙ×ÙÕÛÓßÏáËáÉãÃåÃå;PM1PEÖ¿ÂãÆãÈáÌßÐßÒÛÔÛÖÙÚÕÜÓÜÑàÏâËàÇäÅäÁäÂäÆâÈâÌàÐÜÒÜÔØÖØÚÔÜÒÜÐàÌàÈâÄäÄäÃäÃäÇâËâÏÞÑÞÓÜ×Ø×ØÛÔÛÒßÐáÌáÈãÄãÂãÁãÃßÇáËßÏÛÑÛÓÙ×Õ×ÓÛÑÝÏÝËáÇáÅãÁã;PM1PE;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,4FPPE=<QcÀEFÀ;PM0PEÂãÆãÈáÌßÐßÒÛÔÛÖÙÚÕÜÓÜÑàÏâËàÇäÅäÁäÂäÆâÈâÌàÐÜÒÜÔØÖØÚÔÜÒÜÐàÌàÈâÄäÄäÃäÃäÇâËâÏÞÑÞÓÜ×Ø×ØÛÔÛÒßÐáÌáÈãÄãÂãÁãÃßÇáËßÏÛÑÛÓÙ×Õ×ÓÛÑÝÏÝËáÇáÅãÁã;PM1PEØ¿¿áÆßÈßÌßÎÛÐÛÔÙÖÕÖÕÚÓÜÏÞÍÞËàÇâÅàÁâÂâÆàÈÞÌÞÎÚÐÜÔÖÖÖÖÒÚÒÜÎÜÊàÊàÆà¿â¿âÅâÉÞÉàÍÜÑÜÑÚÕØÕÖÛÒÙÒÝÎÝÊßÈáÆáÂßÁáÅßÇÝÉÝÍÛÑÙÑÕÕÕ×ÓÙÏÛÍÛËßÇÝÅá¿á;PM1PE;PM2FPPE=<ybÀEFÀ;PM0PE¿áÆßÈßÌßÎÛÐÛÔÙÖÕÖÕÚÓÜÏÞÍÞËàÇâÅàÁâÂâÆàÈÞÌÞÎÚÐÜÔÖÖÖÖÒÚÒÜÎÜÊàÊàÆà¿â¿âÅâÉÞÉàÍÜÑÜÑÚÕØÕÖÛÒÙÒÝÎÝÊßÈáÆáÂßÁáÅßÇÝÉÝÍÛÑÙÑÕÕÕ×ÓÙÏÛÍÛËßÇÝÅá¿á;PM1PEÔ¿ÆýÔùÜõæíîåöÛúÓþÅ@ÀÆúÔôÜðæäîÞöÒúÆþÅþÑüÝôãðïäóÞùÒ?ÀÆýÅùÑõÝíãåïÛóÓûÅý;PM1PE;PM2FPPE=<ebÀEFÀ;PM0PEÆýÔùÜõæíîåöÛúÓþÅ@ÀÆúÔôÜðæäîÞöÒúÆþÅþÑüÝôãðïäóÞùÒ?ÀÆýÅùÑõÝíãåïÛóÓûÅý;PM1PEØ¿ÆùÐõÚñäéêãòÙöÏúÅüÆöÐðÚêääêÜòÐöÆúÅüÏöÛðãêéäïÚõÒûÆùÅõÑñÙéããéÙïÏõÅû;PM1PE;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<MbÀEFÀ;PM0PEÆùÐõÚñäéêãòÙöÏúÅüÆöÐðÚêääêÜòÐöÆúÅüÏöÛðãêéäïÚõÒûÆùÅõÑñÙéããéÙïÏõÅû;PM1PEÖ¿ÆõÎñØíâçæßî×òÏöÅöÆôÐìØèààèØîÐòÆöÅöÏò×îßèçàëØóÐõÆõÅñÏí×åßáç×íÍñÅõ;PM1PE;PM2FPPE=<waÀEFÀ;PM0PEÆõÎñØíâçæßî×òÏöÅöÆôÐìØèààèØîÐòÆöÅöÏò×îßèçàëØóÐõÆõÅñÏí×åßáç×íÍñÅõ;PM1PEÖ¿ÄïÐíÖéÞãäÝê×îÍðÃòÄîÎêØäÞÞäÖêÎîÆðÅòÍîÕêÝäãÞéÖíÎñÆïÅíÍéÕãÝÝãÕéÏíÃñ;PM1PE;PM2FPPE=<aaÀEFÀ;PM0PEÄïÐíÖéÞãäÝê×îÍðÃòÄîÎêØäÞÞäÖêÎîÆðÅòÍîÕêÝäãÞéÖíÎñÆïÅíÍéÕãÝÝãÕéÏíÃñ;PM1PEÖ¿ÄëÎéÔåÜßàÛæÓêÍìÃîÄêÎæÔàÜÜàÔæÎêÄìÃìÍêÓèÛàßÜåÔéÌíÆëÅéËåÓßÛÛßÓçÍéÃë;PM1PE;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<KaÀEFÀ;PM0PEÄëÎéÔåÜßàÛæÓêÍìÃîÄêÎæÔàÜÜàÔæÎêÄìÃìÍêÓèÛàßÜåÔéÌíÆëÅéËåÓßÛÛßÓçÍéÃë;PM1PEÖ¿ÄçÌåÔáØÝÞ×àÑæËèÃêÄäÌâÒÞØØÞÔâÌæÄèÃêËäÓâ×ÞÝØáÔãÌéÂçÁåËßÓÝ××ÝÓáËãÃé;PM1PE;PM2FPPE=<u`ÀEFÀ;PM0PEÄçÌåÔáØÝÞ×àÑæËèÃêÄäÌâÒÞØØÞÔâÌæÄèÃêËäÓâ×ÞÝØáÔãÌéÂçÁåËßÓÝ××ÝÓáËãÃé;PM1PEÖ¿ÄãÊáÒÝÔÙÜÕÞÏàÉäÃäÄâÊÞÐÚÖÖÚÒÞÊâÄäÃäÉâÑÞÕÚÙÖÝÐáÌãÄãÃßËÝÏÛÕÓÙÑÝÉáÃã;PM1PE;PM2FPPE=<_`ÀEFÀ;PM0PEÄãÊáÒÝÔÙÜÕÞÏàÉäÃäÄâÊÞÐÚÖÖÚÒÞÊâÄäÃäÉâÑÞÕÚÙÖÝÐáÌãÄãÃßËÝÏÛÕÓÙÑÝÉáÃã;PM1PEÖ¿ÄÝÈÝÐÙÒ×ØÓÚÍÞÇÞÃàÄÜÈÜÎØÔÒØÎÚÊÞÂÞÁàÉÜÍÚÑØ×ÔÛÎÛÈßÄÝÃÝÇÙÍ×ÓÑ×ÏÙÇÛÃß;PM1PE;PM2RF7,8,8,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<I`ÀEFÀ;PM0PEÄÝÈÝÐÙÒ×ØÓÚÍÞÇÞÃàÄÜÈÜÎØÔÒØÎÚÊÞÂÞÁàÉÜÍÚÑØ×ÔÛÎÛÈßÄÝÃÝÇÙÍ×ÓÑ×ÏÙÇÛÃß;PM1PEÖ¿ÂÙÊÙÌÕÐÓÔÑØËØÇÚÁÜÂØÈØÌÔÒÐÔÌÖÈÚÄÚÃÚÇÚËÖÏÖÓÐ×Ì×ÈÛÂÙÁ×Ç×ËÓÏÏÕËÕÉÙÁÙ;PM1PE;PM2FPPE=<s_ÀEFÀ;PM0PEÂÙÊÙÌÕÐÓÔÑØËØÇÚÁÜÂØÈØÌÔÒÐÔÌÖÈÚÄÚÃÚÇÚËÖÏÖÓÐ×Ì×ÈÛÂÙÁ×Ç×ËÓÏÏÕËÕÉÙÁÙ;PM1PEØ¿ÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃØÄÔÆÔÊÐÎÎÐÊÔÆÔÂÖÁØÅÔÉÒÍÒÏÌÓÌÓÆ×ÂÕÁÓÅÓËÏËÍÑÉÑÅÓÁ×;PM1PE;PM2FPPE=<[_ÀEFÀ;PM0PEÂÕÆÓÊÓÎÏÐÍÔÉÔÅÖÃØÄÔÆÔÊÐÎÎÐÊÔÆÔÂÖÁØÅÔÉÒÍÒÏÌÓÌÓÆ×ÂÕÁÓÅÓËÏËÍÑÉÑÅÓÁ×;PM1PEÔ¿ÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÒÆÐÈÌÊÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎËÊÏÊÑÄÑÂÑÁÏÃÏÉËÉËÍÇÍÃÑÃÑ;PM1PE;PM2RF8,8,8,0,0,0,0,0,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;FT11,8FPPE=<G_ÀEFÀ;PM0PEÄÑÄÏÈÏÌÍÌÉÐÇÐÅÒÁÒÂÒÆÐÈÌÊÌÎÈÐÄÐÂÒÁÒÃÒÇÎËÎËÊÏÊÑÄÑÂÑÁÏÃÏÉËÉËÍÇÍÃÑÃÑ;PM1PEØ¿¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PE;PM2FPPE=<o^ÀEFÀ;PM0PE¿ËÆËÆËÈÉÊÇÌÅÌÅ̿οÌÆÌÆÊÈÈÊÆÌÄÌÂÌÁÎÃÌÅÌÇÊÉÈËÆËÄÍÂËÁËÃËÅÉÇÇÉÅËÅË¿Í;PM1PEÖ¿ÂÏÊÏÐÉÐÃÒÄÎÊÊÐÄÐÃÒÉÎÍÊÑÄÏÃÏÉÉÍÁÑ;PM1PE;PM2FPPE=<Y^ÀEFÀ;PM0PEÂÏÊÏÐÉÐÃÒÄÎÊÊÐÄÐÃÒÉÎÍÊÑÄÏÃÏÉÉÍÁÑ;PM1PEÖ¿ÂÇÆÇÆÃÈÁÊÂÆÄÆÈÂÈÁÈÅÈÅÄÉÄÇÃÅÃÅÇÁÇ;PM1PE;PM2FT10,0FPPE=<C^ÀEFÀ;PM0PEÂÇÆÇÆÃÈÁÊÂÆÄÆÈÂÈÁÈÅÈÅÄÉÄÇÃÅÃÅÇÁÇ;PM2FPMC1,240PE=<käqXÀ;PM0PEÇÂÇÆÅÆÅÊÃÈ¿ÌÁÌÂÌÆÖÌÒÒÊÒÂÊÁÈÃÆÇÆÇÄÉÂÉ¿Ë¿ËÇ×ÍÑÏÉÓÁ;PM2RF1,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,1FPPE=<iämXÀ;PM0PEËÄÍÊÅÎÈÎÌÎÂÎÄÊÆÄÊÃÈÇÆÍÂÏÁÏÅÍÇÇÉÃ;PM2FT10,0FPPE=<etÀaHÀ;PM0PEÖìØîÖòÚôØöÚøÜþÚ@ÀÞDÀÞFÀÞLÀÞNÀâTÀàVÀâZÀâ`Àâ`Àä^ÀäZÀäTÀäPÀâLÀâHÀàBÀÞüÚöÚîÖèÒâÎØÊÒÆÊÌÔÊÔÆÔÈÒÄÐÆÐÂÎÄÌÂÊÂÊÂÈÂÆ¿È¿ÆÁÆÁÈÉÙÏÝÍáÑçÕéÕïÙóÙõÛûÝûÝAÀßAÀáEÀáGÀãIÀãKÀãKÀåOÀãOÀåOÀåQÀåSÀãQÀåQÀãQÀãSÀáOÀáQÀáOÀÝMÀßMÀÛKÀÄÉÈÃÈ¿Æ¿ÈÁÄÅÄÍÃÙ;PM2FT11,1FPPE=<yqÀEXÀ;PM0PEÉÄÇÄÉÆÇÎÃÊÁÌÃÌÁÌ¿ÌÁÊÁÊ¿ÈÁØÃØÁØÃØÃÚÃØÃØÁÚÃØÁØÃØÃØÃÚÁØÃØÃØÁÂÃÂÿÃÂÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÂÝÁÑÌÉÌÇÌÇÎÄÌÄÐÄÌÂ;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPM0PEÅÂÅÂÅÄÅÂÃÆÅÆÁÆÁÆÁÈÁÆÁÊÁÈ¿ÈÁÈÁÈÁÈ¿ÍÁËÁËÁË¿ËÁËÂÇÄÉÆÁÆÁÄÁÆ¿È¿È¿È¿È¿;PM2FT11,1FPPE=<sÞUFÀ;PM0PEÇÇËÅÉÃÇÅÉÁËÅÇÃÉÅÿÿÿÿÌÈÊÈÊÆÆÈÈÊÈÈÈÈÈÈÆÅÆÅÆÃÆÅ;PM2FT11,2FPPE=<]æc?À;PM0PEÑÂÏÄÏÄÍÆÍÄÍÆÍÆÏÄÖÆÎÆÌÊÂÒÍÁËÂË¿ÉÄÉÄÉÄËÄÉÂÌ¿Ê¿Ì¿Ê¿Ì¿Ê¿Ê¿Ì¿ÊËÈËÊËÊËÊËÊËÈËÈÉ;PM2FPPE=<ußYEÀ;PM0PEÙÅÛÁÙ¿Û¿Û¿Û¿Û¿Ù¿ØÆØÂØÄÖÆØÂÖÆØÆÖÊÇÆÇÆÇÆÇÈÇÆÇÆÅÆÉÈÍÁÏÁÍÃÏÃÍÁÏ¿Ï¿ÏÄÌÂÌÄÌÂÊÄÊÆÌÄÊÄÌÆÍÊÍÌËÌÍÌËÌÏÌËÊÍÌÏÁÏÁÏÁÑÁÏÁÑ¿Ï¿ÑÂÐÄÎÆÐÂÐÆÎÄÐÆÎÂÐÆàÝÞÛàÛÞÛàÝÞÛÞÛàÛ;PM2FPPE=<yÜqEÀ;PM0PEÆÎÄÎÄÎÂÐÂÐÂÐÂÎÄÐÇÍÇÏÇÍÅËÉÉÇÉÇÇÇÅÙØ×Ø×ØÙØ×ØÙØ×Ú×ØÆÚÄÞÂàÁâÃàÁàÃÜ¿ÖÃÓÁ×ÁÛÅÝÃÝÇÛÇÙÍÕäÝâßäÝäáäßäÝäßâß;PM2FPPE=<mäIAÀ;PM0PE×ÂÕÂտ׿ÕÂ×Ä×ÄÙÈÖ¿Ô¿Ö¿Ö¿Ô¿Ö¿ÔÆÔÆÆÇÄÉÄÇÆÇ;PM2FPPE=<qëyFÀ;PM0PEÂÒÂÒÂÔÄÔÄÒ¿ÔÂÒÁÒÅÈÇÄÅÄÉ¿ÇÁÇÁÇÅÅÅÂÑÂÑÄÑÄÓÆÑÆÓÄÑÄÓÉ¿ÉÁÉ¿ÉÁ¿Ê¿ÊÂÌ¿Ê¿Ê¿ÊÁÌÃÈÇÊËÂÉÃÇÇ¿É¿ÉÄËÄËÄËÆËÂËÄËÌÂÈÂÈÂÈ¿ÈÂÊÂÈÂÊÂ;PM2FPPE=<eó]GÀ;PM0PEÈÃÂËÂÑ¿ÕÁÙÅÛÃÝÅßÅÝÅÝÅÛÃÙÃÕÁÏ¿ËÂÃÒÁÖÄÔÈÒÌÒÐÐÐÈÐÄÌÂØÄÚÂÚÄÚÂÜÄÚÂÚÂØÂØÂÖ¿Ö¿Ò¿Ò¿ÎÁÊÃÈßöåöçöíöñôóöõô÷ôùô÷òùôûð÷ðõðõìóî¿ÊÂÐÁØ¿ÜÁàÁäÁæÃèÁæÁêÁè¿ä¿â¿ÞÂÚÄÖÂØÁØ¿ÚÁØÃØ¿ØÄÔÆØÎÒÔÐØÌÚÎÚÒÖÖÒÚÌÊÄ¿ÈÅÈÉÌËÌÇÌÅÐÄÌÈÈÊÆÌÂÎÂÌ¿ÎÂÌÂÌÄÊÆÌÆÈÈÊÈÊÈÈÈÆÊÆÊÆÐÆÒÄÒÄÒÂÒÁÐÃÐÇÎÇÆËÁËÃËÇÍÉÍÅËÃËÂÇÆÅÌÃÎÁÎÃÎÁÌÇÆÇÂËÅÉËÇÍÃÏÃÏÅÏÅÏÉËÇÅËÁÉÁËÁË¿ÉÁÇÅÅÅÁÏÂÏÆÏÆÑÆÏÆÏ¿ÍÅÍÅÅÅÂÅÆÅÈÅÈÅÈÇÄÉ¿ÑÉËÑÃÕÁٿٿ×Á×ÇÓÇÉËÉÍÅÏÃÑÃÏÁÏÁÍ¿QÀÃGÀÁAÀ¿ùÂóÂëÄåÂáÄÙÄÕÄÑÂÍÂÉÂÅÁÃÁÁÃÅÛÑÏÕÉÙÃÙ¿ÕÃÍÅÃÍÎëÖíÜíäíæíêíìëîíîçìçêãèáàÝÞ×ÖÕÎÏØáÐÕÌÏÊÍÊÉÊÍÐÓÔ×Þ×ÞÅäÄäÎæÎäÊæÆâÉÖÓ¿ÓÏ×Ó×Õ×ÍÑ¿ÑÖÉ;PM2FPPE=<_ô_ù;PM0PEÌÍÊËÌÉÌÏÉÈÉÈÉÆÉÆÇÆÉÆÉÆÉÊÆËÆÇÆÇÄÅÆÇÆÅÆÉÆÉÇÊËÈÉÈËÆÉÈÉÆËÊÉÈÆÉÆÇÆÇÆÅÈÅÈÉÆÇÆÉÉÊÇÊÉÈÉÆÉÈÉÈÇÈÉÌÄÏÄËÂÍÆÍÉÐÇÎÉÎÇÎé¿ç¿å¿ç¿ã¿å¿ç¿é¿ÆËÈÍÈÏÆÍËÎËÌËÌËÎÅÂÇ¿É¿ÉÂËÂÇÂÉ¿ÅÂÁÇÃÇÁÇÃÇÁÅÃÉÁÅÃÇÄÈÂÊÂÌÂÈÂÊÂÊÂÊÂÊâÁàÁàÁà¿âÃà¿âÁàÁâÁâÁà¿àÁâÁàÁàÁâÁ;PM2FPPE=<{õMø;PM0PEÇÊÇÊÉÊÇÊÇÊÇÊÇÊÉÊÆÉÄÉÆÉÄÉÄÉÆÉÄËÆÇÕÁÓÁÕ¿Ó¿ÓÁÕ¿ÓÁÕÁÊÌÊÌÊÎÊÌÇÅÅÅÇÅÇÅÇÃÅÅÇÅÇÅÉ¿Ç¿É¿É¿¿Á¿ÁÅÎÅÎÇÎÅÐÂÏÂÍÂÍÂÍÇ¿ÇÂÇ¿Ç¿Å¿É¿Å¿Ç¿ÌÌÊÊÌÌÊÌÇÅÇÅÇÅÇÅÉÃÇÅÇÅÇÅÉÄÇÆÉÆÇÄÉÆÇÆÉÆÉÄÎËÐÍÎËÌËØÂØÂÖ¿ØÂؿؿÖÂØÂÖ¿Ø¿ØÂØ¿ÖÂØ¿ØÂÖ¿;PM2FPPE=<knÀ[ú;PM0PEÊÊÈÊÊÊÈÈÊÊÈÊÊÌÆÎÇÈÇÈÇÈÉÈÐÔÎÒÐÔÐÒÐÔÌÔÊÔÆÖË¿ÉÂÉ¿É¿ÎÖÐÖÎÖÐÖÎÔÎÖÐØÎÔÍ¿ËÂÍ¿ËÂÆÎÈÒÆÐÈÐÈÐÆÐÈÐÆÐÊÈÊÈÊÈÊÆÊÊÊÆÊÈÊÈËÁË¿ËÁË¿ÄÈÄÌÆÊÄÈÄÊÄÌÆÈÄÌÈÄÈÆÊÆÈÆÊÄÈÆÊÄÈÆÍ¿ÏÁÍ¿ÍÁÈÊÆÌÈÊÆÌÊ¿ÊÄÊÄÊÈÈÈÊÆÈÈÊÆÉ¿ÅÁÇ¿Ç¿ÇÁÇÁÇ¿Ç¿ÄÆÂÆÄÆÂÆÌÄÌÂÌÆÊÆÌÆÌÈÌÊÌÌÉÁÇÃÉÁÉÃÇÁÉ¿É¿ÉÂÄÆÂÆÄÆÆÆÎÄÌÄÎÈÎÈÎÊÌÈÎÊÎÈËÁËÅËÃËÅËÃÉÁËÁË¿ÆÈÄÊÆÈÆÊÒÄÎÆÒÈÐÈÎÊÐÈÒÊÎÈÍÅÏÅÏÅÏÃÏÃÍÅÏÁÏÁÆÊÈÊÆÊÈÊÐÄÐÊÐÌÒÒÒÒÒÒÒÒÒÐÍÇËÇÍÇÍÉËÅÍÅÍÃÍ¿ÛùÛûÛûÝùÛûÛûÛùÝùÛûÛûÛùÛûÛûÝùÛùÛûÃÕÃ×ÃÕÃ×ÃÕÃ×ÃÕÃ×;PM2FT11,1FPPE=<csÀoAÀ;PM0PEÅFÀèÒÌâÎâÎäÎäÌâÎäÎäÎâÃÊÅÈÅÊÃÊÌ¿ÌÄÎÆÌƿο̿οοοÌÂοÎÊÃÈÅÊÃÈÃÆÔÆÒÆÔÆÒÆÖÈÒÆÔÆÒÁÎÁοÎÃÌ¿ÎÁÎÁÎÁÌÆÇÄÇÆÇÄÇÄÉÆÇÄÇÆÇÂÊÆÌÄÊÄÊÄÌÄÊÄÌÄÊÅÒÅÒ¿Ò¿Ò¿ÔÂÒ¿Ò¿ÒÄËÆËÄËÆÍÆËÄÍÆËÄËÄÊÂÈÂÊÂÈÂÊÂÈÂÊÂÊ¿ÎÁοÎÁÎÁοÎÁοÎÌÉÌÉÌÇÎÁÄÌÂÌÄÌÄÌÄÎÄÌÂÌÄÌÁÌÁÌÁÌÃÌ¿ÌÁÌÃÌÁÌÆÉÂÉÆÇÄÉÆÇÂÉÆÇÄÉÄÌÂÊÄÊÂÊÄÊÄÌÂÈÄÌÁÌÃÌÁÊÃÌ¿ÌÁÌ¿Ì¿ÎÈËÊËÈÍÈËÄÊÄÊÄÊÄÈÄÊÄÈÄÊÄÊÁÊÁÊÁÌ¿ÈÃÌ¿ÊÁÊÁÊÊÍÊÍÈÍÊÍÂÌÄÊÂÊÄÌÅÎÃÎÁÌÁÎÂ̿̿οοËÂÉÄÉÄÇÆÇÆÇÆÇÄÇÆÌÄÎÆÌÄÌÄÌÆÎÄÌÆÎÅÎÃÐÁпοοοÎÁÎÂÍÂËÆÉÆËÆÇÆÇÆÉÆÉÄÊÂÈÂÈÂÊÂÈÄÈÂÊÄÈÃÌÁÌÁÊÁÊÁÌÃÌÁÌÁÊÄÉÆËÆËÆËÄÉÆÉÆËÆËáMÀßOÀáOÀßOÀáMÀßOÀáOÀáMÀßOÀáOÀßOÀáMÀßOÀáMÀßOÀáOÀÃÁÅËÇÑÉ×ËÛÍÝÍßÏáÍáÍßÏÝËÛÉÕÉÑÅËÃÃ;PM2FT11,2FPPE=<?uÀ[HÀ;PM0PEÉÌÅÊ¿ÊÁÌÞ@ÀÞBÀÜBÀÞþÜBÀÞ@ÀÞBÀÜþÞBÀÜ@ÀÜ@ÀÞ@ÀÜ@ÀÞ@ÀÞ@ÀÜ@ÀÜþÞBÀÜ@ÀÞþÜBÀÜ@ÀÞ@ÀÞ@ÀÜ@ÀÞBÀÞþÜBÀÜ@ÀÞBÀÞBÀÞ@À¿ÔÇÈÉÄËÆÇÃÉÇÅËÉÓÂÑÃÕÅÝÇáËåÏíÑïÓñ×ù×ûÛýÝAÀÝEÀßGÀáGÀáKÀãKÀãMÀåOÀãOÀåOÀãQÀçOÀãMÀãQÀãMÀãKÀáKÀßGÀßGÀÝEÀÛAÀ¿ÓÆÑÈÉÎÁ;PM2FT11,4FPPE=<C÷eBÀ;PM0PEßÚÛØÛÖÙÖÙÖÙÖ×Ô×Ô×ÔÙÖ×ÖÙÖÙØÝØÛÚßÜÉÆÉÆËÄÉÆËÆÉÆÅÈÅÈÊÎÈÈÌÈÊÄÊÂÊ¿Ì¿Ê¿ÂÇÂÇÂÅ¿ÉÂÅÂÇÂÇ¿ÇÞÝÚÝÜÙÚ×Ø×ØÕØÕÖÕØÕØÓØÕÚÕØÕÜÙÜÙÞÝ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<oëMJÀ;PM0PEË¿É¿É¿Ë¿É¿É¿ÉÂÉÄÇÈËÊËÊËÊÉÌÇÊÇÊÃÊÌÇÌÉÎÅÌÅÎÅÎÅÌÁÌÃÈÁÊ¿È¿ÊÁÈÁÊ¿ÈÁÊÁÅÇÃÅÁÇÃÅ;PM2FT10,0FPPE=<o?ÀQú;PM0PEÂÂÊÆÊÆÈÆÊÄÈÆÊÆÈÆÊÆÉÎÉÅÇÅÉÅÇÅÉÃÇÅÉÅÇÅÂÂÄÑ;PM2RF4,8,8,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1;FT11,4FP1PE=<mAÀmù;PM0PEÈÙÐÏÔÇÖÁÔÄÒÄÎÄÈÄÃÒÇÃÏÅÍÃÑÁÑ¿ÏÆÉÊÅÔÏÁ;PM2FP1PE=<a?Àyú;PM0PEÈÃÈÃÈÁÈ¿ÈÂÆÂÈÂÆÄÊÐÂÎÁοÎÉÆÇ¿ÅÃÅÁÁÇÂÇÃÇÅÅËÁÇÃËÂÑÆÄÇÂÅÄÇÊÇ;PM2FT10,0FPPE=<Oþaú;PM0PEÂÿÉÇÏËËÑÿÏÚÆÒÒÊÔÁÖÂÃÑ¿;PM2FTFP1PE=<kþ_ù;PM0PEÆÅÄÅÆÅÄÅÂÇÂÇÄÍ¿ËÒ¿ÁÐÁÌÁÌÅÈÃÊÅÆÅÈÅÆËË;PM2FP1MC1,90PE=<[ìAOÀ;PM0PEEÅhÀ¿ÂFÅgÀ¿Á;PM2RF5,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<[ì?OÀ;PM0PEEÅhÀÂÆFÅgÀÁÅ;PM2FPPE=<YìyNÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<YìuNÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FT11,3FPPE=<WìqNÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2FPPE=<UìmNÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<UìiNÀ;PM0PEEÅhÀ¿ÆHÅgÀÁÅ;PM2FPPE=<SìcNÀ;PM0PEGÅhÀÂÂFÅgÀ¿Á;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<SìaNÀ;PM0PEEÅhÀ¿ÆFÅgÀ¿Å;PM2FPPE=<Sì[NÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<QìWNÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<OìSNÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<OìONÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<MìKNÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<MìGNÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<KìCNÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<Iì?NÀ;PM0PEEÅhÀ¿ÆFÅiÀ¿Ã;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<Iì{MÀ;PM0PEEÅjÀÂÄFÅgÀÁÅ;PM2FPPE=<GìuMÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<GìqMÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<EìmMÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<CìiMÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<CìeMÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<AìaMÀ;PM0PEGÅhÀÂÆFÅiÀ¿Ã;PM2FPPE=<Aì]MÀ;PM0PEEÅjÀ¿ÂHÅgÀÁÃ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<?ìYMÀ;PM0PEGÅhÀÂÆHÅgÀÁÅ;PM2FPPE=<}ëSMÀ;PM0PEGÅhÀÂÄFÅiÀ¿Á;PM2FPPE=<}ëQMÀ;PM0PEEÅjÀ¿ÄHÅgÀÁÅ;PM2FPPE=<{ëKMÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<{ëGMÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<{ëCMÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<yë?MÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<wë{LÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<wëwLÀ;PM0PEEÅhÀÂÆFÅiÀÁÃ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<uësLÀ;PM0PEEÅjÀ¿ÄFÅgÀ¿Å;PM2FPPE=<uëmLÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<sëiLÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2FPPE=<qëeLÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<qëaLÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,5FPPE=<oë]LÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<oëYLÀ;PM0PEEÅhÀ¿ÆHÅiÀÁÃ;PM2FPPE=<mëULÀ;PM0PEGÅjÀÂÂHÅgÀÁÃ;PM2FPPE=<këQLÀ;PM0PEGÅhÀÂÆFÅgÀ¿Å;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,6FPPE=<këKLÀ;PM0PEEÅhÀ¿ÄHÅiÀÁÁ;PM2FPPE=<iëILÀ;PM0PEGÅjÀÂÄFÅgÀ¿Å;PM2FPPE=<iëCLÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<gë?LÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2FPPE=<eë{KÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,7FPPE=<eëwKÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<cësKÀ;PM0PEGÅhÀÂÆFÅgÀ¿Å;PM2FPMC1,240PE=<SìYNÀ;PM0PEÄÌÂÐÄÒÆÔÂÒÆÔÄÐÂÎÙÁ×ÁÕÅÓÃÓÅÓÁÑ¿ÓÂËÆÉÈÇÈÅÆÅÈÃÆÅÆÇÈÏ¿ÕÃÙÇÙÇÙÅ×ÅÕ¿Ï¿ÇÁÇÁÅÁÇ¿ÇÁÉ¿ËÂÏÌÎÌÊÌÈÊÄÌÂÊÂÊÂÌÂèÁæÉæÉæÍâÑäÑâÑäÑ;PM2FTFPMC1,90PE=<[ìAOÀ;PM0PEEÅhÀ¿ÂFÅgÀ¿Á;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<[ì?OÀ;PM0PEEÅhÀÂÆFÅgÀÁÅ;PM2FPPE=<YìyNÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<YìuNÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<WìqNÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2FPPE=<UìmNÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<UìiNÀ;PM0PEEÅhÀ¿ÆHÅgÀÁÅ;PM2FPPE=<SìcNÀ;PM0PEGÅhÀÂÂFÅgÀ¿Á;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<SìaNÀ;PM0PEEÅhÀ¿ÆFÅgÀ¿Å;PM2FPPE=<Sì[NÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<QìWNÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<OìSNÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<OìONÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<MìKNÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<MìGNÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<KìCNÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<Iì?NÀ;PM0PEEÅhÀ¿ÆFÅiÀ¿Ã;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<Iì{MÀ;PM0PEEÅjÀÂÄFÅgÀÁÅ;PM2FPPE=<GìuMÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<GìqMÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<EìmMÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<CìiMÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<CìeMÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<AìaMÀ;PM0PEGÅhÀÂÆFÅiÀ¿Ã;PM2FPPE=<Aì]MÀ;PM0PEEÅjÀ¿ÂHÅgÀÁÃ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<?ìYMÀ;PM0PEGÅhÀÂÆHÅgÀÁÅ;PM2FPPE=<}ëSMÀ;PM0PEGÅhÀÂÄFÅiÀ¿Á;PM2FPPE=<}ëQMÀ;PM0PEEÅjÀ¿ÄHÅgÀÁÅ;PM2FPPE=<{ëKMÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<{ëGMÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<{ëCMÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<yë?MÀ;PM0PEEÅhÀÂÄFÅgÀÁÃ;PM2FPPE=<wë{LÀ;PM0PEEÅhÀ¿ÄFÅgÀ¿Ã;PM2FPPE=<wëwLÀ;PM0PEEÅhÀÂÆFÅiÀÁÃ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<uësLÀ;PM0PEEÅjÀ¿ÄFÅgÀ¿Å;PM2FPPE=<uëmLÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<sëiLÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2FPPE=<qëeLÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<qëaLÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,1FPPE=<oë]LÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2FPPE=<oëYLÀ;PM0PEEÅhÀ¿ÆHÅiÀÁÃ;PM2FPPE=<mëULÀ;PM0PEGÅjÀÂÂHÅgÀÁÃ;PM2FPPE=<këQLÀ;PM0PEGÅhÀÂÆFÅgÀ¿Å;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,2FPPE=<këKLÀ;PM0PEEÅhÀ¿ÄHÅiÀÁÁ;PM2FPPE=<iëILÀ;PM0PEGÅjÀÂÄFÅgÀ¿Å;PM2FPPE=<iëCLÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<gë?LÀ;PM0PEGÅhÀÂÄHÅgÀÁÃ;PM2FPPE=<eë{KÀ;PM0PEGÅhÀÂÄFÅgÀ¿Ã;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0;FT11,3FPPE=<eëwKÀ;PM0PEEÅhÀ¿ÄHÅgÀÁÃ;PM2FPPE=<cësKÀ;PM0PEGÅhÀÂÆFÅgÀ¿Å;PM2FPMC1,240PE=<quÀoRÀ;PM0PEGÀXÀ\ÀïÓç;PM2FT11,8FPPE=<_vÀwü;PM0PEà~ÀíUÀÏPÁêHÁó[ÀÁBÀÜLÁíWÀÞZÃåYÁÝnÁêTÂùYÁÄVÁÜ|ÁéQÁÓ|ÀòbÁýGÁ\ÁWÏ;PM2FPPE=<ywÀuû;PM0PEyÁRÎWÀ¿ôÙäiÀ}ÀLÀbÀ]ÀâgÀ]ÀärÀSÀÞeÀeÀþjÀmÀÔSÀEÀÜPÀýÞeÀSÀîNÀeÀÎçKÀèPÀSÀæUÁWÀlÀ\ÀcÁÌè;PM2FPMC1,90PE=<UÜQý;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,4FPPE=<SÜKý;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<QÜEý;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,5FPPE=<MÜ?ý;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<KÜyü;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,6FPPE=<KÜsü;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<GÜmü;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<EÜgü;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPPE=<CÜaü;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<AÜ[ü;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPPE=<?ÜUü;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<{ÛOü;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2FPPE=<{ÛIü;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<yÛCü;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<uÛ}û;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<sÛwû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<qÛqû;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<oÛkû;PM0PE?ÈR¿ÈBÈQÂÁÇ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<mÛcû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<kÛ]û;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<iÛWû;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<gÛQû;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<cÛKû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<aÛEû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<_Û?û;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<]Ûyú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<[Ûsú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<YÛmú;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<WÛgú;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<UÛaú;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<QÛ[ú;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<QÛUú;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<OÛOú;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<KÛIú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<IÛCú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<GÛ}ù;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<EÛwù;PM0PE?ÈR¿ÆBÈQÂÁÅ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<CÛqù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<AÛkù;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<?Ûeù;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<}Ú_ù;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<yÚYù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<wÚSù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<uÚMù;PM0PEAÈRÂÂÈBÈQÂÁÇ;PM2FPPE=<sÚEù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<qÚ?ù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<oÚyø;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<mÚsø;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<kÚmø;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<gÚgø;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2FPPE=<gÚaø;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<eÚ[ø;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<aÚUø;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<_ÚOø;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,7FPPE=<]ÚIø;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<[ÚCø;PM0PE?ÈRÂÂÈ@ÈQÂÁÇ;PM2FPMC1,240PE=<aâkú;PM0PEÐÁÒ¿ÐÁпÐÁÒÁпÒÁÖÆÖÈÖÆÖÆÖÆÖÈØÆÖÈÖÆÖÆØÆÔÈØÆÖÆÖÆÖÈãÎßÊÝÊÙÊÙÊÝÊßÌãÎÑÃÏÇÍÉÏËËËËÏÇÍÃÍËÉÏÅÑ¿ÓÂÕÆÕÆÕÄÑÂ×ÁÓÃÕÅÕÇÓÉÓÇÕÉÓÅÖÅÖÅÖÅØÅÖÅÖÅÖÃÖÅ;PM2FTFPMC1,90PE=<UÜQý;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,8FPPE=<SÜKý;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<QÜEý;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<MÜ?ý;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<KÜyü;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPPE=<KÜsü;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<GÜmü;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<EÜgü;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<CÜaü;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<AÜ[ü;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPPE=<?ÜUü;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<{ÛOü;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2FPPE=<{ÛIü;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<yÛCü;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<uÛ}û;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<sÛwû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<qÛqû;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<oÛkû;PM0PE?ÈR¿ÈBÈQÂÁÇ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<mÛcû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<kÛ]û;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<iÛWû;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<gÛQû;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<cÛKû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<aÛEû;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<_Û?û;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<]Ûyú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<[Ûsú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<YÛmú;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<WÛgú;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<UÛaú;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<QÛ[ú;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<QÛUú;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<OÛOú;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<KÛIú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<IÛCú;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<GÛ}ù;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<EÛwù;PM0PE?ÈR¿ÆBÈQÂÁÅ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<CÛqù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<AÛkù;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<?Ûeù;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<}Ú_ù;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<yÚYù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<wÚSù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<uÚMù;PM0PEAÈRÂÂÈBÈQÂÁÇ;PM2FPPE=<sÚEù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<qÚ?ù;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<oÚyø;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<mÚsø;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2FPPE=<kÚmø;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<gÚgø;PM0PEAÈRÂÂÆ@ÈQ¿Å;PM2FPPE=<gÚaø;PM0PE?ÈRÂÂÆ@ÈQÂÁÅ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<eÚ[ø;PM0PE?ÈRÂÂÆBÈQÂÃÅ;PM2FPPE=<aÚUø;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2FPPE=<_ÚOø;PM0PEAÈRÂÂÆBÈQÂÁÅ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,3FPPE=<]ÚIø;PM0PEAÈRÂÄÆ@ÈQÂÁÅ;PM2FPPE=<[ÚCø;PM0PE?ÈRÂÂÈ@ÈQÂÁÇ;PM2FPMC1,240PE=<yìUIÀ;PM0PEîÇàÉØÅÐÇÊÅÈÅÆÃÆ¿ô¿ö¿ôÁö¿öÃô¿ôÁöÁôÁö¿ô¿ö¿ôÂöÂöÄöÄÐÈÐÈÐÈÐÈÐÈÐÈÐÈÒÈÁÐÁпÒÁпÒÁÒÁпÐåäãâãäãâåäãâãäåâãäãäãâãâåäãäãäãâÈÈÈÊÊÈÈÊÈÈÊÊÈÈÈÊÜÆÔ¿ÔÁÒÃÒÃÔÁÖÂÚÄØÈÒÊÒÎÖÎÚÌäÈìÂüÅпÊÄÄÆ¿ÈÁÌ¿Ê¿ÊÆÈÈÈÈÊÊÌÊÈÊÌÌÌÎÌÐÌÌÒÄÒÉÌÙ¿ÑÁÓÅÕÉ×ÇÓÅÕÃÍÄËÈÓÞÍÊËÅÉÏÉÕÍÕÑÓÙÉõÊé¿ãÉÝÏÙÓÛÑÝÑáËÑÉÕÅÛÇÝÅÝÅÛÅ×ÅÑÅÍÇËÇËÇÇÉÅÉÃÉ¿ËÆÍàëâéäéäåèçêãèãêãêáêáìáèáêáèãèáäãÝ¿Ý¿ß¿á¿ß¿áÂãÂáÂãÂáÂãÂãÄáÄãÄáÄãÆßÂãÄá¿ß¿á¿áÁáÃÝÁáÃÝÃÝÁÛÃÛÃÙÁÙÁ׿ÊÛÄÙÄÙÆÕÆÕÌÏÔÍÚÅ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<qÜMIÀ;PM0PEÉÇÇÃÇÃÃÅÅÁÅÁÇ¿É¿ÕÄÇÊÅÌÇÊÐÄοοÌÃÌÁÌÃÌÁÌÁ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0;FT11,5FPPE=<YÝoGÀ;PM0PE¿ÉÄÉÄÉÆÉÄÇÆÇÆÇÄÇÎÆÃÊÃÈÅÊÅÈÅÆÁÊÁÆÁÈÏ¿;PM2FTFP1PE=<wÜoFÀ;PM0PE¿Ã¿ÅÅÅÅÇÅÇÉÉÃÉÁËпÂÆÄÆÆÈÆÈÈÊÆÊÄÊÃÌÍÅ;PM2FP1PE=<?ÞaFÀ;PM0PEÌÅÊÁÌ¿Ì¿Ê¿ÈÁÄÁÄÁÎÆÇÊÉÄËÂÉ¿Ë¿ÉÂÇ¿ÇÄÇÍ;PM2FP1PE=<kßkDÀ;PM0PE¿ÌËÎÏÌÍÌÏÎÏÌÏÎÍÐÍÈÎËÌÍÎËÎËÐËÐÍÐÍÐÍÌËË;PM2FP1PE=<QâuBÀ;PM0PEÒÑÖÏÔÏÖËØÍÔËÖÏÒÍÌÌÓÒÕÎÕÌÕÎÕÎÕÎÑÎÑÒËË;PM2FP1PE=<Så{þ;PM0PEÚÝØÝØÝÖáØßÖßÚßÚÝÌÌÙÜ×ÞÕâ×àÕâÕÞÛàÙÞËË;PM2FP1PE=<KçGþ;PM0PE¿ÁÊÍÎÉÒÅÒÃÒÁÐÃÎÃÌÅÌÌÏÊÑÆÑÂÑÄÏÂÍÄÉÈÅÊ¿ÁÏÃ;PM2FP1PE=<Gæuü;PM0PEÇÉËÅËÉËÇËÉÉÉÃÍÂÍÐÄÁÈÄÆÆÈÈÈÎÈÌÈÌÊÊÊËÌ;PM2FP1PE=<wâgü;PM0PEÌÁÌÃÌÁÌÃÌÃοÎÁÐÂÎÄÌÆÌÂÊÆÌÆÊÈÌÊÎÐùÒéÆÛÃÑÇÍÍÉÏËÍÑÉ;PM2FT11,3FPPE=<sÚMù;PM0PEãÇÛËÑÉÏËËÉËÉÍËÏÉÉÅÇ¿ÉÄÇÆÇÈÉÄÇ¿ÇÃÅÇÇÉÇÅÇÇÅÉÇÇÇÅÇÉÏÇÑÁÏ¿ÏÄÏÄÑÆÍÄÑÂÏÃÍÃÏÇËÇÍÇËÇËÉÍÇÝÇÝÉÝÇÝÉÝÇÝÉÝÇÝÉÇÃÇÃÉÅÉÅÉÅÉÅÇÅÉÃÅÊÁÈ¿ÈÂÈÂÆÄÈÄÆÄÆÌÈÎÊÌÊÌÈØÆÚÆØÆØÄØÆØÆØÆÚÆÜÒÚÐÚÐÖÎÖÌÔÊÔÆÒÄÔ¿Ì¿Ê¿Æ¿Æ¿ÈÁÊÃÒÃÒÆÌÊÌÐÊÐÈÒÈÐÊÌÈÈÊÃÈÇÆÅÈÇÈÉÈÇÊÅÊÃÐÂÌÂÌÂÌÂÌÄÊÄÌÄÎÄοοοп;PM2RF6,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,6FPMC1,90PE=<kówö;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPPE=<ióqö;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<góiö;PM0PEyÄJÁÄÈzÄIÁÃÇ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPPE=<cóaö;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2FPPE=<aó[ö;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<]óSö;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<[óMö;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<YóEö;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<Wó}õ;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2FPPE=<Sówõ;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<Qóoõ;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2FPPE=<Oóiõ;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<Kóaõ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<IóYõ;PM0PE{ÄJÁÄÆ|ÄIÁÃÅ;PM2FPPE=<EóSõ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<CóKõ;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<AóEõ;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<?ó}ô;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<}òuô;PM0PEyÄJÁÄÆzÄIÁÃÅ;PM2FPPE=<yòoô;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<wògô;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2RF6,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<sòaô;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<qòYô;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<oòQô;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2FPPE=<mòKô;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<iòCô;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<gò}ó;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<eòuó;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<aòmó;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<_ògó;PM0PE{ÄJÁÄÈ|ÄIÁÃÇ;PM2FPPE=<[ò_ó;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<YòYó;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<WòQó;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<UòIó;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2FPPE=<SòCó;PM0PEyÄJÁÄÈzÄIÁÃÇ;PM2FPPE=<Oò{ò;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<Mòuò;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<Iòmò;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<Gòeò;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<Eò_ò;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<CòWò;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2RF5,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<?òQò;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<}ñIò;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<{ñAò;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2RF6,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<wñ{ñ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<uñsñ;PM0PE{ÄJÁÄÆ|ÄIÁÃÅ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<qñmñ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<oñeñ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<mñ]ñ;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<kñWñ;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<iñOñ;PM0PEyÄJÁÄÈzÄIÁÃÇ;PM2FPMC1,240PE=<móWö;PM0PEÈÔÈÔÈÖÈÒÈÔÈÖÈÔÈÔÈÔÊÔÈÖÆÒÊÔÈÖÈÔÈÔÉ¿ÇÂÉ¿ÇÂÇ¿ÇÄÉÂÉÂÁÉÁË¿ÉÁËÃÉÃÉÇËÇÉÇ¿ÇÁÇ¿Ç¿Ç¿Ç¿Ç¿Ç¿ÇÅÅÃÅÅÃÇÁË¿ÏÄÓÈ×ÇÅÅÃÅÅÅÅÅÁÇÅËÁÍÁáÅáÁáÁãÁá¿ÝÂÝ¿Ù¿ØÇÖÅØÇÖÅØÅØÅØÇÖÅØÇØÅØÅÖÅØÇÖÅØÅØÇ;PM2FTFPMC1,90PE=<kówö;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<ióqö;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<góiö;PM0PEyÄJÁÄÈzÄIÁÃÇ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPPE=<cóaö;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2FPPE=<aó[ö;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<]óSö;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<[óMö;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<YóEö;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<Wó}õ;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2FPPE=<Sówõ;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<Qóoõ;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2FPPE=<Oóiõ;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<Kóaõ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<IóYõ;PM0PE{ÄJÁÄÆ|ÄIÁÃÅ;PM2FPPE=<EóSõ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<CóKõ;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<AóEõ;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<?ó}ô;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<}òuô;PM0PEyÄJÁÄÆzÄIÁÃÅ;PM2FPPE=<yòoô;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<wògô;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2RF8,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<sòaô;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<qòYô;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<oòQô;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2FPPE=<mòKô;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<iòCô;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<gò}ó;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<eòuó;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<aòmó;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<_ògó;PM0PE{ÄJÁÄÈ|ÄIÁÃÇ;PM2FPPE=<[ò_ó;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<YòYó;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<WòQó;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<UòIó;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2FPPE=<SòCó;PM0PEyÄJÁÄÈzÄIÁÃÇ;PM2FPPE=<Oò{ò;PM0PEyÄJÁÂÆzÄIÁÁÅ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<Mòuò;PM0PEyÄJÁÂÈ|ÄIÁÃÇ;PM2FPPE=<Iòmò;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<Gòeò;PM0PE{ÄJÁÂÆ|ÄIÁÁÅ;PM2FPPE=<Eò_ò;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<CòWò;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<?òQò;PM0PE{ÄJÁÄÈzÄIÁÁÇ;PM2FPPE=<}ñIò;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<{ñAò;PM0PEyÄJÁÂÆ|ÄIÁÃÅ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<wñ{ñ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<uñsñ;PM0PE{ÄJÁÄÆ|ÄIÁÃÅ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<qñmñ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<oñeñ;PM0PE{ÄJÁÂÈ|ÄIÁÁÇ;PM2FPPE=<mñ]ñ;PM0PE{ÄJÁÄÆzÄIÁÁÅ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,2FPPE=<kñWñ;PM0PEyÄJÁÂÈzÄIÁÁÇ;PM2FPPE=<iñOñ;PM0PEyÄJÁÄÈzÄIÁÃÇ;PM2FPMC1,240PE=<GõU÷;PM0PEÆËÆËÈÇÈÅÊÃÊ¿ÎÄÎÆÆÌÂÎÄÎÂÎÄÎÂÎÄÎÄÌÄÈÆÈÄÄÆÆÈÆÄÆÆÊÄÌÈÌÁÎÃÐÁÐÎÔÎÆÐÂÎÄÒÁÌÄÆÈÂÌÂοÎÂÌÄÌÃÌÁÌÃÎÁÌÃÎÁÊÅÈÇÆÉÉÉÅÇÇÉÇÃÅÁÇÃÉÃÉÁËÃËÃÉÁËÉÁËÃÉ¿Ë¿ÉÁÉÃÉÃÇÇÂË¿ÉÁÉ¿ÉÂÉÄÍÆÑÌÕÁÉ¿ÉÃÇÅ¿ËÈÇÐÉÌÍÄËÅÉÇÇÍÇÑ¿Í¿ÍÁÍ¿Í¿Í¿Í¿Í¿Í;PM2RF3,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,3FPPE=<Wóy÷;PM0PEÕÁÇÄÃÊÃÊÂÎÄÎÄÐÄÐÆÒÂÐÄÐÂÐÊÆÆÂÈÌÊÖÃÈÁÊÃÊ¿ÈÁÊ¿ÈÂÄÄÂÌÌÌÆÊÄÊÂÌÂÌ¿Ì¿ÊÄÆÌÆÊÆÊÆÎÖÃÊ¿ÈÆÎÆÐÄÌÄÊ¿ÌÍÅÍÁÍÃËÃÉÃÉÃÉÇÇÉÇ¿ÃÅÃÉÃÍÁÍÁËÁËÁÅ¿ÉÅÇÇËÉËÇËÉËÇÉÇÅÇÇÓÃÕÅÑÁÑÃÑÁÑÅÓÅÕ;PM2FT11,2FPPE=<sê_RÀ;PM0PEÄÚÆÚÈÚÆÚÊÚÈÚÊÚÊÜÊÚÊØÈÚÊØÊØÈØÈÖÆÖÑãÓáÑáÓÝÓÙÑÕÓÑÑÉÆÕÂ×Â×ÂÙ¿ÙÂÙÂÕÄÕ;PM2FTFPPE=<mék\À;PM0PEÇÌÉÕÉ×Ë×É×ÉÕÉÓÇÍÅÅÊÍÊÌÊÎÈÔÊÖÌØÊØÊØÊÖÅÌÆËÆÌË¿¿Ï;PM2FP1PE=<qëG\À;PM0PEÉÉÒÅÒÅÒÃÒÃÐÁÒÁÒÁÒ¿¿ÐÑÂÏ¿ÑÄÏÂÏÄÏÂÑÆÓÆÉÉÊÊÏÆÆÏÐÄ;PM2FP1PE=<Aë{^À;PM0PEÌÁÉÖÇÔÅØÇØÇÖÅØÅÖÇØÏÃÆ×ÈÕÆ×È×ÆÕÈ×Ê×ÊÕÌÃËÄÄÉÈÆÉÎ;PM2FP1PE=<[éQJÀ;PM0PEÁÐÙÍÙ×ÙÝ×áÕçÕçÓéÑçÒÅÎæÔêÖèÖæØâØÜØÖÔÌÁпÏ;PM2FP1PE=<_êIJÀ;PM0PEÉÃÆÃÈ¿Ê¿ÌÁÊ¿Ê¿ÌÂÊ¿¿ÐÉ¿Ë¿É¿É¿Ë¿Å¿ÅÂÅ¿ÉÁÊÂÅÄÃÅÎÇ;PM2FP1PE=<cë}KÀ;PM0PEÈÐÈÌÈÎÊÎÈÎÈÎÊÐÈÐÍÈÇÏÉÍÇÍÉÍÇÍÇÍÇÏÇÏÎÅ;PM2FP1PE=<UìINÀ;PM0PEÒÁ¿ÐÂÒÄÒÂÒÆÐÄÒÈÔÆÒÍÆÉÓÅÑÅÑÃÑÃÑÁÑÁÑÁÓÒÃÑÆ;PM2FP1PE=<mäkJÀ;PM0PEÓÂÑÄÕÄÏÄÓÆÑÆÑÆÏÆÇÍÔÇÒÅÒÅÔÅÒÃÔÃÔÃÔÁÂÐ;PM2FP1PE=<Kä[JÀ;PM0PEÇÂÁÇÅÇÑÁÁÏÜÄÎÎÂÐÇοÏ;PM2FP1PE=<AçEJÀ;PM0PEÃÍØÁÖÁÖ¿Ø¿ØÁÖ¿Ø¿ØÁ¿Ð×Â׿ÕÂ׿×ÂÕ¿Õ¿×ÂÃÏÈÎ;PM2FP1PE=<[ëMOÀ;PM0PEÁÂÌÑÈÍÄËÄËÁÉ¿ËÂËÂËÆ¿ʿ̿ÌÁÊÁÎÃÌÇÐËÒÁÂÃÇ;PM2FP1PE=<eîYMÀ;PM0PEÞËÚËÖÉÒÇÖËÖÏÜÓâÙÄÈßÚÛÔ×ÎÓÌÕÊÕÊÙÊÝÎÁÇ;PM2FP1MC1,90PE=<G_ÀiKÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,4FPPE=<O_ÀyKÀ;PM0PE^ÑkÉÇÍ_ÑjÉÊÐ;PM2FPPE=<Y_ÀILÀ;PM0PE`ÑiÉÉÑ]ÑlÉÈÐ;PM2FPPE=<a_ÀYLÀ;PM0PE^ÑkÉÉÏ]ÑlÉÊÐ;PM2FPPE=<k_ÀiLÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<u_ÀyLÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FT11,2FPPE=<}_ÀIMÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<G`ÀYMÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<Q`ÀiMÀ;PM0PE`ÑkÉÉÏ_ÑjÉÊÒ;PM2FPPE=<[`À{MÀ;PM0PE`ÑiÉÇÏ_ÑlÉÈÎ;PM2FPPE=<c`ÀINÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<m`ÀYNÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FPPE=<u`ÀiNÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<?aÀyNÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FPPE=<GaÀIOÀ;PM0PE^ÑkÉÉÏ]ÑlÉÊÐ;PM2FPPE=<QaÀYOÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<[aÀiOÀ;PM0PE`ÑkÉÉÏ]ÑjÉÈÒ;PM2FPPE=<caÀ{OÀ;PM0PE^ÑiÉÇÏ_ÑlÉÊÎ;PM2FPPE=<maÀIPÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<waÀYPÀ;PM0PE`ÑkÉÇÏ_ÑjÉÈÒ;PM2FPPE=<?bÀkPÀ;PM0PE`ÑiÉÉÏ_ÑlÉÊÎ;PM2FPPE=<IbÀyPÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<SbÀIQÀ;PM0PE`ÑkÉÉÏ]ÑjÉÈÒ;PM2FPPE=<[bÀ[QÀ;PM0PE^ÑiÉÇÏ_ÑlÉÊÎ;PM2FPPE=<ebÀiQÀ;PM0PE`ÑkÉÉÏ]ÑjÉÈÒ;PM2FPPE=<mbÀ{QÀ;PM0PE^ÑiÉÉÏ]ÑjÉÊÐ;PM2FPPE=<wbÀKRÀ;PM0PE^ÑiÉÇÏ]ÑlÉÈÎ;PM2FPPE=<?cÀYRÀ;PM0PE^ÑkÉÉÏ]ÑjÉÊÒ;PM2FPPE=<IcÀkRÀ;PM0PE^ÑiÉÇÏ_ÑjÉÊÐ;PM2FPPE=<ScÀ{RÀ;PM0PE`ÑiÉÉÏ_ÑlÉÊÎ;PM2FPPE=<]cÀISÀ;PM0PE`ÑkÉÇÏ_ÑjÉÈÒ;PM2FPPE=<ecÀ[SÀ;PM0PE`ÑiÉÉÏ_ÑjÉÊÐ;PM2FPPE=<ocÀkSÀ;PM0PE`ÑiÉÉÏ_ÑjÉÊÐ;PM2FPPE=<ycÀ{SÀ;PM0PE`ÑiÉÇÏ_ÑjÉÈÐ;PM2FPPE=<AdÀKTÀ;PM0PE`ÑiÉÉÏ_ÑjÉÊÐ;PM2FPPE=<KdÀ[TÀ;PM0PE`ÑiÉÉÏ]ÑjÉÈÐ;PM2FPPE=<SdÀkTÀ;PM0PE^ÑiÉÉÏ]ÑjÉÊÐ;PM2FPPE=<]dÀ{TÀ;PM0PE^ÑiÉÇÏ]ÑjÉÈÐ;PM2FPPE=<edÀKUÀ;PM0PE^ÑiÉÉÏ]ÑjÉÊÐ;PM2FT11,1FPPE=<odÀ[UÀ;PM0PE^ÑiÉÇÏ_ÑjÉÊÐ;PM2FPPE=<ydÀkUÀ;PM0PE`ÑiÉÉÑ_ÑlÉÊÐ;PM2FPMC1,240PE=<qLÀcVÀ;PM0PEÝÊÛÊÝÈÝÈÝÈÝÈÝÊÝÈÝÈÝÊÛÊÛÈÝÌÛÌÙÌÛÌùèéÞßÖ×Ô×ÒÝØãàóêéÐëÒíÔéÖåÔÛÐÏÊÿÃÇÅËËÓÍ×ÑÛÑÝ×áÕãÙå×ãÛçÙã×ã×ß×ßÕ@ÀË@ÀËþËúËúÉøÉøÉöËøÇöÉöÉöÇøÉöÉøÉúÇøÅôÅìÃêÁæÁâÁÞ¿ÞÁÜ¿Ú¿Ú¿Ú¿Ú¿Þ¿Þ¿âÁ;PM2FTFPMC1,90PE=<G_ÀiKÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FT11,4FPPE=<O_ÀyKÀ;PM0PE^ÑkÉÇÍ_ÑjÉÊÐ;PM2FPPE=<Y_ÀILÀ;PM0PE`ÑiÉÉÑ]ÑlÉÈÐ;PM2FPPE=<a_ÀYLÀ;PM0PE^ÑkÉÉÏ]ÑlÉÊÐ;PM2FPPE=<k_ÀiLÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<u_ÀyLÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FT11,2FPPE=<}_ÀIMÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<G`ÀYMÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<Q`ÀiMÀ;PM0PE`ÑkÉÉÏ_ÑjÉÊÒ;PM2FPPE=<[`À{MÀ;PM0PE`ÑiÉÇÏ_ÑlÉÈÎ;PM2FPPE=<c`ÀINÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<m`ÀYNÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FPPE=<u`ÀiNÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<?aÀyNÀ;PM0PE`ÑkÉÉÏ]ÑlÉÈÐ;PM2FPPE=<GaÀIOÀ;PM0PE^ÑkÉÉÏ]ÑlÉÊÐ;PM2FPPE=<QaÀYOÀ;PM0PE^ÑkÉÇÏ_ÑlÉÊÐ;PM2FPPE=<[aÀiOÀ;PM0PE`ÑkÉÉÏ]ÑjÉÈÒ;PM2FPPE=<caÀ{OÀ;PM0PE^ÑiÉÇÏ_ÑlÉÊÎ;PM2FPPE=<maÀIPÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<waÀYPÀ;PM0PE`ÑkÉÇÏ_ÑjÉÈÒ;PM2FPPE=<?bÀkPÀ;PM0PE`ÑiÉÉÏ_ÑlÉÊÎ;PM2FPPE=<IbÀyPÀ;PM0PE`ÑkÉÉÏ_ÑlÉÊÐ;PM2FPPE=<SbÀIQÀ;PM0PE`ÑkÉÉÏ]ÑjÉÈÒ;PM2FPPE=<[bÀ[QÀ;PM0PE^ÑiÉÇÏ_ÑlÉÊÎ;PM2FPPE=<ebÀiQÀ;PM0PE`ÑkÉÉÏ]ÑjÉÈÒ;PM2FPPE=<mbÀ{QÀ;PM0PE^ÑiÉÉÏ]ÑjÉÊÐ;PM2FPPE=<wbÀKRÀ;PM0PE^ÑiÉÇÏ]ÑlÉÈÎ;PM2FPPE=<?cÀYRÀ;PM0PE^ÑkÉÉÏ]ÑjÉÊÒ;PM2FPPE=<IcÀkRÀ;PM0PE^ÑiÉÇÏ_ÑjÉÊÐ;PM2FPPE=<ScÀ{RÀ;PM0PE`ÑiÉÉÏ_ÑlÉÊÎ;PM2FPPE=<]cÀISÀ;PM0PE`ÑkÉÇÏ_ÑjÉÈÒ;PM2FPPE=<ecÀ[SÀ;PM0PE`ÑiÉÉÏ_ÑjÉÊÐ;PM2FPPE=<ocÀkSÀ;PM0PE`ÑiÉÉÏ_ÑjÉÊÐ;PM2FPPE=<ycÀ{SÀ;PM0PE`ÑiÉÇÏ_ÑjÉÈÐ;PM2FPPE=<AdÀKTÀ;PM0PE`ÑiÉÉÏ_ÑjÉÊÐ;PM2FPPE=<KdÀ[TÀ;PM0PE`ÑiÉÉÏ]ÑjÉÈÐ;PM2FPPE=<SdÀkTÀ;PM0PE^ÑiÉÉÏ]ÑjÉÊÐ;PM2FPPE=<]dÀ{TÀ;PM0PE^ÑiÉÇÏ]ÑjÉÈÐ;PM2FPPE=<edÀKUÀ;PM0PE^ÑiÉÉÏ]ÑjÉÊÐ;PM2FT11,1FPPE=<odÀ[UÀ;PM0PE^ÑiÉÇÏ_ÑjÉÊÐ;PM2FPPE=<ydÀkUÀ;PM0PE`ÑiÉÉÑ_ÑlÉÊÐ;PM2FPMC1,240PE=<qFÀ]UÀ;PM0PEÂÁÈÉÊÇÌÉÌÇÄÈËÆÉÊËÊÅÆÂÁÉ¿;PM2FT10,0FP1PE=<kFÀkTÀ;PM0PEÅ¿¿ñÊ¿¿òÿ;PM2FP1PE=<oHÀeUÀ;PM0PEÂÃÄÅ¿ÇÂÉÁÇÊ¿ÁÈ¿ÊÁÌÃÈÂÁÉ¿;PM2FP1PE=<qHÀUTÀ;PM0PEÃÄÄÇÄÉ¿É¿Ë¿Ë¿ËÁË¿ÇÊ¿¿ÈÂÌ¿Ì¿Ì¿ÌÃÌÁÊÃÊÃÂÄÁÁÂÁ¿¿É;PM2FP1PE=<sHÀWTÀ;PM0PE¿Â¿¿ÊÃÁÃÁÁÃÁÃÊ¿;PM2FP1PE=<CJÀoTÀ;PM0PEÂÂÄÄÂÆÄÆÂÂÃÆÃÃÃÅÁÃÃÃÄ¿É;PM2FP1PE=<OJÀoTÀ;PM0PEÃÃÆÂÄÂÂÂÄÁ¿ÊÅÁÃÁÁ¿Ã¿ÁÁÂÂÁ¿¿ÁÆÃ;PM2FP1PE=<}JÀKUÀ;PM0PEÃÁÎÆÎÆÌÈÊÊÅÄÉÇËÅËÇËÅÃÃÄÄÿ¿ÃÊ¿;PM2FP1PE=<CKÀ{UÀ;PM0PEÆ¿¿ðÉ¿¿ïÄ¿;PM2FP1PE=<GMÀKUÀ;PM0PEÆÍÊÏÈËÆÍÆ¿ÃÐÇÐÉÎÇÌ¿ÁÅ¿;PM2FP1PE=<GMÀETÀ;PM0PEÿÄEÀÆ¿ÁFÀÿ;PM2FP1PE=<]EÀmUÀ;PM0PEÃÄ¿ßÊ¿¿àÁÄÂÿÂÁÂÃÇ;PM2FP1PE=<mEÀWUÀ;PM0PEÂÇÂÅÆÅÆÁÄÈÃÂÃÂÁÄ¿ÆÉ¿;PM2FP1PE=<AOÀaSÀ;PM0PEÈ}ÀÆ¿Å~ÀÇ¿;PM2FP1PE=<COÀYSÀ;PM0PEÁ¿ÃÂÃÂÁÈ¿¿ÆÁÂÁ¿ÂÂÃÂÃÃ;PM2FP1PE=<GOÀOSÀ;PM0PEÃÃÈÅÄÄÅÈÁÁ;PM2FP1PE=<]QÀMTÀ;PM0PE¿Ì¿Î¿Î¿ÊÅÂÁËÁÍ¿Í¿ËÊ¿;PM2FP1PE=<QQÀiTÀ;PM0PE¿ÃÃÊÃÆÃÈ¿ÈÉ¿ÄÉÂÉÆÅ¿ÅÂÁÈÆ;PM2FP1PE=<yPÀQUÀ;PM0PEÃÊÅÊÇÊÅÊÇÅÈÉÆÇÆÉÄÇ¿ÂÈ¿;PM2FP1PE=<}PÀ}UÀ;PM0PE¿ÂÄêÇ¿Ãé¿ÂÈÃ;PM2FP1PE=<WQÀUVÀ;PM0PEÈÆÆÆÆÆÆÆÇÄÃÅÅÃÅÅÅÃÄÇ;PM2FP1PE=<[SÀmUÀ;PM0PEÁÿÅÁÅÃÃÃÅÈÅÄÆÂÆÄÈÂÈÁÃÅÈ;PM1PEÁÁ¿ÁÂÄ;PM2FP1PE=<}RÀSUÀ;PM0PEÂÂÅÅÇÇÉÇÇÅÆÇÈÆÈÊÈÈÆÆÂÄÇ¿;PM2FP1PE=<{RÀ?UÀ;PM0PEÁÄ¿×È¿¿ØÁÄÂÿÂÁÂÃÇ;PM2FP1PE=<KSÀuTÀ;PM0PEÂÁÎÇÄÈÍÈÂÃÇÁ;PM1PEÂÁÁÂ;PM2FP1PE=<WSÀ[TÀ;PM0PEÃÄÄËÄÅÄÅÄÅÈÂÃÈÅÆÁÄÁÊÃÂÄÁÁÂÁ¿ÁÅ;PM2FP1PE=<ySÀSSÀ;PM0PEÂÇÂËÂËÂÉÆËÄÇÈÅÈÃÂÆÅÄÃÆÅÈÃÈÁÊÁÌÃÊÂÈÉ¿;PM2FP1PE=<ySÀKSÀ;PM0PEÃÂÂÃÂÃÂÁÁ¿Ê¿ÁÄÁ¿ÄÁÂÃÃ;PM2FP1PE=<?TÀESÀ;PM0PEÂÁÄÃÄÄÃÄÂÁÇ¿;PM2FP1PE=<{SÀwRÀ;PM0PEÿ¿ÍÈ¿¿Îÿ;PM2FP1PE=<oUÀ{SÀ;PM0PEÁÁÊÊÊÊÊÈÈÊÆÊÄÌÄÌÂÐÉ¿¿ËÁÍÅÉÅÉÇÇÇÉÇÇËËÁÁÊ¿;PM2FP1PE=<qUÀmTÀ;PM0PEÂÁ¿ôÉ¿¿óÂÃÆÆ;PM2FP1PE=<cUÀEUÀ;PM0PEÁÂËÖÅÅÌÓÁÂÊ¿;PM2FP1PE=<iUÀ[UÀ;PM0PEÆ¿¿ÖÉ¿¿ÕÄ¿;PM2FP1PE=<SXÀqSÀ;PM0PEÂÁHÀYÀÆÆGÀZÀÂÃÉ¿;PM2FP1PE=<UXÀASÀ;PM0PEÃÃÂËÂÉÂË¿ÉÊ¿ÁÌÁÌÃÊ¿ÊÃÿÈ;PM1PEÿ¿ÃÄÄ;PM2FP1PE=<MWÀkRÀ;PM0PE¿ÅÁÃÃÇÅÅÃËÁÉÃÍ¿Í¿¿ÇοÎÂÌÂÌÄÊÄÆÄÆÄÄÆ¿ÇÄ;PM2FP1PE=<{VÀKRÀ;PM0PEÃÿÃÅÇÃÇÃÇÈÃÂÆÆÊÄÈÂÈÃÿÈ;PM1PEÿ¿ÃÄÄ;PM2FP1PE=<_VÀGRÀ;PM0PEÇÁÉÁÿſ¿ÇÆ¿ÈÂÆ¿È¿¿Ê;PM2FP1PE=<UZÀGSÀ;PM0PEÁÑÃÑ¿Ñ¿Ñ¿Ñ¿ÑÂÏ¿ÏÊ¿¿ÐÁпҿҿÒÁÒÂÒÂпÁÅÄ;PM2FP1PE=<CZÀ?SÀ;PM0PEÄÂÅÁÅÁÅÁÃÃÆÃÄÂÂÂÆ¿Ä¿ÂÄÁÿÂÅÄ;PM2FP1PE=<aYÀWRÀ;PM0PEÂÄÉÉÉËÉËÅÉÆÃÈÈÈÌÌÌÆÊÂÂÇ¿;PM2FP1PE=<WYÀyQÀ;PM0PEÃÁÃÅ¿ÇÁÇ¿ÅÈ¿¿Æ¿ÆÂÆÄÆÃÁ¿È;PM1PEÁ¿ÁÁÄÂ;PM2FP1PE=<GYÀoQÀ;PM0PEÃÃÃÁÃÃÿ¿ÇÆÂÈÂÂÄÄÄÃÆ;PM2FP1PE=<Y\ÀSSÀ;PM0PEÄÃÆÃÈÅÊÅÆÅÈÅÈÇÈÅÆÅÆÄÇÊÇÆÅÆÇÆÇÆÇÆÇÆÇÆÂÃÉ¿;PM1PE¿ÁÄÁÃÄ;PM2FP1PE=<_\ÀISÀ;PM0PEÄÃÂÁ¿Á¿ÁÊ¿ÁÄÁÆÁÂÅÄÄÃÇÁ;PM1PEÂÿÃÄ;PM2FP1PE=<g\ÀsRÀ;PM0PEÂÇÂÃÂÃÂÅÈÂÁÆÁÄÁÆ¿ÄÉ¿;PM2FP1PE=<q\ÀeRÀ;PM0PEÂÅÄÃÄÁ¿ÁÊ¿ÁÆÅÄÁÄÉ¿;PM2FP1PE=<q\ÀuQÀ;PM0PE¿ïÊ¿¿ðÁÁÇÂ;PM2FP1PE=<S\ÀYPÀ;PM0PEÂÂß]ÀÈÁà^ÀÉ¿;PM2FP1PE=<O\ÀMPÀ;PM0PEÂÁÁÁÁÃÁÃÊ¿¿Â¿ÂÂÂÂÆÉ¿;PM2FP1PE=<{^ÀaRÀ;PM0PE¿ÂÈÈÈÈÈÊÄÊÅÂÅÇÅÉÉÇÅÇ¿ÂÆÇ;PM2FP1PE=<C`ÀASÀ;PM0PEÁ¿ÊÄÈÂÊÄÊÆÊÂÈÆÊÄÈÄÅÈÇÃÇÅÇÃÇÃÉÃÉÃÇÃÉÃÁ¿ÆÅ;PM2FP1PE=<k`À[SÀ;PM0PEÁÃÊÆÊÈÊÈÌÈÅÆÉÇÉÅÉÇËÅÁÃÂÄÁÁ¿ÁÊ¿;PM2FP1PE=<o`ÀqSÀ;PM0PEÄ¿¿ÖÉ¿¿ÕÆ¿;PM2FP1PE=<AJÀgUÀ;PM0PE¿Á¿ÅÅÅÁÅÃÇÊ¿¿ÆÄÄÄÈÄÈÁÁÇÄ;PM2FP1PE=<oIÀ[UÀ;PM0PEÂÂÃÁÅÃÃÃÅÃÈÃÂÂÆÄÆÂÂÆÄÂÉ¿;PM2FP1PE=<kIÀ?UÀ;PM0PEÿ¿ÛÊ¿¿ÜÅ¿;PM2FP1PE=<uDÀWUÀ;PM0PEÃÁäóÆÆáòÃÁ;PM2FP1PE=<{BÀmUÀ;PM0PE¿ÅÇÉÇÉÁÇÆÃÄÈÈÊÆÊÄÊÉ¿;PM2FP1PE=<KHÀYUÀ;PM0PE¿Á¿ÇÁÉÁÉ¿ËÊ¿¿Ì¿ÈÂÌ¿È¿ÁÇÄ;PM2FP1PE=<EHÀSUÀ;PM0PE¿ÂÅÇÈÃÆÆ¿ÄÇ¿;PM2FP1PE=<CHÀKUÀ;PM0PE¿ÁÁÁÿÁÈ¿¿ÂÄ¿ÄÉ¿;PM2FP1PE=<wGÀsTÀ;PM0PEÅÿÁÁÅ¿ÃÃÇÊ¿¿ÆÂÄ¿ÆÄÄÇÃÄÈ;PM1PEÅÆ¿ÉÆÄ;PM2FP1PE=<[GÀIVÀ;PM0PEÈ¿¿ÊÁÌÁÊÃÌÃÊÅÌÅÊËÊÃÇÈÅÈÉÆÉÄÉÂËÄÉ¿É¿É;PM1PEÈÁÇÂ;PM2FP1PE=<{FÀ{TÀ;PM0PEÃÂÛOÀÈÁÜPÀÿ;PM2FP1PE=<uEÀ]UÀ;PM0PEÂÅÆÇÌÉÌÉÌÇÈÐÉÆÉÈËÊÅÈÂÅÏ¿;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,5FP1PE=<mEÀkTÀ;PM0PEÇ¿¿ñп¿òÇ¿;PM2FP1PE=<sGÀeUÀ;PM0PEÂÅ¿ÃÂÇÂÉ¿Çп¿ÈÁÌ¿ÊÅÊÂÃÏ¿;PM2FP1PE=<sGÀWTÀ;PM0PEÅÂÂÅÄÇ¿É¿Ë¿Ë¿Ë¿Ë¿Çп¿ÈÂÌ¿Ì¿Ì¿ÌÁÎÃÊÃÊÇÄÈÃÁÄÅ¿¿Ï;PM2FP1PE=<qGÀWTÀ;PM0PEÁ¿¿ÐÅÁÃÁÃÅÁÅÒ¿;PM2FP1PE=<EIÀsTÀ;PM0PEÆÄÄÄÂÆÄÄÂÄËÌÃÅÃÅÁÃÁÁÆ¿Ñ;PM2FP1PE=<MIÀsTÀ;PM0PEÅÁÄ¿Æ¿¿¿ÒÅ¿ÅÃÁ¿ÅÁÆÂÿÁÁÌË;PM2FP1PE=<{IÀKUÀ;PM0PEÅÅÎÆÎÆÌÈÌÊËÌÉÇÉÅÍÇËÅÅÇÆÈÅÁ¿ÅÒ¿;PM2FP1PE=<CJÀ{UÀ;PM0PEÈ¿¿ðÑ¿¿ïÊ¿;PM2FP1PE=<MLÀKUÀ;PM0PE¿ÁÈÏÊÍÈËÄËÐÂÅÐÇÐÉÎÅÌ¿ÃÏ¿;PM2FP1PE=<ILÀETÀ;PM0PEÇ¿ÄEÀпÃFÀÇ¿;PM2FP1PE=<aDÀqUÀ;PM0PEÃÈ¿ßп¿àÃÆÄÅ¿ÄÃÂÇÍ;PM2FP1PE=<sDÀWUÀ;PM0PEÂÉÄÇÆÅÆÁÈÎÃÄÿÆÑ¿;PM2FP1PE=<GNÀaSÀ;PM0PEÈ}ÀпÇ~ÀÏ¿;PM2FP1PE=<INÀ]SÀ;PM0PEÁÆ¿ÃÂÅÄ¿Á¿Ð¿¿ÆÁÄÃÆËË;PM2FP1PE=<INÀOSÀ;PM0PEÅÅÆÇÌÌÅÈÅÅ;PM2FP1PE=<[PÀMTÀ;PM0PE¿Ì¿Î¿ÌÂÊÑÄ¿ËÁÍ¿Í¿ËÒ¿;PM2FP1PE=<QPÀgTÀ;PM0PEÂÅÃÌÃÆÁÆÁÈÑ¿ÂËÆÉÄÅÂÃÂÅÌÌ;PM2FP1PE=<wOÀSUÀ;PM0PE¿ÄÃÊÅÊÇÊÇÊËËÆÇÈÉÆÇÂÅ¿ÂÐÁ;PM2FP1PE=<}OÀAVÀ;PM0PEÂÄÄêÏÂÃéÂÄÌÉ;PM2FP1PE=<UPÀYVÀ;PM0PEÆÆÈÆÆÆÄÆËÊÃÃÅÅÅÅÅÁÊÏ;PM2FP1PE=<_RÀiUÀ;PM0PEÃÇ¿ÃÁÅÃÃÁÇÎÅÄÄÂÆÄÈÂÊÃÅÉÎ;PM1PEÃÁ¿ÅÄÈ;PM2FP1PE=<CRÀSUÀ;PM0PEÂÆÅÅÇÉÇÇÇÃÊÍÊÆÈÈÈÊÆÆÂÆÏ¿;PM2FP1PE=<?RÀAUÀ;PM0PEÃÆ¿×п¿ØÃÈÄÇ¿ÆÃÂÇÍ;PM2FP1PE=<QRÀuTÀ;PM0PEÄÅÎÅÈÎÍÆÄÃÏÃ;PM1PE¿ÃÄÁÃÆ;PM2FP1PE=<YRÀaTÀ;PM0PEÅÊÂËÄÉÆÅÂÁÐÄÃÈÅÆÁÄÁÈÅÈÆÇ¿ÆÅÂÃÑ;PM2FP1PE=<}RÀSSÀ;PM0PE¿ÉÂËÂÉÂËÆÉÆÉÈÇÊÅÄÒÃÂÃÄÅÆÁÊÃÊÁÊÁÊ¿ÈÏ¿;PM2FP1PE=<?SÀOSÀ;PM0PEÁÆ¿ÃÂÅÂÁ¿ÂпÁÆÁÄÁÆËË;PM2FP1PE=<ESÀESÀ;PM0PEÂÅÄÃÌÌÃÄÂÅÏ¿;PM2FP1PE=<}RÀwRÀ;PM0PEÇ¿¿Íп¿ÎÇ¿;PM2FP1PE=<mTÀ{SÀ;PM0PEÁÅÊÊÊÊÈÈÊÌÆÊÆÌÄοÐÏ¿ÁËÃËÁÉÅÇÇÉÇÇÉÉÉÉÃÅÒ¿;PM2FP1PE=<oTÀmTÀ;PM0PEÂÁ¿ôÑ¿¿óÂÃÎÆ;PM2FP1PE=<aTÀEUÀ;PM0PEÁÄËÔÍÅÌÕÁÄÒ¿;PM2FP1PE=<iTÀ[UÀ;PM0PEÈ¿¿ÖÑ¿¿ÕÊ¿;PM2FP1PE=<WWÀqSÀ;PM0PEÂÃHÀYÀÌÊGÀZÀÂÅÏ¿;PM2FP1PE=<UWÀ}RÀ;PM0PEÉÇÂËÂËÂÉÂÉпÁÌÁÌÁÊÁÊÇÇÂÐ;PM1PEÉ¿ÉÊÈ;PM2FP1PE=<SVÀiRÀ;PM0PEÂÂÃÃÃÃÅÃÇÁÉÃËÁËÁË¿ÁÏοпÌÄÌÂÈÆÊÆÆÄÄÄÂÂÏÈ;PM2FP1PE=<}UÀGRÀ;PM0PEÇÇ¿ÁÃÇÅÉÃÅÐÇÂÈÆÈÄÈÂÊÇÇ¿Ð;PM1PEÇ¿¿ÇÈÈ;PM2FP1PE=<aUÀERÀ;PM0PEÉ¿Å¿ÅÁÅ¿¿ÏÈ¿Æ¿ÆÂÈ¿¿Ð;PM2FP1PE=<YYÀCSÀ;PM0PEÁÃÃÑÁÑ¿Ñ¿ÑÂÑ¿Ñ¿Ï¿ÏÒ¿¿ÐÁпҿҿҿÒÂÐÂÐÁÃËÌ;PM2FP1PE=<IYÀ}RÀ;PM0PEÈÄÇÁÅ¿ÅÃÃÃÌË¿ÆÂÂÂÆÂÅÁÄ¿ÂÂÍÊ;PM2FP1PE=<gXÀWRÀ;PM0PEÂÆÇÇÉÍÉËÇÉÎÉÈÊÈÌÊÌÈÈÂÆÏ¿;PM2FP1PE=<YXÀuQÀ;PM0PEÅÃÅÇ¿ÇÁÅ¿Çп¿ÆÂÆÂÆ¿ÄÅÿÐ;PM1PEÿÁÃÆÄ;PM2FP1PE=<MXÀmQÀ;PM0PEÃÁÁÃÿÁÁ¿ÏÈ¿ÈÄÄÆÄÂËÌ;PM2FP1PE=<][ÀSSÀ;PM0PEÄÇÆÃÈÅÊÅÆÅÈÅÆÅÈÅÈÇÌÌÇÈÇÆÅÆÉÈÇÆÇÆÇÆÇÄÄÅÏ¿;PM1PE¿ÅÄÁÃÈ;PM2FP1PE=<c[ÀMSÀ;PM0PEÆÃÁ¿¿Á¿п¿ÆÃÆÃÄÇÂÈÃÍÇ;PM1PE¿ÃÆ¿ÅÄ;PM2FP1PE=<k[ÀsRÀ;PM0PE¿ÇÂÅÄÅÂÅÎÈÁÆÁÄ¿ÄÁÄÏ¿;PM2FP1PE=<w[ÀeRÀ;PM0PEÂÇÆÃÄÿÂпÃÈÃÆÁ¿ÁÑ¿;PM2FP1PE=<w[ÀsQÀ;PM0PE¿Á¿ïÒ¿¿ð¿ÃÑÆ;PM2FP1PE=<W[ÀYPÀ;PM0PE¿Äß]ÀÒÅÞ^À¿ÂÏ¿;PM2FP1PE=<S[ÀMPÀ;PM0PEÁÁÁÿÅпÄÄ¿ÈÏ¿;PM2FP1PE=<{]ÀeRÀ;PM0PEÂÂÆÈÊÈÈÌÆÌÑÂÁÅÅÇÉÇÇÉÄÂÈÍ;PM2FP1PE=<C_ÀESÀ;PM0PEÁÁÊÄÊÄÈÄÊÆÊÄÈÄÈÄÊÄÇÎÇÁÇÅÉÃÇÃÉÃÉÃÇÁÇÃÃÁÊÍ;PM2FP1PE=<i_À[SÀ;PM0PEÃÅÌÆÈÆÌÈÊÈÉÎÉÇÉÇÉÅÉÅÃÇÄÈÃÁ¿Åп;PM2FP1PE=<q_ÀqSÀ;PM0PEÈ¿¿ÖÏ¿¿ÕÈ¿;PM2FP1PE=<EIÀeUÀ;PM0PEÁÿÁÃÅÅÇ¿ÉпÂÂÂÆÄÈÄÊÁÅÍÊ;PM2FP1PE=<uHÀ[UÀ;PM0PEÂÆÁÁÅÃÅÃÃÅÎÉÂÄÄÂÆÄÄÄÄÆÑ¿;PM2FP1PE=<mHÀ?UÀ;PM0PEÇ¿¿ÛÒ¿¿ÜÉ¿;PM2FP1PE=<wCÀWUÀ;PM0PEÅÅâñÎÊáòÇÃ;PM2FP1PE=<?BÀmUÀ;PM0PEÁÃÇÉÅÇÅËÒÃÂÆÈÊÆÊÄÌÏ¿;PM2FP1PE=<OGÀWUÀ;PM0PEÁÿÇÁÉÁÉ¿ËÒ¿¿Ì¿ÈÂÊ¿ÊÁÃËÈ;PM2FP1PE=<KGÀSUÀ;PM0PEÂÄÅÇÌÇÆÆÂÆÏ¿;PM2FP1PE=<GGÀKUÀ;PM0PE¿ÂÁÁÁÿÃпÄ¿ÆÏ¿;PM2FP1PE=<uFÀqTÀ;PM0PEÍÅ¿ÁÁÃÁÿÉпÂÄ¿ÆÂÄÂÆÏÅÌÌ;PM1PEÍÌ¿ÑÎÆ;PM2FP1PE=<aFÀGVÀ;PM0PEÐÁ¿Ê¿ÌÁÌÃÊÅÌÅÌÇÌÉÈËËÊÇÆÇÆÉÂÉÄÉÂÉÂÉ¿ÉÐÃÏÆ;PM2FP1PE=<}EÀ{TÀ;PM0PEÇÂÛMÀÐÅÜPÀÇÂ;PM2FP1PE=<A_ÀKPÀ;PM0PEHÀëFÀåFÀáDÀÝFÀÙDÀÕDÀÓFÀÑDÀÑHÀÏFÀÑJÀÑHÀÓLÀÕNÀ×NÀÛÂÈMÀÚMÀÚIÀÖIÀÔIÀÒEÀÐEÀÒEÀÐCÀÔEÀÔCÀÖEÀÚCÀÜCÀâEÀæEÀîÅÇ;PM2FP1PE=<qqÀyKÀ;PM0PELÀÏNÀÍPÀËRÀËRÀËRÀÉRÀËPÀËNÀËPÀÏLÀÏHÀÓFÀÕBÀÙüÛøáÆÈ÷à?ÀÞAÀÚCÀÖIÀÒKÀÒMÀÎOÀÎQÀÌQÀÊQÀÌQÀÌOÀÊOÀÎMÀÎIÀÐÃÇ;PM2FP1PE=<iAÁ}FÀ;PM0PEBÀÏþÑBÀÑþÕ@ÀÓ@ÀÕþÓ@À×þÕ@ÀÓþÕ@ÀÓþÓ@ÀÓ@ÀÏ@ÀÏÄÈAÀÐ?ÀÐýÔ?ÀÒ?ÀÔýÖ?ÀÖýÖ?ÀÖýÖ?ÀÖ?ÀÔýÔ?ÀÔ?ÀÒAÀÐÁÇ;PM2FP1PE=<aJÁCFÀ;PM0PEâÅæÅâÃäÃäÁäÁäÁäÁäÁäÁäÁäÁâÃâÃäÅâÇÂÈáÆáÆåÆáÂãÄãÂãÂãÂãÂã¿ãÄãÂãÄáÄãÄáÈÁÇ;PM2FP1PE=<qLÁ_DÀ;PM0PEÔÅÒÉÐÍÒÏÐÑÒÏÒËÔÇÂÈÑÈÑÌÏÎÑÐÏÒÑÎÓÌÕÆ¿Ç;PM2FP1PE=<Q^ÁuCÀ;PM0PEFÀÁFÀÁHÀÁDÀÁHÀ¿FÀÁFÀ¿FÀÁFÀ¿FÀÁFÀÁFÀÁFÀÅFÀÃFÀÅDÀÇ¿ÈCÀÆEÀÆEÀÆEÀÄEÀÂEÀÄEÀÂEÀÂEÀÂEÀ¿EÀÂGÀ¿CÀ¿GÀ¿EÀÄEÀ¿Ç;PM2FP1IW0,0,6352,4896PE=<pÂG[Á;PM0PEoØ¿¿V^ÁpØ¿¿U^Á;PM2FT10,0FPIWIW0,0,6352,4896PM0PEOM¿¿jØPM¿¿iØ;PM2FPIWIW0,0,6352,4896PE=<QoÁWHÁ;PM0PEMÙ¿¿fKÁNÙ¿¿eKÁ;PM2FPIWIW0,0,6352,4896PE=<?Î}Õ;PM0PE[lÁ¿¿NÙ\lÁ¿¿MÙ;PM2FPIWPE=<[ZÀwÍ;PM0PEÇÑÇ¿ÃTÀÊ¿ÂÁ¿Á¿Á¿Á¿ÃÂÁ¿Ã¿Á¿ÁÂÁ¿ÁÂÁ¿Á¿ÁÂÁ¿Á¿Á¿ÁÂÁÂÁ¿Á¿Á¿¿Á¿¿Ã¿ÂÁ¿ÁÂÁ¿¿Á¿¿Á¿ÂÁ¿ÂÁ¿¿ÂÁ¿¿¿¿¿Á¿¿¿¿¿¿Â¿Ŀ¿Â¿Â¿¿Â¿Â¿¿¿Â¿ÂÂĿ¿Â¿¿¿¿Â¿¿¿¿¿Ŀ¿¿ÂÂĿ¿Ŀ¿¿¿Ŀ¿Ŀ¿ƿĿĿ¿Ŀ¿Ŀ¿¿¿ĿÂÁĿ¿ÂÁ¿¿Ŀ¿¿¿ÂÁ¿¿¿¿ÂÁÂÁ¿¿ÄÁ¿ĿÂÁ¿Á¿ÂÁÂÁ¿ÂÁ¿ÁÂÁ¿Á¿ÂÁ¿Á¿Á¿¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿¿ÁÁ¿Á¿ÁÁÁ¿¿ÁÁ¿¿ÁÃÁ¿ÁÁÁ¿ÁÁÁ¿ÁÁÁ¿Á¿ÁÁÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Ï¿Á¿Á¿Á¿Á¿Á¿Á¿¿Á¿¿¿¿ÁÄ¿Ì¿¿ÍGÀ¿¿Î̿Ŀ¿¿¿Â¿¿Â¿Â¿Â¿Â¿Â¿Â¿JÀÈ¿Êۿ¿Â¿¿¿Â¿¿¿¿Â¿¿¿Â¿¿¿Â¿¿¿¿¿¿¿¿ÂÂÁĿĿ¿¿ĿÂÁĿ¿ÂÁ¿ÂÁ¿ÂÁÂÁÂÁ¿¿Á¿ÂÁÂÁ¿Á¿ÂÁÂÁÂÿÁÂÁ¿¿ÃÂÁ¿ÁÂÁÂÁ¿Á¿ÁÂÁ¿ÃÂÁ¿ÁÂÁ¿Á¿ÃÂÁ¿Ã¿Á¿Á¿ÃÂÁ¿Á¿ÃÂÁ¿Ã¿Á¿Ã¿Á¿Ç¿Á¿Ã¿Á¿Ã¿Á¿ÃÁÁ¿Ã¿ÁÁÁ¿Ã¿Á¿Á¿ÃÁÁ¿Ã¿ÁÁÁ¿ÁÁÁ¿ÃÁÁ¿Á¿ÁÁÁÁÁ¿Á¿ÁÁÃÃÅÁÁÁÁ¿ÁÁÁÁÁ¿Áÿ¿ÁÁÁ¿ÁÁ¿ÁÁÁ¿¿ÁÃÁÁ¿ÁÁÁ¿Á¿¿Áÿ¿ÁÁ¿Á¿Á¿Á¿Á¿Á¿ÅÁ¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿ÁÂÁ¿Á¿¿ÂÁ¿Á¿Á¿¿ÂÁ¿ÁÂÁ¿¿ÂÁ¿¿ÂÁ¿Á¿ÂÁ¿¿ÂÁ¿Á¿Á;PM2FTFPPE=<Q\ÀoÌ;PM0PE¿¿Â¿¿¿Â¿¿¿Â¿Â¿Â¿¿Â¿Â¿¿Â¿Ä¿¿Â¿Â¿¿¿¿¿Â¿¿Ŀ¿¿¿¿¿¿¿ĿĿà¿Â¿Â¿Â¿Â¿ÂÁ¿Á¿Á¿Í¿¿Îü¿¿ÍÉ¿Á¿Á¿Á¿¿ÁÁ¿¿Á¿Á¿Á¿Á¿YÀ¿Á¿Á¿Á¿Á¿Á¿¿¿Á¿¿¿¿¿ƿ¿ËåÅ¿ì¿ÁÁ¿¿Á¿ÁÁ¿¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿ÁÁ¿ÁÁ¿Á¿ÁÁ¿¿Á¿ÁÁÁÁ¿¿Á¿ÁÁ¿ÁÁÁ¿¿ÁÁ¿¿ÁÁ¿Á¿Á¿ÃÁ¿ÂÁ¿Á¿Á¿Á¿¿ÂÁ¿ÁÂÁ¿¿ÂÁ¿Á¿¿Â¿Â¿Â¿ÂÁ¿¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿¿Â¿Â¿Â¿¿¿¿¿¿¿¿Á¿¿¿Á¿Á¿¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿ÁÁÁ;PM2FPLTPW0SVPE=<g]À}Ì¿=<W]À{ÌÝ¿=<U]ÀyÌã¿=<O]ÀwÌí¿=<K]ÀuÌõ¿=<K]ÀsÌ÷¿=<I]ÀqÌù¿=<E]ÀoÌÓ¿<Ñ¿Ù¿=<E]ÀmÌÏ¿<Ù¿Õ¿=<C]ÀkÌÍ¿<á¿Õ¿=<A]ÀiÌÍ¿<å¿Ó¿=<A]ÀgÌË¿<é¿Ñ¿=<?]ÀeÌÍ¿<ë¿Ï¿=<}\ÀcÌÏ¿<ë¿Ñ¿=<}\ÀaÌÏ¿<ë¿Ñ¿=<}\À_ÌÑ¿<é¿Ñ¿=<}\À]ÌÓ¿<ç¿Ñ¿=<}\À[ÌÓ¿<ç¿Ñ¿=<}\ÀYÌÕ¿<ç¿Ï¿=<}\ÀWÌÕ¿<ç¿Ï¿=<}\ÀUÌÕ¿<ç¿Ï¿=<}\ÀSÌÕ¿<ç¿Ï¿=<}\ÀQÌÕ¿<ç¿Ñ¿=<}\ÀOÌÕ¿<ç¿Ñ¿=<}\ÀMÌÓ¿<é¿Ñ¿=<?]ÀKÌÏ¿<ë¿Ñ¿=<?]ÀIÌÏ¿<ë¿Ñ¿=<C]ÀGÌÉ¿<í¿Ñ¿=<{]ÀEÌÑ¿=<u]ÀCÌ׿=<o]ÀAÌÝ¿=<g]À?Ìå¿=<a]À}Ëë¿=<[]À{Ëñ¿=<W]ÀyËõ¿=<S]ÀwËå¿<Á¿Ñ¿=<O]ÀuËÝ¿<Í¿Ñ¿=<K]ÀsËÛ¿<Ó¿Ñ¿=<I]ÀqËÛ¿<Õ¿Ñ¿=<E]ÀoËÙ¿<Û¿Ñ¿=<C]ÀmË׿<ß¿Ñ¿=<A]ÀkËÕ¿<ã¿Ñ¿=<?]ÀiËÕ¿<å¿Ñ¿=<}\ÀgËÕ¿<ç¿Ñ¿=<}\ÀeËÓ¿<é¿Ñ¿=<{\ÀcËÓ¿<ë¿Ñ¿=<y\ÀaËÓ¿<í¿Ñ¿=<y\À_ËÓ¿<í¿Ñ¿=<y\À]ËÓ¿<í¿Ñ¿=<w\À[ËÓ¿<ï¿Ñ¿=<w\ÀYËÓ¿<ï¿Ñ¿=<w\ÀWËÑ¿<ï¿Ó¿=<w\ÀUËÑ¿<ï¿Ó¿=<w\ÀSËÑ¿<ï¿Ó¿=<w\ÀQËÑ¿<ï¿Ó¿=<w\ÀOËÑ¿<ï¿Ó¿=<w\ÀMËÑ¿<ï¿Ó¿=<w\ÀKËÑ¿<ë¿×¿=<w\ÀIËÑ¿<ë¿×¿=<w\ÀGËÑ¿<ë¿×¿=<w\ÀEËÓ¿<ç¿Ù¿=<w\ÀCËÕ¿<å¿Û¿<Ͽ¿=<w\ÀAËÕ¿<á¿Ë¿<Á¿Ñ¿<Ï¿Á¿=<w\À?ËÕ¿<ß¿Ë¿<ÿã¿=<w\À}ÊÙ¿<׿Ϳ<Å¿ã¿=<y\À{ÊÛ¿<Ï¿Ñ¿<Å¿ã¿=<y\ÀyÊù¿<É¿ã¿=<y\ÀwÊ÷¿<Í¿ß¿=<{\ÀuÊõ¿<Í¿Ý¿=<}\ÀsÊï¿<Ó¿Û¿=<?]ÀqÊé¿<ٿ׿=<A]ÀoÊå¿<Ý¿Ó¿=<I]ÀmÊÕ¿<í¿Á¿=<S]ÀkÊ¿¿;;PE=<s_ÀqÌ;PM0PEÅÉÅ¿¿òÆ¿¿Á¿¿Á¿Á¿Á¿Á¿ÂÁ¿Á¿ÁÂÁ¿ÁÂÁÂÁ¿Á¿¿ÁÂÁÂÁ¿¿Á¿ÂÁ¿Á¿¿¿¿¿¿¿Á¿¿¿¿¿¿Â¿¿Â¿¿Â¿¿Â¿Â¿Â¿¿Â¿Â¿Â¿Â¿Â¿ÂÁ¿¿Â¿ÂÁ¿ÂÁ¿ÁÂÁ¿¿ÂÁÂÁ¿Á¿ÁÂÁ¿Á¿Ã¿¿ÂÁ¿Á¿¿ÂÁ¿Á¿Á¿ÁÂÁ¿Ã¿ÁÂÁÂÁ¿Á¿¿ÂÁ¿Á¿Á¿ÂÁ¿Á¿¿ÂÁ¿¿ÂÁ¿¿ÂÁ¿¿ÂÁ¿¿¿ÂÁ¿¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿¿¿Â¿¿¿Â¿¿Â¿Â¿¿Â¿¿Â¿¿Â¿¿Â¿¿¿Â¿¿Â¿¿¿¿¿ÂÂÁ¿¿¿¿¿¿Á¿¿¿¿Á¿¿¿¿ÁÂÁ¿ÂÁ¿¿Á¿ÁÈÎÈ¿¿ûÇ¿¿Â¿ÂÁ¿¿¿¿ÂÁ¿¿¿ÂÁ¿¿ÂÁ¿¿ÂÁÂÁÂÁ¿ÂÁ¿¿ÂÁ¿Á¿¿ÂÁ¿¿ÂÁ¿Á¿¿ÂÁ¿Á¿Á¿¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁÁ¿Á¿ÁÁÁ¿¿ÁÁÁÁ¿¿Á¿ÁÁ¿¿Á¿Á¿Á¿Á¿ÁÁÿ¿Á¿Á¿Á¿Á¿¿ÁÂÁ¿¿Á¿ÂÁÂÁ¿¿¿¿Á¿ĿÂÁ¿¿¿Á¿¿¿¿¿ÁĿ¿¿Á¿¿¿Á¿¿¿Á¿¿¿Á¿¿Á¿¿Á¿¿ÁÂÁ¿¿Á¿Á¿ÁÂÁ¿Á¿Á¿Á¿¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿ÁÁÁ¿Á¿Á¿ÁÁ¿ÁÁ¿ÁÁÁ¿ÁÁ¿¿ÁÁ¿ÁÁÁ¿ÁÁÁ¿¿ÁÁ¿Á¿Á¿Á¿Á¿ÁÁ¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿¿ÂÁ¿¿ÂÁ¿ÁÂÁ¿¿ÂÁ¿¿ÂÁ¿Á¿¿ÂÁ¿¿Á;PM2FPPE=<[aÀqÌ;PM0PEÅÉÇ¿¿òƿ¿¿Á¿¿Á¿Á¿Á¿Á¿¿Á¿Á¿¿ÁÂÁ¿ÁÂÁ¿ÁÂÁ¿¿ÁÂÁ¿Á¿¿¿Á¿¿Á¿¿Á¿¿¿¿¿ÂÁ¿¿¿¿¿Â¿Â¿¿Â¿¿Â¿¿Â¿Â¿Â¿¿Â¿Â¿Â¿Â¿Â¿ÂÁ¿¿Â¿ÂÁÂÁÂÁÂÁ¿¿ÂÁ¿¿ÂÁ¿Á¿Á¿¿ÂÁ¿Ã¿Á¿¿ÂÁ¿Á¿¿ÂÁ¿Á¿Á¿ÁÂÿÁ¿ÁÂÁ¿¿ÂÁ¿Á¿ÁÂÁ¿ÁÂÁ¿¿ÂÁ¿¿Âÿ¿Â¿ÂÁ¿¿ÂÁÂÁ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿Â¿¿Â¿¿¿Â¿¿Â¿Â¿¿Â¿¿Â¿¿Â¿¿¿Â¿¿Â¿¿¿ÂÂÂÁ¿¿¿¿¿Á¿¿¿¿Á¿¿¿¿¿ÁÂÁ¿¿Á¿¿¿Á¿ÁÈÎÆ¿¿ûÅ¿¿Â¿ÂÁ¿¿¿¿ÂÁÂÁ¿¿¿ÂÁ¿¿ÂÁÂÁ¿¿ÂÁ¿ÂÁ¿ÁÂÁ¿¿ÂÁ¿¿ÂÁ¿Á¿¿ÂÁ¿Á¿Á¿¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁÁ¿Á¿ÁÁÁ¿ÁÁ¿ÁÁ¿¿Á¿ÁÁ¿¿ÁÁ¿¿Á¿Á¿Á¿Á¿Ã¿Á¿Á¿Á¿¿Á¿¿ÁÂÁÂÁ¿ÂÁ¿ÁĿ¿ÂÁ¿¿ÄÁ¿¿ÁĿ¿¿¿¿Á¿Ŀ¿Á¿¿¿Á¿¿¿Á¿¿¿Á¿¿Á¿¿Á¿¿ÁÂÁ¿Á¿¿Á¿ÁÂÁ¿Á¿Á¿Á¿¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿ÁÁÁ¿Á¿ÁÁ¿¿ÁÁÁ¿ÁÁÁÁ¿¿Á¿ÁÁ¿ÁÁÁ¿ÁÁÁ¿¿ÁÁ¿Á¿Á¿Á¿Á¿ÁÁ¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿¿ÂÁ¿¿ÂÁ¿Á¿¿ÂÁ¿¿ÂÁ¿ÁÂÁ¿¿ÂÁ¿¿Á;PM2FPPE=<cbÀKÎ;PM0PE¿lÀ¿Á¿ÁÁ¿¿Á¿ÁÁÁ¿ÁÁ¿¿ÁÁÁÁ¿¿ÁÁ¿¿ÁÁ¿¿ÁÁ¿¿ÁÁ¿Á¿¿ÁÁ¿¿ÁÁ¿Á¿Á¿Á¿Á¿Á¿¿ÁÁÂÁ¿Á¿Á¿Á¿Á¿ÁÂÁ¿¿ÂÁ¿Á¿ÁÂÁ¿¿Â¿Âÿ¿Â¿Â¿ÂÁ¿¿Â¿ÂÁ¿¿ÂÁ¿¿¿ÂÁ¿¿¿¿¿¿¿FÀ¿Â¿Â¿Â¿ÂÁ¿¿ÂÁ¿Á¿Ë¿¿Îö¿¿ÍÇ¿Á¿Á¿¿ÁÁ¿¿ÁÁ¿¿Á¿Á¿Á¿GÀ¿Á¿Á¿Á¿Á¿Á¿¿Á¿Á¿Á¿¿Á¿Á¿Á¿¿¿Á¿¿¿Á¿¿Á¿¿¿¿¿¿¿¿¿Â¿¿¿Â¿¿Â¿¿¿Â¿¿Â¿Â¿¿¿Â¿Â¿Â¿Â¿Â¿¿¿¿Ŀ¿¿¿¿¿ò¿Â¿Â¿Â¿ÂÁ¿¿ÂÁ¿Á¿É¿¿Îö¿¿ÍÉ¿Á¿Á¿¿ÁÁ¿¿Á¿Á¿Á¿ÁÁ¿¿iÁ¿¿Á¿Á¿Á¿Á¿Á¿¿¿¿¿¿ÁÄ¿Ä¿¿ËçÃ;PM2FPLTSVPE=<wdÀ}Ì¿=<kdÀ{Ì׿=<gdÀyÌß¿=<edÀwÌå¿=<adÀuÌë¿=<_dÀsÌí¿=<]dÀqÌ׿<Á¿Ù¿=<YdÀoÌÑ¿<Õ¿Ñ¿=<YdÀmÌÏ¿<׿ӿ=<WdÀkÌÏ¿<Ý¿Ñ¿=<UdÀiÌÏ¿<á¿Ñ¿=<UdÀgÌÍ¿<å¿Ï¿=<UdÀeÌÍ¿<å¿Ï¿=<SdÀcÌÏ¿<é¿Í¿=<QdÀaÌÏ¿<ë¿Ï¿=<QdÀ_ÌÏ¿<ë¿Ï¿=<OdÀ]ÌÑ¿<ë¿Ñ¿=<OdÀ[ÌÑ¿<ë¿Ñ¿=<MdÀYÌÓ¿<í¿Ï¿=<MdÀWÌÑ¿<ï¿Ñ¿=<MdÀUÌÑ¿<ï¿Ó¿=<KdÀSÌÑ¿<ñ¿Ó¿=<KdÀQÌÑ¿<ñ¿Ó¿=<KdÀOÌÑ¿<ñ¿Ó¿=<KdÀMÌÑ¿<ó¿Ñ¿=<IdÀKÌÓ¿<ó¿Ó¿=<IdÀIÌÓ¿<ó¿Ó¿=<IdÀGÌÓ¿<ó¿Ó¿=<IdÀEÌÓ¿<õ¿Ñ¿=<IdÀCÌÓ¿<õ¿Ñ¿=<GdÀAÌÕ¿<õ¿Ñ¿=<GdÀ?ÌÕ¿<õ¿Ñ¿=<GdÀ}ËÕ¿<õ¿Ñ¿=<GdÀ{ËÕ¿<õ¿Ñ¿=<GdÀyËÕ¿<õ¿Ñ¿=<GdÀwËÕ¿<õ¿Ñ¿=<GdÀuËÕ¿<õ¿Ñ¿=<GdÀsËÕ¿<õ¿Ó¿=<GdÀqËÕ¿<õ¿Ó¿=<GdÀoËÕ¿<õ¿Ñ¿=<GdÀmËÕ¿<õ¿Ñ¿=<GdÀkËÕ¿<õ¿Ñ¿=<GdÀiËÕ¿<õ¿Ñ¿=<GdÀgËÕ¿<õ¿Ñ¿=<GdÀeËÕ¿<õ¿Ñ¿=<GdÀcËÕ¿<õ¿Ñ¿=<IdÀaËÓ¿<õ¿Ñ¿=<IdÀ_ËÓ¿<õ¿Ñ¿=<IdÀ]ËÓ¿<õ¿Ñ¿=<IdÀ[ËÓ¿<ó¿Ó¿=<IdÀYËÓ¿<ó¿Ó¿=<IdÀWËÓ¿<ó¿Ó¿=<KdÀUËÑ¿<ñ¿Ó¿=<KdÀSËÑ¿<ñ¿Ó¿=<KdÀQËÓ¿<ï¿Ó¿=<MdÀOËÑ¿<ï¿Ó¿=<MdÀMËÑ¿<ï¿Ó¿=<MdÀKËÓ¿<í¿Ï¿=<MdÀIËÓ¿<ë¿Ñ¿=<OdÀGËÑ¿<ë¿Ñ¿=<QdÀEËÏ¿<ë¿Ñ¿=<QdÀCËÑ¿<é¿Ï¿=<QdÀAËÑ¿<é¿Ï¿=<SdÀ?ËÏ¿<å¿Ñ¿=<UdÀ}ÊÑ¿<á¿Ï¿=<WdÀ{ÊÏ¿<ß¿Ñ¿=<WdÀyÊÑ¿<Ù¿Ó¿=<YdÀwÊÓ¿<Ñ¿Ó¿=<[dÀuÊ÷¿=<]dÀsÊó¿=<_dÀqÊí¿=<cdÀoÊç¿=<idÀmÊÙ¿=<wdÀkÊÁ¿;;LTSVPE=<WfÀ}Ì¿<ã¿Â¿=<GfÀ{ÌÍ¿<׿տ=<{eÀyÌÙ¿<Õ¿Û¿=<seÀwÌá¿<Ñ¿ã¿=<seÀuÌá¿<Í¿ë¿=<seÀsÌá¿<Í¿ë¿=<seÀqÌá¿<Ë¿ï¿=<seÀoÌá¿<É¿õ¿=<seÀmÌá¿<Ç¿÷¿=<yeÀkÌÛ¿<Ç¿Í¿<Ï¿Û¿=<CfÀiÌÑ¿<Å¿Ë¿<ٿ׿=<CfÀgÌÑ¿<Å¿É¿<Ý¿Õ¿=<EfÀeÌÏ¿<ÿɿ<ã¿Ó¿=<EfÀcÌÏ¿<ÿǿ<å¿Õ¿=<EfÀaÌÏ¿<Á¿É¿<ç¿Ó¿=<EfÀ_ÌÙ¿<ë¿Ñ¿=<EfÀ]Ì׿<í¿Ó¿=<EfÀ[Ì׿<í¿Õ¿=<EfÀYÌ׿<ï¿Ó¿=<EfÀWÌÕ¿<ñ¿Ó¿=<EfÀUÌÕ¿<ñ¿Ó¿=<EfÀSÌÕ¿<ñ¿Õ¿=<EfÀQÌÕ¿<ñ¿Õ¿=<EfÀOÌÕ¿<ó¿Ó¿=<EfÀMÌÓ¿<õ¿Ó¿=<EfÀKÌÓ¿<÷¿Ñ¿=<EfÀIÌÓ¿<÷¿Ñ¿=<EfÀGÌÓ¿<÷¿Ó¿=<EfÀEÌÓ¿<÷¿Ó¿=<EfÀCÌÓ¿<÷¿Ó¿=<EfÀAÌÑ¿<ù¿Õ¿=<EfÀ?ÌÑ¿<ù¿Õ¿=<EfÀ}ËÑ¿<ù¿Õ¿=<EfÀ{ËÑ¿<ù¿Õ¿=<EfÀyËÑ¿<ù¿Õ¿=<EfÀwËÑ¿<ù¿Õ¿=<EfÀuËÑ¿<ù¿Õ¿=<EfÀsËÑ¿<ù¿Õ¿=<EfÀqËÑ¿<ù¿Õ¿=<EfÀoËÑ¿<ù¿Õ¿=<EfÀmËÑ¿<ù¿Õ¿=<EfÀkËÑ¿<ù¿Õ¿=<EfÀiËÑ¿<ù¿Õ¿=<EfÀgËÑ¿<ù¿Õ¿=<EfÀeËÑ¿<ù¿Õ¿=<EfÀcËÑ¿<ù¿Õ¿=<EfÀaËÑ¿<ù¿Ó¿=<EfÀ_ËÑ¿<ù¿Ó¿=<EfÀ]ËÓ¿<÷¿Ó¿=<EfÀ[ËÓ¿<÷¿Ñ¿=<EfÀYËÓ¿<÷¿Ñ¿=<EfÀWËÓ¿<õ¿Ó¿=<EfÀUËÓ¿<õ¿Ó¿=<EfÀSËÓ¿<ó¿Õ¿=<EfÀQËÕ¿<ñ¿Ó¿=<EfÀOËÕ¿<ñ¿Ó¿=<EfÀMËÕ¿<ñ¿Ó¿=<EfÀKËÕ¿<ñ¿Ó¿=<EfÀIË׿<í¿Ó¿=<EfÀGË׿<í¿Ñ¿=<EfÀEËÙ¿<é¿Ó¿=<EfÀCËÛ¿<å¿Ó¿=<EfÀAËÛ¿<å¿Ó¿=<EfÀ?ËÑ¿<Á¿Ë¿<Ý¿Õ¿=<EfÀ}ÊÑ¿<ÿ˿<׿ٿ=<EfÀ{ÊÑ¿<ÿϿ<Ï¿Û¿=<EfÀyÊÑ¿<Å¿÷¿=<EfÀwÊÑ¿<Å¿õ¿=<EfÀuÊÑ¿<Ç¿ñ¿=<EfÀsÊÑ¿<É¿í¿=<EfÀqÊÑ¿<Ë¿é¿=<EfÀoÊÑ¿<Í¿å¿=<EfÀmÊÑ¿<տ׿=<EfÀkÊÑ¿<á¿¿¿=<EfÀiÊÑ¿=<EfÀgÊÑ¿=<EfÀeÊÑ¿=<EfÀcÊÑ¿=<EfÀaÊÑ¿=<EfÀ_ÊÑ¿=<EfÀ]ÊÑ¿=<EfÀ[ÊÑ¿=<EfÀYÊÑ¿=<EfÀWÊÑ¿=<EfÀUÊÑ¿=<EfÀSÊÑ¿=<EfÀQÊÑ¿=<EfÀOÊÑ¿=<EfÀMÊÑ¿=<EfÀKÊÑ¿=<EfÀIÊÑ¿=<EfÀGÊÑ¿=<EfÀEÊÑ¿=<EfÀCÊÑ¿=<CfÀAÊÓ¿=<CfÀ?ÊÕ¿=<seÀ}Éõ¿=<seÀ{Éõ¿=<seÀyÉõ¿=<seÀwÉõ¿=<seÀuÉõ¿=<seÀsÉõ¿=<seÀqÉõ¿;;LTSVPE=<YhÀ}Ì¿<á¿Â¿=<IhÀ{ÌÍ¿<Õ¿Õ¿=<}gÀyÌÙ¿<Ó¿Û¿=<ugÀwÌá¿<Ï¿ã¿=<ugÀuÌá¿<Í¿é¿=<ugÀsÌá¿<Ë¿ë¿=<ugÀqÌá¿<É¿ñ¿=<ugÀoÌá¿<Ç¿õ¿=<ugÀmÌá¿<Ç¿õ¿=<ygÀkÌÝ¿<Å¿Í¿<Ñ¿Û¿=<ChÀiÌÓ¿<ÿ˿<Û¿Õ¿=<ChÀgÌÓ¿<ÿɿ<Ý¿Õ¿=<EhÀeÌÑ¿<Á¿É¿<ã¿Ó¿=<EhÀcÌÑ¿<Á¿Ç¿<ç¿Ó¿=<GhÀaÌÏ¿<Á¿Ç¿<ç¿Ó¿=<GhÀ_Ì׿<ë¿Ó¿=<GhÀ]ÌÕ¿<í¿Ó¿=<GhÀ[ÌÕ¿<í¿Õ¿=<GhÀYÌÕ¿<ï¿Ó¿=<GhÀWÌÕ¿<ï¿Ó¿=<GhÀUÌÓ¿<ñ¿Ó¿=<GhÀSÌÓ¿<ó¿Ó¿=<GhÀQÌÓ¿<ó¿Õ¿=<GhÀOÌÓ¿<ó¿Õ¿=<GhÀMÌÑ¿<õ¿Õ¿=<GhÀKÌÑ¿<÷¿Ó¿=<GhÀIÌÑ¿<÷¿Ó¿=<GhÀGÌÑ¿<÷¿Ó¿=<GhÀEÌÑ¿<÷¿Ó¿=<GhÀCÌÑ¿<÷¿Ó¿=<GhÀAÌÏ¿<ù¿Õ¿=<GhÀ?ÌÏ¿<ù¿Õ¿=<GhÀ}ËÏ¿<ù¿Õ¿=<GhÀ{ËÏ¿<ù¿Õ¿=<GhÀyËÏ¿<ù¿Õ¿=<GhÀwËÏ¿<ù¿Õ¿=<GhÀuËÏ¿<ù¿Õ¿=<GhÀsËÏ¿<ù¿Õ¿=<GhÀqËÏ¿<ù¿Õ¿=<GhÀoËÏ¿<ù¿Õ¿=<GhÀmËÏ¿<ù¿Õ¿=<GhÀkËÏ¿<ù¿Õ¿=<GhÀiËÏ¿<ù¿Õ¿=<GhÀgËÏ¿<ù¿Õ¿=<GhÀeËÏ¿<ù¿Õ¿=<GhÀcËÏ¿<ù¿Õ¿=<GhÀaËÏ¿<ù¿Ó¿=<GhÀ_ËÏ¿<ù¿Ó¿=<GhÀ]ËÑ¿<÷¿Ó¿=<GhÀ[ËÑ¿<÷¿Ó¿=<GhÀYËÑ¿<÷¿Ó¿=<GhÀWËÑ¿<õ¿Õ¿=<GhÀUËÑ¿<õ¿Õ¿=<GhÀSËÑ¿<õ¿Ó¿=<GhÀQËÓ¿<ó¿Ñ¿=<GhÀOËÓ¿<ñ¿Ó¿=<GhÀMËÓ¿<ñ¿Ó¿=<GhÀKËÕ¿<ï¿Ó¿=<GhÀIËÕ¿<í¿Ó¿=<GhÀGËÕ¿<í¿Ó¿=<GhÀEË׿<é¿Ó¿=<GhÀCËÙ¿<å¿Ó¿=<GhÀAËÙ¿<å¿Ó¿=<GhÀ?ËÏ¿<Á¿Ë¿<Ý¿Õ¿=<GhÀ}ÊÏ¿<ÿͿ<Õ¿Ù¿=<GhÀ{ÊÏ¿<ÿϿ<Ñ¿Û¿=<GhÀyÊÏ¿<Å¿÷¿=<GhÀwÊÏ¿<Ç¿ó¿=<GhÀuÊÏ¿<Ç¿ó¿=<GhÀsÊÏ¿<É¿í¿=<GhÀqÊÏ¿<Ë¿é¿=<GhÀoÊÏ¿<Í¿å¿=<GhÀmÊÏ¿<տ׿=<GhÀkÊÏ¿<á¿Á¿=<GhÀiÊÏ¿=<GhÀgÊÏ¿=<GhÀeÊÏ¿=<GhÀcÊÏ¿=<GhÀaÊÏ¿=<GhÀ_ÊÏ¿=<GhÀ]ÊÏ¿=<GhÀ[ÊÏ¿=<GhÀYÊÏ¿=<GhÀWÊÏ¿=<GhÀUÊÏ¿=<GhÀSÊÏ¿=<GhÀQÊÏ¿=<GhÀOÊÏ¿=<GhÀMÊÏ¿=<GhÀKÊÏ¿=<GhÀIÊÏ¿=<EhÀGÊÑ¿=<EhÀEÊÑ¿=<EhÀCÊÑ¿=<ChÀAÊÓ¿=<ChÀ?ÊÕ¿=<ugÀ}Éó¿=<ugÀ{Éó¿=<ugÀyÉó¿=<ugÀwÉó¿=<ugÀuÉó¿=<ugÀsÉó¿=<ugÀqÉó¿;;LTSVPE=<ijÀ}Ì¿=<[jÀ{Ì׿=<WjÀyÌÝ¿=<SjÀwÌå¿=<QjÀuÌë¿=<MjÀsÌñ¿=<MjÀqÌÙ¿<Á¿×¿=<KjÀoÌÏ¿<Õ¿Ó¿=<GjÀmÌÓ¿<Õ¿Ó¿=<GjÀkÌÏ¿<Ý¿Ñ¿=<EjÀiÌÏ¿<á¿Ñ¿=<EjÀgÌÏ¿<á¿Ó¿=<EjÀeÌÍ¿<ç¿Ï¿=<AjÀcÌÏ¿<é¿Ñ¿=<AjÀaÌÏ¿<é¿Ñ¿=<?jÀ_ÌÑ¿<ë¿Ï¿=<?jÀ]ÌÏ¿<í¿Ñ¿=<?jÀ[ÌÏ¿<í¿Ó¿=<}iÀYÌÑ¿<ï¿Ñ¿=<{iÀWÌÓ¿<ï¿Ñ¿=<{iÀUÌÓ¿<ï¿Ñ¿=<{iÀSÌÓ¿<ï¿Ó¿=<{iÀQÌÑ¿<ó¿Ñ¿=<yiÀOÌÓ¿<ó¿Ñ¿=<yiÀMÌÑ¿<õ¿Ñ¿=<yiÀKÌÑ¿<õ¿Ó¿=<yiÀIÌÑ¿<õ¿Ó¿=<yiÀGÌÑ¿<õ¿Ó¿=<yiÀEÌÑ¿<õ¿Ó¿=<yiÀCÌÑ¿<õ¿Ó¿=<wiÀAÌÓ¿<õ¿Ó¿=<wiÀ?ÌÓ¿<ó¿Õ¿=<wiÀ}Ë]À¿=<wiÀ{Ë]À¿=<wiÀyË]À¿=<wiÀwË_À¿=<wiÀuË_À¿=<wiÀsË_À¿=<wiÀqË]À¿=<wiÀoËÓ¿=<wiÀmËÓ¿=<wiÀkËÓ¿=<wiÀiËÓ¿=<wiÀgËÓ¿=<wiÀeËÓ¿=<wiÀcËÓ¿=<yiÀaËÑ¿=<yiÀ_ËÑ¿=<yiÀ]ËÑ¿=<yiÀ[ËÑ¿=<yiÀYËÑ¿=<yiÀWËÑ¿<CÀ¿Â¿=<yiÀUËÓ¿<AÀ¿¿¿=<{iÀSËÑ¿<AÀ¿Ã¿=<{iÀQËÓ¿<ý¿Ç¿=<{iÀOËÓ¿<ý¿Ç¿=<{iÀMËÓ¿<û¿Ç¿=<}iÀKËÑ¿<ù¿Ç¿=<}iÀIËÓ¿<÷¿Ç¿=<?jÀGËÑ¿<õ¿É¿=<?jÀEËÓ¿<ó¿Ç¿=<AjÀCËÓ¿<í¿É¿=<AjÀAËÕ¿<ë¿É¿=<CjÀ?ËÕ¿<å¿Ë¿=<EjÀ}Ê׿<Ý¿Ï¿=<EjÀ{Ê׿<Û¿Ñ¿=<GjÀyÊ?À¿=<KjÀwÊù¿=<KjÀuÊù¿=<MjÀsÊó¿=<QjÀqÊí¿=<QjÀoÊé¿=<YjÀmÊÛ¿=<ejÀkÊÁ¿;;PE=<ilÀoÌ;PM0PE¿Â¿¿¿¿Â¿Â¿¿Â¿Â¿¿Â¿¿Â¿ÂÂĿ¿¿Â¿Â¿¿¿Â¿¿¿¿¿ÂÂĿ¿¿¿¿¿¿¿ĿĿà¿Â¿Â¿Â¿ÂÁ¿¿ÂÁ¿Á¿Í¿¿Îú¿¿ÍÉ¿Á¿Á¿¿ÁÁ¿¿Á¿Á¿Á¿ÁÁ¿¿YÀ¿¿Á¿Á¿Á¿Á¿Á¿¿¿Á¿¿¿ĿĿ¿ËåÅ¿ì¿Á¿Á¿ÁÁ¿¿Á¿ÁÁÁ¿Á¿Á¿ÁÁ¿¿ÁÁÁ¿ÁÁÁ¿ÁÁÁ¿ÁÁ¿ÁÁ¿ÁÁ¿¿ÁÁ¿Á¿¿Á¿ÁÁ¿Á¿Á¿Á¿ÁÁ¿ÂÁ¿Á¿Á¿Á¿¿ÂÁ¿ÁÂÁ¿¿ÂÁ¿¿Â¿ÂÁ¿¿Â¿ÂÁ¿¿¿¿ÂÁ¿Â¿¿¿¿Â¿Â¿¿Â¿¿¿¿¿¿¿¿Á¿¿Á¿Á¿¿Á¿¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁÁ¿ÁÁ¿¿Á¿Á;PM2FPPE=<{UÀ?È;PM0PEGÀ¿¿ÎÌ¿Ä¿¿Â¿¿¿¿Â¿¿¿¿¿¿`Á¿Â¿Â¿Â¿Â¿ÂÁ¿¿Â¿ÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Ã¿Á¿Á¿Á¿Á¿Á¿ÁÁÁ¿ÁÁÁ¿Á¿ÁÁÁ¿Á¿¿ÁÁ¿¿ÁÁ¿ÁÁ¿Á¿ÁÁ¿Á¿¿Á¿Á¿ÁÁ¿¿Á¿ÃÁÁÁÁ¿Á¿Á¿Á¿Á¿ÁÁÁ¿Á¿Á¿ÃÁÁ¿Á¿Á¿ÁÁÿÅÇ¿ÂTÀDÁ¿¿ÍË¿Á¿Á¿Á¿¿ÁÁ¿¿ÁÁ¿¿Á¿Á¿Á¿ÁÁÁ¿_Á¿¿Á¿Á¿Á¿Á¿Á¿¿Á¿¿Á¿¿¿¿ÁÌ¿¿Í;PM2FPPE=<c]À}Ç;PM0PEIÁ¿ÎNÀÊ¿¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁÁ¿¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÂÁ¿Á¿Á¿¿Á¿Á¿Á¿¿¿ÁÂÁ¿ÂÁ¿¿¿¿¿Á¿¿¿¿¿Â¿¿Â¿Â¿¿Â¿¿ÂàdÁ¿Â¿Â¿Â¿ÂÁ¿¿ÂÁ¿¿ÂÁ¿Á¿Á¿Ï¿ÂÎXÀ¿ÃÍÍ¿Á¿Á¿ÁÁ¿ÁÁ¿Á¿¿Á¿ÁÁ¿¿Á¿ÁÁÁß_Á¿Á¿Á¿Á¿Á¿Á¿¿Á¿¿¿¿¿Á¿Â¿¿¿¿Â¿¿¿Â¿Â¿¿¿Â¿¿Â¿¿¿Ä¿Ŀ¿¿Â¿Ŀ¿Â¿¿Â¿Â¿ÄÂÂÈ¿ÓMÀ;PM2FPLTSVPE=<a`ÀwÆÑ¿=<Y`ÀuÆß¿=<W`ÀsÆá¿=<Q`ÀqÆë¿=<M`ÀoÆó¿=<K`ÀmÆõ¿=<I`ÀkÆù¿=<E`ÀiÆÕ¿<Ë¿Ý¿=<E`ÀgÆÕ¿<Í¿Û¿=<C`ÀeÆÓ¿<Ó¿Ù¿=<?`ÀcÆÕ¿<׿ٿ=<?`ÀaÆÓ¿<ٿٿ=<}_À_ÆÕ¿<Ù¿Û¿=<{_À]ÆÓ¿<Ý¿Û¿=<y_À[ÆÕ¿<Ý¿Û¿=<y_ÀYÆÓ¿<á¿Ù¿=<w_ÀWÆÕ¿<ß¿Û¿=<w_ÀUÆÕ¿<ß¿Û¿=<s_ÀSÆÙ¿<ß¿Û¿=<s_ÀQÆÕ¿<ã¿Û¿=<s_ÀOÆÕ¿<ã¿Û¿=<q_ÀMÆ׿<ã¿Ù¿=<o_ÀKÆÙ¿<á¿Û¿=<o_ÀIÆ׿<ã¿Ù¿=<m_ÀGÆÙ¿<ã¿Ù¿=<m_ÀEÆÙ¿<á¿Û¿=<k_ÀCÆÛ¿<á¿Û¿=<k_ÀAÆÛ¿<ß¿Û¿=<k_À?ÆÙ¿<á¿Û¿=<k_À}ÅÙ¿<ß¿Û¿=<i_À{ÅÙ¿<ß¿Û¿=<i_ÀyÅÙ¿<Ý¿Û¿=<g_ÀwÅÛ¿<Ý¿Û¿=<g_ÀuÅÛ¿<Ù¿Ý¿=<g_ÀsÅÛ¿<׿ݿ=<g_ÀqÅÛ¿<Õ¿Ý¿=<g_ÀoÅÛ¿<Ñ¿Ý¿=<g_ÀmÅÙ¿<Í¿á¿=<e_ÀkÅÛ¿<É¿ã¿=<e_ÀiÅEÀ¿=<e_ÀgÅAÀ¿=<e_ÀeÅ?À¿=<e_ÀcÅù¿=<e_ÀaÅñ¿=<e_À_Åí¿=<e_À]Åå¿=<e_À[ÅÛ¿=<e_ÀYÅÙ¿=<e_ÀWÅÙ¿=<e_ÀUÅÙ¿=<e_ÀSÅÙ¿=<e_ÀQÅÙ¿=<e_ÀOÅÙ¿=<e_ÀMÅÙ¿=<e_ÀKÅÙ¿=<e_ÀIÅÙ¿=<e_ÀGÅÙ¿<û¿Â¿=<g_ÀEÅ׿<û¿¿¿=<g_ÀCÅÙ¿<÷¿Ã¿=<g_ÀAÅÙ¿<÷¿Å¿=<g_À?ÅÙ¿<ó¿Ë¿=<g_À}ÄÙ¿<ó¿É¿=<i_À{ÄÙ¿<ï¿Ë¿=<i_ÀyÄÙ¿<í¿Ë¿=<k_ÀwÄÙ¿<é¿É¿=<k_ÀuÄÙ¿<ç¿Ë¿=<m_ÀsÄÙ¿<á¿Í¿=<m_ÀqÄÛ¿<Û¿Ñ¿=<o_ÀoÄÛ¿<Õ¿Ñ¿=<q_ÀmÄ?À¿=<s_ÀkÄû¿=<s_ÀiÄù¿=<w_ÀgÄó¿=<{_ÀeÄé¿=<}_ÀcÄã¿=<E`ÀaÄÓ¿;;PE=<}aÀcÇ;PM0PEÛ¿Êð׿ÄÎÖ¿Ò`À¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿ÂÁ¿¿ÂÁ¿Á¿ÁÁÁ¿ÁÁ¿ÁÁ¿¿ÁÁÁÁÁ¿ÁÁ¿¿ÃÁ¿¿ÁÁÁ¿ÁÁÁ¿ÃÁÁÁÃÉÆÂÄ¿¿Â¿¿Â¿Â¿Â¿¿Â¿Â¿Â¿Â¿¿¿Â¿Â¿Â¿¿Â¿¿¿¿Â¿¿Â¿¿Â¿¿¿¿¿¿ÂÁ¿ÂÁ¿Á¿¿¿Á¿Á¿¿ÁÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁÃÏUÀÔ¿ÁÍÕ¿Çï;PM2FPPE=<YcÀcÇ;PM0PEÙ¿ÈðÕ¿ÂÎÖ¿Ò`À¿¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿ÂÁ¿¿ÂÁ¿Á¿Á¿¿ÁÁ¿Á¿¿Á¿ÁÁ¿ÁÁÁÁ¿ÁÁ¿¿ÁÁÃÁ¿¿Á¿ÁÁÁ¿ÁÁÃÁÁÁÃÉÆÂÄ¿¿Â¿Â¿Â¿¿Â¿¿Â¿Â¿¿¿Â¿Â¿¿Â¿¿¿¿¿¿Â¿¿¿Â¿¿Â¿¿¿¿Â¿¿¿¿¿¿ÂÁ¿¿¿Á¿Á¿¿¿Á¿¿Á¿ÁÂÁ¿Á¿Á¿¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿ÁÁÃÏUÀÖ¿ÃÍÓ¿Éï;PM2FPLTSVPE=<AeÀEÈ¿=<ydÀCÈÍ¿=<wdÀAÈÏ¿=<udÀ?ÈÕ¿=<sdÀ}ÇÙ¿=<sdÀ{ÇÙ¿=<qdÀyÇÛ¿=<qdÀwÇß¿=<qdÀuÇß¿=<odÀsÇá¿=<odÀqÇá¿=<odÀoÇá¿=<odÀmÇá¿=<odÀkÇá¿=<odÀiÇá¿=<odÀgÇá¿=<odÀeÇá¿=<qdÀcÇß¿=<qdÀaÇÝ¿=<sdÀ_ÇÙ¿=<sdÀ]ÇÙ¿=<udÀ[ÇÕ¿=<wdÀYÇÑ¿=<ydÀWÇÍ¿=<KeÀwÆ¿=<YdÀuÆï¿=<YdÀsÆï¿=<YdÀqÆí¿=<YdÀoÆí¿=<WdÀmÆï¿=<WdÀkÆï¿=<WdÀiÆï¿=<]dÀgÆç¿=<edÀeÆß¿=<gdÀcÆÝ¿=<idÀaÆÛ¿=<idÀ_ÆÛ¿=<idÀ]ÆÙ¿=<idÀ[ÆÙ¿=<idÀYÆÙ¿=<idÀWÆÙ¿=<idÀUÆÙ¿=<idÀSÆÙ¿=<idÀQÆ׿=<idÀOÆ׿=<gdÀMÆÙ¿=<gdÀKÆÙ¿=<gdÀIÆÙ¿=<gdÀGÆ׿=<edÀEÆÙ¿=<edÀCÆÙ¿=<edÀAÆÙ¿=<edÀ?ÆÙ¿=<edÀ}Å׿=<cdÀ{ÅÙ¿=<cdÀyÅÙ¿=<cdÀwÅÙ¿=<cdÀuÅÙ¿=<cdÀsÅ׿=<adÀqÅÙ¿=<adÀoÅÙ¿=<adÀmÅÙ¿=<adÀkÅÙ¿=<_dÀiÅÙ¿=<_dÀgÅÙ¿=<_dÀeÅÙ¿=<_dÀcÅÙ¿=<_dÀaÅÙ¿=<]dÀ_ÅÛ¿=<]dÀ]ÅÙ¿=<]dÀ[ÅÙ¿=<]dÀYÅÙ¿=<]dÀWÅÙ¿=<[dÀUÅÛ¿<׿¿=<[dÀSÅÙ¿<׿Á¿=<[dÀQÅÙ¿<Õ¿Ç¿=<[dÀOÅÙ¿<Õ¿É¿=<YdÀMÅÛ¿<Õ¿É¿=<YdÀKÅÛ¿<Ó¿É¿=<YdÀIÅÙ¿<Ó¿Ë¿=<YdÀGÅÙ¿<Ó¿Ë¿=<YdÀEÅÙ¿<Ó¿É¿=<YdÀCÅ׿<Ñ¿Í¿=<YdÀAÅ׿<Ñ¿Ë¿=<YdÀ?Å׿<Ñ¿É¿=<YdÀ}Ä׿<Ï¿Ë¿=<YdÀ{Ä׿<Ï¿É¿=<YdÀyÄ׿<Í¿Ë¿=<YdÀwÄ׿<Ë¿Ë¿=<YdÀuÄ׿<É¿Ë¿=<YdÀsÄ׿<Ç¿Ë¿=<YdÀqÄë¿=<YdÀoÄé¿=<YdÀmÄç¿=<YdÀkÄå¿=<YdÀiÄå¿=<]dÀgÄÝ¿=<]dÀeÄÙ¿=<_dÀcÄÕ¿=<cdÀaÄË¿;;LTSVPE=<QgÀAÇÉ¿=<OgÀ?ÇÏ¿=<KgÀ}ÆÕ¿=<GgÀ{ÆÛ¿=<EgÀyÆÝ¿=<[fÀwÆÕ¿<Ñ¿ß¿=<SfÀuÆã¿<É¿á¿=<OfÀsÆé¿<Å¿ã¿=<KfÀqÆWÀ¿=<GfÀoÆEÀ¿<Á¿Ó¿=<EfÀmÆCÀ¿<Ç¿Ñ¿=<CfÀkÆAÀ¿<Í¿Ï¿=<?fÀiÆß¿<Ϳ׿<Í¿Ï¿=<?fÀgÆÝ¿<ѿ׿<Ï¿É¿=<}eÀeÆÝ¿<׿տ=<{eÀcÆÝ¿<ٿ׿=<{eÀaÆÛ¿<ۿ׿=<yeÀ_ÆÛ¿<߿׿=<weÀ]ÆÛ¿<á¿Ù¿=<weÀ[ÆÛ¿<ã¿×¿=<weÀYÆÙ¿<å¿×¿=<ueÀWÆÛ¿<å¿Ù¿=<seÀUÆÛ¿<ç¿Ù¿=<seÀSÆÛ¿<ç¿Ù¿=<seÀQÆÛ¿<ç¿Ù¿=<seÀOÆÛ¿<é¿×¿=<seÀMÆÙ¿<ë¿×¿=<seÀKÆÙ¿<é¿Ù¿=<seÀIÆÙ¿<é¿Ù¿=<seÀGÆÙ¿<é¿Û¿=<seÀEÆÙ¿<é¿Ù¿=<seÀCÆÙ¿<é¿Ù¿=<seÀAÆÙ¿<é¿Ù¿=<seÀ?ÆÙ¿<ç¿Û¿=<seÀ}ÅÙ¿<ç¿Û¿=<seÀ{ÅÙ¿<ç¿Û¿=<seÀyÅÙ¿<å¿Ý¿=<seÀwÅÙ¿<å¿Ý¿=<seÀuÅÙ¿<å¿Û¿=<ueÀsÅ׿<å¿Û¿=<ueÀqÅ׿<ã¿Ý¿=<weÀoÅ׿<ß¿Ý¿=<weÀmÅ׿<ß¿Ý¿=<yeÀkÅÕ¿<Ý¿Ý¿=<{eÀiÅÕ¿<Û¿Û¿=<}eÀgÅ׿<Ó¿ß¿=<?fÀeÅÕ¿<Ï¿á¿=<}eÀcÅGÀ¿=<weÀaÅKÀ¿=<ueÀ_ÅMÀ¿=<qeÀ]ÅKÀ¿=<oeÀ[ÅIÀ¿=<meÀYÅIÀ¿=<meÀWÅÙ¿<Á¿ã¿=<keÀUÅÑ¿=<ieÀSÅÏ¿=<ieÀQÅË¿=<geÀOÅÍ¿=<geÀMÅÍ¿=<eeÀKÅÏ¿=<eeÀIÅÏ¿=<eeÀGÅÏ¿=<eeÀEÅÓ¿=<eeÀCÅí¿=<eeÀAÅý¿=<eeÀ?ÅKÀ¿=<eeÀ}ÄOÀ¿=<eeÀ{ÄQÀ¿=<eeÀyÄUÀ¿=<eeÀwÄYÀ¿=<eeÀuÄYÀ¿=<eeÀsÄ]À¿=<eeÀqÄ]À¿=<eeÀoÄ_À¿=<geÀmÄ]À¿=<ieÀkÄ]À¿=<ieÀiÄ]À¿=<keÀgÄ]À¿=<meÀeÄ[À¿=<qeÀcÄWÀ¿=<oeÀaÄYÀ¿=<geÀ_ÄaÀ¿=<eeÀ]ÄcÀ¿=<_eÀ[ÄÝ¿<å¿å¿=<]eÀYÄ׿<ó¿ß¿=<[eÀWÄÙ¿<÷¿Û¿=<YeÀUÄ׿<ý¿Ù¿=<YeÀSÄÕ¿<?À¿Ù¿=<YeÀQÄÕ¿<?À¿×¿=<UeÀOÄ׿<AÀ¿Õ¿=<UeÀMÄ׿<AÀ¿Õ¿=<UeÀKÄ׿<AÀ¿Õ¿=<UeÀIÄ׿<AÀ¿Ó¿=<UeÀGÄ׿<?À¿Õ¿=<UeÀEÄÙ¿<ý¿Õ¿=<UeÀCÄÙ¿<ù¿Õ¿=<UeÀAÄÛ¿<õ¿×¿=<UeÀ?Äß¿<í¿Ù¿=<YeÀ}Ãã¿<Ý¿ß¿=<YeÀ{Ã]À¿=<YeÀyÃ]À¿=<[eÀwÃWÀ¿=<_eÀuÃOÀ¿=<aeÀsÃKÀ¿=<geÀqÃý¿=<seÀoÃç¿=<GfÀmÃÁ¿;;LTSVPE=<ehÀwÆÑ¿=<]hÀuÆß¿=<YhÀsÆå¿=<UhÀqÆí¿=<QhÀoÆõ¿=<OhÀmÆ÷¿=<MhÀkÆý¿=<IhÀiÆß¿<˿׿=<IhÀgÆÛ¿<Ñ¿Õ¿=<EhÀeÆÝ¿<Õ¿Õ¿=<ChÀcÆÝ¿<Û¿Ó¿=<ChÀaÆÛ¿<Ý¿Õ¿=<AhÀ_ÆÝ¿<ß¿Ó¿=<?hÀ]ÆÝ¿<á¿Ó¿=<}gÀ[ÆÝ¿<ã¿Õ¿=<}gÀYÆÝ¿<å¿Ó¿=<{gÀWÆÝ¿<ç¿Õ¿=<{gÀUÆÛ¿<é¿Õ¿=<{gÀSÆÛ¿<é¿×¿=<ygÀQÆÝ¿<é¿×¿=<wgÀOÆÝ¿<ë¿×¿=<wgÀMÆÝ¿<í¿×¿=<wgÀKÆÛ¿<ï¿×¿=<wgÀIÆÛ¿<í¿Ù¿=<ugÀGÆÝ¿<í¿Ù¿=<sgÀEÆß¿<í¿Ù¿=<sgÀCÆÝ¿<ï¿Ù¿=<sgÀAÆÝ¿<ï¿Ù¿=<sgÀ?ÆÝ¿<ï¿Ù¿=<qgÀ}Åß¿<ï¿Ù¿=<qgÀ{Åß¿<ï¿Ù¿=<qgÀyÅÝ¿<ñ¿Û¿=<qgÀwÅÝ¿<ñ¿Û¿=<ogÀuÅß¿<ñ¿Ù¿=<ogÀsÅÝ¿<ñ¿Û¿=<ogÀqÅÝ¿<ñ¿Û¿=<ogÀoÅÝ¿<ñ¿Û¿=<ogÀmÅÝ¿<ñ¿Û¿=<ogÀkÅÝ¿<ñ¿Û¿=<ogÀiÅÝ¿<ï¿Ý¿=<ogÀgÅÛ¿<ñ¿Ý¿=<ogÀeÅÛ¿<ñ¿Ý¿=<ogÀcÅÛ¿<ñ¿Ý¿=<ogÀaÅÛ¿<ñ¿Ý¿=<ogÀ_ÅÛ¿<ñ¿Ý¿=<ogÀ]ÅÛ¿<ï¿Ý¿=<ogÀ[ÅÛ¿<í¿ß¿=<ogÀYÅÛ¿<í¿ß¿=<ogÀWÅÛ¿<í¿Ý¿=<ogÀUÅÙ¿<ï¿Ý¿=<ogÀSÅÙ¿<ï¿Ý¿=<ogÀQÅÙ¿<í¿Ý¿=<ogÀOÅÙ¿<í¿Ý¿=<ogÀMÅÙ¿<í¿Ý¿=<ogÀKÅÙ¿<ë¿Ý¿=<ogÀIÅÙ¿<ë¿Ý¿=<ogÀGÅÙ¿<é¿ß¿=<qgÀEÅ׿<é¿Ý¿=<qgÀCÅ׿<é¿Û¿=<qgÀAÅ׿<é¿Û¿=<sgÀ?ÅÕ¿<ç¿Û¿=<sgÀ}Ä׿<ã¿Ý¿=<ugÀ{ÄÕ¿<ã¿Ý¿=<ugÀyÄÕ¿<á¿Ý¿=<wgÀwÄÓ¿<ß¿Ý¿=<wgÀuÄÓ¿<ß¿Ý¿=<wgÀsÄÕ¿<Ý¿Ù¿=<{gÀqÄÕ¿<Õ¿Û¿=<{gÀoÄÕ¿<Ó¿Û¿=<}gÀmÄAÀ¿=<?hÀkÄý¿=<AhÀiÄù¿=<ChÀgÄó¿=<IhÀeÄç¿=<KhÀcÄã¿=<ShÀaÄÓ¿;;PE=<mkÀSÅ;PM0PEÇÄÂĿ¿¿Â¿¿Â¿Â¿Â¿¿Â¿Â¿¿Â¿¿Â¿¿Â¿Â¿¿Â¿Â¿Â¿¿Â¿¿Â¿Â¿¿¿¿Â¿¿¿¿¿¿ÂÁ¿¿¿Á¿Á¿¿¿Á¿ÁÂÁ¿Á¿ÁÂÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿Á¿Ã¿Á¿ÁÁÁ¿ÁÁ¿¿Ã¿Á¿Á¿Á¿ÁÁ¿¿Á¿Á¿Á¿Á¿Á¿ÁÁÁ¿Á¿Á¿ÁÁÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÂÁ¿Á¿¿Á¿Â¿¿¿¿Â¿¿¿Â¿¿Â¿Â¿¿¿Â¿¿Â¿Â¿¿Â¿¿Â¿Â¿¿Â¿¿Â¿Â¿¿Â¿¿Â¿¿¿Â¿¿Â¿Â¿Â¿¿Â¿¿¿Â¿¿¿Â¿¿Â¿Â¿Â¿ÄÈîÜ¿ÕqÀ¿Á¿Á¿Á¿Á¿Á¿¿Á¿¿Á¿¿¿¿¿ÁÄ¿¿ÍïÁÈò¿ÁÁÿÁÁÃÁÁÁÁ¿ÃÁÁÁÃÁÁÃÿÁÁ¿¿ÃÁ¿ÁÁÁÁ¿ÁÁ¿ÁÁÁ¿¿ÁÃÁÁ¿ÁÁÁ¿Ã¿Á¿Á¿Á¿¿ÂÁ¿Á¿¿ÂÁ¿¿ÂÁ¿¿ÂÁ¿¿Â¿ÂÁ¿¿ÂÁ¿¿Â¿Â¿ÂÁ¿¿Â¿Â¿Â¿Â¿Â¿ÂÁ¿Â¿¿¿¿¿¿¿¿¿¿Â¿¿ÂÊò¿Â¿Â¿Â¿Â¿Â¿Â¿¿¿¿¿¿¿ÂÁ¿Á¿Á¿Á¿¿Á¿ÁÁ¿ÁÁ¿Á¿ÁÁ¿¿ÁÁÁ¿ÁÁÁ¿ÁÁÁ¿Á¿Á¿ÁÁ¿¿ÁÁÁ¿Á¿ÃÁ¿;PM2FPLTSVPE=<{lÀEÈ¿=<slÀCÈË¿=<qlÀAÈÏ¿=<olÀ?ÈÓ¿=<mlÀ}Ç׿=<mlÀ{Ç׿=<klÀyÇÛ¿=<ilÀwÇß¿=<ilÀuÇß¿=<ilÀsÇß¿=<ilÀqÇß¿=<ilÀoÇß¿=<ilÀmÇá¿=<ilÀkÇß¿=<ilÀiÇß¿=<ilÀgÇß¿=<ilÀeÇß¿=<ilÀcÇß¿=<klÀaÇÝ¿=<mlÀ_ÇÙ¿=<mlÀ]Ç׿=<olÀ[ÇÕ¿=<olÀYÇÓ¿=<slÀWÇË¿=<EmÀwÆ¿=<SlÀuÆï¿=<SlÀsÆï¿=<SlÀqÆí¿=<SlÀoÆí¿=<QlÀmÆï¿=<QlÀkÆï¿=<QlÀiÆï¿=<WlÀgÆç¿=<]lÀeÆá¿=<alÀcÆÝ¿=<alÀaÆÝ¿=<alÀ_ÆÛ¿=<alÀ]ÆÛ¿=<alÀ[ÆÛ¿=<alÀYÆÛ¿=<alÀWÆÛ¿=<alÀUÆÙ¿=<alÀSÆÙ¿=<alÀQÆÙ¿=<alÀOÆÙ¿=<_lÀMÆÛ¿=<_lÀKÆÙ¿=<_lÀIÆÙ¿=<_lÀGÆÙ¿=<_lÀEÆÙ¿=<]lÀCÆÛ¿=<]lÀAÆÙ¿=<]lÀ?ÆÙ¿=<]lÀ}ÅÙ¿=<]lÀ{ÅÙ¿=<]lÀyÅ׿=<[lÀwÅÙ¿=<[lÀuÅÙ¿=<[lÀsÅÙ¿=<[lÀqÅÙ¿=<[lÀoÅ׿=<YlÀmÅÙ¿=<YlÀkÅÙ¿=<YlÀiÅÙ¿=<YlÀgÅÙ¿=<YlÀeÅ׿=<WlÀcÅÙ¿=<WlÀaÅÙ¿=<WlÀ_ÅÙ¿=<WlÀ]ÅÙ¿=<WlÀ[Å׿=<WlÀYÅ׿=<UlÀWÅÙ¿=<UlÀUÅÙ¿<׿¿=<UlÀSÅ׿<׿ÿ=<UlÀQÅ׿<׿ǿ=<UlÀOÅ׿<׿ɿ=<SlÀMÅÙ¿<׿ɿ=<SlÀKÅÙ¿<Ó¿Ë¿=<SlÀIÅ׿<Õ¿É¿=<QlÀGÅÙ¿<Õ¿É¿=<QlÀEÅÙ¿<Ó¿É¿=<QlÀCÅÙ¿<Ñ¿Ë¿=<QlÀAÅÙ¿<Ñ¿Ë¿=<QlÀ?ÅÙ¿<Ï¿Ë¿=<QlÀ}ÄÙ¿<Í¿Ë¿=<QlÀ{ÄÙ¿<Í¿Ë¿=<QlÀyÄÙ¿<Í¿É¿=<QlÀwÄÙ¿<É¿Í¿=<QlÀuÄÙ¿<É¿Ë¿=<QlÀsÄÙ¿<Ç¿Ë¿=<QlÀqÄí¿=<SlÀoÄé¿=<SlÀmÄç¿=<SlÀkÄå¿=<SlÀiÄã¿=<UlÀgÄß¿=<WlÀeÄÙ¿=<YlÀcÄÓ¿=<]lÀaÄË¿;;LTSVPE=<WnÀwÆË¿=<OnÀuÆÙ¿=<OnÀsÆÛ¿<í¿Â¿=<InÀqÆã¿<Ï¿Ù¿=<GnÀoÆç¿<Í¿Ù¿=<EnÀmÆé¿<Ë¿Ù¿=<CnÀkÆí¿<É¿Ù¿=<AnÀiÆÛ¿<Ë¿Ç¿<É¿Ù¿=<?nÀgÆÛ¿<Í¿É¿<Å¿Û¿=<}mÀeÆÙ¿<Õ¿Ç¿<ÿۿ=<{mÀcÆÙ¿<׿ǿ<Á¿Û¿=<{mÀaÆÙ¿<׿ǿ<Á¿Û¿=<ymÀ_ÆÙ¿<Û¿ã¿=<wmÀ]ÆÙ¿<Ý¿ã¿=<wmÀ[ÆÙ¿<ß¿á¿=<umÀYÆÙ¿<á¿á¿=<umÀWÆ׿<ã¿ß¿=<smÀUÆÙ¿<ã¿ß¿=<qmÀSÆÛ¿<ã¿ß¿=<qmÀQÆÙ¿<å¿ß¿=<qmÀOÆÙ¿<å¿ß¿=<omÀMÆÛ¿<å¿Ý¿=<mmÀKÆÛ¿<ç¿Ý¿=<mmÀIÆÛ¿<ç¿Ý¿=<mmÀGÆÙ¿<é¿Ý¿=<mmÀEÆÙ¿<é¿Ý¿=<kmÀCÆÛ¿<é¿Û¿=<imÀAÆÛ¿<ë¿Û¿=<imÀ?ÆÛ¿<ë¿Û¿=<imÀ}ÅÛ¿<ë¿Û¿=<imÀ{ÅÛ¿<ë¿Û¿=<imÀyÅÙ¿<í¿Û¿=<imÀwÅÙ¿<í¿Ù¿=<gmÀuÅÛ¿<í¿Ù¿=<emÀsÅÝ¿<í¿Ù¿=<emÀqÅÛ¿<ï¿Ù¿=<emÀoÅÛ¿<í¿Û¿=<emÀmÅÛ¿<í¿Ù¿=<emÀkÅÛ¿<í¿Ù¿=<emÀiÅÛ¿<ë¿Û¿=<emÀgÅÛ¿<ë¿Û¿=<emÀeÅÛ¿<ë¿Û¿=<emÀcÅÛ¿<ë¿Ù¿=<emÀaÅÛ¿<ë¿Ù¿=<emÀ_ÅÙ¿<í¿Ù¿=<emÀ]ÅÙ¿<í¿Ù¿=<emÀ[ÅÙ¿<ë¿Û¿=<emÀYÅÙ¿<ë¿Û¿=<emÀWÅÙ¿<ë¿Ù¿=<emÀUÅÙ¿<ë¿Ù¿<տ¿=<emÀSÅÙ¿<é¿Û¿<Ó¿Á¿=<emÀQÅÙ¿<é¿Û¿<Ñ¿Å¿=<emÀOÅÙ¿<é¿Û¿<Ñ¿Ç¿=<emÀMÅÙ¿<é¿Ù¿<Ó¿Ç¿=<emÀKÅÙ¿<ç¿Û¿<Ó¿Ç¿=<emÀIÅÙ¿<ç¿Û¿<Ñ¿Ç¿=<emÀGÅÙ¿<å¿Ý¿<Ñ¿Ç¿=<emÀEÅÙ¿<å¿Ý¿<Ï¿Ç¿=<emÀCÅÙ¿<å¿Ý¿<Í¿É¿=<emÀAÅÙ¿<ã¿ß¿<Í¿Ç¿=<emÀ?ÅÙ¿<á¿á¿<Ë¿É¿=<gmÀ}Ä׿<á¿á¿<Ë¿Ç¿=<imÀ{ÄÕ¿<á¿á¿<Ë¿Ç¿=<imÀyÄ׿<Ý¿ã¿<Ç¿É¿=<imÀwÄ׿<Û¿å¿<Ç¿É¿=<imÀuÄ׿<Ù¿ç¿<Å¿É¿=<kmÀsÄÕ¿<׿ɿ<ÿé¿=<kmÀqÄ׿<Ó¿Ë¿<ÿé¿=<mmÀoÄ׿<Ï¿Ë¿<Å¿ç¿=<omÀmÄï¿<Ç¿å¿=<omÀkÄí¿<É¿ã¿=<qmÀiÄë¿<Ë¿ß¿=<qmÀgÄç¿<Ï¿ß¿=<wmÀeÄÝ¿<տ׿=<wmÀcÄÛ¿<Ù¿Ó¿=<}mÀaÄÍ¿<å¿É¿;;PE=<ghÀi^À;PM0PE¿Ê¿È¿Ê¿Ê¿Ê¿ÊÃÈÅÊÇÈËÈËÈÍÆÍÈËÈËÈÇÊÉÊÇÊÉÊÉÊÇÊÉÌÇÌÇÎÉÊÅÊÁÊÃÌÁÊÃÊÁÊÃÌÁÏ¿ÏÁÏÁÏÁÏ¿ÏÃÏ¿ÏÂÇÂÉÂÇÂÇÈÍÈËÈÍÈÍÐËÌÅÈÅÆÁƿ¿ƿÆÃÊ¿ÊÁÊÁÊÁÊÁÊÁÊÁÊ¿ÎÇÌÍÈÏÄÏ;PM2FT11,1FPPE=<YmÀk^À;PM0PE¿ÎÂοοοпοÐÂÎÎÈÒÊÎÈÂÊÊÊÊÈÆÊÈÈÄÍÄËÆËÈÑÄÇÄÇÆÇÄÇ¿ÉÁÉ¿Ë¿ÇÁË¿É¿É¿ÉÁÊÁÊÃÈÃÊÃÈÃÈÃÈÁÊËÁËÁË¿ÉÁÉÅÇÅÇÍÉÏÁÉÅÇÃËÁË;PM2FT11,3FPPE=<IsÁgDÁ;PM0PEÈÇT`Á¿¿ÐS`Á¿ÈÇÏ¿;PM1PE¿ÇÈ¿ÇÈ;PM2RF6,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FP1PE=<AsÁ[Ò;PM0PEÇÇ¿CqÀп¿DqÀÇÇ¿Ð;PM1PEÇ¿¿ÇÈÈ;PM2FP1PE=<eÑcÒ;PM0PEÇÈS`Á¿¿ÏT`Á¿ÉÈÒ¿;PM1PE¿ÈÇ¿ÈÇ;PM2FP1PE=<mÑoDÁ;PM0PEÈÈ¿DqÀÑ¿¿CqÀÊÈ¿Ï;PM1PEÈ¿¿ÈÇÇ;PM2FP1PE=<IWÁmÙ;PM0PEÙÁ¿Â¿Â¿Â¿Â¿ÂÁ¿¿¿ÂÁÂÁ¿¿Â¿Â¿ÂÁ¿ÂÁ¿¿ÂÁ¿¿Â¿ÂÁ¿¿ÂÿÁ¿ÂÁÂÁÁ¿ÂÁ¿¿ÂÁ¿ÁÂÁ¿Á¿Á¿¿ÂÁ¿Ã¿Á¿Á¿ÁÂÁ¿Á¿ÁÁÿÁ¿Á¿Á¿Á¿Á¿ÁÁÁ¿ÁÁÁ¿ÁÁÁ¿ÁÁÁ¿¿ÁÁÁÁ¿Á¿¿ÁÁ¿¿ÃÁÁÁ¿¿Á¿ÁÁ¿¿Á¿ÁÁÁÁÁ¿Á¿Á¿Á¿ÁÁÁ¿Á¿Á¿Á¿Á¿Ã¿Á¿Á¿Á¿Á¿ÁÂÁ¿Á¿Ã¿ÁÂÁÂÁ¿Á¿¿ÃÂÁ¿ÂÿÁÄ¿¿ÁÄÁÂÁ¿ÂÁÂÁ¿ÄÁÄ¿ÂÁÄÁ¿ÄÁÄ¿Ä¿Æÿ¿¿¿Á¿Ŀ¿Ŀ¿ÁÂÁÂÂÂÁ¿¿ÂÁ¿¿ÂÁ¿¿Á¿ÂÁ¿ÂÂÁ¿ÂÁÂÁÂÁ¿¿Á¿¿Á¿ÂÁ¿ÁÂÁ¿ÁÄ¿¿Á¿Á¿ÁÂÁ¿ÁÂÁ¿ÃÂÁ¿Á¿Á¿Á¿ÃÂÿÁ¿Á¿Á¿Á¿Á¿Ã¿Á¿Ã¿Á¿ÁÁÁÂÁÁÁ¿Á¿ÁÁ¿¿Á¿ÁÁÁ¿ÃÁÁ¿ÃÁ¿ÁÁÁÿÁÁÁÁÁÁÁÁ¿ÁÁ¿ÁÁ¿¿ÁÁ¿ÁÁÁÁÁ¿ÁÁÁ¿ÁÁÁ¿¿ÁÁ¿ÁÁÁ¿Á¿Ã¿¿ÁÁ¿Ã¿ÅÁÁ¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿Á¿ÁÂÁ¿Á¿Á¿¿ÂÁ¿Ã¿¿ÂÁÁ¿ÂÁ¿ÁÂÁÂÁ¿Á¿¿Âÿ¿ÄÁ¿¿ÂÁ¿¿ÂÁ¿Á¿ÂÁ¿¿ÂÁ¿ÂÁ¿ÁÄ¿ÂÁÂÁ¿¿ÂÁ¿¿ÂÁ¿ÂÁ¿¿¿ÂÁÄÚÂÂÁ¿Á¿ÁÂÁ¿ÁÂÁ¿Á¿Á¿¿Á¿Á¿¿Á¿Á¿Á¿ÂÁ¿¿ÁÂÁÂÁ¿ÂÁ¿Á¿Á¿¿¿Á¿¿¿¿¿¿Á¿¿Â¿ÂÁ¿¿¿¿¿Â¿Â¿Â¿¿¿¿Â¿Â¿¿Â¿¿Â¿¿¿ÂÁ¿¿Â¿Â¿Â¿¿ÂÁ¿¿Â¿¿¿ÂÁ¿¿Â¿Â¿Â¿Â¿Â¿Â¿Â¿ÂÁ¿ÂÁ¿¿Â¿ÂÁ¿¿Â¿ÂÁ¿¿ÂÁ¿Á¿¿ÂÁ¿¿Â¿ÂÁ¿Á¿¿ÂÁ¿Ã¿¿ÂÁ¿¿ÂÁ¿Á¿Á¿Á¿ÁÂÁ¿ÁÂÁÁÁÂÃÂÁ¿Á¿Ã¿Á¿Á¿¿ÂÁÁ¿ÂÁ¿Á¿Á¿Á¿¿ÂÁÁÁÂÁ¿Á¿¿ÂÁ¿Á¿Á¿ÃÂÁ¿Á¿ÁÂÁ¿¿ÂÁ¿ÁÂÁ¿Á¿ÁÂÁÂÁ¿¿ÂÁ¿Á¿¿ÂÁÂÁÂÁ¿¿ÂÁ¿¿ÂÁÂÁ¿ÂÁ¿¿Â¿Â¿ÂÁ¿Á¿¿ÂÁ¿¿Â¿Â¿ÂÁ¿¿Â¿Â¿Â¿ÂÁ¿¿Â¿Â¿Â¿Ä¿Â¿Ä¿ÂÁ¿¿Â¿ÂÁÂÂĿ¿¿¿¿ÂÂÂÂÂÁÄÂÂÂĿ¿Ä¿Â¿Â¿ÂÂÄ¿¿Â¿ÂĿ¿¿ÂÄ¿¿Â¿¿ÂÄ¿¿¿Â¿¿¿¿Â¿¿¿ÄÂÂÁÄ¿ÂÂĿ¿¿¿¿ÄÁ¿Ŀ¿¿ĿÂÁÂÁ¿¿ÁÄ¿Á¿ÂÁÂÁ¿¿ÁÄÁÂÁÂÁÂÁÂÁÂÁÂÿ¿Á¿ÁÂÁÂÁ¿ÁÂÁ¿ÁÂÃÂÁ¿Ã¿Á¿ÁÂÁ¿Á¿Á¿ÁÂÁ¿Ã¿Å;PM2FTFPLTSVPE=<K[ÁwÜ¿<É¿Ñ¿=<?[ÁuÜï¿=<sZÁsÜCÀ¿=<sZÁqÜGÀ¿=<kZÁoÜUÀ¿=<gZÁmÜ]À¿=<aZÁkÜeÀ¿=<_ZÁiÜmÀ¿=<YZÁgÜuÀ¿=<WZÁeÜyÀ¿=<WZÁcÜ}À¿=<QZÁaÜGÁ¿=<OZÁ_ÜKÁ¿=<OZÁ]Üù¿<Á¿Ç¿<ſÿ<Á¿û¿=<KZÁ[Üñ¿<í¿ó¿=<IZÁYÜñ¿<ñ¿ñ¿=<GZÁWÜí¿<ý¿í¿=<EZÁUÜç¿<OÀ¿ç¿=<EZÁSÜã¿<SÀ¿ç¿=<AZÁQÜå¿<WÀ¿ç¿=<?ZÁOÜã¿<aÀ¿ã¿=<?ZÁMÜá¿<eÀ¿ã¿=<}YÁKÜã¿<gÀ¿ã¿=<{YÁIÜß¿<oÀ¿á¿=<{YÁGÜß¿<oÀ¿ã¿=<yYÁEÜß¿<uÀ¿á¿=<yYÁCÜÝ¿<yÀ¿ß¿=<wYÁAÜß¿<{À¿ß¿=<uYÁ?ÜÝ¿<AÁ¿Ý¿=<uYÁ}ÛÛ¿<CÁ¿á¿=<uYÁ{ÛÛ¿<EÁ¿ß¿=<sYÁyÛÛ¿<KÁ¿Û¿=<sYÁwÛÙ¿<MÁ¿Û¿=<sYÁuÛÙ¿<MÁ¿Ý¿=<qYÁsÛÙ¿<QÁ¿Û¿=<oYÁqÛÛ¿<SÁ¿Û¿=<oYÁoÛÛ¿<UÁ¿Ù¿=<oYÁmÛÙ¿<WÁ¿Ù¿=<mYÁkÛÙ¿<YÁ¿Û¿=<mYÁiÛÙ¿<YÁ¿Û¿=<mYÁgÛ׿<[Á¿Û¿=<mYÁeÛ׿<]Á¿Û¿=<kYÁcÛÙ¿<_Á¿Ù¿=<kYÁaÛÙ¿<_Á¿Ù¿=<kYÁ_ÛÙ¿<aÁ¿Ù¿=<iYÁ]ÛÙ¿<KÁ¿ñ¿=<iYÁ[ÛÛ¿<yÀ¿AÀ¿=<iYÁYÛÙ¿<kÀ¿QÀ¿=<iYÁWÛÙ¿<[À¿aÀ¿=<iYÁUÛÙ¿<KÀ¿qÀ¿=<iYÁSÛÙ¿<û¿CÁ¿=<iYÁQÛÙ¿<ë¿SÁ¿=<iYÁOÛÙ¿<Û¿cÁ¿=<iYÁMÛÙ¿<Ë¿sÁ¿=<iYÁKÛ[¿=<gYÁIÛG¿=<iYÁGÛuÁ¿=<iYÁEÛeÁ¿=<iYÁCÛUÁ¿=<iYÁAÛEÁ¿=<iYÁ?ÛuÀ¿=<iYÁ}ÚeÀ¿=<iYÁ{ÚUÀ¿=<iYÁyÚEÀ¿=<iYÁwÚõ¿=<iYÁuÚå¿=<kYÁsÚÙ¿=<kYÁqÚÙ¿=<kYÁoÚÙ¿=<kYÁmÚÛ¿=<kYÁkÚÛ¿<{Á¿Â¿=<mYÁiÚÙ¿<gÁ¿Ï¿=<mYÁgÚÙ¿<_Á¿×¿=<mYÁeÚÛ¿<[Á¿Ù¿=<oYÁcÚÛ¿<WÁ¿Û¿=<oYÁaÚÛ¿<WÁ¿Ù¿=<oYÁ_ÚÛ¿<WÁ¿Ù¿=<oYÁ]ÚÛ¿<UÁ¿Ù¿=<qYÁ[ÚÙ¿<UÁ¿Ù¿=<qYÁYÚÝ¿<OÁ¿Û¿=<sYÁWÚÛ¿<OÁ¿Ù¿=<sYÁUÚÛ¿<MÁ¿Û¿=<sYÁSÚÝ¿<IÁ¿Ý¿=<uYÁQÚÛ¿<IÁ¿Û¿=<uYÁOÚß¿<CÁ¿Ý¿=<wYÁMÚÝ¿<AÁ¿Û¿=<yYÁKÚÝ¿<?Á¿Û¿=<yYÁIÚÝ¿<}À¿Ý¿=<yYÁGÚß¿<wÀ¿ß¿=<{YÁEÚá¿<sÀ¿ß¿=<}YÁCÚß¿<qÀ¿ß¿=<?ZÁAÚá¿<kÀ¿ß¿=<?ZÁ?Úá¿<iÀ¿ß¿=<AZÁ}Ùã¿<cÀ¿á¿=<EZÁ{Ùá¿<[À¿å¿=<EZÁyÙå¿<SÀ¿ç¿=<GZÁwÙå¿<OÀ¿ç¿=<GZÁuÙë¿<EÀ¿é¿=<KZÁsÙí¿<÷¿ï¿=<MZÁqÙí¿<ſ¿<ï¿ñ¿=<OZÁoÙõ¿<ÿ¿¿<Ó¿AÀ¿=<QZÁmÙIÁ¿=<SZÁkÙEÁ¿=<WZÁiÙ}À¿=<YZÁgÙyÀ¿=<[ZÁeÙuÀ¿=<_ZÁcÙmÀ¿=<cZÁaÙcÀ¿=<eZÁ_Ù]À¿=<iZÁ]ÙUÀ¿=<oZÁ[ÙIÀ¿=<qZÁYÙCÀ¿=<A[ÁWÙå¿=<Q[ÁUÙÿ;;PE=<{]ÁoÙ;PM0PEÚÄÚSÂ×ÁÁÔÁÁ¿Á¿ÁÁ¿¿ÁÁ¿ÁÁ¿ÁÁ¿¿ÁÁ¿¿ÁÁ¿¿ÁÁÁÁ¿ÁÃÁ¿Á¿ÁÁÁ¿ÁÁ¿ÁÁ¿Á¿Á¿ÁÁÁ¿Á¿Á¿Á¿ÃÃÁÞ¿¿ÂĿ¿¿Â¿¿ÂĿ¿ÂÄ¿¿¿Â¿¿¿Â¿¿¿Â¿Â¿¿Â¿¿¿¿ÂÂÄ¿ÂÁ¿ÂĿ¿¿ÂÁ¿ĿÂÏBÁ;PM2FPLTSVPE=<saÁeÝ¿=<aaÁcÝÏ¿=<YaÁaÝ׿=<E`Á_Ý¿<˿ÿ<Å¿Á¿<Å¿¿¿<÷¿×¿=<{_Á]Ýñ¿<ë¿×¿=<w_Á[Ý÷¿<ſ¿<å¿Ù¿=<o_ÁYÝGÀ¿<á¿Ù¿=<g_ÁWÝUÀ¿<Û¿Ù¿=<g_ÁUÝWÀ¿<ٿٿ=<a_ÁSÝaÀ¿<Õ¿Ù¿=<]_ÁQÝiÀ¿<ӿ׿=<[_ÁOÝoÀ¿<Ͽ׿=<W_ÁMÝsÀ¿<Ͽ׿=<U_ÁKÝwÀ¿<Í¿Ù¿=<S_ÁIÝ{À¿<Ë¿Ù¿=<O_ÁGÝ÷¿<Á¿Ã¿<ſÿ<Á¿û¿<Å¿Ù¿=<K_ÁEÝï¿<é¿ñ¿<ÿٿ=<K_ÁCÝí¿<ï¿í¿<ÿٿ=<G_ÁAÝé¿<û¿GÀ¿=<G_Á?Ýå¿<CÀ¿CÀ¿=<E_Á}Üå¿<GÀ¿AÀ¿=<C_Á{Üã¿<QÀ¿ý¿=<?_ÁyÜã¿<YÀ¿ù¿=<?_ÁwÜã¿<YÀ¿ù¿=<}^ÁuÜß¿<cÀ¿õ¿=<}^ÁsÜÝ¿<kÀ¿ï¿=<y^ÁqÜá¿<mÀ¿í¿=<w^ÁoÜß¿<qÀ¿í¿=<w^ÁmÜß¿<sÀ¿ë¿=<w^ÁkÜÝ¿<wÀ¿ë¿=<w^ÁiÜÛ¿<{À¿é¿=<s^ÁgÜÝ¿<}À¿é¿=<s^ÁeÜÝ¿<?Á¿ç¿=<q^ÁcÜÝ¿<CÁ¿å¿=<q^ÁaÜÛ¿<EÁ¿å¿=<q^Á_ÜÛ¿<IÁ¿á¿=<o^Á]ÜÛ¿<KÁ¿á¿=<m^Á[ÜÛ¿<OÁ¿á¿=<m^ÁYÜÛ¿<OÁ¿á¿=<m^ÁWÜÛ¿<QÁ¿ß¿=<m^ÁUÜÙ¿<SÁ¿ß¿=<k^ÁSÜÛ¿<UÁ¿Ý¿=<k^ÁQÜÙ¿<WÁ¿Ý¿=<i^ÁOÜÛ¿<YÁ¿Û¿=<i^ÁMÜÛ¿<YÁ¿Û¿=<i^ÁKÜÙ¿<[Á¿Ý¿=<g^ÁIÜÛ¿<]Á¿Û¿=<g^ÁGÜÛ¿<]Á¿Û¿=<g^ÁEÜÙ¿<aÁ¿Ù¿=<g^ÁCÜÙ¿<aÁ¿Ù¿=<g^ÁAÜÙ¿<aÁ¿Ù¿=<g^Á?ÜÙ¿<aÁ¿Ù¿=<g^Á}ÛÙ¿<aÁ¿Ù¿=<e^Á{ÛÛ¿<cÁ¿×¿=<g^ÁyÛÙ¿<cÁ¿Ù¿=<g^ÁwÛÙ¿<cÁ¿Ù¿=<e^ÁuÛÛ¿<cÁ¿Ù¿=<e^ÁsÛÙ¿<eÁ¿Ù¿=<e^ÁqÛÛ¿<cÁ¿Ù¿=<e^ÁoÛÛ¿<cÁ¿Ù¿=<e^ÁmÛÛ¿<cÁ¿Ù¿=<e^ÁkÛÛ¿<cÁ¿Ù¿=<e^ÁiÛÛ¿<cÁ¿Û¿=<e^ÁgÛÛ¿<cÁ¿Û¿=<g^ÁeÛÙ¿<cÁ¿Û¿=<g^ÁcÛÙ¿<cÁ¿Û¿=<g^ÁaÛÙ¿<cÁ¿Û¿=<g^Á_ÛÙ¿<cÁ¿Û¿=<g^Á]ÛÛ¿<aÁ¿Û¿=<g^Á[ÛÛ¿<aÁ¿Û¿=<g^ÁYÛÛ¿<aÁ¿Ý¿=<g^ÁWÛÛ¿<_Á¿ß¿=<g^ÁUÛÛ¿<_Á¿ß¿=<g^ÁSÛÝ¿<]Á¿ß¿=<i^ÁQÛÛ¿<]Á¿ß¿=<i^ÁOÛÝ¿<YÁ¿á¿=<i^ÁMÛÝ¿<WÁ¿ã¿=<k^ÁKÛÛ¿<WÁ¿ã¿=<k^ÁIÛÝ¿<UÁ¿å¿=<m^ÁGÛÛ¿<UÁ¿å¿=<m^ÁEÛÛ¿<SÁ¿ç¿=<m^ÁCÛÝ¿<OÁ¿é¿=<m^ÁAÛÝ¿<OÁ¿é¿=<o^Á?ÛÝ¿<MÁ¿é¿=<o^Á}Úß¿<IÁ¿ë¿=<q^Á{ÚÝ¿<GÁ¿í¿=<q^ÁyÚß¿<CÁ¿ñ¿=<q^ÁwÚá¿<?Á¿ó¿=<q^ÁuÚã¿<}À¿ó¿=<s^ÁsÚá¿<{À¿õ¿=<u^ÁqÚá¿<wÀ¿Û¿<Á¿Ù¿=<w^ÁoÚã¿<qÀ¿Ý¿<Á¿Ù¿=<w^ÁmÚå¿<oÀ¿Û¿<ſ׿=<y^ÁkÚã¿<mÀ¿Ý¿<ſ׿=<{^ÁiÚå¿<gÀ¿Ý¿<ǿ׿=<}^ÁgÚã¿<eÀ¿Ý¿<Ç¿Ù¿=<}^ÁeÚé¿<[À¿á¿<Ç¿Ù¿=<A_ÁcÚç¿<WÀ¿á¿<˿׿=<C_ÁaÚç¿<SÀ¿ã¿<˿׿=<C_Á_Úé¿<KÀ¿ç¿<Ϳ׿=<C_Á]Úï¿<CÀ¿å¿<ѿ׿=<E_Á[Úñ¿<ù¿ë¿<ѿ׿=<I_ÁYÚõ¿<ë¿ï¿<ӿ׿=<K_ÁWÚý¿<ǿ¿<É¿?À¿<տ׿=<M_ÁUÚIÁ¿<׿׿=<Q_ÁSÚAÁ¿<ۿ׿=<S_ÁQÚ}À¿<Û¿Ù¿=<U_ÁOÚ{À¿<ݿ׿=<W_ÁMÚuÀ¿<ß¿Ù¿=<[_ÁKÚoÀ¿<á¿Ù¿=<]_ÁIÚkÀ¿<ã¿Ù¿=<c_ÁGÚ]À¿<ë¿Ù¿=<e_ÁEÚUÀ¿<ñ¿Ù¿=<i_ÁCÚOÀ¿<ñ¿Ù¿=<o_ÁAÚCÀ¿<÷¿Ù¿=<?`Á?Úã¿<GÀ¿Ù¿=<E`Á}ÙÁ¿<Á¿Ñ¿<ÿÿ<EÀ¿Ù¿=<iaÁ{ÙÙ¿=<gaÁyÙÛ¿=<gaÁwÙÛ¿=<gaÁuÙÙ¿=<eaÁsÙÛ¿=<eaÁqÙÛ¿=<caÁoÙÛ¿=<aaÁmÙÛ¿=<aaÁkÙÛ¿=<_aÁiÙÝ¿=<c_ÁgÙ¿<{À¿ß¿=<G_ÁeÙÙ¿<yÀ¿á¿=<G_ÁcÙÛ¿<uÀ¿á¿=<I_ÁaÙÛ¿<qÀ¿ã¿=<I_Á_ÙÝ¿<mÀ¿ã¿=<K_Á]ÙÛ¿<kÀ¿ã¿=<K_Á[Ùß¿<cÀ¿ç¿=<K_ÁYÙß¿<cÀ¿å¿=<M_ÁWÙß¿<]À¿ç¿=<Q_ÁUÙß¿<SÀ¿ë¿=<Q_ÁSÙá¿<ÿ¿<OÀ¿ë¿=<Q_ÁQÙå¿<EÀ¿ñ¿=<U_ÁOÙç¿<ÿ¿<÷¿ó¿=<U_ÁMÙí¿<í¿ù¿=<W_ÁKÙ÷¿<Å¿¿¿<É¿Á¿<Ç¿?À¿=<[_ÁIÙIÁ¿=<[_ÁGÙGÁ¿=<]_ÁEÙCÁ¿=<a_ÁCÙ{À¿=<c_ÁAÙuÀ¿=<e_Á?ÙsÀ¿=<i_Á}ØgÀ¿=<i_Á{ØeÀ¿=<q_ÁyØYÀ¿=<y_ÁwØKÀ¿=<{_ÁuØCÀ¿=<E`ÁsØí¿=<S`ÁqØÁ¿<ÿǿ;;LTSVPE=<{cÁ}Ý¿<É¿Ñ¿=<ocÁ{Ýï¿=<icÁyÝù¿=<ccÁwÝGÀ¿=<]cÁuÝSÀ¿=<YcÁsÝ[À¿=<QcÁqÝcÀ¿=<OcÁoÝmÀ¿=<McÁmÝqÀ¿=<GcÁkÝyÀ¿=<GcÁiÝ}À¿=<EcÁgÝCÁ¿=<?cÁeÝKÁ¿=<?cÁcÝù¿<Á¿Ç¿<ſÿ<Á¿ý¿=<}bÁaÝû¿<Ù¿Á¿<Á¿÷¿=<ybÁ_Ýó¿<ñ¿ï¿=<ybÁ]Ýë¿<?À¿í¿=<ubÁ[Ýë¿<EÀ¿í¿=<ubÁYÝå¿<QÀ¿ç¿=<sbÁWÝã¿<YÀ¿å¿=<qbÁUÝå¿<[À¿å¿=<obÁSÝá¿<eÀ¿ã¿=<mbÁQÝã¿<gÀ¿ã¿=<mbÁOÝá¿<iÀ¿å¿=<kbÁMÝß¿<qÀ¿á¿=<ibÁKÝß¿<uÀ¿á¿=<ibÁIÝß¿<wÀ¿ß¿=<gbÁGÝß¿<{À¿Ý¿=<gbÁEÝÛ¿<AÁ¿Ý¿=<gbÁCÝÛ¿<AÁ¿ß¿=<ebÁAÝÛ¿<EÁ¿ß¿=<cbÁ?ÝÛ¿<KÁ¿Û¿=<cbÁ}ÜÛ¿<KÁ¿Û¿=<cbÁ{ÜÙ¿<MÁ¿Û¿=<abÁyÜÙ¿<QÁ¿Û¿=<abÁwÜÙ¿<QÁ¿Ý¿=<abÁuÜÙ¿<SÁ¿Û¿=<_bÁsÜÙ¿<WÁ¿Ù¿=<_bÁqÜÙ¿<WÁ¿Û¿=<]bÁoÜÙ¿<YÁ¿Û¿=<]bÁmÜÙ¿<YÁ¿Û¿=<]bÁkÜÙ¿<]Á¿Ù¿=<[bÁiÜÛ¿<]Á¿Ù¿=<[bÁgÜÙ¿<_Á¿Ù¿=<[bÁeÜÙ¿<aÁ¿Ù¿=<[bÁcÜ׿<KÁ¿ñ¿=<[bÁaÜÙ¿<yÀ¿AÀ¿=<[bÁ_Ü׿<kÀ¿QÀ¿=<[bÁ]Ü׿<[À¿aÀ¿=<YbÁ[ÜÙ¿<KÀ¿qÀ¿=<[bÁYÜ׿<û¿CÁ¿=<[bÁWÜ׿<ë¿SÁ¿=<YbÁUÜÙ¿<Û¿cÁ¿=<YbÁSÜÙ¿<Ë¿sÁ¿=<YbÁQÜ[¿=<WbÁOÜG¿=<YbÁMÜuÁ¿=<YbÁKÜeÁ¿=<YbÁIÜUÁ¿=<YbÁGÜEÁ¿=<YbÁEÜuÀ¿=<YbÁCÜeÀ¿=<[bÁAÜSÀ¿=<[bÁ?ÜCÀ¿=<[bÁ}Ûó¿=<[bÁ{Ûã¿=<[bÁyÛÛ¿=<[bÁwÛÛ¿=<[bÁuÛÛ¿=<[bÁsÛÛ¿=<[bÁqÛÛ¿<{Á¿Â¿=<]bÁoÛÙ¿<gÁ¿Ñ¿=<]bÁmÛÙ¿<_Á¿Ù¿=<]bÁkÛÛ¿<]Á¿×¿=<_bÁiÛÛ¿<YÁ¿Ù¿=<_bÁgÛÛ¿<YÁ¿×¿=<abÁeÛÙ¿<WÁ¿Ù¿=<abÁcÛÛ¿<SÁ¿Ù¿=<abÁaÛÛ¿<SÁ¿Ù¿=<abÁ_ÛÝ¿<OÁ¿Û¿=<cbÁ]ÛÛ¿<OÁ¿Û¿=<cbÁ[ÛÛ¿<OÁ¿Û¿=<cbÁYÛÝ¿<IÁ¿Ý¿=<ebÁWÛÝ¿<GÁ¿Û¿=<ebÁUÛß¿<CÁ¿Ý¿=<gbÁSÛÝ¿<CÁ¿Û¿=<ibÁQÛÝ¿<?Á¿Ý¿=<ibÁOÛß¿<{À¿Ý¿=<ibÁMÛß¿<yÀ¿Ý¿=<kbÁKÛß¿<uÀ¿ß¿=<mbÁIÛß¿<qÀ¿ß¿=<obÁGÛá¿<kÀ¿á¿=<obÁEÛá¿<kÀ¿Ý¿=<obÁCÛå¿<cÀ¿á¿=<ubÁAÛá¿<[À¿å¿=<ubÁ?Ûå¿<WÀ¿å¿=<ubÁ}Úç¿<OÀ¿ç¿=<wbÁ{Úë¿<GÀ¿ç¿=<ybÁyÚí¿<ý¿í¿=<{bÁwÚï¿<ſ¿<ñ¿ï¿=<?cÁuÚõ¿<ſ¿<Ó¿AÀ¿=<AcÁsÚKÁ¿=<EcÁqÚCÁ¿=<GcÁoÚ?Á¿=<IcÁmÚ{À¿=<KcÁkÚuÀ¿=<OcÁiÚmÀ¿=<QcÁgÚkÀ¿=<WcÁeÚ]À¿=<YcÁcÚUÀ¿=<]cÁaÚKÀ¿=<ccÁ_ÚAÀ¿=<qcÁ]Úå¿=<wcÁ[Úÿ<Á¿Ï¿<Å¿Á¿;;LTSVPE=<wkÁAà׿=<ikÁ?àí¿=<ekÁ}ßó¿<ſ¿=<_kÁ{ßAÀ¿=<[kÁyßKÀ¿=<YkÁwßOÀ¿=<UkÁußUÀ¿=<QkÁsß]À¿=<QkÁqß_À¿=<KkÁoßgÀ¿=<KkÁmßiÀ¿=<IkÁkßmÀ¿=<GkÁißqÀ¿=<EkÁgßñ¿<׿ë¿=<CkÁeßé¿<ã¿ë¿=<CkÁcßå¿<ï¿å¿=<?kÁaßã¿<÷¿å¿=<?kÁ_ßã¿<û¿¿¿<Á¿ß¿=<}jÁ]ßá¿<CÀ¿ß¿=<}jÁ[ßÝ¿<IÀ¿ß¿=<}jÁYßÝ¿<IÀ¿á¿=<yjÁWßß¿<MÀ¿ß¿=<yjÁUßÛ¿<UÀ¿Û¿=<yjÁSßÛ¿<UÀ¿Û¿=<wjÁQßÛ¿<YÀ¿Û¿=<wjÁOßÙ¿<[À¿Ý¿=<wjÁMßÙ¿<]À¿Û¿=<ujÁKßÙ¿<_À¿Û¿=<ujÁIßÙ¿<aÀ¿Ù¿=<sjÁGßÙ¿<cÀ¿Ù¿=<sjÁEßÛ¿<aÀ¿Û¿=<sjÁCßÙ¿<cÀ¿Û¿=<sjÁAßÙ¿<cÀ¿Û¿=<sjÁ?ßÙ¿<eÀ¿Ù¿=<qjÁ}ÞÛ¿<cÀ¿Û¿=<sjÁ{ÞÙ¿<cÀ¿Û¿=<qjÁyÞÛ¿<eÀ¿Ù¿=<qjÁwÞÛ¿<eÀ¿Ù¿=<qjÁuÞÛ¿<Á¿Â¿<eÀ¿Ù¿=<qjÁsÞÛ¿<cÀ¿Û¿=<qjÁqÞÛ¿<cÀ¿Û¿=<sjÁoÞÙ¿<eÀ¿Ù¿=<sjÁmÞÙ¿<cÀ¿Û¿=<sjÁkÞÙ¿<cÀ¿Ù¿=<sjÁiÞÛ¿<aÀ¿Ù¿=<sjÁgÞÛ¿<_À¿Û¿=<sjÁeÞÛ¿<_À¿Û¿=<sjÁcÞÝ¿<]À¿Û¿=<sjÁaÞÝ¿<[À¿Û¿=<ujÁ_Þß¿<UÀ¿Û¿=<wjÁ]ÞÝ¿<SÀ¿Ý¿=<wjÁ[Þß¿<QÀ¿Ý¿=<yjÁYÞß¿<KÀ¿ß¿=<yjÁWÞß¿<KÀ¿ß¿=<{jÁUÞã¿<?À¿á¿=<{jÁSÞå¿<ù¿å¿=<}jÁQÞå¿<õ¿ç¿=<}jÁOÞë¿<é¿ë¿=<?kÁMÞñ¿<ÿ¿¿<É¿û¿=<?kÁKÞ{À¿=<CkÁIÞuÀ¿=<EkÁGÞqÀ¿=<EkÁEÞoÀ¿=<IkÁCÞkÀ¿=<KkÁAÞoÀ¿=<OkÁ?ÞkÀ¿=<QkÁ}ÝqÀ¿=<UkÁ{Ý¿¿<Á¿mÀ¿=<WkÁyÝoÀ¿=<WkÁwÝqÀ¿=<SkÁuÝ{À¿=<QkÁsÝõ¿<Á¿Ç¿<ÿû¿=<OkÁqÝï¿<ã¿í¿=<KkÁoÝé¿<ó¿é¿=<KkÁmÝé¿<õ¿ç¿=<IkÁkÝã¿<EÀ¿å¿=<EkÁiÝå¿<IÀ¿ã¿=<EkÁgÝá¿<OÀ¿á¿=<EkÁeÝß¿<SÀ¿á¿=<CkÁcÝÝ¿<[À¿ß¿=<CkÁaÝÝ¿<[À¿á¿=<?kÁ_Ýß¿<aÀ¿Ý¿=<}jÁ]ÝÝ¿<eÀ¿Ý¿=<}jÁ[ÝÝ¿<gÀ¿Ý¿=<}jÁYÝÛ¿<iÀ¿ß¿=<}jÁWÝÛ¿<kÀ¿Ý¿=<{jÁUÝÝ¿<mÀ¿Û¿=<{jÁSÝÛ¿<oÀ¿Ý¿=<yjÁQÝÝ¿<qÀ¿Û¿=<yjÁOÝÛ¿<sÀ¿Û¿=<yjÁMÝÛ¿<uÀ¿Û¿=<wjÁKÝÛ¿<wÀ¿Û¿=<wjÁIÝÛ¿<wÀ¿Û¿=<wjÁGÝÛ¿<yÀ¿Ù¿=<wjÁEÝÛ¿<yÀ¿Û¿=<wjÁCÝÛ¿<yÀ¿Û¿=<wjÁAÝÙ¿<{À¿Û¿=<ujÁ?ÝÛ¿<{À¿Û¿=<ujÁ}ÜÛ¿<{À¿Û¿=<wjÁ{ÜÙ¿<}À¿Ù¿=<ujÁyÜÙ¿<?Á¿Ù¿=<ujÁwÜÙ¿<?Á¿Ù¿=<ujÁuÜÙ¿<?Á¿Ù¿=<ujÁsÜÛ¿<}À¿Ù¿=<wjÁqÜÙ¿<}À¿Ù¿=<wjÁoÜÙ¿<}À¿Ù¿=<wjÁmÜÙ¿<}À¿Ù¿=<wjÁkÜÙ¿<}À¿Ù¿=<wjÁiÜÛ¿<yÀ¿Û¿=<wjÁgÜÛ¿<yÀ¿Û¿=<wjÁeÜÛ¿<{À¿Ù¿=<wjÁcÜÛ¿<yÀ¿Û¿=<wjÁaÜÛ¿<yÀ¿Ù¿=<wjÁ_ÜÛ¿<yÀ¿Ù¿=<yjÁ]ÜÙ¿<yÀ¿Ù¿=<yjÁ[ÜÛ¿<sÀ¿Û¿=<yjÁYÜÛ¿<sÀ¿Û¿=<yjÁWÜÛ¿<sÀ¿Ù¿=<yjÁUÜÝ¿<oÀ¿Ý¿=<}jÁSÜÛ¿<mÀ¿Ý¿=<}jÁQÜÛ¿<mÀ¿Û¿=<}jÁOÜÛ¿<iÀ¿Ý¿=<}jÁMÜÝ¿<gÀ¿Û¿=<?kÁKÜÝ¿<cÀ¿Ý¿=<AkÁIÜÝ¿<aÀ¿Ý¿=<AkÁGÜÝ¿<_À¿Ý¿=<CkÁEÜÝ¿<[À¿Ý¿=<EkÁCÜß¿<QÀ¿á¿=<EkÁAÜá¿<OÀ¿á¿=<GkÁ?Üá¿<KÀ¿á¿=<IkÁ}Ûá¿<EÀ¿ã¿=<IkÁ{Ûã¿<AÀ¿ã¿=<KkÁyÛç¿<õ¿ç¿=<OkÁwÛé¿<ÿ¿<é¿ë¿=<OkÁuÛí¿<Ý¿õ¿=<QkÁsÛyÀ¿=<SkÁqÛwÀ¿=<UkÁoÛqÀ¿=<YkÁmÛkÀ¿=<[kÁkÛeÀ¿=<]kÁiÛaÀ¿=<akÁgÛWÀ¿=<ekÁeÛMÀ¿=<gkÁcÛEÀ¿=<okÁaÛ÷¿=<ukÁ_Ûç¿=<ClÁ]ÛÅ¿<Á¿Å¿<Å¿Á¿;;LTSVPE=<KpÁgà¿<Ë¿Á¿<Ç¿¿¿=<ApÁeàç¿=<woÁcàû¿=<uoÁaà?À¿=<moÁ_àMÀ¿=<ioÁ]àUÀ¿=<eoÁ[à]À¿=<coÁYàeÀ¿=<_oÁWàiÀ¿=<]oÁUàoÀ¿=<YoÁSàuÀ¿=<WoÁQà{À¿=<WoÁOàñ¿<Á¿Ç¿<ÿý¿=<QoÁMàï¿<ã¿ñ¿=<QoÁKàç¿<ñ¿í¿=<MoÁIàé¿<õ¿í¿=<MoÁGàå¿<?À¿é¿=<KoÁEàá¿<IÀ¿ç¿=<IoÁCàã¿<KÀ¿å¿=<GoÁAàá¿<QÀ¿å¿=<EoÁ?àá¿<WÀ¿á¿=<EoÁ}ßß¿<[À¿ã¿=<EoÁ{ßÝ¿<_À¿á¿=<AoÁyßß¿<cÀ¿á¿=<AoÁwßÝ¿<eÀ¿á¿=<?oÁußß¿<iÀ¿Ý¿=<?oÁsßÝ¿<mÀ¿ß¿=<?oÁqßÝ¿<mÀ¿ß¿=<?oÁoßÛ¿<qÀ¿Ý¿=<}nÁmßÛ¿<uÀ¿Ý¿=<{nÁkßÝ¿<uÀ¿Ý¿=<{nÁißÛ¿<wÀ¿ß¿=<{nÁgßÛ¿<yÀ¿Ý¿=<{nÁeßÙ¿<}À¿Û¿=<ynÁcßÛ¿<}À¿Ý¿=<ynÁaßÛ¿<?Á¿Û¿=<ynÁ_ßÛ¿<?Á¿Û¿=<ynÁ]ßÙ¿<AÁ¿Û¿=<wnÁ[ßÙ¿<EÁ¿Ù¿=<wnÁYßÛ¿<CÁ¿Ù¿=<wnÁWßÙ¿<EÁ¿Û¿=<wnÁUßÙ¿<EÁ¿Û¿=<wnÁSßÙ¿<EÁ¿Û¿=<wnÁQßÙ¿<EÁ¿Û¿=<unÁOßÛ¿<GÁ¿Ù¿=<wnÁMßÙ¿<GÁ¿Ù¿=<wnÁKßÙ¿<GÁ¿Ù¿=<unÁIßÛ¿<GÁ¿Ù¿=<unÁGßÛ¿<GÁ¿Ù¿=<unÁEßÛ¿<GÁ¿Ù¿=<unÁCßÛ¿<GÁ¿Ù¿=<wnÁAßÙ¿<IÁ¿×¿=<wnÁ?ßÙ¿<GÁ¿Ù¿=<wnÁ}ÞÙ¿<GÁ¿Ù¿=<wnÁ{ÞÙ¿<GÁ¿×¿=<wnÁyÞÛ¿<CÁ¿Ù¿=<ynÁwÞÙ¿<EÁ¿×¿=<ynÁuÞÙ¿<CÁ¿Ù¿=<ynÁsÞÙ¿<CÁ¿Ù¿=<ynÁqÞÙ¿<CÁ¿Ù¿=<ynÁoÞÛ¿<?Á¿Û¿=<ynÁmÞÛ¿<?Á¿Ù¿=<ynÁkÞÛ¿<?Á¿Ù¿=<{nÁiÞÛ¿<}À¿×¿=<{nÁgÞÛ¿<{À¿Ù¿=<{nÁeÞÛ¿<yÀ¿Û¿=<}nÁcÞÛ¿<wÀ¿Û¿=<}nÁaÞÝ¿<sÀ¿Û¿=<}nÁ_ÞÝ¿<qÀ¿Ý¿=<?oÁ]ÞÛ¿<qÀ¿Ý¿=<?oÁ[ÞÝ¿<mÀ¿Ý¿=<AoÁYÞÝ¿<kÀ¿Ý¿=<AoÁWÞß¿<iÀ¿Û¿=<AoÁUÞß¿<eÀ¿ß¿=<AoÁSÞá¿<_À¿ã¿=<CoÁQÞá¿<]À¿ã¿=<EoÁOÞã¿<YÀ¿á¿=<GoÁMÞá¿<UÀ¿å¿=<GoÁKÞå¿<MÀ¿ç¿=<GoÁIÞç¿<IÀ¿ç¿=<KoÁGÞé¿<ý¿í¿=<MoÁEÞé¿<û¿í¿=<MoÁCÞí¿<ï¿ó¿=<OoÁAÞó¿<Û¿?À¿=<QoÁ?Þû¿<Ç¿GÀ¿=<SoÁ}ÝIÁ¿=<WoÁ{ÝCÁ¿=<YoÁyÝAÁ¿=<[oÁwÝ}À¿=<_oÁuÝyÀ¿=<aoÁsÝwÀ¿=<eoÁqÝqÀ¿=<ioÁoÝMÀ¿<Á¿Ý¿=<ioÁmÝGÀ¿<Ç¿Ý¿=<qoÁkÝõ¿<Ï¿Ý¿=<{oÁiÝá¿<Ù¿Ý¿=<}oÁgÝÿ<Á¿Ï¿<á¿Ý¿=<upÁeÝÝ¿=<spÁcÝÝ¿=<spÁaÝÝ¿=<qpÁ_ÝÝ¿=<qpÁ]ÝÝ¿=<opÁ[ÝÝ¿=<opÁYÝÝ¿=<mpÁWÝÝ¿=<mpÁUÝÝ¿=<kpÁSÝÝ¿=<kpÁQÝÝ¿=<ipÁOÝÝ¿=<ipÁMÝÝ¿=<gpÁKÝÝ¿=<gpÁIÝÝ¿=<epÁGÝÝ¿=<epÁEÝÝ¿=<cpÁCÝÝ¿=<cpÁAÝÝ¿=<apÁ?ÝÝ¿=<apÁ}ÜÝ¿=<_pÁ{ÜÝ¿=<_pÁyÜÝ¿=<]pÁwÜÝ¿=<]pÁuÜÝ¿=<[pÁsÜÝ¿=<[pÁqÜÝ¿=<YpÁoÜÝ¿=<YpÁmÜÝ¿=<WpÁkÜÝ¿=<WpÁiÜÝ¿=<UpÁgÜÝ¿=<UpÁeÜÝ¿=<SpÁcÜÝ¿=<SpÁaÜÝ¿=<QpÁ_ÜÝ¿=<QpÁ]ÜÝ¿=<OpÁ[ÜÝ¿=<OpÁYÜÝ¿=<MpÁWÜÝ¿=<MpÁUÜÝ¿=<KpÁSÜÝ¿=<KpÁQÜÝ¿=<IpÁOÜÝ¿=<IpÁMÜÝ¿=<GpÁKÜÝ¿=<GpÁIÜÝ¿=<EpÁGÜÝ¿=<EpÁEÜÝ¿=<CpÁCÜÇ¿;;MC1,90PE=<UiÀc[À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FT11,2FPPE=<UiÀI\À;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀq\À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀW]À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FT11,1FPPE=<UiÀ}]À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀc^À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FT11,8FPPE=<UiÀI_À;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀq_À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀW`À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀ}`À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FT11,7FPPE=<UiÀcaÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀIbÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀqbÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FPPE=<UiÀWcÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀ?dÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀedÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<UiÀKeÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀqeÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF1,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<UiÀWfÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀ?gÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀegÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF2,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<UiÀKhÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀqhÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FT11,6FPPE=<UiÀWiÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀ?jÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀejÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF3,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<UiÀMkÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀskÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀYlÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<UiÀ?mÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀemÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀMnÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF5,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<UiÀsnÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀYoÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀ?pÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<UiÀepÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀMqÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀsqÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<UiÀYrÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀAsÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀgsÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<UiÀMtÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀstÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<UiÀ[uÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀAvÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀgvÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPPE=<UiÀMwÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀswÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<UiÀ[xÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀAyÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀgyÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀMzÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,4FPPE=<UiÀuzÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀ[{À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀA|À;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPPE=<UiÀi|À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀO}À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀu}À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF6,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,6FPPE=<UiÀ[~À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀA?Á;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF7,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,7FPPE=<UiÀi?Á;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀO@Á;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀu@Á;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF8,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,8FPPE=<UiÀ[AÁ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPMC1,240PE=<Aäe\À;PM0PEÄÊÁÈËÊÏÈÑÈÑÄÑÂËÃ?Á]ÀMÁ]À[ÁaÀiÁaÀsÁcÀ{ÁcÀEÂcÀKÂcÀOÂcÀQÂaÀUÂaÀSÂ]ÀUÂ[ÀMÂYÀKÂSÀEÂQÀ}ÁMÀsÁGÀiÁCÀ[ÁýMÁ÷?ÁïkÀé[ÀáEÀÙïÑÙÇÁ¿ÜÊöÔVÀàrÀêhÀäjÀèpÀèpÀêvÀìxÀìzÀî|Àî@ÁòBÁðDÁôDÁôHÁöFÁøJÁúJÁúJÁüNÁüJÁþLÁ@ÀLÁBÀLÁBÀJÁDÀJÁFÀJÁFÀFÁHÀHÁJÀDÁJÀDÁLÀBÁNÀ@ÁNÀ|ÀPÀ;PM2FTFPMC1,90PE=<UiÀc[À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,1FPPE=<UiÀI\À;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀq\À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀW]À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<UiÀ}]À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀc^À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<UiÀI_À;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀq_À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀW`À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀ}`À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF4,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<UiÀcaÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀIbÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀqbÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<UiÀWcÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀ?dÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀedÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<UiÀKeÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀqeÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,7FPPE=<UiÀWfÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀ?gÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀegÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF8,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<UiÀKhÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀqhÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<UiÀWiÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀ?jÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀejÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF2,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<UiÀMkÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀskÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀYlÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<UiÀ?mÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀemÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀMnÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF4,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<UiÀsnÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀYoÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀ?pÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<UiÀepÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀMqÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀsqÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<UiÀYrÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<UiÀAsÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀgsÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<UiÀMtÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀstÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPPE=<UiÀ[uÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀAvÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀgvÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<UiÀMwÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀswÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPPE=<UiÀ[xÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀAyÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀgyÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀMzÀ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,3FPPE=<UiÀuzÀ;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀ[{À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀA|À;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,4FPPE=<UiÀi|À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀO}À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀu}À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF5,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPPE=<UiÀ[~À;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀA?Á;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2RF6,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,6FPPE=<UiÀi?Á;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀO@Á;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2FPPE=<UiÀu@Á;PM0PEZDÀ¿¿åYDÀ¿¿æ;PM2RF7,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,7FPPE=<UiÀ[AÁ;PM0PEZDÀ¿¿çYDÀ¿¿è;PM2FPPE=<CWÀG[À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,8FPPE=<CWÀK\À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀQ]À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀU^À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<CWÀ[_À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ_`À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<CWÀeaÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀibÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀocÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀsdÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF3,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<CWÀyeÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ}fÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀChÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<CWÀGiÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀMjÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀQkÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<CWÀWlÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ[mÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,6FPPE=<CWÀanÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀeoÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀkpÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF7,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<CWÀoqÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀurÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<CWÀysÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀ?uÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀCvÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF1,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<CWÀIwÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀMxÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀSyÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<CWÀWzÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀ]{À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀa|À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF3,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<CWÀg}À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀk~À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀq?Á;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<CWÀu@Á;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀ{AÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ?CÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<CWÀEDÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀIEÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀOFÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<CWÀSGÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀYHÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPPE=<CWÀ]IÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀcJÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀgKÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPPE=<CWÀmLÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀqMÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<CWÀwNÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ{OÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀAQÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀERÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,2FPPE=<CWÀKSÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀOTÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀUUÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,3FPPE=<CWÀYVÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPIW0,0,6352,4896PE=<CWÀ_WÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀcXÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF4,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,4FPIWIW0,0,6352,4896PE=<CWÀiYÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀmZÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF5,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPIWIW0,0,6352,4896PE=<CWÀs[Á;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀw\Á;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀ}]Á;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF6,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,6FPIWIW0,0,6352,4896PE=<CWÀA_Á;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPIWMC1,240PE=<Yãi[À;PM0PEÂÊÇÆÍÆÑÂÑÁÓÁÏÅÉÉOÀEÁ]ÀOÁiÀUÁuÀ]Á}ÀaÁGÁeÁMÁiÁSÁiÁWÁmÁ]ÁmÁ]ÁkÁ]ÁiÁ]ÁgÁ]ÁaÁYÁ_ÁUÁWÁOÁOÁIÁIÁ?Á?ÁwÀuÀoÀiÀ_À]ÀUÀQÀEÀCÀõóåãÓÑ¿ÂÔÔêèBÀþZÀTÀPÀJÀTÀNÀVÀPÀXÀRÀZÀVÀ^ÀXÀ^ÀZÀbÀ\ÀbÀ^ÀdÀ`ÀdÀbÀfÀfÀhÀfÀfÀhÀhÀjÀjÀlÀhÀlÀhÀpÀhÀpÀhÀpÀfÀrÀfÀvÀfÀtÀdÀvÀbÀvÀbÀxÀ^ÀxÀ^ÀzÀ\ÀxÀXÀzÀVÀ|ÀTÀzÀ;PM2FTFPMC1,90PE=<CWÀG[À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF7,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0;FT11,7FPPE=<CWÀK\À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀQ]À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀU^À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF8,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,8FPPE=<CWÀ[_À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ_`À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF1,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0;FT11,1FPPE=<CWÀeaÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀibÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀocÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀsdÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF2,8,8,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,2FPPE=<CWÀyeÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ}fÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀChÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF3,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,3FPPE=<CWÀGiÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀMjÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀQkÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF4,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,4FPPE=<CWÀWlÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ[mÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF5,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0;FT11,5FPPE=<CWÀanÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀeoÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀkpÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF6,8,8,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,6FPPE=<CWÀoqÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀurÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF7,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<CWÀysÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀ?uÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀCvÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF8,8,8,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,8FPPE=<CWÀIwÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀMxÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀSyÀ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF1,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,1FPPE=<CWÀWzÀ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀ]{À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀa|À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF2,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,2FPPE=<CWÀg}À;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀk~À;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀq?Á;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF3,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,3FPPE=<CWÀu@Á;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀ{AÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ?CÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF4,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,4FPPE=<CWÀEDÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀIEÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀOFÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF5,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,5FPPE=<CWÀSGÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀYHÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF6,8,8,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,6FPPE=<CWÀ]IÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀcJÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀgKÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF7,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,7FPPE=<CWÀmLÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀqMÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF8,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,8FPPE=<CWÀwNÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀ{OÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀAQÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀERÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF1,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0;FT11,1FPPE=<CWÀKSÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPPE=<CWÀOTÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPPE=<CWÀUUÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF2,8,8,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,2FPPE=<CWÀYVÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPIW0,0,6352,4896PE=<CWÀ_WÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀcXÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF3,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,3FPIWIW0,0,6352,4896PE=<CWÀiYÁ;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀmZÁ;PM0PEnò¿¿EÀmò¿¿FÀ;PM2RF4,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,4FPIWIW0,0,6352,4896PE=<CWÀs[Á;PM0PEnò¿¿CÀmò¿¿DÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀw\Á;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPIWIW0,0,6352,4896PE=<CWÀ}]Á;PM0PEnò¿¿CÀmò¿¿DÀ;PM2RF5,8,8,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1;FT11,5FPIWIW0,0,6352,4896PE=<CWÀA_Á;PM0PEnò¿¿EÀmò¿¿FÀ;PM2FPIWMC1,240PE=<YmÀañ;PM0PEÆÊÂÌÆÈÄÊÄÌÄÈÄÌÆÊÁÈÁÊ¿ÈÁÈ¿ÊÁÈÁÈ¿ÈÄËÆËÆÉÆËÄÊÄÊÄÌÆÊÄÊÄÌÄÊÆÌÅÈÃÆ¿ÊÁÈ¿Ê¿È¿Ê¿ÈÆÇÆÉÆÉÈÉÄÊÆÊÄÊÄÈÄÈÆÊÄÊÄÈ¿ÈÁÈ¿ÈÁÆÁÊ¿ÆÁÈ¿ÈÅÂÿÁÂÿÅÅÁÁÃÃÃÅÃÂÉÌÅÌÅÄ¿Å¿ÇÂÉÂÍÂËÂÉ¿Ç¿ÅÃÉÅÇÃÉÃÇÃÉÅÇÃÇÅÉÇÃÇÆÇÌÅÎÁ¿ÿÇÂËÂËÂËÁËÁÅÇÉÉÉÇÉÉÉÉÉÉÉÉÉÇÇÉ¿ÅÌÅÌÁÁ¿ÇÃÇ¿ÉÃÇÁÉÃÇÃÅÁÁÎÉÎÉÎÇÎÉÎÇÌÉÎÇÎÉ;PM2RF6,8,8,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1;FT11,6FPPE=<QvÀCý;PM0PEÁÊ¿ÈÁÈÁÈÄÊ¿ÊÂÌÄÎÂÌÄÌ¿ÌÂÊÅÉÅÍÅÍÅÉÁÔÃÔÁÒÃÔÁÔÃÔÁÔÃÒÄÌÄÊÄÌÄÌÂÌÄÊÄÊÄÌÇËÉÍÇËÇËÁÌÁÎÁÎÁÎÂÌÂÎÂÌ¿ÎÄÎÂÌ¿ÌÄÎÅËÇÍÇËÅËÁÌ¿ÌÃÌ¿ÌÂÖÂÖÂØÂØÂÖÂØÂØÂÖÃÍÁÍÃËÁÍÃÍÁÍÃËÃÍÃÚÁØÃØÃØÁÚÃØÁØÃÚÄÔÂÒÄÔÂÒÄÔÂÔÄÔÄÒÃËÃÉÃÉÃËÃÉÁËÃËÅÉÁοÌÃοÌÁÎÁÎÁÌÁÎÂÔÄÔÂÔÄÔÂÔÂÔÄÖÂÔÃËÃÍÁËÃËÃËÃËÃËÃËÁÎÁÒÁÐÁÐÁÐÁÐÁÐÁÐÄÐÄÌÄÎÄÎÄÎÄÎÄÎÄÎÃÉÃËÅÇÃËÅÉÃÉÅÉÃÉÃÊÁÌÁÌÁÌÁÌÃÌÁÊÁÌÃÊÅÌÅÊÅÆËÇÉÇËÇÉÇÉéÁåÄãÊßÊÝÌ×ÊÕÆÏÄÍÄÛÈçÊóÊùÌAÀÌEÀÎKÀÎKÀÎKÀÌKÀÎGÀÌAÀÊûÊóÆéÄÇÄÅÆÇÄÅÄ¿ÂÁ¿ÆÁ;PM2RF7,8,8,0,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,0;FT11,7FPPE=<}aÀA?À;PM0PE¿ÂËÏËÏÉÍÇÉËËÍËÍËÑËÊÍÒÌÐÎÎÌÌÌÈÌÌÎÌÐÌпÂÍÆ;PM2FTFP1PE=<kaÀ?þ;PM0PE¿ÄÁÉÁÇ¿ÅÁÅ¿ÅÃÉÁËÅËÎÅÈÎÄÌÂÈÂÈ¿ÈÂÆ¿ÈÂÆ¿ÂÏ¿;PM2FP1PE=<mdÀWû;PM0PEâÏâÓâÓÞÕÚÕÔÕÌÕÄ×пÃÜÍÚÕÚÛÖÝØãÖãÒßÒÇÏ;PM2FP1PE=<mfÀwø;PM0PE¿ÃÌÝÌ×Ð×ÐÓÐÏÒÏÒÍÔËÈÐÑÊÑÌÏÐÏÐÍÒÍÖËØËÚ¿ÃÏÄ;PM2FP1PE=<_fÀy÷;PM0PEÇÁÅÑ¿Ï¿Í¿ËÐÃÂÐÁοÌÆÌÇÿÐ;PM1PEÿÃÁÈÂ;PM2FP1PE=<kdÀaø;PM0PEÈÐÍÄÏÆÍÄÏÄÑÄÍÂÏ¿Ï¿¿ÏпÌÁÐÁÎÃÐÁÎÅÐÃÎÅÈÐÉÍ;PM2FP1PE=<ekÀAó;PM0PEÍÅÞÕÜÕÜÕÜÓÞÕÜÓÜÕÞÕÜÕÜÕÜÓÞÕÜÕÜÕÜÕÜÕÊÎÛÖÛÖÝÔÙÖÝØÛÖÛÔÛÖÝÖÛÖÝÖÛÔÛÖÛÔÝÖÛÖÍÅÎÆÉÈÃÍÒÁ;PM2FP1PE=<skÀQó;PM0PEÈÉ¿ÆÄÆ¿ÈÂÆÑ¿ÅÁÅÁÅÁÅÊÉÉÊÁÉÌ¿¿Ð;PM2FP1PE=<IkÀ_ó;PM0PEÇÎÇ¿Ç¿É¿Ç¿¿ÏÈ¿Ê¿È¿È¿ÇÌÐÉ;PM1PEÈÎÏ¿ÈÍ;PM2FP1PE=<clÀeõ;PM0PEÊÐÊÐÌÒÌÒÊÐÌÒÌÐÌÐÏÊÉÏËÑËÏÉÏËÑËÑÉÏËÓÐÅ;PM2FP1PE=<wlÀ?ö;PM0PEÆËÄÊÄÈÄÊÂÊÏÆÁÉÃÇÃÉÁÇÆËÇÌÃËÌ¿ÂÐ;PM2FP1PE=<UlÀKö;PM0PEÇÊÅ¿Å¿Å¿ÇÂÁÏÆÁÊ¿Æ¿Æ¿ÇÊÐÃ;PM1PEÄÊË¿ÈÉ;PM2FP1PE=<ylÀQ÷;PM0PE¿ÁÈÈÄÈÆÈÄÈÆÊÂÊÄÊÂÊÏÄÃÇÁËÃÅÁÉÃÅÅÇÃÇÅÅ¿ÁÌÇ;PM2FP1PE=<amÀEø;PM0PEÁÁÊÎÌÌÊÎÊÎËÈÉËÉÍËËÉËÁÃÐÅ;PM2FP1PE=<umÀkø;PM0PEÄÉÄÌÄÌÄÌÄÌÏÆÃËÅËÁËÅËÂÇÁÈ¿ÅÂÁÌÌ;PM2FP1PE=<_mÀIù;PM0PEÁÈÃÆÅÄÃÆÅÆËËÆÅÄÅÆÃÄÅÁÊÐÅ;PM1PEÂÆÃÂÂÇ;PM2FP1PE=<SnÀOú;PM0PEÁÁÈÈÆÈÈÈÈÈÆÊÈÈÄÊÆÌÏÆÃÉÃÇÅÉÅÇÇÅÇÇÅÇÇÉÁÁÐÅ;PM2FP1PE=<?pÀIþ;PM0PEÆÉÎàÌàÎàÌàÌàÎâÌâÌàÏÆÍáËáËÝÍßËßËßËáÍáÈÉÇÊÁÇÊÁÂÐ;PM2FP1PE=<acÀg@À;PM0PEÆ¿ñÊñÌñÈñÊóÊñÊñÊñÈñÊóÊñÊñÊñÊñÊóÊïÊÁÏðËòÉôÇòËòÉòÇòÉôÉòÉòÉòÇòÉôÉòÉòÉòÉÆÂÉÎ;PM2FP1PE=<SlÀ_UÀ;PM0PE×ÍÕÍ×Í×Í×Í×ËÕË×É×É×ÉÓÅ×ÇÕÅÓÃÕÃÓÁÂÑÔÄÖÂØÆÖÆÖÆØÊÖÊØÊØÊØÌØÌØÎØÌØÐØÎØÎÉÎ;PM2FP1PE=<YhÀMSÀ;PM0PEÁÐãÛáÓÛÓÙÑÛÏÛÑßÓãÕÊÍäÖÞÒÞÒÜÒÚÒÜÒàÖäÚÁÐÂÏÐÌÑÄÃÏ;PM2FP1PE=<SsÀ_PÀ;PM0PEÉÇîËìÉìËìÇìËêÉìÉìÉìÉêÉìÉìÉìËîÇìËðÉÄÐíÌëÊíÊëÊíÊéÊëÊëÌëÈéÊëÌéÊíÊëÊëÌíÊÉÉÊÊËÂÂËÐÂ;PM2FP1PE=<[rÀWWÀ;PM0PEÁÜÃÜÃÜÃÚÃÜÁÜÃÚÃÜÁÚÃÜÃÚÃÜÁÜÃÜÃÜÃÜÏÁÄÛÂÝÄÙÄÛÄÛÄÙÂÛÄÙÂÛÄÙÄÛÄÛÄÛÂÙÄÛÄÝÐÄ;PM2FP1PE=<?rÀyWÀ;PM0PE¿ÍÆÇÆÃÊÃÌÏÃÄËÆÍÌËÔÉÄ¿ÁÒ;PM2FP1PE=<OÞQZÀ;PM0PEÄÃÎÃÌÃÊÁÊÁÊÁÊÃÌÁÌÃÆÒÍÄÉÂËÂÉÂÇÂËÄËÂËÄÄÃÍÇ;PM1PE¿ÃÄ¿ÃÄ;PM2FP1PE=<wßuWÀ;PM0PEÅÂÔÓÒÑÎÓÎÓÌÑÊÓÊÕÌÓÎÈÉÔËÔÉÔËÖÍÔÏÔÑÔÓÔÅÄÆÃÁÄÿ¿Ñ;PM2FP1PE=<}àuWÀ;PM0PEÂÃÌÇÊÃÈ¿ÈÄÆÄÈÄÈÂÈ¿ÒËÃËÃÅÃÅÃÿÿÿÇÆÂÁÏÅ;PM2FP1PE=<KâiUÀ;PM0PEËÇØÍÐÍÎËÈÍÈÏÆÏÆÓÈÙÐÆÇØÅÔÇÔÇÐÉÐÍÎÑÐÙÎËÇÌÈÍÊÂÑÐÂ;PM2FP1PE=<câA[À;PM0PEÂÂÄÖÄÐÄÔÄÒÂÐÄÐÂÒÂÒÂÔ¿ÔÂÔ¿ØÁØ¿ÜÁÞÃàÏÁÂßÂÛÂÛÂ׿×ÁÓÁÓ¿ÑÁÑÃÏÁÑÃÏÁÑÃÑÅÑÁÓ¿ÂÎÇ;PM2FP1PE=<qã_\À;PM0PEÁÁØÌÎÌÌÌÊÌÆÌÂÌÄÌÈÌÍÈÇÍÅËÃËÃÉÅÉÇÉÏÉÕËÃÁÎÉ;PM2FP1PE=<yöItÀ;PM0PE¿ÂèðæîèîæìèîæìæêæìæêæêæêäêæìæêæìäêæìäêæîæîæîäðèðæðæôæòèöæöèøæúêüæüÍÊçûçûåùç÷åõçõåóåñãïçïãïåíåíåëãéåëãéåëåéåëãéåéåéåéåëåéåëçíåëçíåïçïÌË;PM2FP1PE=<}VÀESÁ;PM0PEÌËLÀFÀJÀBÀHÀBÀHÀDÀHÀ@ÀFÀBÀFÀBÀDÀ@ÀDÀ@ÀBÀ@ÀBÀþBÀ@À@Àþ@À@Àþþþü@ÀþüþþüüþüüüüüüúüüüøüüüúúøúúüúüúúËÌùùùûùû÷ùùùûû÷ûûûùûûûûûûûûýýûûý?Àýýûýý?À?À?ÀýAÀ?ÀAÀýAÀ?ÀCÀ?ÀCÀ?ÀEÀAÀEÀAÀGÀ?ÀGÀCÀGÀAÀIÀAÀKÀEÀ;PM1PEÌËËÌ;PM2FP1PE=<kø[tÀ;PM0PE÷ûõý÷û÷ý÷ûùûùûùýùûûûùýùýûûûýýûûýýýûûýý?Àûûý?Àýýý?Àûýý?À?À?Àû?Àý?Àý?ÀýAÀý?À?ÀÌË@À@ÀBÀþ@Àþ@Àþ@Àþ@Àü@À@Àþþ@Àüþþ@Àþüþ@ÀüþþüþþüüþþüüþüüúþúþüüúüúþúüúüøüøþøüöþøüËÌ;PM2FP1PE=<aéWbÀ;PM0PEùKÀùIÀûIÀùIÀûGÀûGÀýGÀýGÀûGÀýGÀûGÀ?ÀEÀûGÀýGÀýEÀýEÀÌËþFÀþFÀþHÀüHÀ@ÀFÀüHÀþHÀüHÀþHÀþJÀüHÀüHÀúLÀüHÀüJÀúLÀÍÊ;PM2FP1PE=<cæW^À;PM0PEËÌÕßÕáÕá×áÕá×ßÕáÓáÎÉÖâÔâØâÖàØâÖâÖâÖâËÌÊÏ;PM2FP1PE=<yçK_À;PM0PEÁÃÌÆÌÈÊÆÊÈÌÈÊÈÌÆÊÆÉÐÉÅËÇÉÇÉÇËÅÉÇËÇÉÅÃÁÎÇ;PM2FP1PE=<yéebÀ;PM0PEÂÄÒÜÐÚÎÚÐÚÎÚÐØÐÞÐÜÍÈÏÝÏÙÏÙÏ×ÍÙÏÙÍÛÑÝÂÄÊÍ;PM2FP1PE=<iì{aÀ;PM0PEÇ¿ÒÇÒËÖËÚÉØÇÚÃÚÂØÊÉÎÑÇÕ¿ÕÄ×ÆÕÈÕÌÓÌÍÊÉ¿Ê¿ÅÂÃÁÈÏ;PM2FP1PE=<SDÀ_mÀ;PM0PEðÒîÔðÔðÔðÖîÔðÖðÖîÖðÖðÖðØîÖðØðØðÖîØðØîØðÚðØðØîØðÚðØîØîÚðÚðØîØðÚîØÇÐíÙíÙï×ï×íÙï×íÙï×íÙï×ï×í×ïÙï×ï×í×ïÕí×ï×ïÕïÕí×ïÕïÕïÕïÕíÓïÕíÓïÑïÕïÑÈÍ;PM2FP1PE=<giÀm{À;PM0PEÆÏNÀÜNÀÜNÀÜLÀÜNÀÜLÀÜLÀÜLÀÜJÀÜLÀÜJÀÜLÀÜJÀÜJÀÜLÀÞHÀÜLÀÜHÀÞJÀÜHÀÞJÀÜJÀÞHÀÞHÀÜJÀÞHÀÞHÀÞJÀÞJÀÞHÀàHÀÞJÀàÇÎGÀßIÀÝGÀÝIÀÝGÀÝGÀÝIÀÝGÀÝGÀÝIÀÝIÀÛGÀÛIÀÛGÀÝIÀÛIÀÝIÀÛGÀÛKÀÛIÀÝIÀÙIÀÝKÀÛKÀÙKÀÝIÀÛMÀÙKÀÝMÀÛMÀÙMÀÝMÀÛ;PM1PEÆÏÅÐ;PM2FP1PE=<AKÀWoÀ;PM0PEýÙûÙûÙý×ûÙûÙýÙý×û×ýÙûÙý×ý×ûÙý×û×ý×ýÙû×ýÙýÕý×ûÙý×û×ý×ý×ý×û×ý×ý×û×ÆÏþØþØüØþØþØþØüØþÚüØþØþØüØþÚþØþØüØþÚüØþÚþØüØþÚüØþÚþØüÚüÚþØüÚþÚüÚþØÇÐ;PM2FP1PE=<SíCaÀ;PM0PEÂÊùß÷áùßùáùßûßùßûÝùßùÝûÝûÝùÝûÛûÝûÛûÛûÛùÛýÛûÛûÙûÛûÙûÛûÙûÛý×ûÙûÛû×ýÙÈÏüÜüØþÚüÜüØüÚüÜþÚüÜüÚüÜüÜþÜúÜüÚüÞüÜúÞüÜüÞüÞúÞüÞúàúÞüàúàüàøàüâúàúâÂÌÁËÆÄÃÈÍÇ;PM2FP1PE=<Cïk\À;PM0PEÅÆÎéÌåÐåÎáÎáÎáÐßÒáÎÈÑàÏâÍàÍâËäÍâÍèÍèÇÆÈÅÁÆÅ¿ÁÏ;PM2FP1PE=<kõA\À;PM0PEÁ¿ÚÁÜÁÚÁÜÃÚÁÜÁÚÃÚÁÚÃÚÁÜÃÚÁÜÁÚÁÚÃÚÁÂÐÙÂÙÄÙÂÛÄÙÂÙÄÛÂÙÂÙÄÙÂÛÂÙÂÙÄÛÂÙÄÛ¿Ñ;PM2FP1PE=<IûQ\À;PM0PEØÁÔ¿Ö¿Ö¿Ö¿ÖÂÖÂÖ¿ÖÂÖÄÖ¿ÖÂÖÄÔ¿ÖÂÖ¿¿ÒÕÁÕ¿ÕÁÕÁÕÁÕÁÕÁÕÁÓÁÕÁÕ¿ÕÁÕ¿Õ¿ÓÂտ¿ÃÏ;PM2FP1PE=<G?ÀcZÀ;PM0PEÃÂêÙäÓàÏÜÍÞÉÚÉÞÇâÇÄÐßÊÝÆÛÊÙÈÝÎÝÐãÔçÚÃÂÁÑ;PM2FP1PE=<qSÀeWÀ;PM0PEèÇêÇèÅèÇêÇêÅèÅêÅêÇêÅèÃêÅêÅêÅèÅêÃêÃêÅêÅêÃêÅèÅêÃêÅêÃèÅêÅèÅêÅèÅêÅèÅÂÒçÆéÆçÆçÆéÆéÄçÆéÄéÆéÆçÆéÄéÆéÄçÆéÄéÆéÆéÄéÆéÆçÆéÆéÆéÆçÆéÈçÆéÈçÈéÆçÈÁÏ;PM2FP1PE=<MdÀOTÀ;PM0PEÅÁDÀËBÀÍDÀÍDÀÍBÀËDÀÍBÀÍBÀËBÀÍBÀÍBÀÍBÀË@ÀÍBÀË@ÀË@ÀÍÂÐ?ÀÎ?ÀÎAÀÌ?ÀÌAÀÎ?ÀÌAÀÐCÀÌAÀÎAÀÌCÀÎAÀÎCÀÎAÀÌCÀÎCÀÎÅÁÆÂÁ¿ÃÁÊÍ;PM2FP1PE=<_qÀW\À;PM0PEÁÁàÒäØêØðÜòÜöÞøàüâüâüäþæüæþæúèúèöèÉÎõç÷çûåûçýåýãûãùãùáùßõÝñÛíÛë×åÕßÓÁÁÎÉ;PM2FP1PE=<}sÀiZÀ;PM0PEÂÁÔËÔÓÒ×Ô×ÒÕÒÍÖÅÔÎÍÊÉÅÉÂÍÌÑÔÓØÑÚÕÔÕÎÄÁÍÉ;PM2FP1PE=<CuÀqYÀ;PM0PEÄÃÊÅÊÃÆÃÆÁÆÅÈÃÈÉÌÏÎÊËÐÉÌÉÆÅÆÉÄÅÂÅÄÉÆÄÃÑÅ;PM2FP1PE=<AvÀoRÀ;PM0PEÁÄÄÛÄÛÂÛÄÛÂÝÄÝÂÛÄÛÄÝÄÛÄÝÄÙÄÝÆÛÆÙÆÛÒÆÅÚÅÚÅÚÅÞÃÜÃÜÃÜÁÞÃÜÃÞÁÞÃÜÃÜÁÜÃÜÃÜ¿ÂÍÇ;PM2FP1PE=<svÀSQÀ;PM0PEÉÉÆÍÈÉÊÉÆÉÈÇÆÇÈÉÈËÎÈÇÎÅÈÉÌÇÈÅÈÉÊÅÊÅÊËÉÈÎ;PM2FP1PE=<KvÀqQÀ;PM0PEÌÊÏÈÉÂÉÂÏÈÇÍÐÇÌÃÌÁÌÅÌÈËÇÒÉÅÒÏÃ;PM2FP1PE=<QvÀ{OÀ;PM0PEÅÆÄÑÂÍ¿Í¿Í¿Í¿ÏÂÍÄÓÐÄÃÒ¿ÐÁÌÂοοÐÁÐÃÔÅÆÆÅÁÄÃÂÅÑ;PM2FP1PE=<]QÁQIÀ;PM0PEöÏöËöÍôÏöËöÍöÍôÍöËöÍôÍöÍöËöÍöËöÍöÍöËöËöÍøËöÍøËöËøÍöÍøËøÍøËøËøÍøÍÆÒ÷ÌùÎ÷ÎõÌùÌõÎ÷ÌõÎ÷Ì÷ÌõÎõÎõÌõÌõÎ÷ÌóÎõÎõÌõÎõÌõÎõÎõÎóÌõÎóÎõÎõÎõÎóÎõÎÅÏ;PM2FP1PE=<{\ÁUEÀ;PM0PEðÕðÕðÓìÓðÑîÏìÏìÏìÍìÍîËìËîÍîËîËðËÆÐïÌïÎëÌíÌëÌíÎëÌíÐëÎëÐíÒëÐíÒíÔïÖñÖÅÍ;PM2FP1PE=<QcÁo@À;PM0PE¿ÃÜÝÚÙÚÛÚ×ÚÓÚÕÚÓØÑØÏÚÍØÏÚËØËØËÚÉØÉÆÎ×Ê×Ì×Ê×ÌÙÎÕÎÙÎ×ÐÙÒ×ÒÙÖ×ÔÙØÙÜÙÚÛÞÂÁÍÅ;PM2FP1PE=<qaÁgý;PM0PEÓ×Ó×ÕÙÏ×ÍÛÉÙÁ×È×ÎÆÃÔ¿ÔÈÖÎØÐØÔÚÔÚÔÖ¿ÁËÌ;PM2FP1PE=<maÁmù;PM0PEÁÃÓïÅëÂçÆáÈÛÈ×ÂÑÁÉÌËÆÖÁÔÅÚÉÜÅâ¿äÆèÐî¿ÁËÌ;PM2FP1PE=<i^Ám÷;PM0PEßÍÛÍÙÍ×ËÕÍÕÑÕÑÓ×ÌËÔØÖÒÔÐÖÎÖÌÚÎÜÌàÐÇÎ;PM2FP1PE=<AVÁ]÷;PM0PE¿åÈãÆçÆåÄéÂç¿ç¿å¿çÁãÃáÁßÅÝÅÙÅ×ÅÓÉÈÍÒÆÖÈØÆÞÆàÄâÄæÄäÂæ¿è¿èÁèÁæÃèÃäÅâÇ¿ÂÐ;PM2FP1PE=<axÀkü;PM0PEÊÊùÊûÊùÊùÈùÌûÊùÈùÌûÊùÊûÊùÊùÊûÊùÊûÌùÈùÌûÊûÊûÊùÌûÊûÊûÊûÊûÊûÊýÊûÊûÊýÊÁÏüÉþÉüÉþÉüÉüÉüËüÇüËüÉúÉüÉúÉüËüÉúÉüÉúÉüÉúÉúËüÇúËúÉüÉúÉüÉøÉüÉúÉüÇúÉÊÊÉÉÊÁ¿ÌÑÃ;PM2FP1PE=<ixÀoû;PM0PE¿ÉÂÇ¿ÅÂÅÂÅ¿ÃÂÇ¿ËÒÄÁÊ¿ÈÁÈÁÄ¿ÆÁÆ¿ÆÁÌÏÃ;PM2FP1PE=<eyÀmù;PM0PEËÉÆÍÊÏÌÍÊÑÌÏÊÑÈËÄËÐÄÃÎÉÐÇÒËÐËÐËÐÉÐÅÌÍÉÌÌ;PM2FP1PE=<sxÀwú;PM0PEÎÈÇÆÇÈÇÊÇÈÇÊÇÈÇÊÇÆËËÈÅÈÉÈÇÈÉÈÇÈÉÈÇÈÅÎÆÏÁ;PM2FP1PE=<EyÀIù;PM0PEÁÆÂÍÂÍÂÏÂÍÄÏÂÍÄÍÂÍÐÂÁÎÁÎÁÎÃÐÁÎÃÐÁÎÁÎÁÄËË;PM2FP1PE=<{yÀu÷;PM0PEÉËÈÉÈÇÈÉÈÇÈÉÈÇÈÉÈÇÌÌÇÈÇÊÇÈÇÊÇÈÇÊÇÈÇÊÉÍÈÎ;PM2FP1PE=<MyÀYø;PM0PEÌÈÏÆÍÈÍÈÍÆÇÍÎÇÐÅÎÇÎÅÌÈËÇÎÅÁÎÏÁ;PM2FP1PE=<UyÀs÷;PM0PEÁÂÄÉÂÉ¿ÉÄÉÐÂÁÊÁÌÁÊÁÊÁÄÍÉ;PM2FP1PE=<KzÀOö;PM0PEÉËÈËÆËÊÉÈËÈÉÈÉÈËÈÉÎÊÉÊÅÊÇÌÉÊÇÌÅÊÇÌÇÊËËÈÐ;PM2FP1PE=<ayÀuö;PM0PEÌÈÍÈÍÆËÈÍÈÇÏÎÅÎÇÎÅÌÇÌÈËÇÐÇÃÐÏÁ;PM2FP1PE=<oyÀ]õ;PM0PEÃÆÂËÂËÄË¿ËÂËÄÉÂËÂËÐÂÁÌÁÌÁÌÁÌÁÌÁÌÁÌÃÌÁÆÉÏ;PM2FP1PE=<kzÀUô;PM0PEÅÏÈÃÈÇÈÇÈÅÈÇÈÅÈÇÊÇÊÐÇÄÇÈÇÆÇÈÇÆÇÈÉÈÇÆÅÏÂÒ;PM2FP1PE=<{yÀqô;PM0PEÊÊÍÄÍÆÍÄÏÄÁÑÌÁÎÅÐÃÎÃÊÊÉÉÎÁÃÌÏÃ;PM2FP1PE=<KzÀaó;PM0PEÁÂÂÉÂÉÂÉÂÉÂËÂÉÄÉÂÉÐÄÁÊÁÌÁÈÃÊ¿ÌÁÌÃÈÁÌÁÄËË;PM2FP1PE=<]{Àqñ;PM0PEÉÍÊËÌËÌËÌÍÌËÌËÌËÊËÌÌÉÌËÌËÌËÌËÎËÌËÌÉÌÉËÈÎ;PM2FP1PE=<]zÀiò;PM0PEÌÊÉÆÇÄÉÆÉÈÇÆÉÆËÆÇÄÇÍÊÅÈÅÊÅÊÅÈÅÌÅÊÅÈÃÌÊËÉÒÇÅÒÏÅ;PM2FP1PE=<uzÀKñ;PM0PEÃÂÄËÄËÄËÂËÄËÂËÄËÄËÐÆÁÊÃÌÃÌÃÎÁÌÃÌÃÌÁÌÃÄÉË;PM2FP1PE=<K|Àsï;PM0PEÇÏÌÇÌÉÌÇÊÉÎÉÌÇÈÉÎÇÊÌËÈËÊËÊÉÈËÊËÊËÈËÊÇÍÆÐ;PM2FP1PE=<E{À[ð;PM0PEÌÌËÂÉÄÇÄËÄÉÄÇÂËÄÉÄÅÏÌÃÊÃÊÃÊÃÊÁÊÃÊÃÊÃÌÌËËÎÃÁÐÑÅ;PM2FP1PE=<[{À?ï;PM0PEÁÄÂËÄËÂËÄËÂÉÄËÂËÄÍÒÆÃÌÁÌÃÌÃÌÁÌÃÊÁÌÃÌÁÄËË;PM2FP1PE=<k|ÀUí;PM0PEÉÍÊËÌËÌÉÌËÊËÌËÊÉÌËÌÌËÌÉÊËÌÉÌËÌËÊËÌÉÌËÍÊÐ;PM2FP1PE=<a{ÀQî;PM0PEÌÈËÆÉÆÉÆÉÈËÆËÆÇÆËÈÉÏÌÅÌÅÊÅÊÅÊÇÌÅÌÅÊÅÌÈËÇÎÇÁÐÏÁ;PM2FP1PE=<g{ÀGí;PM0PEÁÆÂÇ¿Ë¿ÉÂÉÂÇ¿Ë¿ÉÂÉпÊÁÈ¿ÌÁÊ¿ÊÁÈ¿Ì¿ÊÃÄËË;PM2FP1PE=<M|À[ì;PM0PEÃÏÌÅÌÇÌÇÆÅÌÌÇÊËÆÍÈÉÆÅÍ¿Ð;PM2FP1PE=<c{Àaì;PM0PEÈÈË¿Í¿ÉÁÍ¿¿Ïο̿ÌÂÌ¿ÈÈÇÇÈ¿¿ÈÏ¿;PM2FP1PE=<]{ÀIë;PM0PEÂÁ¿Ã¿ÇÁÏÁÍÁÏÁÍ¿ÍпÂÌ¿ÎÂÐÄÎÂοÎÃÌÉÈÂÁÇÍ;PM2FP1PE=<K?ÁUé;PM0PEÄÃÜÕÜÑÞÍÞÍÞÉÞËÞÉÜËÈÎÝÌÝÎÝÊÝÊÛÌÝÎÙÒÝÔÄÅÏÁ;PM2FP1PE=<I?Ámè;PM0PEÃÆ¿É¿Ë¿ËÂËпʿ̿ÌÁÎÃÆÄÅÁÄÁÂÇÏ;PM2FP1PE=<?DÁwå;PM0PEÅÏæÓâÓàÓäÕäÓêÓîÕôÕÈÐõÔíÖçÔãÖáÔáÔãÔãÔÅÍÄÐ;PM2FP1PE=<g~Àeæ;PM0PEÁ¿ÕÂÓÄÕÂÓÄÕÂÕÄÕÂÕÄÓÂÕÂÓÄÕÂÕÄÕÂÕÄÓÂÃÏÖÃÖÁÖÃÖÁÔÃÖÁÖÃÔÁÖÃÖÁÖÁÔÃÖÁÔÁÖÃÖÁÁ¿ÆÐ;PM2FP1PE=<?|ÀAè;PM0PEÍÄÏÆÑÊÓÌÕÎ×ÐÙÎÛÐÅÏÜÍØÏØÍÔÍÔËÔÉÒÉÒÁÂÐ;PM2FP1PE=<]yÀcé;PM0PEßÌÙÐÕÎÓÐÏÌÍÎÏÈÏÆÁÏÌÃÌÇÎËÐËÔÑÖÏÜÍâÍÆÐ;PM2FP1PE=<oxÀoë;PM0PEпÃÒÅÔÃÔÅÔÅÔÇÒËÎÏÊÅÏÊÅÈËÆÍÆÑÆÓÆÕÄÓÆÑοÍÆ;PM2FP1PE=<swÀWê;PM0PEÏÄÅËÅÉÅËÃËÅÉÃËÅËÅËÎÅÆÌÆÊÄÌÆÊÆÌÆÌÄÌÆÌÏÄÒÁ;PM2FP1PE=<[xÀQì;PM0PE¿ÁÄÐÆÐÄÎÄÎÈÐÄÎÆÐÄÒÑÂÃÏÃÍÃÏÅÍÅÏÅÍÅÏÃÑ¿ÁÒÂ;PM2FP1PE=<YxÀKî;PM0PEпÁÌÃÎÁÐÁÐÁÒÁÐÃпÎÑÁÂÍÂÏÂÏÄÑÂÑÂÍÄÏÂÍпÏÆ;PM2FP1PE=<mwÀuì;PM0PEÑÄÃËÁËÃÉÁÍÃÉÁËÃÉÃÉÐÅÄÌÄÊÄÌÂÌÂÊÄÌÄÌÄÊÑÄÒÁ;PM2FP1PE=<?xÀYï;PM0PEÂÔÂÔÂÔÂÔÂÖÂÔÂÖÄÔÑÂÁÓÁÓÁÕÃÓ¿ÕÁÓÃÓÁÓ¿ÁÒ¿;PM2FP1PE=<ExÀqð;PM0PEÎÅ¿ÎÁÊ¿ÌÁÌÁÌ¿ÌÁÌ¿ÊÑ¿ÂË¿ËÂËÂË¿ËÂË¿ÉÂËÐÃÍÊ;PM2FP1PE=<OwÀ]ï;PM0PEÏÆÅËÃÉÅÍÃËÃËÃËÃÉÅÇÎÉÆÊÄÌÆÌÄÌÄÎÄÊÆÌÆÈÏÆÐÁ;PM2FP1PE=<qwÀCò;PM0PE¿ÁÄÖÆÔÂÔÆÔÄÖÄÔÄÖÄÖÏÂÃÕÃÕÃÓÅÑÃ×ÃÓÃÓÃÕ¿ÁÐÂ;PM2FP1PE=<ewÀ?õ;PM0PEÐÁÁÖÃÖÃÚÃÚÃØÃØÁØÃÖÏÁÂÕÄ×ÄÙÄ×Ä×ÄÙÄÕÂÕÐÁÏÆ;PM2FP1PE=<wvÀMó;PM0PEÏÄÃÍÃÏÃÍÁÏÃÍÃÍÃÏÃÍÐÅÄÐÄÎÄÐÄÎÄÐÄÎÂÐÄÎ;PM1PEÏÄÐÃ;PM2FP1PE=<IwÀOö;PM0PE¿ÁÂØÂÚÂØÂØÄÚÂÚÂÖÂØÏÄÁ×ÁÙÁ×ÃÙÁ×ÁÙÁ×Á×п;PM2FP1PE=<SwÀyö;PM0PEÐÅ¿ÎÃÊ¿ÌÁÌÏ¿¿ÍÂËÂÉÂËÐÃÏÊ;PM2FP1PE=<evÀCö;PM0PEÏÆÁÉÃÅÃÇÃÇÃÇÃÇÃÅÃÅÐÉÂÈÄÈÄÆÄÈÄÈÄÈÄÈÄÆÏÆÐÁ;PM2FP1PE=<wvÀAø;PM0PE¿Á¿ÐÂÐÂÎÂÐÄÒÂÎÄÒÂÐÏÂÁÏÃÏÁÏÃÑÁÍÃÏ¿Ñ¿Ï¿ÁÐÄ;PM2FP1PE=<AwÀkø;PM0PEÎÃÁÊ¿Ì¿ÊÁÎÏÿɿÉÂÍÂÉÎÃËÊ;PM2FP1PE=<GvÀq÷;PM0PEÏÈÅÉÃÇÅÇÅÇÃÇÅÉÅÇÃÅÌÉÆÆÆÊÆÈÄÈÆÈÆÈÆÊÆÈÏÆÐÃ;PM2FP1PE=<kvÀYù;PM0PE¿ÅÆÒÂÌÄÎÆÌÂÌÆÌÄÎÆÐÏÄÅÍÅÏÃËÃËÃËÃËÃÍÃÏ¿ÅÐÆ;PM2FP1PE=<_vÀkû;PM0PEÐÁÃÎÃÒÁÔÃÔÁÔÃÔÃÒÃÒÏÅÄÍÂÑÄÓÂÓÄÓÄÓÄÑÄÏÎÁÍÈ;PM2FP1PE=<yuÀyú;PM0PEÍÄÅËÇÏÃÍÅËÎÇÈÎÄÎÆÎÆÎÏÄÐÁ;PM2FP1PE=<OvÀYü;PM0PE¿ÁÄÊÂÊÄÌÄÌÂÎÂÌÂÎÂÎÏÂÁÍÁÍÃËÁËÃÉÁËÃËÁÉ¿Áп;PM2FP1PE=<OvÀyü;PM0PEÈÉÁÌÁÌÁÈÁÊÏ¿¿ËÂËÄÇ¿ÉÈÇÇÈ¿ÅÈÁÂÒ;PM2FP1PE=<_rÀsý;PM0PEÊÆßÆÝÆßÆßÈÝÆÝÈßÆßÆÁÑÞÅâÅÞÅÞÅàÇÞÅàÅàÅÈÆÇÅÆÁÂÈÏÄ;PM2FP1PE=<gqÀwû;PM0PEÁ¿ÃÏÇÏÇÍÅÍÅÏÇÍÅÏÇÑÐÃÆÐÆÐÈÎÆÎÈÎÆÎÈÐÆÒÍÆ;PM2FP1PE=<wqÀWû;PM0PE¿ÅÆËÆÅÄÿÃÎÅÂÌÃÌÅÆÅÈ¿ÅÏÆ;PM2FP1PE=<YqÀMû;PM0PE¿ÂÇÁË¿ÉÉÐÅ¿ÁÈÂÌ¿ÊÌÏÄ;PM2FP1PE=<EqÀ[ú;PM0PEÃÇÃÏÇÍÃËÐÃÂÊÈÎÈÐÂÌ¿ÁÏÄ;PM2FP1PE=<{pÀUù;PM0PEÁÅÁÉÁÉ¿Ë¿ÉÁÉ¿ÅÁÅÐÃÂÈÂÆ¿Ì¿ÊÂÊ¿ÊÂÆÂÂÏÊ;PM2FP1PE=<kpÀYù;PM0PE¿ÁÆÄÂÂÇÆÏÅÐÉÅ¿ÂÁÊÅÊÊÁÁÍÆ;PM2FP1PE=<moÀA÷;PM0PEÂÆÉÓÉÓÅÓÅÓÇÓÅÑÇÓÉÓÎÅÊÒÊÔÈÖÆÒÆÖÈÒÆÔÊÒÂÆÑÃ;PM2FP1PE=<ioÀcõ;PM0PEÍÉÂÇÂË¿Ç¿ËÂËÂÉ¿ËÂÉÒÄÁÊÁÊÁÊ¿Ê¿ÌÁÌ¿ÊÃÊËÇÊÎ;PM2FP1PE=<UoÀGö;PM0PEÌÄÇÆÇÈÇÊÇÈÉÍÆÅÈÉÈÇÊÇÌÄËÃÈÃÄÈÍÆ;PM2FP1PE=<ynÀGõ;PM0PE¿ÆÃÉÁÇÅÇÃÉÁÇÃÇÁÇÃÉÎÅÄÈÄÈÂÈÆÊÄÈÂÊÄÈÂÈÂÄÏÁ;PM2FP1PE=<knÀGó;PM0PEÍÿÏÁÍÁÍ¿Ñ¿Í¿Ï¿ÏÄÏÐÂÁÐÁοпÎÂпÎÂпÐÏÃÎÈ;PM2FP1PE=<_nÀmó;PM0PEпÅÊÇÊÅÊÇÈÍÇÈÉÆÉÆÉÆÉпϿÈÇÈÈÏÊ;PM2FP1PE=<CnÀIó;PM0PEÂÆÇÉÅËÇÉÇÉÐÉÆÊÈÌÆÊÈÊÂÆÑÁ;PM2FP1PE=<ymÀcñ;PM0PEËÉÂÉ¿Ë¿Ë¿É¿Ë¿Ë¿É¿ÍÒÂÁÌ¿Ê¿Ì¿Ì¿Ê¿Ì¿ÌÁÎËÉÈÐ;PM1PEÍÈÂÑÌÊ;PM2FP1PE=<imÀ{ñ;PM0PE¿ÃÆÃÈÉÊÇÏÄÁÄÉÈÉÎÁÅÐ;PM2FP1PE=<]mÀsñ;PM0PE¿ÐÅÉÁÇÁÃÁÁÆÏÊÈÄÊÂƿпÏÈÈÇÈÉÏ;PM2FP1PE=<awÀOê;PM0PE¿ÁêÛêÝèÝèÝèÝèÝæÝèÝæßèÝæßêÝæÝêÝêÝêÝÊÐéÜéÞéÞçÞçÞåÞçÞåàçÞåÞçàçÞçÞéÞçÞëÜÇË;PM2FP1PE=<OLÁoØ;PM0PEÂÃäéäçäçäåæåæåèãèåèáèãìáèãêáìßêáêãìßêáìßìáìßêáìßìßìáêßìáìßêáêáêáêáÈÌéâéâéâéâéâëâéàëâëàëâéàíâéàëâéàëâëàéâéàéâéäçâçäçâçæçäåæåæãæãèãèãæÄÃÑ¿;PM2FP1PE=<OLÁq×;PM0PEÉÇÄÍÂÍÂÍÂËÒ¿ÃÎÁÎÁÎÁÌÉÇÂÐ;PM1PEÉ¿ÉÊÈ;PM2FP1PE=<EKÁw×;PM0PEÅÂÇ¿Ç¿Ç¿ÉÂÇ¿ÇÂÉ¿Ç¿ÁÏÊÁÊ¿È¿È¿ÊÁÈ¿ÈÁÈ¿ÃÂÊÎ;PM2FP1PE=<}HÁgÙ;PM0PEÊÎÑÌÑÌÑÌÓÎÑÌÑÌÑÌÑÌÉÍÒËÔÍÒËÒËÒËÒËÒËÒË;PM1PEÌÌËË;PM2FP1PE=<aJÁ_×;PM0PEÉÅÁÏÊÍÎÏÐÑÒÏÒÑÔÏÐÏÌÌÏÐÓÐÑÒÑÐÏÒËÌÅÌÁÄÉÅÆÒ;PM1PEÇ¿ÁÅÊÆ;PM2FP1PE=<]{Àaá;PM0PEQÀúMÀøMÀøMÀöIÀöGÀôEÀðAÀìýìûæõäïÞíÚåÔßÐÙÊÅÑØÅâÏæÓêÙðßöáüåþëBÀíFÀïHÀñLÀõLÀõNÀ÷PÀ÷PÀùÊÎ;PM2FP1PE=<qsÀ{æ;PM0PE×Ò×ÐÙÒÙÒÛÔÛÒÛÖÝÔÝÖßÔáØßØãØãÜçÚåÜÉÍèÛæÛäÙä×â×à×àÕàÓÜÕÜÓÜÑÜÓÚÑÚÑØÏØÑÊÎ;PM2FP1PE=<akÀCì;PM0PEÆÐËÆÕÌÙÎáÔåÔéØëØëÚíÚëÜëÚéØãØáÔÙÒÉÍÚÑâÕäÕêÙì×ìÛðÙìÙî×ê×äÕâÑÜÍÔËÎÅÌÊËË;PM2FP1PE=<SkÀqë;PM0PEÑ¿ſÅÄÇÌÌ¿ÁÂÂÂÑÂÒ¿;PM2FP1PE=<OkÀKì;PM0PEÐÆÅÆÇÈÅÆÑ¿ÆÉÆÇÈÇÄÃÐÄÑ¿;PM2FP1PE=<{jÀoë;PM0PEÁÉÃÅÇÁÅÉÒ¿ÁÃÈÄÈÊÄÒÏ¿;PM2FP1PE=<AkÀUê;PM0PEÁÉÂË¿Ë¿ÍÄË¿ËÂÉ¿Çп¿È¿ÌÁÌÁÌÁÌ¿Ì¿Ì¿ÆÏÄ;PM2FP1PE=<ijÀ?ë;PM0PE¿ÁÆ¿ÁÆÃÌÁÌÁÌÅÊÍÇÐÃËÁÂÉÂÍÄËÄËÎÃÊÌÏÄ;PM2FP1PE=<?jÀeé;PM0PEÁÅÁÇÃÉÇËÇËÅÍÅÍÅÍÐÃÄÌÈÌÆÎÆÊÈÎÄÊÆÌ¿ÊÏ¿;PM2FP1PE=<EjÀGè;PM0PE¿Ë¿ÍÂÍÂË¿Ë¿ËÂË¿Åп¿Æ¿Ì¿ÌÁÎÁÌ¿Ì¿ÎÁÌÏ¿;PM2FP1PE=<giÀwè;PM0PE¿ÃÊÅÎÁÎÃÊÉÌÇÍпÇÃÅÂÂËÄËÄÍÆÍÌÉÎÈÍÈ;PM2FP1PE=<MiÀwç;PM0PEÁÁ¿ÃÁÅÃÇÁÅÃÉÁÇÅÉÃÉÎÇÄÊÆÊÄÊÂÈÆÊÂÆÂÆÂÆÁÁÍÈ;PM2FP1PE=<[iÀsæ;PM0PEÁÉÂÉÂËÄËÂÉÄÉ¿ÅÂÂÎÇÂÈÁÊÃÈÁÌÃÌÁÊ¿Æ¿ÂÏÈ;PM2FP1PE=<?iÀaç;PM0PEÆÄ¿ÁÆÃÊÃÊÃÌÅÆÏÁÐÇÉÁ¿ÁÄÇÂËÆËÄÇÊÅÌÈÏÄ;PM2FP1PE=<ahÀgæ;PM0PE¿ÂÁÃÃÇÅÉÃÉÅÉÅÉÁÇÐÃÂÆÄÊÆÈÄÊÆÊÄÈÄÈÁÊ¿ÂÍÉ;PM2FP1PE=<giÀ]å;PM0PEÌ×ÐÑÊÍÌÉÊÃÆÅÆ¿ÁÂÎÊÅÄÃÂÇÂÅÄÉÈÉÊËÒËØÏÇ;PM2FP1PE=<]jÀyâ;PM0PEÄÍÂÏÆÏÆÓÆÕÈÕÊÛÌÙÐÈËÚÉØÇÖÅÖÅÔÃÒÃÐÃÌÏÃ;PM2FP1PE=<[kÀGá;PM0PE¿ÈÅÕÂÕÊÑÌÏÐËÎËÈÉÆÉÐÄÅÎËÎÏÌÍÌÉÎÇÌÁÎÄÒ¿È¿ÇÄÄÃÄÍÇ;PM2FP1PE=<alÀ{Þ;PM0PEÂÃÊÙÊÕÊÑÈÍÆÍÈÍÈËÈÏÎÈÇÐÇÎÇÌÅÎÇÎÉÒÇÖËÚÂÃÑ¿;PM2FP1PE=<skÀoÜ;PM0PE¿ÄÅÏÇÍÇÏÇÏÇÏÃÓÃÕ¿×Ò¿¿ØÂÔÄÒÆÎÈÐÈÎÈÐÈÒ¿ÂÏÁ;PM2FP1PE=<ekÀYÚ;PM0PEÁÁËÏÅÑÃÑ¿Ñ¿ÕÄÑÂÑÄÓÐÂÁÔÃÒÁÔÁÒÂÐÂÐÄÎÊÌÃÁÅÐ;PM2FP1PE=<SjÀIÚ;PM0PEÃÂÍ¿Ë¿ÉÁÅÁÅ¿ÅÅÉÁÍÅÆÏÐÆÈÄÆÂÆÂÄÂƿ̿οÁÂÆÎ;PM2FP1PE=<yiÀwÚ;PM0PEÄÌÅÈÃÊÅÈÍÈÅÍÈÅÄÅÄÇÆÉÄÌÆÍ;PM1PEÊÂÅÊÃË;PM2FP1PE=<kjÀSÛ;PM0PEÁÅÊÐÌÈÎÄÐÆÅÎÍÃÑÅÏÉËÕÁÅÒÆ;PM2FP1PE=<QjÀgÜ;PM0PE¿ÆÁÊÃÊÃÊÃÊÃÈÁÊÃÊÁÊÑÅÂÇÄËÄÉÄÇÆÉÂÇÄÉÂÉ¿ÆÐÇ;PM2FP1PE=<SjÀ?Þ;PM0PE¿Á¿ÌÃÊÁÈÁÈ¿ÊÂÊÂÎÆÒÏÈÇÓÁÑ¿Ë¿ËÂËÂÇÂÅÂÉ¿ÁÐÄ;PM2FP1PE=<GjÀcà;PM0PEÂÇÄÎÂÎÂÎÂÐÁÔÃØÅàËæÏÃÊçÈÝÄ׿ϿÍÁÍÃËÁÏÂÅÁÆÁÁÄÃÌÌ;PM2FP1PE=<ehÀWâ;PM0PE¿ÂËÐÉÎÍÐËÎËÎËÎËÌÍÎËËÎÍÌËÌÍÌÍÌËÌÍÊÏÌÏ¿ÂÎÆ;PM2FP1PE=<WgÀUä;PM0PE¿ÉÎÉÐÇÐËÐÉÐÇÎËÒÉÐÍÅÊÓÊÏÊÏÊÏÊÏÊÏÊÍÊÏÌÊ;PM2FP1PE=<meÀ}å;PM0PE¿ÄËÖËÒÏÌËÊÍÈÏÈËÊËÌËÉÌÍÐËÎÇÎÇÎÇÌËÊÏÈÑ¿ÄÒÁ;PM2FP1PE=<ifÀeè;PM0PEÊËÊÔÊØÆÖÆØÆÚÄØÄÔÄÔÑÂÃÑÁÕÃ×Å×Å×ÇÕÅÓÉÑÊËÅÎ;PM2FP1PE=<UeÀEè;PM0PEËÌÇÃÇÅÉÅÉÅÉÅÇÅËÅÅÃÆÍÊÄÈÆÊÆÊÆÌÆÊÆÈÆÈÄÉÎÌË;PM2FP1PE=<KgÀqé;PM0PEÌÈÒÌÐÐÐÎÐÒÐÐÎÌÊÌËÌÉËÍËÏÏÏÑÏÍÏÏÍÉËÇÈÍ;PM2FP1PE=<ggÀIê;PM0PEÈÍÈпʿÂÌÊÇÎÏËÅÉ¿ÇÃËÈÍÇÎÉÍÒ¿ÁÒ;PM2FP1PE=<}eÀ{é;PM0PEÇÐÍÅÍÅÉÃËÁÉÃËÃËÁÍÁÂÑÎÂÐÄÊÂÊÄÌÄÌÆÌÄÐÄÇÐÊÍ;PM2FP1PE=<qgÀwê;PM0PEÆÂÊÄÎÈÎÈÒÈÒÊÒÊÒÊÉÎÏÉÑÉÑÉÏÇÏÇÍÅÇÃÅÁÆÏ;PM2FP1PE=<AhÀWë;PM0PE¿ÃÈÒÆÌÂÆÅÐÉÅÁÉÃËÇÍÁÃÐÁ;PM2FP1PE=<yfÀCë;PM0PEÅÎËÁÍÅËÅËÅÉÅÇÁÂÅÏÂÈÍÊÂÊÄÌÆÌÆÌÆÊÄÈÂÅÎÌË;PM1PEÌÌÑÂÆÍ;PM2FP1PE=<ShÀ{ë;PM0PEÌÔÆÊÊÄÈÂÊ¿Ì¿ÐÈÐÌËÌÍÉÉÃÇÁË¿ËÃËÅËËËÕÎÇ;PM2FP1PE=<chÀMì;PM0PEÄËÌÞÍÈËÝÂËÁÌÃÇÆÃÈÐ;PM2FP1PE=<egÀKì;PM0PEÃÎËÂÇÃÇÁÇÅÇÃÅÁÿÿÇÏÌÁÊÂÈÄÆÄÊÄÆÂÆ¿ÁÎÌË;PM1PEÈÊËÄÄÍ;PM2FP1PE=<shÀ}ì;PM0PEÆÂÈÂÊÄÈÄÊÆÌÈÌÊÌÎËÌËÍÉÉËÅÇÅÇÁÇÃÇÁÇÃÈÍ;PM2FP1PE=<IiÀIí;PM0PEÁÏÊÈÄÈÂÆÈÆÇÎËÇÃÉÁÃÃÁÁÏÂÐÏÅÎÉÊÎ;PM2FP1PE=<WhÀAí;PM0PEÉÃÑÁÏÁÅ¿ÉÍÐÁÒ¿ÒÄÌÂÃÒ;PM2FP1PE=<ehÀUí;PM0PEÄÇÈÆÊÄÇÒÄÑÅÐÇÅËÇÂÑÆÎ;PM2FP1PE=<AbÀUð;PM0PEáÌÝÌÝÌÛÈÛÌÙÌÙÌ×Ì×Ì×Ì×Ì×ÎÕÌ×ÎÙÌÙÌÅÍØÍÚËØËÖËØÍØËØËØËØËÜËØËÜËÜËÞËâËàÉÆÐ;PM2FP1PE=<{YÀmó;PM0PEÝÒßÒÝÐßÐßÎßÎáÎßÌáÎßÌáÊáÌßÌáÌßÊßÌÅÏâËàËâËàÉâËàÉâËàÍâËàËÞÍâÍÞÏàÏÜÑÞÑÊÎ;PM2FP1PE=<uTÀ{÷;PM0PEÏÔÏÒÑÒÑÒÓÐÓÒÕÒÓÐÕÒÓÐÕÐ×ÐÓÐ×ÐÕÎÕÐÉÍÖÏÖÏØÍÖÏÖÏÖÏÖÏÔÏÖÏÒÑÔÑÔÏÒÑÒÑÐÑÐÑ¿ÁÌÌ;PM2FP1PE=<mSÀeû;PM0PEÈÉ¿à¿àÅÞÇàËàÍÜÏÞ×ÜËËÔ×ÒÛÎÝÊÝÈÛÄßÂÛÁÛÊÉÉÊ¿ÉÊ¿¿Ð;PM2FP1PE=<gKÀ?þ;PM0PEÆ¿ÛÌÛÎÝÎßÌßÎáÌáÌáÌáÊáÊãÊáÆãÆßÆáÄß¿¿ÏàÁÞÃâÃäÅàÇâÇäÉâÉâËâËÞËàËàÍÞËÜÍÜËÆÁÃÐ;PM2FP1PE=<aHÀCý;PM0PEÄÄ×ÇÙÇÙÇÙÇ×ÇÙÇÙÅ×ÉÄÏÚÈØÈÚÈÚÈÚÈØÆÚÊÚÈÄÄÍÈ;PM2FP1PE=<mFÀgù;PM0PEÂÆÏÛÍÙÏÝÍÝÍÝÍÛÍÛÏÙÎÇÐÚÎÜÎÞÎÞÐÞÎÜÐÜÎØ¿ÈÏÃ;PM2FP1PE=<gFÀMø;PM0PEÏÿ˿ÉÂÉ¿ËÂÉÂÉÂËÂÉÐÄÁÊÁÊÁÌÁÈ¿Ê¿Ê¿Ê¿ÌÏÁÎÆ;PM2FP1PE=<_FÀMù;PM0PEοÁÈÃÈÁÈÁÈÁÈÁÈÃÈÃÈÍÅ¿ÅÄÉÂÅÄÇÂÇÂÇÂÇÆÉοͿÆÏÈÐÍÆ;PM2FP1PE=<gDÀGõ;PM0PE¿ÆËáÍáÍáÏáÏßÏáÏßÏáÎÅÐàÒâÎâÐàÐâÎàÎäÐâ¿ÆÑÅ;PM2FP1PE=<gDÀYó;PM0PEÏÁ¿ÏÂÍÂËÂÍÂËÂËÂÍÄÍÒÆÃÌÁÌÃÌÁÌÁÎÁÌ¿ÐÁÌÏÁÐÄ;PM2FP1PE=<[DÀaô;PM0PEοÃÈÁÊÃÈÃÈÃÊÁÈÃÌÁÈÏÃÂÉÄÉÂÇÄÉÄËÂÇÆÉÄÇοͿÈÏÆÐÍÈ;PM2FP1PE=<QCÀKñ;PM0PEËÅÅÝÅÝÇÛÇÙÇ×ÇÙÇÕÉÕÎÇÊØÌØÈØÆÚÊÚÆÜÈÞÆàËÅÆÎ;PM1PEÇÆÃËÌÆ;PM2FP1PE=<[AÀ{ñ;PM0PEÉÊËÆÍÄÓÈÑÆÑÆÏÆÉÂÅÍÌÃÐÅÒÅÒÅÒÇÎÃÊÿÂÒÂ;PM2FP1PE=<sAÀiò;PM0PEÈÉÄÎÆÐÄÎÂÌÑÁ¿ÃÅÏÅÍÃÏÊÉÉÊÁÉÌ¿¿Ð;PM2FP1PE=<]@Àcò;PM0PEÅÐÍÁËÃÉÃÉÁÉÃÉÁÅÃÇ¿¿ÏÊ¿ÊÂÊÂÈÄÊÄÌÄÌÄÊÂÅÐÊÏ;PM2FP1PE=<}AÀ_ó;PM0PEÃÃÎÆÎÈÌÆÌÊÌÊÌÈÌÈÌÈÉÐËÉËÇÍÉÇÉËÇËÅËÇËÃÅÃÆÄÿÁÃÎÇ;PM2FP1PE=<]BÀSô;PM0PEÆËÄÈÄÈÄÊÂÈÄÈÂÈÄÆÂÈÍÈÃÇÃÉÁÇÃÇÁÇÁÇÃÅÃÇÈËÇÌÅËο¿Ð;PM2FP1PE=<OAÀ[ô;PM0PEÅÐÉÁÇÁÉ¿Ç¿ÉÁÇ¿ÉÁÇ¿¿ÏÈ¿Ì¿ÊÂÆ¿È¿ÌÂÊÂÈ¿ÃÐÈÍ;PM2FP1PE=<gBÀ?õ;PM0PEÃÃÌÄÊÄÎÆÊÄÌÄÌÆÊÆÌÆÇÎÉÅËÅÉÃËÅËÃÉÃÉÃËÃÅÃÆÄÿÁÃÎÇ;PM2FP1PE=<MCÀuõ;PM0PEÈËÄÆÂÊÆÈÄÊÄÈÄÊÄÈÂÆÍÈÃÇÁÇÃÇÅÉÁÉÅÇÃÇÁÇÆËÅÌÅËÌ¿¿Ò;PM2FP1PE=<wAÀwõ;PM0PEÃÎËÁËÁÉÁÉÁÇÁÉÁÉ¿É¿¿ÑÊ¿ÌÂÊÂÊÂÈ¿ÌÄÊÂÌÂÃÐÆÍ;PM2FP1PE=<OCÀYö;PM0PEÅÅÎÄÊÄÌÄÌÄÊÆÌÆÌÄÌÈÅÎÍÇËÃÉÅËÃÇÃËÃËÃËÃÅÅÆÆÅ¿¿ÅÐÃ;PM2FP1PE=<?DÀ[÷;PM0PEÌÉÂÆÄÊÄÊÆÊÆÌÆÊÄÊÄÈÏÄÁÅÃÉÅÇÅËÅËÃÉÅÇÁÉÌÇËÈÅÑÒÊÇÎ;PM2FP1PE=<sBÀQ÷;PM0PEÉÎÇÃÅÁÇÁÉÃÇÁÉÃÇÁÇÃÈÍÆÂÈÂÈÄÊÂÊÂÈÄÈÄÈÄÉÌÌË;PM2FP1PE=<CDÀEø;PM0PEÃÁÊÆÌÆÊÆÊÈÊÆÌÆÈÈÌÈËÌÇÇÉÅÉÅËÅÉÇÉÅËÅÇÇÃÃÐÅ;PM2FP1PE=<cEÀAû;PM0PEÈËÌØÊÚÌØÊÚÊÚÌØÊØÌÚÏÆÉ×É×ËÙÉ×ËÙÉÙÉ×ËÙÊËÉÌÅÑÐÆÃÒ;PM2FP1PE=<sDÀCû;PM0PEÉÎÍÃÅÁÃÁÍÃÄÑÎÆÆ¿ÆÂÎÆÇÎÌË;PM2FP1PE=<eEÀeû;PM0PEÃÃÎÈÌÈÌÈÐÎËÌÏÍÇÅËÇÏÇÁÃÐÅ;PM2FP1PE=<GFÀ_ü;PM0PEÊËÂÈÂÈÄÊÄÊÄÊÄÈÂÊÂÆÏÆÃÇÁÇÃÉÁÉÃÉÃÇÁÉÁÅÈËÇÌÃÍÌÂÁÒ;PM2FP1PE=<[?ÀOý;PM0PEÊÌ×ÌÙÊÙÆÙÈÛÄÙÆÛÂÝÂÛÂÛ¿Û¿ÛÁÛÁÛÃÛÃÛÃÂÑÜÆÜÄÜÂÚÄÜ¿Ü¿Ü¿Ü¿ÜÃÚÁÜÃÚÅÚÅÚÇØÉØÇÈÌËÉ;PM2FP1PE=<oAÀsù;PM0PEÔëÒáÒÝÐÕÒ×ÒÑÔ×Ô×ÌÊÓÚÓØÑÒÏÖÏÖÑÚÑäÓêÍÅ;PM2FP1PE=<_@Àkø;PM0PEÿËÃÍ¿ÑÁÏÁÍÇÉËÁÓÊ×ÎÆÅÔ¿ÌÄÆÈÄÎÂпÒÂÎÄÁ¿¿Ð;PM2FP1PE=<[?Àk÷;PM0PEÇÃÅÍÅËÃÉÅÉÅÅÅÁËÃÍÁ¿ÏÒ¿ÎÄÌÈÈÊÆÊÄÊÆÌÆÎÇÃÂÐ;PM1PEÅÂÁÅÈÄ;PM2FP1PE=<EüUø;PM0PEÄÐ×ÄÓ¿ÑÂÓÂ×ÂÛÄåÄíÈÁÏîÇæÃÜÃÖÁÖÃÔ¿ÒÁØÁÄÐÅÏ;PM2FP1PE=<küq÷;PM0PEÁ¿ÆÃÆÉÌÍÐÇÆÐËÆÉÊÅÊÇÈÇÍ;PM2FP1PE=<gûGø;PM0PEÅÂÇÆÉÆÉÆÉÆÇÆÅÄÉÍÈÎÇÏÆÁÈÅÊÅÊÅÊÅÈÅÈÁÈÎ;PM2FP1PE=<YûEø;PM0PE¿ËÁÁ¿Á¿ÇÍÆÃÆ¿ÄÂÊ¿ÅÐ;PM2FP1PE=<Yúo÷;PM0PEÆÈÏÆÇÃÉÇËÇÉÅÉÅÃÃÆÏÈÄÊÆÊÈÌÈÊÈÆÄÇÈÁÄÌË;PM2FP1PE=<CûEø;PM0PEÆÍääËÌããÆÏ¿Ò;PM2FP1PE=<WúMø;PM0PEÂÆÍ¿Ñ¿Í¿ÑοҿпÌÎÏÃ;PM2FP1PE=<Mú[÷;PM0PEÏÁÄÛÂËÁÁÂÅÐĿ¿¿ÎÅÜ;PM1PEÏÃÐÄ;PM2FP1PE=<{ùGø;PM0PEÈÃÇÌÇÊÃÎÅÌÏÃÄÏÈËÈÍÈÉÆÃÅÄÂÃÄ¿¿Ð;PM2FP1PE=<YùKø;PM0PEÄÂÉ¿ÇÂÇ¿Ë¿¿ÏÌ¿ÆÁÊ¿Ê¿Æ¿ÉÎ;PM2FP1PE=<Oøc÷;PM0PEÏÄÅÃÅÇÅÃÇÅÉÅÅÅÉÃÅÅÊÍÆÆÆÄÊÄÈÆÊÆÈÈÆÈÆÆÍÄÒÂ;PM1PEÃÒËÍÐÃ;PM2FP1PE=<wøGø;PM0PEÊÉÄÊÊÈÊÌÆÐÑÁÁÃÇÉÉËÉÍÈÉÇÊÃËÌ¿Ð;PM2FP1PE=<cöIø;PM0PEÈÊÍ¿ÑÁÕ¿×ÁÕÁÓ¿Ó¿ÏÁ¿ÏпÔÂÔ¿ÖÂØ¿ÖÂÒ¿ÐÂÈÊÇÉÊÂÁÈÑÃ;PM2FP1PE=<wö{ö;PM0PEÍÇÄËÆÇÄÇÄÇÄÇÆÉÄÇÂÇÒÄÅÌÃÈÅÈÃÈÃÊÃÈÅÈÁÈÍÇÌÌ;PM2FP1PE=<Cö{÷;PM0PEÈÁÇÈÅÈÇÈÇÈÇÈÅÊÇÈÇÈËËÈÇÈÇÆÉÈÇÈÇÈÇÆÇÈÇÈÁÇÂÄÁÄ¿ÃÐ;PM2FP1PE=<OõU÷;PM0PEÂÆËÍÇÍËÉÕÅÄÏÚÆÐÎÌÐÈÎÂÄÏ¿;PM2FP1PE=<_ômô;PM0PE¿ÍÁËÇÉÍÅÏÅÕÁÛÁãÂéпÁêÂâÄÜÄÔÆÎÆÈÆÄÈ¿ÁÒ;PM2FP1PE=<uóWõ;PM0PEÄÄÇÂÅÌËÐÓÈÂÑÆÁÊËÌÏÒÅÆÄËÈ;PM2FP1PE=<EôYó;PM0PEÁÁÁ×ÂÕÄÑÈÑÄËÄË¿ÉÁÇÌÇÆοÎÃÎÅÐÅÎÃÒÁÒÄÔÁÁÍÈ;PM2FP1PE=<wò}ò;PM0PEÄÂÉÁÇ¿Ë¿É¿Ë¿ËÅÉÉÇËÎÇÆÌÈÄÆÂÈÂÊ¿ÌÁÌÂÌÄÄÄÍÈ;PM2FP1PE=<}ñQñ;PM0PE¿ÑÉËËÇÍÅÏÃÍÁÏÅÍÃËÎÇÈÎÄÐÄÎÄÎÂÎÈÌÈÈÎÈ¿ÉÐ;PM2FP1PE=<GñYò;PM0PEÂÁÁÈÃÎÅÎÁÎÅÌÉÌËÄÍÃÊÏÄÄÄ¿ÂÅÄËÄËÄÏÄËÆÍ¿ÊÌ;PM2FP1PE=<?ð}ñ;PM0PEËÃÉÇÉÇÉÅÇÅÇ¿Å¿ÇÄÉËÎÉοÌÄÊÆÊÆÊÈÈÆÈÄÃÐ;PM2FP1PE=<Cð}ô;PM0PEÄÂÐÜÎÞÈàÄà¿ÜÅÖÏÐÓÂÄÏÊ¿ÆÉÄÑ¿×ÃÝÇÝÉÙÑÙÄÂÈÍ;PM2FP1PE=<Còeõ;PM0PEÃÁÚÂÔÂÒÄÎÆÌÆÌÆÌÈÒÈÇÎÏÇÍÇËÅËÅËÁÏÃÑÁ×ÃÅ¿ÊÍ;PM2FP1PE=<oñI÷;PM0PEÈÊÅÎÇÌËÎÇÌÃÊÁÊÂÈÊÊÉÎÍÍÅÑÂÍÈÏÊËÊËÈËÄÉÈÊ¿Ï;PM1PEÊ¿ÁÊÇÉ;PM2FP1PE=<Sôaù;PM0PEÅËÚÊÖÖÔÚÐÞÔÜÒÚÖÐÚÆ¿ÐßÅÛÓÓÛÓÛÏÝÑÙÑÑÑÅÇËÈÌÍÁÆÉÎÆ;PM2FP1PE=<{óWú;PM0PEÐÈÇÐËÌËÈÇÊÍÅÊÏÌÇÊÉÆËÎÈÍÉ;PM2FP1PE=<WôCú;PM0PEÄ¿ÈÁÆÅÊËÎÊËÎËÈÇÄÉ¿Ñ;PM2FP1PE=<iôgù;PM0PEËÉÆÁÆÇÈÃÊÿÒÁ¿ÅÄÅÆÉÆËÉÌÊÍÆÂÏÒÄ;PM2FP1PE=<Yôcú;PM0PEÎÆÅÒÉÎÉÌÃÊÑÃÈÍÊËÊÍÄÉÎÆËË;PM2FP1PE=<Uõcù;PM0PEËÉÌÉÈÇÊÃÈÅÊÅÈÅÈÅÈÇÌÌÇÈÉÆÇÈÉÆÇÆÉÄÉÈÉÈËËÎÊ;PM2FP1PE=<{ôeú;PM0PEÎÊËÒÇÊÇÌËÐÍÉÌÏÈËÈÉÌÏÌÊËË;PM2FP1PE=<oõeù;PM0PEÍÇÊÇÊÇÈÇÈÅÈÃÆÅÈÇÈÇÌÌÇÈÇÈÇÈÇÄÇÆÇÆÇÈÉÈÍÅÐÂ;PM2FP1PE=<wõUú;PM0PEÐÄÃпÈÁÆÁÎÏÁÂÍ¿ÇÂÅÂÏÐÄÍÅ;PM2FP1PE=<Kömù;PM0PEÅÂÈËÄÅÆÇÈÏÎÆÇÒÅÊÃÆÇÌÇÄÈÃÁÄÅ¿¿Ï;PM2FP1PE=<cùuù;PM0PEê¿àÂÞ¿ØÂÖ¿ÖÂÖÂÖ¿¿ÐÕ¿ÕÁÕ¿ÕÁ׿ÝÁßÁé¿Â¿ÁÏ;PM2FP1PE=<}úeù;PM0PEÉÉÌÁÌ¿ÎÁο̿̿̿ÌÁÂÐËÂÍÂË¿Ë¿Í¿Ë¿ËÂË¿ÉÉÊÊÍÄÄÍÒÄ;PM2FP1PE=<{úSú;PM0PEÎÈÁÎÅÈÃÄÃÌÑÃÈÍÄÇÂÃÄËÎÈËË;PM2FP1PE=<Yûoù;PM0PEÅÂÌËÆÅÆÇÌËÌÌËÌÅÈÅÆËÌÅÂÆÁÁÂÿ¿Ï;PM2FP1PE=<cüeù;PM0PEÇÃÈ¿ÊÁÊ¿ÎÁÊ¿Ì¿ÊÁÈ¿¿ÐÇ¿ÇÂÍÂÉ¿É¿ËÂË¿Ç¿ÇÃÈÄÿÃÃÐÇ;PM2FP1PE=<GýUú;PM0PEÐÁÊÔÄÎÂÈÄÈÏÈÅÉ¿ÉÃÉÇÕÐÃÑ¿;PM2FP1PE=<uügù;PM0PEÇÈÁËÁËÃÍÁÏÒ¿¿ÌÄÌÄпÎÇÊÈÉ¿ÊÇ¿¿Ñ;PM2FP1PE=<aþSù;PM0PEÅÍÎÁÌ¿ÎÁппÎÁοο¿ÒÍ¿Í¿Í¿Ï¿ÍÂÏ¿Ë¿ÍÂÃÍÊÌ;PM2FP1PE=<WòuDÀ;PM0PEÁÄëôëòíòëîíðíìïîïìïìñìïìóêóîóêõîõîÉËôíøíôéòíôéðëòëðëðëðíîëîïìíîñìñìñÁÂÐÄ;PM2FP1PE=<_ñSGÀ;PM0PEÁÜÃÖÉÖÇÒÉÒÇÐÇÐÅÒÏÃÈÓÈÑÈÏÊÏÈÑÆÓÆÓ¿Ù¿ÂÒÁ;PM2FP1PE=<MòWKÀ;PM0PEÊÉÆâÂâÆâÄàÆâÂâÆâÄâÑÂÃáÃáÃáÃßÅáÃáÃáÃáÊÇÉÈÁËÌÄÃÐ;PM2FP1PE=<Iñ[IÀ;PM0PE¿ÁÇÑÉÑÇÕÇÑÉÑÉÍÇÉÅÃÄÏÎÈÊÌÊÐÊÒÈÔÈÔÊÔÈÒ¿ÁÍÊ;PM2FP1PE=<MîmFÀ;PM0PEÃÁ×××Ó×Õ×ÓÙÓÕÓÓÕÓ×ÎÉÒÖÔÖÖÔØÔØÔÚÖØÔØØÁÃÅÒ;PM2FP1PE=<CíuFÀ;PM0PEÈÎÉ¿É¿É¿É¿ËÁÉ¿ÉÁÉÁÆÑÆÄÊ¿ÊÂÊ¿Ê¿Ê¿Ê¿Ê¿ÈÎÇÍпÇÎÏÉ;PM2FP1PE=<AíSEÀ;PM0PEÉÅÅËÁÉÁÍ¿ÉÂÉÄËÆËÆËÐÊÇÊÃÊÃÊ¿ÈÁÈÂÊÄÊÂÊÇÅÄÒ;PM1PEÇÂÁÇÊÆ;PM2FP1PE=<aìgFÀ;PM0PE¿Á¿ÄÄÈÄÌ¿Ì¿ÎÇÌËÎÓÊÃÑÎÅÊÇÄÉ¿ÇÁÇÁÉÃÉÁÇÒÂ;PM2FP1PE=<IìoFÀ;PM0PEпÍÎÏÁÉÃÑÁÎÍÐÂÌ¿ÂÐÂÏ¿;PM2FP1PE=<gì]DÀ;PM0PEÃÅÄßÆÙÆÑÄÍÄËÄËÄËÂÍпÁÒÁÎÃÊÅÌÃÎÃÒÅØÅàÃÇÇÌ;PM1PEÃÁ¿ÃÄÆ;PM2FP1PE=<[ëgDÀ;PM0PE¿ÂÃÊÇÈÉÆÉ¿Ë¿ÉÁËÃÉÉÈËÊÆÈÄÊÂÈ¿ÆÁÄ¿ÂÅÄÿÂп;PM2FP1PE=<oë]FÀ;PM0PEÊÉÂпÐÂÐÂпÒÂοÐÂÐÏ¿ÁÍÁÏ¿ÏÁÑ¿ÍÁÏÁÏ¿ÍÊÉÉÊÁËÌÂÃÐ;PM2FP1PE=<{äcFÀ;PM0PEÛÆÙÂÛÄÛÂÛÄÛ¿ÙÂÛ¿Ù¿Û¿ÙÁÛ¿ÙÃÛÁÙÁÛÃÄÏÚÄÜÂÚÂØÂÜÂÚ¿ÜÂÚ¿ÜÁÚ¿ÜÁÚÁÜÁÚÃÜÃÜÿ¿Ð;PM2FP1PE=<QÞEGÀ;PM0PEÆÎçÁå¿á¿Ý¿ÝÂÙÂ׿×ÂÕÄÕ¿ÕÂÕÄ×ÂÕ¿ÙÄÙ¿¿ÏÚÁØÁÖÁØÁÔÁØÁÖÁÖÁÚÁØÁÚ¿ÞÁÞ¿â¿æ¿èÂÆÎÅÍÔ¿ÍÎËË;PM2FP1PE=<qÞWFÀ;PM0PEË¿ÌËÊËÌËÊÉÌÌÉÊËÌÉÌËÌË¿Ì¿ÅÆÅÅÌË;PM2FP1PE=<Uà?GÀ;PM0PEÌËÐÆÐÄÌÈÌÄÊÈÈÆÆÈÈÈËÌÇÇÅÇÇÅÅÅÉÃËÃÍÅÑÃÌËÑÆ;PM1PEÃÍÐÂËÌ;PM2FP1PE=<YàwFÀ;PM0PEÇÇÎÉÄÂÅÈÒÅÉÐËÃÆË¿ÇÎ;PM2FP1PE=<OßEFÀ;PM0PEÇÌÁÅÅÅÇÉÉËËÇÉÇÉÇÇÃÈÍÊÄÊÈÊÊÎÈÊÌÈÊÈÈÆÊÇÌÈËÂÊÉÂÁÑ;PM2FP1PE=<GãUEÀ;PM0PEÁÑàÃÞÁàÃàÅàÁÞÃàÃÞÃÂÒÝÂÝÄßÄßÄßÄÝÄßÄßÄ;PM1PE¿Ñ¿Ò;PM2FP1PE=<?à_EÀ;PM0PEÄÎÕÃÕÁÛ¿ÙÁÛ¿ÛÂÙÂ׿¿ÑØ¿Ú¿ÜÁÜ¿ÚÂÜ¿ØÂØÄÄÎÃÍÎÂÉÌËË;PM2FP1PE=<aáKDÀ;PM0PEÅÂÊÇÎËÎËÐËÐËÌËÌÉÊÇÌÌÉÈËÊÏÌÍÎÏÊÍÌËÌÉÈÇÂÈÁÃÂÿÂÏ;PM2FP1PE=<OãEDÀ;PM0PE¿ÑÔÁҿпÎÂÌÄÊÂÊÄÊÂÁÐËÁÉÁËÃÇÁÍÁÍÁÍÂÕÂÂÑÃÒ;PM2FP1PE=<CâsCÀ;PM0PE¿ÌÃÁÅÅÃÁÉÁÉÃËÃÍÅÏÃÄÑÐÆÐÄÌÆÈÂÊÄÊÄÆÄÆÆ¿Ì¿ËÆÆÅÆËË;PM2FP1PE=<kãYBÀ;PM0PEÇÄÎËÌËÐËÎËÐËÎËÌËÎÉÌÌÍÊËÌÏÌÏÎÍÊÍÌËÌÍÌÇÂÈÁÃÂÿÄÑ;PM2FP1PE=<gåMBÀ;PM0PEÁÑÐÁÎÁÐÁοÐÄÎÂÒÄÒÂÃÒÏÃÑÃÏÁÍÁË¿Ë¿ÏÂËÄÁÑÁÒ;PM2FP1PE=<KäABÀ;PM0PEÂÐËÃËÃËÃÉÃËÁÉÃÍÁËÃÂÑÎÄÎÂÊÄÌÄÌÄÊÄÌÂÌÄÂÐÁÏÒÆÏÊÇÍ;PM2FP1PE=<?åQAÀ;PM0PEÅ¿ÌÇÐÏÎËÐËÈÎËÊÍÌÏÐÍÌÿ¿Ï;PM2FP1PE=<içi@À;PM0PEÃÑØÅÖÅÔÃÖÁÖÁÖÁÔ¿Ö¿¿ÐÕÂÓ¿Õ¿ÓÂÓÂÓÄÕÆÓÈÃÑ¿Ò;PM2FP1PE=<eås@À;PM0PEÆÌÏ¿ËÁÉ¿Í¿ÍÁѿ׿Ý¿Ñ޿ؿҿοοÎÂÌ¿ÎÂÄÎÃÍÎÂÉÌËÉ;PM2FP1PE=<aæm?À;PM0PEÃÄÈÉÈËÈÇÈÇÈÉÈÇÈÇÈÉÌÊÇÈÇÌÇÈÇÊÇÈÇÈÇÈÇÌÅÄÁÑ;PM2FP1PE=<[èyþ;PM0PEÂÏÎÃÐÅÎÅÐÃÎÃÐÃÎÃÐÃÂÒËÂÏÄÍÄÏÄÏÆÍÄÏÆÍÆÂÏÇÎ;PM1PEÏÇÒÇÁÐ;PM2FP1PE=<eç_þ;PM0PEÉÆ¿ÍËÇÏÃÏÅÈÍÎÄÒÆÒÎÄØÉÈÊÇÁÊÇÁÂÏ;PM2FP1PE=<yè{ý;PM0PEÃÏÊÃÊÃÌÅÊÁÌÃÌ¿ÌÁÊÂÁÐÇÁÉÂÉÂÉÂÉÄÉÄÉÂÉÆÃÏ¿Ð;PM2FP1PE=<yçGþ;PM0PEÈÌË¿É¿É¿Ç¿Ç¿Ç¿Ç¿Ç¿¿ÏÈ¿È¿È¿È¿È¿Ê¿Ê¿Ì¿ÈÌÇËпÇÌÏÇ;PM2FP1PE=<]çaü;PM0PE¿ÓËÍÏÇËÃÏÂËÂÍÆËÆÇÐÈÅÊÅÈÁÊÁÊÂÈÆÌÊÈÒÌ¿ÉÐ;PM2FP1PE=<Qäiû;PM0PE¿ÙÅÝÅÝÇÛÅÙÅÙÇÕÇÑÇÊÏÐÊÒÆÚÆÚÈÞÆÞÆÜÆÚÈÂÂÇÎ;PM2FP1PE=<{áWú;PM0PEÑÉÓËÑÇÓËÑÉÑËÑÇÓÉÈÍÒÈÔÊÔÌÒÊÒÊÒÊÒÌÔÈÇÐ;PM2FP1PE=<ißMú;PM0PEÆÂÍÄÏÄÑÄÑ¿Ó¿ÓÃÕÉ×ÉÈÏÖÌÔÆÒÄÒÂÐÁÎÁÐÃÎÅÆÂÅÎ;PM2FP1PE=<OÞcø;PM0PEËÁÇÏÇÏÇÍÇÏÉÍÇÉËÉÏÇÆÍÒÈÐÌÌÎÈÎÈÐÈÎÈÐÈÎË¿ÊÌ;PM1PEÇÆÃÇÌÂ;PM2FP1PE=<SÝ[ù;PM0PE¿ÅÂÇÆÇÆÇÈÇÊÇÈÇÈÇÈÉËÆÇÈÇÈÇÈÉÈÇÊÇÊÅÌÿÐ;PM2FP1PE=<iÚkù;PM0PEÂÈÇØÑÎÕ¿ÛÃ×ÇÙÇ×ÇÕÁ¿ÏØÂÚÈÚÈÚÈÖÄÒÁÈÅÆÏÂÆÌË;PM1PEÂÄ¿ÄÁÇ;PM2FP1PE=<GÜGû;PM0PE¿ÔÖÐÐÌÊÊÈÆÊÈÆÊÈÊÌËÌÉËÉÇÇÅÅÉÉÇËÉÏÏÓÕÂÂÈÍ;PM2FP1PE=<cÜQü;PM0PEÊÄÂÌÂÊ¿ÊÂÊ¿ÊÂÈÄÄÆÆÇÎÉÇÅÉÃËÁÉ¿Ë¿ÉÁÇÁÅÊÄÃÏ;PM1PEÆÁÄÆÉÃ;PM2FP1PE=<wÞMü;PM0PEÁÁÐÂÒÄÔ¿Ò¿Ö¿ÒÁÔÁÒÃÄÐÓÄÓÂÓÂÕÂÑ¿ÕÁÑÁÏÁÃÁÈÍ;PM2FP1PE=<GáUý;PM0PEÄÂÒÈÒÊÐÈÒÈÒÊÒÈÐÈÒÊÇÎÑÉÏÇÑÇÏÇÑÉÑÇÑÉÑÇÄ¿Ñ;PM2FP1PE=<?ãMý;PM0PEÃÁοпÎÁпÒÁοÐÁп¿ÒÏ¿Ï¿Í¿ÏÂÍÂÑ¿Ï¿ÍÂÅÁÊÍ;PM2FP1PE=<]äGþ;PM0PE¿ÍÎÊÌÈÌÊÊÊÊÈÊÈÌÈÎÊÉÎËÉËÉËÇÉÇÉÉËÇËÇÍÉ¿Ë¿ÌÇÅÈÅÊÌ;PM2FP1PE=<Qá[AÀ;PM0PEÎÂÛÚÙØÛÜÙÚÙÜÛÚÙÚÝÚÉËÜÙÚÙÜÙÚÛÚÙÜÛÚ×ÜÙÌÂËÁÈÅÄÈÍÈ;PM2FP1PE=<_àeþ;PM0PEÏÂÃ×Ã×Á×Ã×Á×ÃÓÅ×ÇÓÎÇÊØÆÖÆØÂØÄØÂØÂØÄÔÏÂÐÂ;PM2FP1PE=<[à}AÀ;PM0PEÂÅÄÚÂÜ¿ÚÁÜ¿ÚÃÞÁÜÃÞÏÁÄÝÂÛÂÛÂÙ¿Û¿ÙÁÙÃÙÄÇÃÈ¿ÃÄÃÌÌ;PM2FP1PE=<YÝ{DÀ;PM0PEÆÁÕÖÙØÙØÙÚÙÚÙØ×Ø×ÖËËØÕØ×Ú×ÚÙÚÙÚ×Ú×ÖÕÆÿÒ;PM2FP1PE=<WÜyCÀ;PM0PEÍÆÇËÅËÅËÅÍÅÉÅÅÅÅÇ¿¿ÑÐÄÊÈÈÊÆÌÆÌÆÌÆÌÆÈÍÆп;PM2FP1PE=<oÜcEÀ;PM0PEÄÇÂÌÄÎÄÐÂÌÄÐÂÎÂοÐÏ¿ÁÍÁÍ¿ÍÃÍÁÍÃÍÃËÃÍÂÇÁÈ¿ÃÂÃÌÌ;PM2FP1PE=<OÛGGÀ;PM0PEÁÆËÌËÌËÌËÊÉÊËÌËÌËÎËËÌÍÌËÌËÊÉÌÉÌËÌËÌËÃÆÒ¿;PM2FP1PE=<MÛMIÀ;PM0PEÄȿοÒÁпÎÁÐÁοҿÐÑ¿¿ÏÂÑÂÏ¿ÏÂÍ¿ÍÂÑ¿ÍÄÆÈÍ;PM1PEÄ¿ÆÃÇ;PM2FP1PE=<}ÝWJÀ;PM0PEÄ¿ÚÈØÈÒÆÔÈÒÈÔÊÔÌÚÎÇÎ×ÍÕËÓÉÑÇÏÅÓÅÕÇÛÅ¿¿Ñ;PM2FP1PE=<GãQJÀ;PM0PEÇÇÒ¿ÔÁÖ¿Ô¿Ö¿Ö¿Ö¿Ø¿Ö¿Ö¿ÖÂÖ¿Ö¿Ô¿ÔÂÒ¿¿ÒÑÁÓ¿Ó¿ÕÁÕ¿ÕÁտտ׿տտտӿտÓÂÑ¿ÉÇÊÈÉ¿¿ÇÒ¿;PM2FP1PE=<yãsKÀ;PM0PE¿ÅÆÈÆÈÈÈÊÌÈÌÆÎÄÔÂÖÑ¿¿ÓÃÏÃËÇËÇÇÇÇÅÉÉÉ¿ÅÐÄ;PM2FP1PE=<_âcRÀ;PM0PEÂÁÅÚÅÜÅÚÃÜÅÚÅÜÅÚÅÜÃÚÅÜÅÜÅÜÅÜÅÚÅÚÅÜÏÃÆÙÄÛÆÙÆÛÆÙÆÛÆÛÆÙÆÛÆÛÆÛÆÙÄÙÆÛÄÙÆÛÂÁÎÈ;PM2FP1PE=<kámSÀ;PM0PEÂÁÃÊÅÊÇÈÅÊÇÊÇÊÅÊÇÈÍÇÈÉÈÉÈÉÆÉÈÇÆÉÆÇÂÅÂÃÌÊ;PM2FP1PE=<ußQUÀ;PM0PEÁÄÉÎÏÌÏÌÏÌÏÊÏÌËÌÍÌËÉÎÍÎËÐÍÒÉÎËÐËÎÉÊËÁÄÐÂ;PM2FP1PE=<ißYVÀ;PM0PEÅÌÅÈ¿ÆÁÈÂÆ¿ÈÂÌÁÌÏÁÂÉÁÇÁÉ¿Ç¿ÉÂËÈÉÈÍÌÌ;PM2FP1PE=<aÝKXÀ;PM0PEÏÎÑÎÏÎÏÐÑÎÑÎÏÎÑÎËËÒÍÒÍÒÍÐÍÐÏÒÍÒÍÐÍÂÁÈÎ;PM2FP1PE=<IÝYYÀ;PM0PEÂÁÁÆ¿ÈÂÈÄÊ¿ÌÃÌÇÌÑÌÇÍÎÉÆÅÂÅÁÇÁÉÁÉÁËÆÍÂÁÊÎ;PM2FP1PE=<qÜmZÀ;PM0PEÊÆÄÄÄÈÂÆÂÊÃÊÇÌÍÌÓÐÉÍÔÍÌËÆÇÂÃÁÁÁÅÁÃÃÇÊÆÅÑ;PM1PEÈ¿ÄÆËÅ;PM2FP1%0A E%-12345X@PJL DEFAULT MPTRAY=FIRST
+%-12345X \ No newline at end of file
diff --git a/tools/grid.pcl b/tools/grid.pcl
new file mode 100644
index 000000000..5bffc1533
--- /dev/null
+++ b/tools/grid.pcl
@@ -0,0 +1 @@
+E%0BIN;SP1;PW0;FT4,63.5,0;PA0,0;RR50000,50000;PW0.25;FT4,508,0;PA0,0;RR50000,50000;PW0.5;FT4,1016,0;PA0,0;RR50000,50000;%1AE \ No newline at end of file
diff --git a/tools/gslite/README b/tools/gslite/README
new file mode 100644
index 000000000..d5c79ae27
--- /dev/null
+++ b/tools/gslite/README
@@ -0,0 +1,124 @@
+The gslite library temporarily requires patches to gs/src. See "Patches
+for Ghostscript" attached below.
+
+How to build and test gslite library with Microsoft Visual Studio 8
+with Microsoft Platform SDK for Windows Server 2003 R2.
+
+ # install the free visual C++ 2005 and SDK.
+ # modify vsvars32.bat so visual c can find the SDK (vsvars32.bat
+ # patch below) and open the Visual Studio 2005 command prompt.
+ # go to the gslite directory
+ cd tools\gslite
+ # build the library see DEBUG options in the makefile
+ nmake /f gslt_lib_msvc.mak DEVSTUDIO=
+ # build and run the the test files.
+ nmake /f gslt_lib_msvc.mak check
+
+how to build and test gslite library with Linux 2.6.12 and gcc version
+3.4.4 20050721 (Red Hat 3.4.4-2)
+
+ # go to the glite directory and build the library.
+ make -f gslt_lib_gcc.mak
+ # test the library.
+ make check
+
+Note the linux makefile supports a threads test
+(gslt_image_threads_test), it is the same as gslt_image_test except it
+tests rendering 2 images in 2 concurrent threads of execution. To get
+this to run on windows would require installing POSIX threads.
+
+
+vsvars32.bat patch
+------------------
+--- vsvars32.bat 2006-12-27 23:48:11.578125000 -0700
++++ vsvars32.bat.bak 2006-12-27 21:14:42.312500000 -0700
+@@ -14,8 +14,8 @@
+ @set DevEnvDir=C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
+
+ @set PATH=C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PATH%
+-@set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%INCLUDE%;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include
+-@set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%LIB%;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib
++@set INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%INCLUDE%
++@set LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%LIB%
+ @set LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
+
+ @goto end
+
+
+Patches for ghostscript
+-----------------------
+
+Note We will integrate these or compatible fixes into the gs tree as
+time permits.
+
+
+This is required to avoid a circular dependency in the build.
+
+Index: sjpegc.c
+===================================================================
+--- sjpegc.c (revision 7517)
++++ sjpegc.c (working copy)
+@@ -34,7 +34,6 @@
+ unix-aux.mak, and written to gconfig_.h
+ */
+
+-#include "gconfig_.h"
+ #ifdef DONT_HAVE_JMEMSYS_H
+
+This patch is needed to support True Type Collection files.
+
+Index: gs/src/ttfmain.c
+===================================================================
+--- gs/src/ttfmain.c (revision 7637)
++++ gs/src/ttfmain.c (working copy)
+@@ -211,7 +211,8 @@
+FontError ttfFont__Open(ttfInterpreter *tti, ttfFont *this, ttfReader *r,
+ unsigned int nTTC, float w, float h,
+ bool design_grid)
+-{ char sVersion[4], sVersion0[4] = {0, 1, 0, 0};
++{ char sVersion[4], sVersion1[4] = {0, 1, 0, 0};
++ char sVersion2[4] = {0, 2, 0, 0};
+ unsigned int nNumTables, i;
+ TT_Error code;
+ int k;
+@@ -227,7 +228,7 @@
+ unsigned int nPos = 0xbaadf00d; /* Quiet compiler. */
+
+ r->Read(r, sVersion, 4);
+- if(memcmp(sVersion, sVersion0, 4))
++ if(memcmp(sVersion, sVersion1, 4) && memcmp(sVersion, sVersion2, 4))
+ return fUnimplemented;
+ nFonts = ttfReader__UInt(r);
+ if (nFonts == 0)
+@@ -239,7 +240,7 @@
+ r->Seek(r, nPos);
+ r->Read(r, sVersion, 4);
+ }
+- if(memcmp(sVersion, sVersion0, 4) && memcmp(sVersion, "true", 4))
++ if(memcmp(sVersion, sVersion1, 4) && memcmp(sVersion, "true", 4))
+ return fUnimplemented;
+ nNumTables = ttfReader__UShort(r);
+ ttfReader__UShort(r); /* nSearchRange */
+
+
+The following module does not compile without the patch. We hope to
+deprecate "check_interrupts" soon.
+
+
+
+Index: gp_mslib.c
+===================================================================
+--- gp_mslib.c (revision 7655)
++++ gp_mslib.c (working copy)
+@@ -26,10 +26,8 @@
+ */
+ #ifdef CHECK_INTERRUPTS
+
+-#include "gx.h"
+-
+ int
+-gp_check_interrupts(const gs_memory_t *mem)
++gp_check_interrupts(void *mem)
+ {
+ return 0;
+ }
diff --git a/tools/gslite/gslite-api.rtf b/tools/gslite/gslite-api.rtf
new file mode 100644
index 000000000..61ce0242d
--- /dev/null
+++ b/tools/gslite/gslite-api.rtf
@@ -0,0 +1,349 @@
+{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410
+{\fonttbl\f0\fnil\fcharset77 Constantia;\f1\fnil\fcharset77 Constantia-Bold;}
+{\colortbl;\red255\green255\blue255;}
+\paperw11900\paperh16840\margl1440\margr1440\vieww11340\viewh12480\viewkind0
+\deftab720
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\fs24 \cf0 \
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+\
+The GSLite API\
+version 0.4\
+Artifex Software, Inc.\
+26 Oct 2006\
+\
+\page \pard\tx225\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 The GSLite API\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+GSLite is a simple, lightweight API for accessing some features of the Ghostscript graphics library, most importantly the font rendering and image decoding features. It is implemented as a thin wrapper over the significantly more complex and general Ghostscript graphics library interface, which is designed to support all imaging operations used in modern Page Description Languages.\
+\
+In this beta release, GSLite is provided as an additional layer on top of the full Ghostscript distribution. Production versions will contain a fairly small subset of the Ghostscript codebase, as needed to support the GSLite API. Clients should call GSLite functions exclusively, rather than directly into the Ghostscript graphics library, to allow maximum streamlining of the production GSLite implementation.\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 Initialization and library object lifecycle\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+Before using any other GSLite functions, the client must initialize the library, using the gslt_init_library() call. This function initializes a single static context; GSLite does not presently support multiple reentrant contexts. The client may also call gslt_free_library() at process termination to free up resources.\
+\
+In addition to the library context, font rendering operations require a graphics state (gs_state), which in turn requires a Ghostscript \'d2device\'d3 data structure (gx_device). In ordinary Ghostscript usage, this device represents a page buffer for imaging operations, but such a page buffer is not required for font rendering and image decoding, so GSLite clients will use the \'d2nullpage\'d3 device.\
+\
+The detailed calling instructions follow.\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 \
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 To use GSLite, the first thing you need to do is to initialize the library:\
+\
+ gs_memory_t * gslt_init_library();\
+\
+This returns an allocator handle for internal use by the gslite routines and the underlying implementation in the graphics library. You need to pass this allocator to many functions. You do not have to use it yourself; it is perfectly safe to use malloc() and free() for your own code.\
+\
+The font rendering implementation in Ghostscript requires a device structure and a graphics state structure. The graphics state is used for font rendering internal operations. The graphics state is tied to a device structure, and contains a pointer to it.\
+\
+Create these two structures at program startup. Pass in "nullpage" as the device name.\
+\
+ gx_device * gslt_init_device(gs_memory_t *mem, char *name);\
+\
+ gs_state *gslt_init_state(gs_memory_t *mem, gx_device *dev);\
+\
+There are functions to clean up the Ghostscript library and the three global objects. Call these in the correct order before the program exits.\
+\
+ void gslt_free_state(gs_memory_t *mem, gs_state *pgs);\
+ void gslt_free_device(gs_memory_t *mem, gx_device *dev);\
+ void gslt_free_library(gs_memory_t *mem);\
+\
+Here is an example of how to use the gslite library:\
+\
+int main(int argc, char **argv)\
+\{\
+ gs_memory *mem = gslt_init_library();\
+ if (!mem)\
+ die("cannot create gslite allocator");\
+\
+ gx_device *dev = gslt_init_device(mem, "nullpage");\
+ if (!dev)\
+ die("cannot create gslite device");\
+\
+ gs_state *pgs = gslt_init_state(mem, dev);\
+ if (!pgs)\
+ die("cannot create gslite state");\
+\
+ /* do some work */\
+\
+ gslt_free_state(mem, pgs);\
+ gslt_free_device(mem, dev);\
+ gslt_free_library(mem, dev, pgs);\
+\}\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 The Image Codec API\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+There is no need to create the device and graphics state objects for the image codecs; they only require the allocator.\
+\
+There are three defined colorspaces for the image codec API: gray, RGB and CMYK. They come in two variants each: with and without an alpha channel. The variants are enumerated with the type gslt_image_colorspace:\
+\
+ typedef enum \{\
+ GSLT_GRAY,\
+ GSLT_GRAY_A,\
+ GSLT_RGB,\
+ GSLT_RGB_A,\
+ GSLT_CMYK, \
+ GSLT_CMYK_A\
+ \} gslt_image_colorspace;\
+\
+The function to decode an image takes three parameters: the allocator, a buffer with the encoded image data as loaded from disk, and the length of this buffer.\
+\
+ gslt_image_t *gslt_image_decode(gs_memory_t *mem,\
+ unsigned char *buf, int len);\
+\
+It returns an image object or NULL if it fails to decode the image.\
+\
+The image object is a struct:\
+\
+ struct gslt_image_s\
+ \{\
+ int width;\
+ int height;\
+ int stride; /* byte offset between image data rows */\
+ int components;\
+ int bits;\
+ int xres; /* horizontal resolution in pixels per meter */\
+ int yres; /* vertical resolution */\
+ char *samples; /* image data buffer */\
+ gslt_image_colorspace colorspace;\
+ \};\
+\
+The samples field points to the decoded image data. The data is in a format described by the other fields of the struct. Stride is the number of bytes separating each row of image data, and bits is the number of bits per component. The number of bits can be 1, 2, 4, 8 or 16. For 16 bits per component, treat the data as an array of shorts in native byte order. The number of components includes the alpha channel, so it is 3 for GSLT_RGB and 4 for GSLT_RGB_A.\
+\
+Release the image object and decoded data with:\
+\
+ void gslt_image_free(gs_memory_t *mem, gslt_image_t *image);\
+\
+The image decoder takes the entire image file and returns the decoded image data in single memory buffers. This design choice simplifies the API considerably, avoiding the need for complex stream operations.\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 The Font API\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+The GSLite API for font rendering is designed to support OpenType fonts. The underlying Ghostscript font rendering mechanism supports many other font types as needed for PostScript and PDF, including Type1, CID, and composite fonts, but these would involve considerable extra complexity and so are not supported by GSLite. OpenType is a font format that is based on TrueType; in practice it is a superset of TrueType. Most PostScript and PDF fonts can be transformed into OpenType without loss of fidelity.\
+\
+The primary functions supported by the API are:\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\li360\fi-360\ri0\ql\qnatural
+\cf0 \'a5 Access to the font's encoding, mapping a character (usually expressed as a Unicode codepoint) to a glyph index.\
+\'a5 Determining the metrics for a glyph, specified by index.\
+\'a5 Rendering a glyph into a bitmap, given glyph index and transform.\
+\'a5 Obtaining an outline for the glyph.\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+\cf0 \
+The functions in the font API that return an integer will return zero on success and a negative number on failure, unless otherwise specified.\
+\
+The GSLite font API has a caching mechanism for glyph bitmaps, significantly speeding up cases where the same glyph is requested repeatedly. The results of all glyph rendering operations are stored as bitmaps in the cache. The renderer may determine that the bitmap is too large to fit in the cache, in which case it returns an error code (-2), signalling the client that it should obtain an outline, and use its own vector path filling capabilities to render the glyph.\
+\
+At present, the functions for creating this cache choose reasonable defaults for cache size and rendering options, but more configuration options may be provided in the future. To create the cache, use these calls:\
+\
+ gs_font_dir * gslt_new_font_cache(gs_memory_t *mem);\
+\
+ void gslt_free_font_cache(gs_memory_t *mem, gs_font_dir *cache);\
+\
+Create the gslite font object from a memory buffer containing the file data. The font object keeps a pointer to this data, so do not free it until after you free the font object. You will also need to pass in the writing mode to be used with this font. Use zero for horizontal writing and 1 for vertical writing.\
+\
+ gslt_font_t * gslt_new_font(gs_memory_t *mem, gs_font_dir *cache,\
+ char *rbuf, int rlen, int wmode);\
+\
+ void gslt_free_font(gs_memory_t *mem, gslt_font_t *font);\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 Encodings\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+A TrueType font is a collection of tables. Some of these tables specify the metrics, others specify the outlines. One of the tables that are important for our purposes, is the table that specifies encodings. This table is called the "cmap" table. This table can hold many encodings.\
+\
+An encoding in this table is specified by two numbers. If the font has a Unicode encoding, it will have the identifier (3,1). The TrueType and OpenType specifications contain more details on allowed encodings.\
+\
+Some common encodings are:\
+\
+ 3,0 Microsoft Symbol\
+ 3,1 Microsoft Unicode (used for WGL4)\
+ 3,2 Microsoft SJIS\
+ 3,3 Microsoft GB2312\
+ 3,4 Microsoft Big5\
+ 3,5 Microsoft Wansung\
+ 3,6 Microsoft Johab\
+ 3,10 Microsoft UCS4\
+\
+ 1,0 Apple Roman\
+ 1,1 Apple Japanese\
+ 1,2 Apple Traditional Chinese\
+ 1,3 Apple Korean\
+\
+There is a function to count the number of encodings in the cmap table.\
+\
+ int gslt_count_font_encodings(gslt_font_t *font);\
+\
+Use the count to iterate over the encodings. The encoding identification function takes the index and returns the two numbers that identify the encoding. See the truetype specification for the meaning of these two numbers.\
+\
+ int gslt_identify_font_encoding(gslt_font_t *font, int idx,\
+ int *pid, int *eid);\
+\
+Finally, we can select one of these encodings for use later.\
+\
+ int gslt_select_font_encoding(gslt_font_t *font, int idx);\
+\
+In truetype fonts the glyphs are numbered from zero. Glyph zero has a special meaning as the glyph that represents undefined characters. Any character that cannot be encoded will be mapped to glyph zero.\
+\
+ int gslt_encode_font_char(gslt_font_t *font, int codepoint);\
+\
+The codepoint argument is an integer that represents a character code in the currently selected encoding. If you have selected encoding (3,0) then the codepoint is a unicode character. If you have selected encoding (1,0) then the codepoint is a mac roman encoded character.\
+\
+The function returns the glyph index of the encoded character. If the font does not provide the encoding you are using, you will have to use your own tables to map characters to a codepoint in an encoding the font does support before passing them to gslt_encode_font_char. [TODO microsoft is not clear on what to do when fonts don't have a 3,1 cmap; but they do state (SHOULD) that it is a possibility]\
+\
+You can also use the glyph indices directly, if you have some other means to know which glyph indices to use, such as the Indices attribute of the <Glyphs> element in XPS. When glyph indices are known, gslt_encode_font_char is not needed.\
+\
+For XPS fonts with an encoding table (3, 0) are treated specially. If the code point encodes to the undefined glyph, another attempt is made by first adding 0xf000 to the code point before looking it up again. This is handled by gslt whenever a cmap (3, 0) is selected. \
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 Encoding XPS strings\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+XPS Glyph tags represent text on the page. The tag has two attributes that affect how we select the font glyphs to use when drawing the glyph element.\
+\
+The first one is UnicodeString. It contains the text that the tag represents in Unicode format. For trivial uses, this is enough information to select the glyphs. For each code point we can look it up in the font encoding and get the corresponding glyph.\
+\
+However, not all typeset text will be as straightforward. For instance, the "fi" ligature will map two unicode characters (f followed by i) to one glyph (fi). This transform can not be represented by the cmap table. These transforms are done by using smart font layout table features in OpenType. This is not done by the XPS renderer. The creator of the XPS file has to do this.\
+\
+In order to represent ligatures and more advanced typographical features, we need the second attribute in the <Glyph> element: Indices. Indices is used in parallel with UnicodeString to select glyphs that represent the Unicode characters.\
+\
+The Indices string contains cluster maps that map one-to-many and many-to-one; and also indices to glyphs that are not encoded by the cmap. The indices are the glyph indices for the font. You can use the indices directly; there is no need to encode them or pass them through gslt_encode_font_char.\
+\
+A ligature would be represented by a cluster map that says that the two characters 'f' and 'i' in the UnicodeString should map to the one (hypothetical) glyph index 1234. In this case you should ignore the 'f' and 'i' in the UnicodeString and use the glyph index specified by the cluster map instead.\
+\
+See the XPS specification for more details.\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 Glyph metrics\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+Once you have the list of glyphs, you will need to figure out their position on the page. Each glyph has the following metrics:\
+\
+ struct gslt_glyph_metrics_s\
+ \{\
+ float hadv, vadv, vorg;\
+ \};\
+\
+ int gslt_measure_font_glyph(gs_state *pgs, gslt_font_t *font,\
+ int gid, gslt_glyph_metrics_t *mtx);\
+\
+The metrics are untransformed, and will typically lie in the range 0..1.\
+\
+A glyph is drawn from its origin, which is at the bottom left of the glyph. This is used for horizontal writing; for vertical writing the origin should be at the middle top of the glyph.\
+\
+The origin offset is a vector that needs to be added to the pen position when drawing the glyph. The vorg field specifies the origin offset in the y direction, and the x origin offset is obtained by dividing hadv by two. This will adjust the horizontal writing origin to the vertical writing origin. This is only to be used for vertical (IsSideways) written text.\
+\
+The hadv and vadv field specifies the advance width, or escapement, for horizontal and vertical writing. This is the distance the pen should be moved to position the following glyph. Use the appropriate field depending on the IsSideways attribute.\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 Rendering bitmaps\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+With the list of glyph indices and their positions on the page in hand, it will be time to draw them.\
+\
+ struct gslt_glyph_bitmap_s\
+ \{\
+ int w, h, stride;\
+ int lsb, top;\
+ unsigned char *data;\
+ \};\
+\
+ int gslt_render_font_glyph(gs_state *pgs, gslt_font_t *font,\
+ gs_matrix *tm, int gid,\
+ gslt_glyph_bitmap_t *slot);\
+\
+ void gslt_retain_font_glyph(gs_memory_t *mem, gslt_glyph_bitmap_t *slot);\
+ void gslt_release_font_glyph(gs_memory_t *mem, gslt_glyph_bitmap_t *slot);\
+\
+\
+This function will attempt to find a rendered bitmap with the same font, matrix and glyph index in the cache (the same cache as was used to create the font object). If it fails, it will try to render the bitmap and store it in the cache, then return that bitmap.\
+\
+The bitmap data returned is a pointer to the cache. Therefore, you must not overwrite the data, or it may give provide incorrect results to future calls. Similarly, subsequent rendering calls may evict the data from the cache, so validity is only guaranteed until the next rendering call or library free call. If a more persistent lifetime is desired, copy the data.\
+\
+The lsb and top fields specify the position of the bitmap relative to the pen position for the horizontal origin.\
+\
+The cache has a limited amount of space to work with. If you try to render a bitmap that is too large, the rendering function will return -2. In that case, you will have to fall back to your own path rendering functions, using the outline data.\
+\
+The bitmap data points to an internal slot in the cache. These slots have a reference count, which is the number of client pointers that use it. When the reference count is zero, the slot can be reused. Each time gslt_render_font_glyph returns a bitmap, the corresponding slot has its reference count incremented. Therefore it is very important that you call gslt_release_font_glyph as soon as you do not need the bitmap anymore. If your code needs to pass around or hold multiple pointers to a glyph bitmap, then you may use the gslt_retain_font_glyph function to increment the reference count.\
+\
+If you do not released the bitmaps immediately after using them, the next call to gslt_render_font_glyph may also fail because the glyph cache has filled up. This can happen because it cannot evict old bitmaps that you still hold references to.\
+\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f1\b \cf0 Walking the outline\
+\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardeftab720\ql\qnatural
+
+\f0\b0 \cf0 \
+Extract the outline data with a struct full of function pointers. The function will pass unhinted, untransformed coordinates scaled by 1000.\
+\
+ struct gslt_outline_walker_s\
+ \{\
+ void *user;\
+ int (*moveto)(void *user, float x, float y);\
+ int (*lineto)(void *user, float x, float y);\
+ int (*curveto)(void *user, float x0, float y0,\
+ float x1, float y1,\
+ float x2, float y2);\
+ int (*closepath)(void *user);\
+ \};\
+\
+ int gslt_outline_font_glyph(gs_state *pgs, gslt_font_t *font, int gid,\
+ gslt_outline_walker_t *walker);\
+\
+As usual, this function returns -1 if it fails. Return -1 from the callbacks to abort the outline extraction.\
+} \ No newline at end of file
diff --git a/tools/gslite/gslt.def b/tools/gslite/gslt.def
new file mode 100644
index 000000000..6f304d552
--- /dev/null
+++ b/tools/gslite/gslt.def
@@ -0,0 +1,31 @@
+LIBRARY
+; gs lite library
+
+EXPORTS
+
+gslt_alloc_init
+gslt_alloc_print_leaks
+gslt_count_font_encodings
+gslt_encode_font_char
+gslt_free_device
+gslt_free_font
+gslt_free_font_cache
+gslt_free_library
+gslt_free_state
+gslt_get_device_param
+gslt_identify_font_encoding
+gslt_image_decode
+gslt_image_free
+gslt_init_device
+gslt_init_library
+gslt_init_state
+gslt_measure_font_glyph
+gslt_new_font
+gslt_new_font_cache
+gslt_outline_font_glyph
+gslt_release_font_glyph
+gslt_render_font_glyph
+gslt_retain_font_glyph
+gslt_select_font_encoding
+gslt_set_device_param
+gslt_set_device_param
diff --git a/tools/gslite/gslt.h b/tools/gslite/gslt.h
new file mode 100644
index 000000000..347862ac8
--- /dev/null
+++ b/tools/gslite/gslt.h
@@ -0,0 +1,64 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt.h 2713 2007-01-02 22:22:14Z henrys $ */
+/* gslt "Ghostscript Lite" convenience header */
+
+/*
+ * The following typedefs will allow this file to be used
+ * without including the regular gs headers.
+ *
+ * Always include this file *after* the regular gs headers.
+ */
+
+#ifndef gsmemory_INCLUDED
+typedef struct gs_memory_s gs_memory_t;
+#endif
+
+#ifndef gxdevcli_INCLUDED
+typedef struct gx_device_s gx_device;
+#endif
+
+#ifndef gsstate_INCLUDED
+typedef struct gs_state_s gs_state;
+#endif
+
+#ifndef gs_matrix_DEFINED
+typedef struct gs_matrix_s gs_matrix;
+struct gs_matrix_s { float xx, xy, yx, yy, tx, ty; };
+#endif
+
+#ifndef gs_font_dir_DEFINED
+typedef struct gs_font_dir_s gs_font_dir;
+#endif
+
+/*
+ * A simple memory allocator, based on the the allocator for ghostpcl.
+ */
+
+gs_memory_t *gslt_alloc_init(void);
+
+/*
+ * Initialization helpers to set up the memory, device and gstate structs.
+ */
+
+gs_memory_t * gslt_init_library();
+gx_device * gslt_init_device(gs_memory_t *mem, char *name);
+gs_state *gslt_init_state(gs_memory_t *mem, gx_device *dev);
+void gslt_free_state(gs_memory_t *mem, gs_state *pgs);
+void gslt_free_device(gs_memory_t *mem, gx_device *dev);
+void gslt_free_library(gs_memory_t *mem);
+
+void gslt_get_device_param(gs_memory_t *mem, gx_device *dev, char *key);
+void gslt_set_device_param(gs_memory_t *mem, gx_device *dev, char *key, char *val);
+
diff --git a/tools/gslite/gslt.mak b/tools/gslite/gslt.mak
new file mode 100644
index 000000000..fc34da7d9
--- /dev/null
+++ b/tools/gslite/gslt.mak
@@ -0,0 +1,56 @@
+GSLT_CC=$(CC_) $(I_)$(GSLTSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I)\
+ $(I_)$(GLGENDIR)$(_I) $(I_)$(PSRCDIR)$(_I)\
+ $(I_)$(ZSRCDIR)$(_I)
+GSLTO_=$(O_)$(GSLTOBJ)
+GSLTOBJ=$(GLOBJDIR)$(D)
+GSLTSRC=$(GSLTSRCDIR)$(D)
+
+GSLT_OBJS = \
+ $(GSLTOBJ)gslt_alloc.$(OBJ) \
+ $(GSLTOBJ)gslt_init.$(OBJ) \
+ $(GSLTOBJ)gslt_image.$(OBJ) \
+ $(GSLTOBJ)gslt_image_jpeg.$(OBJ) \
+ $(GSLTOBJ)gslt_image_png.$(OBJ) \
+ $(GSLTOBJ)gslt_image_tiff.$(OBJ) \
+ $(GSLTOBJ)gslt_font_cache.$(OBJ) \
+ $(GSLTOBJ)gslt_font_encoding.$(OBJ) \
+ $(GSLTOBJ)gslt_font_glyph.$(OBJ) \
+ $(GSLTOBJ)gslt_font_ttf.$(OBJ) \
+ $(GSLTOBJ)gslt_font_cff.$(OBJ) \
+ $(GSLTOBJ)gslt_stubs.$(OBJ) \
+
+$(GSLTOBJ)gslt_alloc.$(OBJ) : $(GSLTSRC)gslt_alloc.c
+ $(GSLT_CC) $(GSLTO_)gslt_alloc.$(OBJ) $(C_) $(GSLTSRC)gslt_alloc.c
+
+$(GSLTOBJ)gslt_init.$(OBJ) : $(GSLTSRC)gslt_init.c
+ $(GSLT_CC) $(GSLTO_)gslt_init.$(OBJ) $(C_) $(GSLTSRC)gslt_init.c
+
+$(GSLTOBJ)gslt_image.$(OBJ) : $(GSLTSRC)gslt_image.c
+ $(GSLT_CC) $(GSLTO_)gslt_image.$(OBJ) $(C_) $(GSLTSRC)gslt_image.c
+
+$(GSLTOBJ)gslt_image_png.$(OBJ) : $(GSLTSRC)gslt_image_png.c
+ $(GSLT_CC) $(GSLTO_)gslt_image_png.$(OBJ) $(C_) $(GSLTSRC)gslt_image_png.c
+
+$(GSLTOBJ)gslt_image_jpeg.$(OBJ) : $(GSLTSRC)gslt_image_jpeg.c
+ $(GSLT_CC) $(GSLTO_)gslt_image_jpeg.$(OBJ) $(C_) $(GSLTSRC)gslt_image_jpeg.c
+
+$(GSLTOBJ)gslt_image_tiff.$(OBJ) : $(GSLTSRC)gslt_image_tiff.c
+ $(GSLT_CC) $(GSLTO_)gslt_image_tiff.$(OBJ) $(C_) $(GSLTSRC)gslt_image_tiff.c
+
+$(GSLTOBJ)gslt_font_cache.$(OBJ) : $(GSLTSRC)gslt_font_cache.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_cache.$(OBJ) $(C_) $(GSLTSRC)gslt_font_cache.c
+
+$(GSLTOBJ)gslt_font_encoding.$(OBJ) : $(GSLTSRC)gslt_font_encoding.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_encoding.$(OBJ) $(C_) $(GSLTSRC)gslt_font_encoding.c
+
+$(GSLTOBJ)gslt_font_glyph.$(OBJ) : $(GSLTSRC)gslt_font_glyph.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_glyph.$(OBJ) $(C_) $(GSLTSRC)gslt_font_glyph.c
+
+$(GSLTOBJ)gslt_font_ttf.$(OBJ) : $(GSLTSRC)gslt_font_ttf.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_ttf.$(OBJ) $(C_) $(GSLTSRC)gslt_font_ttf.c
+
+$(GSLTOBJ)gslt_font_cff.$(OBJ) : $(GSLTSRC)gslt_font_cff.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_cff.$(OBJ) $(C_) $(GSLTSRC)gslt_font_cff.c
+
+$(GSLTOBJ)gslt_stubs.$(OBJ) : $(GSLTSRC)gslt_stubs.c
+ $(GSLT_CC) $(GSLTO_)gslt_stubs.$(OBJ) $(C_) $(GSLTSRC)gslt_stubs.c
diff --git a/tools/gslite/gslt_alloc.c b/tools/gslite/gslt_alloc.c
new file mode 100644
index 000000000..5e21ad188
--- /dev/null
+++ b/tools/gslite/gslt_alloc.c
@@ -0,0 +1,408 @@
+/* A simple memory allocator, based on the the allocator for ghostpcl */
+
+#include "malloc_.h"
+#include "memory_.h"
+#include "gdebug.h"
+#include "gsmemret.h" /* for gs_memory_type_ptr_t */
+#include "gsmalloc.h"
+#include "gsstype.h"
+#include "gslt_alloc.h"
+
+static int num_alloc_called = 0;
+static int num_resize_called = 0;
+static int num_free_called = 0;
+
+/* a screwed up mess, we try to make it manageable here */
+extern const gs_memory_struct_type_t st_bytes;
+
+/* assume doubles are the largest primitive types and malloc alignment
+ is consistent. Covers the machines we care about */
+static inline uint
+round_up_to_align(uint size)
+{
+ uint result = (size + (ARCH_ALIGN_MEMORY_MOD - 1)) & -ARCH_ALIGN_MEMORY_MOD;
+ return result;
+}
+
+/* accessors to get size and type given the pointer returned to the
+ client, *not* the pointer returned by malloc or realloc */
+static inline uint
+get_size(byte *bptr)
+{
+ /* unpack the unsigned int we stored 2 words behind the object at
+ alloc time... back up 2 */
+ int size_offset = -round_up_to_align(1) * 2;
+ uint size;
+ /* unpack */
+ memcpy(&size, &bptr[size_offset], sizeof(uint));
+ return size;
+}
+
+static inline gs_memory_type_ptr_t
+get_type(byte *bptr)
+{
+ /* unpack the pointer we stored 1 word behind the object at
+ alloc time... back up 1 */
+ gs_memory_type_ptr_t type;
+ int type_offset = -round_up_to_align(1);
+ /* unpack */
+ memcpy(&type, &bptr[type_offset], sizeof(gs_memory_type_ptr_t));
+ return type;
+}
+
+/* accessors to set size and typen give the pointer that was returned
+ by malloc or realloc, *not* the pointer returned to the client */
+static inline void
+set_size(byte *bptr, uint size)
+{
+ memcpy(bptr, &size, sizeof(size));
+}
+
+static inline void
+set_type(byte *bptr, gs_memory_type_ptr_t type)
+{
+ memcpy(&bptr[round_up_to_align(1)], &type, sizeof(type));
+ return;
+}
+
+/* all of the allocation routines modulo realloc reduce to the this
+ function */
+static byte *
+gslt_alloc(gs_memory_t *mem, uint size, gs_memory_type_ptr_t type, client_name_t cname)
+{
+
+ uint minsize, newsize;
+ /* NB apparently there is code floating around that does 0 size
+ mallocs. sigh. */
+ if ( size == 0 )
+ return NULL;
+
+ /* use 2 starting machine words for size and type - assumes
+ malloc() returns on max boundary and first 2 words will hold
+ two longs. Doesn't check for overflow - malloc will fail for
+ us. Update size. */
+ minsize = round_up_to_align(1);
+ newsize = size + minsize + minsize;
+ {
+
+ byte *ptr = (byte *)malloc(newsize);
+ if ( !ptr )
+ return NULL;
+ num_alloc_called ++;
+#ifdef DEBUG
+ if_debug2('A', "[da]:malloc:%p:%s\n", &ptr[minsize * 2], cname );
+#endif
+ /* set the type and size */
+ set_type(ptr, type);
+ set_size(ptr, size);
+ /* initialize for debugging */
+#ifdef DEBUG
+ if ( gs_debug_c('@') )
+ memset(&ptr[minsize * 2], 0xff, get_size(&ptr[minsize * 2]));
+#endif
+ /* return the memory after the size and type words. */
+ return &ptr[minsize * 2];
+ }
+}
+
+static byte *
+gslt_alloc_bytes_immovable(gs_memory_t * mem, uint size, client_name_t cname)
+{
+ return gslt_alloc(mem, size, &st_bytes, cname);
+}
+
+static byte *
+gslt_alloc_bytes(gs_memory_t * mem, uint size, client_name_t cname)
+{
+ return gslt_alloc(mem, size, &st_bytes, cname);
+}
+
+static void *
+gslt_alloc_struct_immovable(gs_memory_t * mem, gs_memory_type_ptr_t pstype,
+ client_name_t cname)
+{
+ return gslt_alloc(mem, pstype->ssize, pstype, cname);
+}
+
+static void *
+gslt_alloc_struct(gs_memory_t * mem, gs_memory_type_ptr_t pstype,
+ client_name_t cname)
+{
+ return gslt_alloc(mem, pstype->ssize, pstype, cname);
+}
+
+static byte *
+gslt_alloc_byte_array_immovable(gs_memory_t * mem, uint num_elements,
+ uint elt_size, client_name_t cname)
+{
+ return gslt_alloc_bytes(mem, num_elements * elt_size, cname);
+}
+
+static byte *
+gslt_alloc_byte_array(gs_memory_t * mem, uint num_elements, uint elt_size,
+ client_name_t cname)
+{
+ return gslt_alloc_bytes(mem, num_elements * elt_size, cname);
+}
+
+static void *
+gslt_alloc_struct_array_immovable(gs_memory_t * mem, uint num_elements,
+ gs_memory_type_ptr_t pstype, client_name_t cname)
+{
+ return gslt_alloc(mem, num_elements * pstype->ssize, pstype, cname);
+}
+
+static void *
+gslt_alloc_struct_array(gs_memory_t * mem, uint num_elements,
+ gs_memory_type_ptr_t pstype, client_name_t cname)
+{
+ return gslt_alloc(mem, num_elements * pstype->ssize, pstype, cname);
+}
+
+
+static void *
+gslt_resize_object(gs_memory_t * mem, void *obj, uint new_num_elements, client_name_t cname)
+{
+ byte *ptr;
+ byte *bptr = (byte *)obj;
+ /* get the type from the old object */
+ gs_memory_type_ptr_t objs_type = get_type(obj);
+ /* type-and-size header size */
+ ulong header_size = round_up_to_align(1) + round_up_to_align(1);
+ /* get new object's size */
+ ulong new_size = (objs_type->ssize * new_num_elements) + header_size;
+ /* replace the size field */
+ ptr = (byte *)realloc(&bptr[-header_size], new_size);
+ if ( !ptr )
+ return NULL;
+
+ num_resize_called ++;
+
+ /* da for debug allocator - so scripts can parse the trace */
+ if_debug2('A', "[da]:realloc:%p:%s\n", ptr, cname );
+ /* we reset size and type - the type in case realloc moved us */
+ set_size(ptr, new_size - header_size);
+ set_type(ptr, objs_type);
+ return &ptr[round_up_to_align(1) * 2];
+}
+
+
+static void
+gslt_free_object(gs_memory_t * mem, void *ptr, client_name_t cname)
+{
+ if ( ptr != NULL ) {
+ byte *bptr = (byte *)ptr;
+ uint header_size = round_up_to_align(1) * 2;
+#ifdef DEBUG
+ if ( gs_debug_c('@') )
+ memset(bptr-header_size, 0xee, header_size + get_size(ptr));
+#endif
+ free(bptr-header_size);
+
+ num_free_called ++;
+
+#ifdef DEBUG
+ /* da for debug allocator - so scripts can parse the trace */
+ if_debug2('A', "[da]:free:%p:%s\n", ptr, cname );
+#endif
+ }
+}
+
+static byte *
+gslt_alloc_string_immovable(gs_memory_t * mem, uint nbytes, client_name_t cname)
+{
+ /* we just alloc bytes here */
+ return gslt_alloc_bytes(mem, nbytes, cname);
+}
+
+static byte *
+gslt_alloc_string(gs_memory_t * mem, uint nbytes, client_name_t cname)
+{
+ /* we just alloc bytes here */
+ return gslt_alloc_bytes(mem, nbytes, cname);
+}
+
+static byte *
+gslt_resize_string(gs_memory_t * mem, byte * data, uint old_num, uint new_num,
+ client_name_t cname)
+{
+ /* just resize object - ignores old_num */
+ return gslt_resize_object(mem, data, new_num, cname);
+}
+
+static void
+gslt_free_string(gs_memory_t * mem, byte * data, uint nbytes,
+ client_name_t cname)
+{
+ gslt_free_object(mem, data, cname);
+ return;
+}
+
+
+static void
+gslt_status(gs_memory_t * mem, gs_memory_status_t * pstat)
+{
+ return;
+}
+
+static void
+gslt_enable_free(gs_memory_t * mem, bool enable)
+{
+ return;
+}
+
+static void
+gslt_free_all(gs_memory_t * mem, uint free_mask, client_name_t cname)
+{
+ return;
+}
+
+static void
+gslt_consolidate_free(gs_memory_t *mem)
+{
+ return;
+}
+
+
+static uint
+gslt_object_size(gs_memory_t * mem, const void /*obj_header_t */ *obj)
+{
+ return get_size((byte *)obj);
+}
+
+static gs_memory_type_ptr_t
+gslt_object_type(gs_memory_t * mem, const void /*obj_header_t */ *obj)
+{
+ return get_type((byte *)obj);
+}
+
+static int
+gslt_register_root(gs_memory_t * mem, gs_gc_root_t * rp, gs_ptr_type_t ptype,
+ void **up, client_name_t cname)
+{
+ return 0;
+}
+
+static void
+gslt_unregister_root(gs_memory_t * mem, gs_gc_root_t * rp, client_name_t cname)
+{
+ return;
+}
+
+/* Define a vacuous recovery procedure. */
+static gs_memory_recover_status_t
+no_recover_proc(gs_memory_retrying_t *rmem, void *proc_data)
+{
+ return RECOVER_STATUS_NO_RETRY;
+}
+
+
+/* forward decl */
+static gs_memory_t * gslt_stable(gs_memory_t *mem);
+
+
+gs_memory_retrying_t gslt_mem = {
+ (gs_memory_t *)&gslt_mem, /* also this is stable_memory since no save/restore */
+ { gslt_alloc_bytes_immovable, /* alloc_bytes_immovable */
+ gslt_resize_object, /* resize_object */
+ gslt_free_object, /* free_object */
+ gslt_stable, /* stable */
+ gslt_status, /* status */
+ gslt_free_all, /* free_all */
+ gslt_consolidate_free, /* consolidate_free */
+ gslt_alloc_bytes, /* alloc_bytes */
+ gslt_alloc_struct, /* alloc_struct */
+ gslt_alloc_struct_immovable, /* alloc_struct_immovable */
+ gslt_alloc_byte_array, /* alloc_byte_array */
+ gslt_alloc_byte_array_immovable, /* alloc_byte_array_immovable */
+ gslt_alloc_struct_array, /* alloc_struct_array */
+ gslt_alloc_struct_array_immovable, /* alloc_struct_array_immovable */
+ gslt_object_size, /* object_size */
+ gslt_object_type, /* object_type */
+ gslt_alloc_string, /* alloc_string */
+ gslt_alloc_string_immovable, /* alloc_string_immovable */
+ gslt_resize_string, /* resize_string */
+ gslt_free_string, /* free_string */
+ gslt_register_root, /* register_root */
+ gslt_unregister_root, /* unregister_root */
+ gslt_enable_free /* enable_free */
+ },
+ NULL, /* gs_lib_ctx */
+ NULL, /* head */
+ NULL, /* non_gc_memory */
+ NULL, /* target */
+ no_recover_proc, /* recovery procedure */
+ NULL /* recovery data */
+};
+
+static gs_memory_t *
+gslt_stable(gs_memory_t *mem)
+{
+ return (gs_memory_t *)&gslt_mem;
+}
+
+const gs_malloc_memory_t gslt_malloc_memory = {
+ 0, /* stable */
+ { gslt_alloc_bytes_immovable, /* alloc_bytes_immovable */
+ gslt_resize_object, /* resize_object */
+ gslt_free_object, /* free_object */
+ gslt_stable, /* stable */
+ gslt_status, /* status */
+ gslt_free_all, /* free_all */
+ gslt_consolidate_free, /* consolidate_free */
+ gslt_alloc_bytes, /* alloc_bytes */
+ gslt_alloc_struct, /* alloc_struct */
+ gslt_alloc_struct_immovable, /* alloc_struct_immovable */
+ gslt_alloc_byte_array, /* alloc_byte_array */
+ gslt_alloc_byte_array_immovable, /* alloc_byte_array_immovable */
+ gslt_alloc_struct_array, /* alloc_struct_array */
+ gslt_alloc_struct_array_immovable, /* alloc_struct_array_immovable */
+ gslt_object_size, /* object_size */
+ gslt_object_type, /* object_type */
+ gslt_alloc_string, /* alloc_string */
+ gslt_alloc_string_immovable, /* alloc_string_immovable */
+ gslt_resize_string, /* resize_string */
+ gslt_free_string, /* free_string */
+ gslt_register_root, /* register_root */
+ gslt_unregister_root, /* unregister_root */
+ gslt_enable_free /* enable_free */
+ },
+ NULL, /* gs_lib_ctx */
+ NULL, /* head */
+ NULL, /* non_gc_memory */
+ 0, /* allocated */
+ 0, /* limit */
+ 0, /* used */
+ 0 /* max used */
+};
+
+/* retrun the c-heap manager set the global default as well. */
+static gs_memory_t *
+gslt_malloc_init(void)
+{
+ return (gs_memory_t *)&gslt_malloc_memory;
+}
+
+gs_memory_t *
+gslt_alloc_init()
+{
+ if ( gslt_malloc_init() == NULL )
+ return NULL;
+
+ gs_lib_ctx_init((gs_memory_t *)&gslt_mem);
+
+ gslt_mem.head = 0;
+ gslt_mem.non_gc_memory = (gs_memory_t *)&gslt_mem;
+
+ return (gs_memory_t *)&gslt_mem;
+}
+
+void
+gslt_alloc_print_leaks(void)
+{
+ dprintf1("number of allocs: %d\n", num_alloc_called);
+ dprintf1("number of frees: %d\n", num_free_called);
+ dprintf1("number of resizes: %d\n", num_resize_called);
+ dprintf1("number of leaked chunks: %d\n", num_alloc_called - num_free_called);
+}
+
diff --git a/tools/gslite/gslt_alloc.h b/tools/gslite/gslt_alloc.h
new file mode 100644
index 000000000..280a20dbd
--- /dev/null
+++ b/tools/gslite/gslt_alloc.h
@@ -0,0 +1,5 @@
+/* A simple memory allocator, based on the the allocator for ghostpcl */
+
+gs_memory_t *gslt_alloc_init(void);
+void gslt_alloc_print_leaks(void);
+
diff --git a/tools/gslite/gslt_font.h b/tools/gslite/gslt_font.h
new file mode 100644
index 000000000..8b33e3033
--- /dev/null
+++ b/tools/gslite/gslt_font.h
@@ -0,0 +1,138 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/*
+ * Public types and functions for
+ * OpenType font API using Ghostscript graphics library.
+ *
+ * This file requires either gslite.h or the internal gs headers
+ * for gs_memory_t, gx_device, gs_state and gs_matrix.
+ */
+
+typedef struct gslt_font_s gslt_font_t;
+typedef struct gslt_glyph_metrics_s gslt_glyph_metrics_t;
+typedef struct gslt_glyph_bitmap_s gslt_glyph_bitmap_t;
+typedef struct gslt_outline_walker_s gslt_outline_walker_t;
+
+struct gslt_glyph_metrics_s
+{
+ float hadv, vadv, vorg;
+};
+
+struct gslt_glyph_bitmap_s
+{
+ int w, h, stride; /* bitmap size; stride is number of bytes per line */
+ int lsb, top; /* bitmap offset (left-side-bearing and top) */
+ unsigned char *data; /* bitmap data */
+#ifdef USE_OLD_GS
+ int refs; /* private for now */
+#else
+ void *cc; /* cc slot that the data uses */
+#endif
+};
+
+struct gslt_outline_walker_s
+{
+ void *user;
+ int (*moveto)(void *user, float x, float y);
+ int (*lineto)(void *user, float x, float y);
+ int (*curveto)(void *user, float x0, float y0, float x1, float y1, float x2, float y2);
+ int (*closepath)(void *user);
+};
+
+/*
+ * Create the font cache machinery.
+ */
+gs_font_dir * gslt_new_font_cache(gs_memory_t *mem);
+
+/*
+ * Destroy the font machinery (and all associated fonts).
+ */
+void gslt_free_font_cache(gs_memory_t *mem, gs_font_dir *cache);
+
+/*
+ * Create and initialize a font structure from the
+ * font file, using index to select which font in TTC font
+ * collections.
+ *
+ * The font object retains a pointer to the memory passed in,
+ * but does not assume ownership. Free the memory
+ * after freeing the font.
+ * Return NULL on failure.
+ */
+gslt_font_t * gslt_new_font(gs_memory_t *mem, gs_font_dir *cache, char *buf, int buflen, int index);
+
+/*
+ * Destroy a font structure.
+ */
+void gslt_free_font(gs_memory_t *mem, gslt_font_t *font);
+
+/*
+ * Return the number of encoding (cmap) sub-tables in a font.
+ * Return zero if there is no cmap table at all.
+ */
+int gslt_count_font_encodings(gslt_font_t *font);
+
+/*
+ * Identify the platform and encoding id of a cmap subtable.
+ */
+int gslt_identify_font_encoding(gslt_font_t *font, int idx, int *pid, int *eid);
+
+/*
+ * Select a cmap subtable for use with the gslt_encode_font_char() function.
+ */
+int gslt_select_font_encoding(gslt_font_t *font, int idx);
+
+/*
+ * Encode a character and return its glyph index.
+ * Glyph 0 is always the "undefined" character.
+ * Any unencoded characters encoded will map to glyph 0.
+ *
+ * Do not call this without having selected an encoding first.
+ */
+int gslt_encode_font_char(gslt_font_t *font, int key);
+
+/*
+ * Walk the outline of a glyph, calling the functions specified.
+ */
+int gslt_outline_font_glyph(gs_state *pgs, gslt_font_t *font, int gid, gslt_outline_walker_t *walker);
+
+/*
+ * Render a glyph using a transform matrix, and fill in the
+ * bitmap struct. All values are in device space.
+ *
+ * The data pointer will point into the internal
+ * glyph bitmap cache in ghostscript, treat it as read only.
+ *
+ * Return -1 on failure.
+ */
+int gslt_render_font_glyph(gs_state *pgs, gslt_font_t *font, gs_matrix *tm, int gid, gslt_glyph_bitmap_t *slot);
+
+/*
+ * The glyph bitmap data is reference counted in the cache.
+ * gslt_render_font_glyph will increase the reference count by one
+ * automatically. Use the following functions to increase and decrease
+ * the reference count manually. You must call gslt_release_font_glyph
+ * when you don't need the bitmap anymore.
+ */
+void gslt_retain_font_glyph(gs_memory_t *mem, gslt_glyph_bitmap_t *slot);
+void gslt_release_font_glyph(gs_memory_t *mem, gslt_glyph_bitmap_t *slot);
+
+/*
+ * Fill in the metrics for a glyph, scaled by the internal font matrix.
+ * The design space (usually 1000 or 2048 for an em) is mapped to 1.0.
+ *
+ * Return -1 on failure.
+ */
+int gslt_measure_font_glyph(gs_state *pgs, gslt_font_t *font, int gid, gslt_glyph_metrics_t *mtx);
+
diff --git a/tools/gslite/gslt_font_api.c b/tools/gslite/gslt_font_api.c
new file mode 100644
index 000000000..36ad466e3
--- /dev/null
+++ b/tools/gslite/gslt_font_api.c
@@ -0,0 +1,777 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: $ */
+/* gslt OpenType font library implementation */
+
+/*
+ * gslt OpenType font API
+ */
+
+/* No shortage of gslib headers to include... */
+
+#include <stdlib.h>
+#include "stdio_.h"
+#include "math_.h"
+#include "string_.h"
+
+#include "gp.h"
+
+#include "gscdefs.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gslib.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsutil.h"
+
+#include "gx.h"
+#include "gxdevice.h"
+#include "gxpath.h"
+
+#include "gxfont.h"
+#include "gxchar.h"
+#include "gsgdata.h"
+#include "gxfont42.h"
+#include "gxfcache.h"
+
+#include "gzstate.h"
+#include "gzpath.h"
+
+/*
+ * Opaque font struct.
+ */
+
+#include "gslt.h"
+
+#include "gslt_font_api.h"
+
+struct gslt_font_s
+{
+ byte *data;
+ int length;
+ gs_font *font;
+ int cmaptable;
+ int cmapsubcount;
+ int cmapsubtable;
+};
+
+static int gslt_init_truetype_font(gs_memory_t *mem, gs_font_dir *xfc, gslt_font_t *xf, int wmode);
+
+/*
+ * The font cache is a gs_font_dir.
+ * It has some parameters that need to be set,
+ * do so here.
+ */
+
+gs_font_dir *
+gslt_new_font_cache(gs_memory_t *mem)
+{
+ gs_font_dir *fontdir;
+
+ uint smax = 50; /* number of scaled fonts */
+ uint bmax = 500000; /* space for cached chars */
+ uint mmax = 200; /* number of cached font/matrix pairs */
+ uint cmax = 5000; /* number of cached chars */
+ uint upper = 32000; /* max size of a single cached char */
+
+ fontdir = gs_font_dir_alloc2_limits(mem, mem, smax, bmax, mmax, cmax, upper);
+ if (!fontdir)
+ {
+ gs_throw(-1, "cannot gs_font_dir_alloc2_limits()");
+ return NULL;
+ }
+
+ gs_setaligntopixels(fontdir, 1); /* no subpixels */
+ gs_setgridfittt(fontdir, 3); /* see gx_ttf_outline for values */
+
+ return fontdir;
+}
+
+void
+gslt_free_font_cache(gs_memory_t *mem, gs_font_dir *fontdir)
+{
+ gs_free_object(mem, fontdir, "gs_font_dir");
+}
+
+/*
+ * Big-endian memory accessor functions
+ */
+
+static inline int u16(byte *p)
+{
+ return (p[0] << 8) | p[1];
+}
+
+static inline int s16(byte *p)
+{
+ return (signed short)( (p[0] << 8) | p[1] );
+}
+
+static inline int u32(byte *p)
+{
+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
+/*
+ * Find the offset and length of an SFNT table.
+ * Return -1 if no table by the specified name is found.
+ */
+
+static int
+gslt_find_sfnt_table(gslt_font_t *xf, char *name, int *lengthp)
+{
+ uint ntables;
+ uint i;
+
+ if (xf->length < 12)
+ return -1;
+
+ ntables = u16(xf->data + 4);
+ if (xf->length < 12 + ntables * 16)
+ return -1;
+
+ for (i = 0; i < ntables; i++)
+ {
+ byte *entry = xf->data + 12 + i * 16;
+ if (!memcmp(entry, name, 4))
+ {
+ if (lengthp)
+ *lengthp = u32(entry + 12);
+ return u32(entry + 8);
+ }
+ }
+
+ return -1;
+}
+
+/*
+ * Locate the 'cmap' table and count the number of subtables.
+ */
+
+static int
+gslt_load_sfnt_cmap(gslt_font_t *xf)
+{
+ byte *cmapdata;
+ int offset, length;
+ int nsubtables;
+
+ offset = gslt_find_sfnt_table(xf, "cmap", &length);
+ if (offset < 0)
+ return -1;
+
+ if (length < 4)
+ return -1;
+
+ cmapdata = xf->data + offset;
+
+ nsubtables = u16(cmapdata + 2);
+ if (nsubtables < 0)
+ return -1;
+ if (length < 4 + nsubtables * 8)
+ return -1;
+
+ xf->cmaptable = offset;
+ xf->cmapsubcount = nsubtables;
+ xf->cmapsubtable = 0;
+
+ return 0;
+}
+
+/*
+ * Return the number of cmap subtables.
+ */
+
+int
+gslt_count_font_encodings(gslt_font_t *xf)
+{
+ return xf->cmapsubcount;
+}
+
+/*
+ * Extract PlatformID and EncodingID for a cmap subtable.
+ */
+
+int
+gslt_identify_font_encoding(gslt_font_t *xf, int idx, int *pid, int *eid)
+{
+ if (idx < 0 || idx >= xf->cmapsubcount)
+ return -1;
+ byte *cmapdata = xf->data + xf->cmaptable;
+ byte *entry = cmapdata + 4 + idx * 8;
+ *pid = u16(entry + 0);
+ *eid = u16(entry + 2);
+ return 0;
+}
+
+/*
+ * Select a cmap subtable for use with encoding functions.
+ */
+
+int
+gslt_select_font_encoding(gslt_font_t *xf, int idx)
+{
+ if (idx < 0 || idx >= xf->cmapsubcount)
+ return -1;
+ byte *cmapdata = xf->data + xf->cmaptable;
+ byte *entry = cmapdata + 4 + idx * 8;
+ xf->cmapsubtable = xf->cmaptable + u32(entry + 4);
+ return 0;
+}
+
+/*
+ * Load and initialize a font struct from a file.
+ * Writing mode is set here; as a legacy from postscript
+ * where the writing mode is per-font and not switchable.
+ *
+ * TODO: using a normal font with wmode 1 will fail if
+ * there are no vmtx tables ... is this the right behavior?
+ */
+
+gslt_font_t *
+gslt_new_font(gs_memory_t *mem, gs_font_dir *fontdir, char *buf, int buflen, int wmode)
+{
+ gslt_font_t *xf;
+ byte *data = (byte*)buf;
+ int length;
+ int t;
+
+ xf = (void*) gs_alloc_bytes(mem, sizeof(gslt_font_t), "gslt_font struct");
+ if (!xf)
+ {
+ gs_free_object(mem, data, "gslt_font bytes");
+ gs_throw(-1, "out of memory");
+ return NULL;
+ }
+
+ xf->data = data;
+ xf->length = length;
+ xf->font = NULL;
+
+ xf->cmaptable = 0;
+ xf->cmapsubcount = 0;
+ xf->cmapsubtable = 0;
+
+ /* TODO: implement CFF fonts */
+
+ t = gslt_init_truetype_font(mem, fontdir, xf, wmode);
+ if (t < 0)
+ {
+ gslt_free_font(mem, xf);
+ gs_throw(-1, "cannot init font");
+ return NULL;
+ }
+
+ t = gslt_load_sfnt_cmap(xf);
+ if (t < 0)
+ {
+ errprintf("warning: no cmap table found in font\n");
+ }
+
+ return xf;
+}
+
+void
+gslt_free_font(gs_memory_t *mem, gslt_font_t *xf)
+{
+ gs_free_object(mem, xf, "gslt_font struct");
+}
+
+/*
+ * Encode a character using the selected cmap subtable.
+ * TODO: extend this to cover more cmap formats.
+ */
+
+int
+gslt_encode_font_char(gslt_font_t *xf, int key)
+{
+ byte *table;
+
+ /* no cmap selected: return identity */
+ if (xf->cmapsubtable <= 0)
+ return key;
+
+ table = xf->data + xf->cmapsubtable;
+
+ switch (u16(table))
+ {
+ case 0: /* Apple standard 1-to-1 mapping. */
+ return table[key + 6];
+
+ case 4: /* Microsoft/Adobe segmented mapping. */
+ {
+ int segCount2 = u16(table + 6);
+ byte *endCount = table + 14;
+ byte *startCount = endCount + segCount2 + 2;
+ byte *idDelta = startCount + segCount2;
+ byte *idRangeOffset = idDelta + segCount2;
+ int i2;
+
+ for (i2 = 0; i2 < segCount2 - 3; i2 += 2)
+ {
+ int delta, roff;
+ int start = u16(startCount + i2);
+ int glyph;
+
+ if ( key < start )
+ return 0;
+ if ( key > u16(endCount + i2) )
+ continue;
+ delta = s16(idDelta + i2);
+ roff = s16(idRangeOffset + i2);
+ if ( roff == 0 )
+ {
+ return ( key + delta ) & 0xffff; /* mod 65536 */
+ return 0;
+ }
+ glyph = u16(idRangeOffset + i2 + roff + ((key - start) << 1));
+ return (glyph == 0 ? 0 : glyph + delta);
+ }
+
+ /*
+ * The TrueType documentation says that the last range is
+ * always supposed to end with 0xffff, so this shouldn't
+ * happen; however, in some real fonts, it does.
+ */
+ return 0;
+ }
+
+ case 6: /* Single interval lookup. */
+ {
+ int firstCode = u16(table + 6);
+ int entryCount = u16(table + 8);
+ if ( key < firstCode || key >= firstCode + entryCount )
+ return 0;
+ return u16(table + 10 + ((key - firstCode) << 1));
+ }
+
+ default:
+ errprintf("error: unknown cmap format: %d\n", u16(table));
+ return 0;
+ }
+
+ return 0;
+}
+
+/*
+ * A bunch of callback functions that the ghostscript
+ * font machinery will call. The most important one
+ * is the build_char function.
+ */
+
+static gs_glyph
+gslt_callback_encode_char(gs_font *pfont, gs_char chr, gs_glyph_space_t spc)
+{
+ gslt_font_t *xf = pfont->client_data;
+ int value;
+ value = gslt_encode_font_char(xf, chr);
+ if (value == 0)
+ return gs_no_glyph;
+ return value;
+}
+
+static gs_char
+gslt_callback_decode_glyph(gs_font *p42, gs_glyph glyph)
+{
+ return GS_NO_CHAR;
+}
+
+static int
+gslt_callback_glyph_name(gs_font *pf, gs_glyph glyph, gs_const_string *pstr)
+{
+ return 0;
+}
+
+static int
+gslt_callback_string_proc(gs_font_type42 *p42, ulong offset, uint length, const byte **pdata)
+{
+ /* NB bounds check offset + length - use gs_object_size for memory
+ buffers - if file read should fail */
+ gslt_font_t *xf = p42->client_data;
+ *pdata = xf->data + offset;
+ return 0;
+}
+
+static int
+gslt_callback_build_char(gs_text_enum_t *ptextenum, gs_state *pgs, gs_font *pfont,
+ gs_char chr, gs_glyph glyph)
+{
+ gs_show_enum *penum = (gs_show_enum*)ptextenum;
+ gs_font_type42 *p42 = (gs_font_type42*)pfont;
+ const gs_rect *pbbox;
+ float sbw[4], w2[6];
+ int code;
+
+ code = gs_type42_get_metrics(p42, glyph, sbw);
+ if (code < 0)
+ return code;
+
+ w2[0] = sbw[2];
+ w2[1] = sbw[3];
+
+ pbbox = &p42->FontBBox;
+ w2[2] = pbbox->p.x;
+ w2[3] = pbbox->p.y;
+ w2[4] = pbbox->q.x;
+ w2[5] = pbbox->q.y;
+
+ /* Expand the bbox when stroking */
+ if ( pfont->PaintType )
+ {
+ float expand = max(1.415, gs_currentmiterlimit(pgs)) * gs_currentlinewidth(pgs) / 2;
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 )
+ return code;
+
+ code = gs_type42_append(glyph,
+ (gs_imager_state *)pgs,
+ gx_current_path(pgs),
+ &penum->log2_scale,
+ gs_show_in_charpath(penum) != cpm_show,
+ p42->PaintType,
+ penum->pair);
+ if (code < 0)
+ return code;
+
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ if (code < 0)
+ return code;
+
+ return 0;
+}
+
+/*
+ * Initialize the ghostscript font machinery for a truetype
+ * (type42 in postscript terminology) font.
+ */
+
+static int
+gslt_init_truetype_font(gs_memory_t *mem, gs_font_dir *fontdir, gslt_font_t *xf, int wmode)
+{
+ xf->font = (void*) gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42, "gslt_font type42");
+ if (!xf->font)
+ return gs_throw(-1, "out of memory");
+
+ /* no shortage of things to initialize */
+ {
+ gs_font_type42 *p42 = (gs_font_type42*) xf->font;
+
+ /* Common to all fonts: */
+
+ p42->next = 0;
+ p42->prev = 0;
+ p42->memory = mem;
+
+ p42->dir = fontdir; /* NB also set by gs_definefont later */
+ p42->base = xf->font; /* NB also set by gs_definefont later */
+ p42->is_resource = false;
+ gs_notify_init(&p42->notify_list, gs_memory_stable(mem));
+ p42->id = gs_next_ids(mem, 1);
+
+ p42->client_data = xf; /* that's us */
+
+ gs_make_identity(&p42->FontMatrix);
+ gs_make_identity(&p42->orig_FontMatrix); /* NB ... original or zeroes? */
+
+ p42->FontType = ft_TrueType;
+ p42->BitmapWidths = true;
+ p42->ExactSize = fbit_use_outlines;
+ p42->InBetweenSize = fbit_use_outlines;
+ p42->TransformedChar = fbit_use_outlines;
+ p42->WMode = wmode; /* TODO */
+ p42->PaintType = 0;
+ p42->StrokeWidth = 0;
+
+ p42->procs.init_fstack = gs_default_init_fstack;
+ p42->procs.next_char_glyph = gs_default_next_char_glyph;
+ p42->procs.glyph_name = gslt_callback_glyph_name;
+ p42->procs.decode_glyph = gslt_callback_decode_glyph;
+ p42->procs.define_font = gs_no_define_font;
+ p42->procs.make_font = gs_no_make_font;
+ p42->procs.font_info = gs_default_font_info;
+ p42->procs.glyph_info = gs_default_glyph_info;
+ p42->procs.glyph_outline = gs_no_glyph_outline;
+ p42->procs.encode_char = gslt_callback_encode_char;
+ p42->procs.build_char = gslt_callback_build_char;
+
+ p42->font_name.size = 0;
+ p42->key_name.size = 0;
+
+ /* Base font specific: */
+
+ p42->FontBBox.p.x = 0;
+ p42->FontBBox.p.y = 0;
+ p42->FontBBox.q.x = 0;
+ p42->FontBBox.q.y = 0;
+
+ uid_set_UniqueID(&p42->UID, p42->id);
+
+ p42->encoding_index = ENCODING_INDEX_UNKNOWN;
+ p42->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
+
+ p42->FAPI = 0;
+ p42->FAPI_font_data = 0;
+
+ /* Type 42 specific: */
+
+ p42->data.string_proc = gslt_callback_string_proc;
+ p42->data.proc_data = xf;
+ gs_type42_font_init(p42);
+ }
+
+ gs_definefont(fontdir, xf->font);
+
+ return 0;
+}
+
+/*
+ * Draw a glyph to the device, and extract the bitmap from
+ * the ccache afterwards... only works if the bitmap is not
+ * too large.
+ */
+
+int
+gslt_render_font_glyph(gs_state *pgs, gslt_font_t *xf, gs_matrix *tm, int gid, gslt_glyph_bitmap_t *slot)
+{
+ gs_fixed_point subpixel = {0, 0}; /* we don't use subpixel accurate device metrics */
+ gs_log2_scale_point oversampling = {0, 0}; /* we don't use oversampling */
+ gs_text_params_t params;
+ gs_text_enum_t *textenum;
+ gs_matrix matrix;
+ cached_fm_pair *ppair;
+ cached_char *cc;
+ int code;
+
+ /* get the real font matrix (this is a little dance) */
+ gs_setfont(pgs, xf->font); /* set pgs->font and invalidate existing charmatrix */
+ gs_setcharmatrix(pgs, tm); /* set the charmatrix to ctm * tm */
+ gs_currentcharmatrix(pgs, &matrix, true); /* extract charmatrix (and multiply by FontMatrix) */
+
+ // dprintf4("tm = [%g %g %g %g]\n", matrix.xx, matrix.xy, matrix.yx, matrix.yy);
+
+ /* find the font/matrix pair (or add it) */
+ code = gx_lookup_fm_pair(xf->font, &matrix, &oversampling, false, &ppair);
+ if (code != 0)
+ return gs_throw(-1, "cannot gx_lookup_fm_pair()");
+
+ cc = gx_lookup_cached_char(xf->font, ppair, gid, 0, 1, &subpixel);
+ if (!cc)
+ {
+ /* No luck ... now we need to get it into the cache somehow.
+ *
+ * We do this by rendering one glyph (that's why we need a device and pgs).
+ * The renderer always renders the bitmap into the cache, and draws
+ * from out of the cache when blitting to the device.
+ *
+ * Things don't get evicted from the cache until there is a collision,
+ * so we have a safe window to snarf it back out of the cache
+ * after it's been drawn to the device.
+ */
+
+ // dprintf1("cache miss for glyph %d\n", gid);
+
+ params.operation = TEXT_FROM_SINGLE_GLYPH | TEXT_DO_DRAW | TEXT_RETURN_WIDTH;
+ params.data.d_glyph = gid;
+ params.size = 1;
+
+ if (gs_text_begin(pgs, &params, xf->font->memory, &textenum) != 0)
+ return gs_throw(-1, "cannot gs_text_begin()");
+ if (gs_text_process(textenum) != 0)
+ return gs_throw(-1, "cannot gs_text_process()");
+ gs_text_release(textenum, "gslt font render");
+
+ cc = gx_lookup_cached_char(xf->font, ppair, gid, 0, 1, &subpixel);
+ if (!cc)
+ {
+ /* merde! it rendered but was not placed in the cache. */
+ return gs_throw(-2, "cannot render from cache");
+ }
+ }
+
+ /* copy values from the cache into the client struct */
+ slot->w = cc->width;
+ slot->h = cc->height;
+ slot->stride = cc_raster(cc);
+ slot->lsb = fixed2int(cc->offset.x);
+ slot->top = fixed2int(cc->offset.y);
+ slot->xadv = fixed2float(cc->wxy.x);
+ slot->yadv = fixed2float(cc->wxy.y);
+ slot->data = cc_bits(cc);
+
+#ifdef XXX
+ dprintf1("glyph %d\n", gid);
+ debug_dump_bitmap(cc_bits(xf->cc), cc_raster(xf->cc), xf->cc->height, "");
+ {
+ char fn[32];
+ sprintf(fn, "glyph%d.pbm", gid);
+ FILE *fo = fopen(fn, "wb");
+ if (!fo)
+ return -1;
+ fprintf(fo, "P4\n%d %d\n", xf->cc->width, xf->cc->height);
+ int y;
+ int s = (xf->cc->width + 7) / 8;
+ for (y = 0; y < xf->cc->height; y++)
+ fwrite(cc_bits(xf->cc) + y * cc_raster(xf->cc), 1, s, fo);
+ fclose(fo);
+ }
+#endif
+
+ return 0;
+}
+
+int
+gslt_outline_font_glyph(gs_state *pgs, gslt_font_t *xf, int gid, gslt_outline_walker_t *walk)
+{
+ gs_text_params_t params;
+ gs_text_enum_t *textenum;
+ gs_matrix matrix;
+ segment *seg;
+ curve_segment *cseg;
+
+ gs_gsave(pgs);
+ gs_make_identity(&matrix);
+ gs_setmatrix(pgs, &matrix);
+ gs_scale(pgs, 1000.0, 1000.0); /* otherwise we hit serious precision problems with fixpoint math */
+
+ /* set gstate params */
+ gs_setfont(pgs, xf->font); /* set pgs->font and invalidate existing charmatrix */
+ gs_make_identity(&matrix);
+ gs_setcharmatrix(pgs, &matrix); /* set the charmatrix to identity */
+
+ /* reset the path */
+ gs_newpath(pgs);
+ gs_moveto(pgs, 0.0, 0.0);
+
+ /* draw the glyph, in charpath mode */
+ params.operation = TEXT_FROM_SINGLE_GLYPH | TEXT_DO_FALSE_CHARPATH | TEXT_RETURN_WIDTH;
+ params.data.d_glyph = gid;
+ params.size = 1;
+
+ if (gs_text_begin(pgs, &params, xf->font->memory, &textenum) != 0)
+ return gs_throw(-1, "cannot gs_text_begin()");
+ if (gs_text_process(textenum) != 0)
+ return gs_throw(-1, "cannot gs_text_process()");
+ gs_text_release(textenum, "gslt font outline");
+
+ /* walk the resulting path */
+ seg = (segment*)pgs->path->first_subpath;
+ while (seg)
+ {
+ switch (seg->type)
+ {
+ case s_start:
+ walk->moveto(walk->user,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ case s_line:
+ walk->lineto(walk->user,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ case s_line_close:
+ walk->closepath(walk->user);
+ break;
+ case s_curve:
+ cseg = (curve_segment*)seg;
+ walk->curveto(walk->user,
+ fixed2float(cseg->p1.x) * 0.001,
+ fixed2float(cseg->p1.y) * 0.001,
+ fixed2float(cseg->p2.x) * 0.001,
+ fixed2float(cseg->p2.y) * 0.001,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ }
+ seg = seg->next;
+ }
+
+ /* and toss it away... */
+ gs_newpath(pgs);
+
+ gs_grestore(pgs);
+ return 0;
+}
+
+int
+gslt_measure_font_glyph(gs_state *pgs, gslt_font_t *xf, int gid, gslt_glyph_metrics_t *mtx)
+{
+ int code;
+ float sbw[4];
+
+ code = gs_type42_get_metrics((gs_font_type42*)xf->font, gid, sbw);
+ if (code < 0)
+ return code;
+
+ // TODO: extract this somehow ...
+ mtx->v[0] = 0.0;
+ mtx->v[1] = 0.0;
+
+ mtx->w[0] = sbw[2];
+ mtx->w[1] = sbw[3];
+
+ return 0;
+}
+
+#ifdef NEVER
+int
+gslt_measure_font_glyph(gslt_font_t *xf, int gid, gslt_glyph_metrics_t *mtx)
+{
+ /*
+ * Gods this is slow ... gs_default_glyph_info builds the outline
+ * Should cache this somehow...
+ * anyway, it just returns 0 and i'm too lazy to find out why
+ */
+
+ gs_glyph_info_t info;
+ int mask;
+ int code;
+
+ mask = GLYPH_INFO_OUTLINE_WIDTHS | GLYPH_INFO_WIDTHS;
+ if (xf->font->WMode == 0)
+ mask |= GLYPH_INFO_VVECTOR0 | GLYPH_INFO_WIDTH0;
+ else
+ mask |= GLYPH_INFO_VVECTOR1 | GLYPH_INFO_WIDTH1;
+
+ code = xf->font->procs.glyph_info(xf->font, gid, NULL, GLYPH_INFO_OUTLINE_WIDTHS, &info);
+ dprintf2("mask %x -> %x\n", mask, code);
+ if (code == 0)
+ return gs_throw(-1, "cannot font->glyph_info()");
+
+ if (xf->font->WMode == 0)
+ {
+ mtx->x = 0.0;
+ mtx->y = 0.0;
+ mtx->w = info.width[0].x;
+ }
+ else
+ {
+ mtx->x = info.v.x;
+ mtx->y = info.v.y;
+ mtx->w = info.width[0].y;
+ }
+
+ return 0;
+}
+#endif
+
diff --git a/tools/gslite/gslt_font_api.h b/tools/gslite/gslt_font_api.h
new file mode 100644
index 000000000..220328082
--- /dev/null
+++ b/tools/gslite/gslt_font_api.h
@@ -0,0 +1,130 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_font_api.h 2460 2006-07-14 18:49:12Z giles $ */
+/* gslt OpenType font library api */
+
+/*
+ * Public types and functions for
+ * OpenType font API using Ghostscript graphics library.
+ *
+ * This file requires either gslite.h or the internal gs headers
+ * for gs_memory_t, gx_device, gs_state and gs_matrix.
+ */
+
+typedef struct gslt_font_s gslt_font_t;
+typedef struct gslt_glyph_metrics_s gslt_glyph_metrics_t;
+typedef struct gslt_glyph_bitmap_s gslt_glyph_bitmap_t;
+typedef struct gslt_outline_walker_s gslt_outline_walker_t;
+
+struct gslt_glyph_metrics_s
+{
+ float v[2]; /* origin offset (used for vertical wmode) */
+ float w[2]; /* advance width */
+};
+
+struct gslt_glyph_bitmap_s
+{
+ float xadv, yadv; /* pen advance */
+ int w, h, stride; /* bitmap size; stride is number of bytes per line */
+ int lsb, top; /* bitmap offset (left-side-bearing and top) */
+ unsigned char *data; /* pointer to (temporary) cache memory */
+};
+
+struct gslt_outline_walker_s
+{
+ void *user;
+ int (*moveto)(void *user, float x, float y);
+ int (*lineto)(void *user, float x, float y);
+ int (*curveto)(void *user, float x0, float y0, float x1, float y1, float x2, float y2);
+ int (*closepath)(void *user);
+};
+
+/*
+ * Create the font cache machinery.
+ */
+gs_font_dir * gslt_new_font_cache(gs_memory_t *mem);
+
+/*
+ * Destroy the font machinery (and all associated fonts).
+ */
+void gslt_free_font_cache(gs_memory_t *mem, gs_font_dir *cache);
+
+/*
+ * Create and initialize a font structure.
+ * This retains a pointer to the memory passed in,
+ * but does not assume ownership. Free the memory
+ * after freeing the font.
+ * Return NULL on failure.
+ */
+gslt_font_t * gslt_new_font(gs_memory_t *mem, gs_font_dir *cache, char *rbuf, int rlen, int wmode);
+
+/*
+ * Destroy a font structure.
+ */
+void gslt_free_font(gs_memory_t *mem, gslt_font_t *font);
+
+/*
+ * Return the number of encoding (cmap) sub-tables in a font.
+ * Return zero if there is no cmap table at all.
+ */
+int gslt_count_font_encodings(gslt_font_t *font);
+
+/*
+ * Identify the platform and encoding id of a cmap subtable.
+ */
+int gslt_identify_font_encoding(gslt_font_t *font, int idx, int *pid, int *eid);
+
+/*
+ * Select a cmap subtable for use with the gslt_encode_font_char() function.
+ */
+int gslt_select_font_encoding(gslt_font_t *font, int idx);
+
+/*
+ * Encode a character and return its glyph index.
+ * Glyph 0 is always the "undefined" character.
+ * Any unencoded characters encoded will map to glyph 0.
+ *
+ * Do not call this without having selected an encoding first.
+ */
+int gslt_encode_font_char(gslt_font_t *font, int key);
+
+/*
+ * Walk the outline of a glyph, calling the functions specified.
+ */
+int gslt_outline_font_glyph(gs_state *pgs, gslt_font_t *font, int gid, gslt_outline_walker_t *walker);
+
+/*
+ * Render a glyph using a transform matrix, and fill in the
+ * bitmap struct. All values are in device space.
+ *
+ * The data pointer will point into the internal
+ * glyph bitmap cache in ghostscript.
+ * This data should be considered volatile;
+ * it may disappear whenever another function
+ * from this API or ghostscript is called.
+ *
+ * If you need to hold on to it, make your own copy.
+ *
+ * Return -1 on failure.
+ */
+int gslt_render_font_glyph(gs_state *pgs, gslt_font_t *font, gs_matrix *tm, int gid, gslt_glyph_bitmap_t *slot);
+
+/*
+ * Fill in the metrics for a glyph, scaled by the internal font matrix.
+ * The design space (usually 1000 or 2048 for an em) is mapped to 1.0.
+ *
+ * Return -1 on failure.
+ */
+int gslt_measure_font_glyph(gs_state *pgs, gslt_font_t *font, int gid, gslt_glyph_metrics_t *mtx);
+
diff --git a/tools/gslite/gslt_font_api_test.c b/tools/gslite/gslt_font_api_test.c
new file mode 100644
index 000000000..7425f64dc
--- /dev/null
+++ b/tools/gslite/gslt_font_api_test.c
@@ -0,0 +1,268 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_font_api_test.c 2461 2006-07-14 18:54:03Z giles $ */
+/* gslt OpenType font library example client */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gserror.h>
+
+#include "gslt.h"
+#include "gslt_font_api.h"
+
+/* these are not strictly needed */
+extern void gs_erasepage(gs_state *pgs);
+extern void gs_moveto(gs_state *pgs, double, double);
+extern void gs_output_page(gs_state *pgs, int, int);
+extern char gs_debug[];
+
+/*
+ * Read a file from disk into memory.
+ */
+
+int readfile(char *filename, char **datap, int *lengthp)
+{
+ FILE *fp;
+ int t, n;
+ char *p;
+
+ fp = fopen(filename, "rb");
+ if (!fp)
+ return gs_throw(-1, "cannot open font file");
+
+ t = fseek(fp, 0, 2);
+ if (t < 0)
+ {
+ fclose(fp);
+ return gs_throw(-1, "cannot seek in font file");
+ }
+
+ n = ftell(fp);
+ if (n < 0)
+ {
+ fclose(fp);
+ return gs_throw(-1, "cannot tell in font file");
+ }
+
+ t = fseek(fp, 0, 0);
+ if (t < 0)
+ {
+ fclose(fp);
+ return gs_throw(-1, "cannot seek in font file");
+ }
+
+ p = malloc(n);
+ if (!p)
+ {
+ fclose(fp);
+ return gs_throw(-1, "out of memory");
+ }
+
+ t = fread(p, 1, n, fp);
+ if (t != n)
+ {
+ free(p);
+ fclose(fp);
+ return gs_throw(-1, "cannot read font file data");
+ }
+
+ t = fclose(fp);
+ if (t < 0)
+ {
+ gs_throw(-1, "cannot close font file");
+ /* ... continue anyway */
+ }
+
+ *lengthp = n;
+ *datap = p;
+
+ return 0;
+}
+
+/*
+ * Test program.
+ */
+
+static int mymoveto(void *ctx, float x, float y)
+{
+ x *= 1000; y *= 1000;
+ printf("%g %g moveto\n", x, y);
+ return 0;
+}
+
+static int mylineto(void *ctx, float x, float y)
+{
+ x *= 1000; y *= 1000;
+ printf("%g %g lineto\n", x, y);
+ return 0;
+}
+
+static int mycurveto(void *ctx, float x0, float y0, float x1, float y1, float x2, float y2)
+{
+ x0 *= 1000; y0 *= 1000;
+ x1 *= 1000; y1 *= 1000;
+ x2 *= 1000; y2 *= 1000;
+ printf("%g %g %g %g %g %g curveto\n", x0, y0, x1, y1, x2, y2);
+ return 0;
+}
+
+static int myclosepath(void *ctx)
+{
+ printf("closepath\n");
+ return 0;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ gs_memory_t *mem;
+ gx_device *dev;
+ gs_state *pgs;
+ gs_font_dir *cache;
+ gslt_font_t *font;
+ gslt_outline_walker_t walk;
+ gslt_glyph_bitmap_t slot;
+ gslt_glyph_metrics_t mtx;
+ gs_matrix ctm;
+ int code;
+ char *s;
+ char *devicename;
+ int i, n, pid, eid, best;
+ char *buf;
+ int len;
+
+ char *text;
+
+ devicename = getenv("DEVICE");
+ if (!devicename)
+ devicename = "nullpage";
+
+ mem = gslt_init_library();
+ dev = gslt_init_device(mem, devicename);
+ pgs = gslt_init_state(mem, dev);
+
+// n = readfile("/Users/tor/Documents/msfonts/times.ttf", &buf, &len);
+ n = readfile("/usr/share/fonts/truetype/ttf-bitstream-vera/VeraIt.ttf", &buf, &len);
+ if (n < 0)
+ return gs_throw(1, "could not read font file");
+
+ gs_debug['k'] = 1; /* debug character cache machinery */
+
+ /*
+ * Set up ghostscript library
+ */
+
+ // gslt_get_device_param(mem, dev, "Name");
+ gslt_set_device_param(mem, dev, "OutputFile", "-");
+
+ // so we see what device calls are made
+ gs_erasepage(pgs);
+ gs_moveto(pgs, 5.0, 20.0);
+
+ /*
+ * Create a font cache
+ */
+
+ cache = gslt_new_font_cache(mem);
+ if (!cache)
+ return gs_throw(1, "could not create font cache");
+
+ /*
+ * Create the font and select an encoding
+ */
+
+ font = gslt_new_font(mem, cache, buf, len, 0);
+ if (!font)
+ return gs_throw(1, "could not create font");
+
+ n = gslt_count_font_encodings(font);
+ for (best = 0, i = 0; i < n; i++)
+ {
+ gslt_identify_font_encoding(font, i, &pid, &eid);
+ if (pid == 3 && eid == 0)
+ best = i;
+ }
+ gslt_select_font_encoding(font, best);
+
+ /*
+ * Test bitmap rendering.
+ */
+
+ text = "Pack my box with five dozen liquor jugs!";
+
+ ctm.xx = 48.0;
+ ctm.xy = 0.0;
+ ctm.yx = 0.0;
+ ctm.yy = 48.0;
+ ctm.tx = ctm.ty = 0.0;
+
+ for (s = text; *s; s++)
+ {
+ int gid = gslt_encode_font_char(font, *s);
+
+ code = gslt_measure_font_glyph(pgs, font, gid, &mtx);
+ if (code < 0)
+ {
+ printf("error in gslt_measure_font_glyph\n");
+ continue;
+ }
+
+ code = gslt_render_font_glyph(pgs, font, &ctm, gid, &slot);
+ if (code < 0)
+ {
+ printf("error in gslt_render_font_glyph\n");
+ continue;
+ }
+
+
+ printf("glyph %3d: v=%f,%f w=%f,%f ", gid, mtx.v[0], mtx.v[1], mtx.w[0], mtx.w[1]);
+ printf(" -> %dx%d+(%d,%d) w=%f,%f\n",
+ slot.w, slot.h,
+ slot.lsb,
+ slot.top,
+ slot.xadv,
+ slot.yadv);
+ }
+
+ /*
+ * Test outline extraction.
+ */
+
+ walk.user = NULL;
+ walk.moveto = mymoveto;
+ walk.lineto = mylineto;
+ walk.curveto = mycurveto;
+ walk.closepath = myclosepath;
+
+ code = gslt_outline_font_glyph(pgs, font, gslt_encode_font_char(font, 'e'), &walk);
+ if (code < 0)
+ printf("error in gslt_outline_font_glyph\n");
+
+ /*
+ * Clean up.
+ */
+
+ // show device and wait for keypress
+ gs_output_page(pgs, 1, 1);
+ getchar();
+
+ gslt_free_font(mem, font);
+ gslt_free_font_cache(mem, cache);
+ free(buf);
+ gslt_free_library(mem, dev, pgs);
+
+ return 0;
+}
+
diff --git a/tools/gslite/gslt_font_cache.c b/tools/gslite/gslt_font_cache.c
new file mode 100644
index 000000000..2a7e0022c
--- /dev/null
+++ b/tools/gslite/gslt_font_cache.c
@@ -0,0 +1,174 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+#include "gslt_font_int.h"
+
+#include "gslt.h"
+#include "gslt_font.h"
+
+
+/*
+ * The font cache is a gs_font_dir.
+ * It has some parameters that need to be set,
+ * do so here.
+ */
+
+gs_font_dir *
+gslt_new_font_cache(gs_memory_t *mem)
+{
+ gs_font_dir *fontdir;
+
+ int smax = 50; /* number of scaled fonts */
+ int bmax = 500000; /* space for cached chars */
+ int mmax = 200; /* number of cached font/matrix pairs */
+ int cmax = 5000; /* number of cached chars */
+ int upper = 32000; /* max size of a single cached char */
+
+ fontdir = gs_font_dir_alloc2_limits(mem, mem, smax, bmax, mmax, cmax, upper);
+ if (!fontdir)
+ {
+ gs_throw(-1, "cannot gs_font_dir_alloc2_limits()");
+ return NULL;
+ }
+
+ gs_setaligntopixels(fontdir, 1); /* no subpixels */
+ gs_setgridfittt(fontdir, 3); /* see gx_ttf_outline for values */
+
+ return fontdir;
+}
+
+void
+gslt_free_font_cache(gs_memory_t *mem, gs_font_dir *fontdir)
+{
+ gs_free_object(mem, fontdir, "gs_font_dir");
+}
+
+
+/*
+ * Find the offset and length of an SFNT table.
+ * Return -1 if no table by the specified name is found.
+ */
+
+int
+gslt_find_sfnt_table(gslt_font_t *xf, char *name, int *lengthp)
+{
+ byte *directory;
+ int offset;
+ int ntables;
+ int i;
+
+ if (xf->length < 12)
+ return -1;
+
+ if (!memcmp(xf->data, "ttcf", 4))
+ {
+ int nfonts = u32(xf->data + 8);
+ if (xf->subfontid < 0 || xf->subfontid >= nfonts)
+ return -1;
+ offset = u32(xf->data + 12 + xf->subfontid * 4);
+ }
+ else
+ {
+ offset = 0;
+ }
+
+ ntables = u16(xf->data + offset + 4);
+ if (xf->length < offset + 12 + ntables * 16)
+ return -1;
+
+ for (i = 0; i < ntables; i++)
+ {
+ byte *entry = xf->data + offset + 12 + i * 16;
+ if (!memcmp(entry, name, 4))
+ {
+ if (lengthp)
+ *lengthp = u32(entry + 12);
+ return u32(entry + 8);
+ }
+ }
+
+ return -1;
+}
+
+/*
+ * Load and initialize a font struct from a file.
+ */
+
+gslt_font_t *
+gslt_new_font(gs_memory_t *mem, gs_font_dir *fontdir, char *buf, int buflen, int subfontid)
+{
+ gslt_font_t *xf;
+ int t;
+
+ xf = (void*) gs_alloc_bytes(mem, sizeof(gslt_font_t), "gslt_font struct");
+ if (!xf)
+ {
+ gs_throw(-1, "out of memory");
+ return NULL;
+ }
+
+ xf->data = (byte*)buf;
+ xf->length = buflen;
+ xf->font = NULL;
+
+ xf->subfontid = subfontid;
+ xf->cmaptable = 0;
+ xf->cmapsubcount = 0;
+ xf->cmapsubtable = 0;
+ xf->usepua = 0;
+
+ xf->cffdata = 0;
+ xf->cffend = 0;
+ xf->gsubrs = 0;
+ xf->subrs = 0;
+ xf->charstrings = 0;
+
+ if (memcmp(xf->data, "OTTO", 4) == 0)
+ t = gslt_init_postscript_font(mem, fontdir, xf);
+ else if (memcmp(xf->data, "\0\1\0\0", 4) == 0)
+ t = gslt_init_truetype_font(mem, fontdir, xf);
+ else if (memcmp(xf->data, "true", 4) == 0)
+ t = gslt_init_truetype_font(mem, fontdir, xf);
+ else if (memcmp(xf->data, "ttcf", 4) == 0)
+ t = gslt_init_truetype_font(mem, fontdir, xf);
+ else
+ {
+ gslt_free_font(mem, xf);
+ gs_throw(-1, "not an opentype font");
+ return NULL;
+ }
+
+ if (t < 0)
+ {
+ gslt_free_font(mem, xf);
+ gs_rethrow(-1, "cannot init font");
+ return NULL;
+ }
+
+ t = gslt_load_sfnt_cmap(xf);
+ if (t < 0)
+ {
+ errprintf("warning: no cmap table found in font\n");
+ }
+
+ return xf;
+}
+
+void
+gslt_free_font(gs_memory_t *mem, gslt_font_t *xf)
+{
+ gs_font_finalize(xf->font);
+ gs_free_object(mem, xf->font, "font object");
+ gs_free_object(mem, xf, "gslt_font struct");
+}
+
diff --git a/tools/gslite/gslt_font_cff.c b/tools/gslite/gslt_font_cff.c
new file mode 100644
index 000000000..627166545
--- /dev/null
+++ b/tools/gslite/gslt_font_cff.c
@@ -0,0 +1,971 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+#include "gslt_font_int.h"
+
+#include "gslt.h"
+#include "gslt_font.h"
+
+/*
+ * OpenType Tables
+ *
+ * Required: cmap, head, hhea, hmtx, maxp, name, OS/2, post
+ * TrueType: cvt, fpgm, glyf, loca, prep
+ * Postscript: CFF, VORG
+ * Typographic: BASE, GDEF, GPOS, GSUB, JSTF
+ * Other: DSIG, gasp, hdmx, kern, LTSH, PCLT, VDMX, vhea, vmtx
+ */
+
+/* Access glyph data through the CharStrings INDEX */
+
+// zfont1.c
+// zfont2.c
+// zchar1.c
+// zcharout.c
+// gxtype1.c
+// gxfont1.h
+
+static byte * gslt_count_cff_index(byte *p, byte *e, int *countp);
+static byte * gslt_find_cff_index(byte *p, byte *e, int idx, byte **pp, byte **ep);
+
+static int subrbias(int count)
+{
+ return count < 1240 ? 107 : count < 33900 ? 1131 : 32768;
+}
+
+static int uofs(byte *p, int offsize)
+{
+ if (offsize == 1) return p[0];
+ if (offsize == 2) return u16(p);
+ if (offsize == 3) return u24(p);
+ if (offsize == 4) return u32(p);
+ return 0;
+}
+
+static byte *
+gslt_read_cff_real(byte *p, byte *e, float *val)
+{
+ char buf[64];
+ char *txt = buf;
+
+ /* b0 was 30 */
+
+ while (txt < buf + (sizeof buf) - 3 && p < e)
+ {
+ int b, n;
+
+ b = *p++;
+
+ n = (b >> 4) & 0xf;
+ if (n < 0xA) { *txt++ = n + '0'; }
+ else if (n == 0xA) { *txt++ = '.'; }
+ else if (n == 0xB) { *txt++ = 'E'; }
+ else if (n == 0xC) { *txt++ = 'E'; *txt++ = '-'; }
+ else if (n == 0xE) { *txt++ = '-'; }
+ else if (n == 0xF) { break; }
+
+ n = b & 0xf;
+ if (n < 0xA) { *txt++ = n + '0'; }
+ else if (n == 0xA) { *txt++ = '.'; }
+ else if (n == 0xB) { *txt++ = 'E'; }
+ else if (n == 0xC) { *txt++ = 'E'; *txt++ = '-'; }
+ else if (n == 0xE) { *txt++ = '-'; }
+ else if (n == 0xF) { break; }
+ }
+
+ *txt = 0;
+
+ *val = atof(buf);
+
+ return p;
+}
+
+static byte *
+gslt_read_cff_integer(byte *p, byte *e, int b0, int *val)
+{
+ int b1, b2, b3, b4;
+
+ if (b0 == 28)
+ {
+ if (p + 2 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ b2 = *p++;
+ *val = (b1 << 8) | b2;
+ }
+
+ else if (b0 == 29)
+ {
+ if (p + 4 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ b2 = *p++;
+ b3 = *p++;
+ b4 = *p++;
+ *val = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+ }
+
+ else if (b0 < 247)
+ {
+ *val = b0 - 139;
+ }
+
+ else if (b0 < 251)
+ {
+ if (p + 1 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ *val = (b0 - 247) * 256 + b1 + 108;
+ }
+
+ else
+ {
+ if (p + 1 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ *val = -(b0 - 251) * 256 - b1 - 108;
+ }
+
+ return p;
+}
+
+static int
+gslt_read_cff_dict(byte *p, byte *e, gslt_font_t *fontobj, gs_font_type1 *pt1)
+{
+ struct { int ival; float fval; } args[48];
+ int offset;
+ int b0, n;
+ float f;
+ int i;
+
+ int privatelen = 0;
+ int privateofs = 0;
+
+ offset = p - fontobj->cffdata;
+
+ n = 0;
+ while (p < e)
+ {
+ b0 = *p++;
+
+ if (b0 < 22)
+ {
+ if (b0 == 12)
+ {
+ if (p + 1 > e)
+ {
+ return gs_throw(-1, "corrupt dictionary (operator)");
+ }
+ b0 = 0x100 | *p++;
+ }
+
+ /* some CFF file offsets */
+
+ if (b0 == 17)
+ {
+ fontobj->charstrings = fontobj->cffdata + args[0].ival;
+ }
+
+ if (b0 == 18)
+ {
+ privatelen = args[0].ival;
+ privateofs = args[1].ival;
+ }
+
+ if (b0 == 19)
+ {
+ fontobj->subrs = fontobj->cffdata + offset + args[0].ival;
+ }
+
+ if (b0 == (256 | 36))
+ errprintf("warning: cid cff fonts not supported yet");
+ if (b0 == (256 | 37))
+ errprintf("warning: cid cff fonts not supported yet");
+
+ /* Type1 stuff that need to be set for the pt1 struct */
+
+ if (b0 == (256 | 6))
+ {
+ if (args[0].ival == 1)
+ {
+ pt1->data.interpret = gs_type1_interpret;
+ pt1->data.lenIV = -1; // FIXME
+ }
+ }
+
+ if (b0 == (256 | 7))
+ {
+ pt1->FontMatrix.xx = args[0].fval * 1000;
+ pt1->FontMatrix.xy = args[1].fval * 1000;
+ pt1->FontMatrix.yx = args[2].fval * 1000;
+ pt1->FontMatrix.yy = args[3].fval * 1000;
+ pt1->FontMatrix.tx = args[4].fval * 1000;
+ pt1->FontMatrix.ty = args[5].fval * 1000;
+ }
+
+ if (b0 == 5)
+ {
+ pt1->FontBBox.p.x = args[0].fval;
+ pt1->FontBBox.p.y = args[1].fval;
+ pt1->FontBBox.q.x = args[2].fval;
+ pt1->FontBBox.q.y = args[3].fval;
+ }
+
+ if (b0 == 20)
+ pt1->data.defaultWidthX = float2fixed(args[0].fval);
+
+ if (b0 == 21)
+ pt1->data.nominalWidthX = float2fixed(args[0].fval);
+
+ if (b0 == (256 | 19))
+ pt1->data.initialRandomSeed = args[0].ival;
+
+ /* Monday morning blues */
+
+ if (b0 == 6)
+ {
+ pt1->data.BlueValues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.BlueValues.values[i] = f;
+ }
+
+ if (b0 == 7)
+ {
+ pt1->data.OtherBlues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.OtherBlues.values[i] = f;
+ }
+
+ if (b0 == 8)
+ {
+ pt1->data.FamilyBlues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.FamilyBlues.values[i] = f;
+ }
+
+ if (b0 == 9)
+ {
+ pt1->data.FamilyOtherBlues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.FamilyOtherBlues.values[i] = f;
+ }
+
+ if (b0 == 10)
+ {
+ pt1->data.StdHW.count = 1;
+ pt1->data.StdHW.values[0] = args[0].fval;
+ }
+
+ if (b0 == 11)
+ {
+ pt1->data.StdVW.count = 1;
+ pt1->data.StdVW.values[0] = args[0].fval;
+ }
+
+ if (b0 == (256 | 9))
+ pt1->data.BlueScale = args[0].fval;
+
+ if (b0 == (256 | 10))
+ pt1->data.BlueShift = args[0].fval;
+
+ if (b0 == (256 | 11))
+ pt1->data.BlueFuzz = args[0].fval;
+
+ if (b0 == (256 | 12))
+ {
+ pt1->data.StemSnapH.count = n;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.StemSnapH.values[i] = f;
+ }
+
+ if (b0 == (256 | 13))
+ {
+ pt1->data.StemSnapV.count = n;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.StemSnapV.values[i] = f;
+ }
+
+ if (b0 == (256 | 14))
+ pt1->data.ForceBold = args[0].ival;
+
+ if (b0 == (256 | 17))
+ pt1->data.LanguageGroup = args[0].ival;
+
+ if (b0 == (256 | 18))
+ pt1->data.ExpansionFactor = args[0].fval;
+
+ n = 0;
+ }
+
+ else
+ {
+ if (b0 == 30)
+ {
+ p = gslt_read_cff_real(p, e, &args[n].fval);
+ if (!p)
+ return gs_throw(-1, "corrupt dictionary operand");
+ args[n].ival = (int) args[n].fval;
+ n++;
+ }
+ else if (b0 == 28 || b0 == 29 || (b0 >= 32 && b0 <= 254))
+ {
+ p = gslt_read_cff_integer(p, e, b0, &args[n].ival);
+ if (!p)
+ return gs_throw(-1, "corrupt dictionary operand");
+ args[n].fval = (float) args[n].ival;
+ n++;
+ }
+ else
+ {
+ return gs_throw1(-1, "corrupt dictionary operand (b0 = %d)", b0);
+ }
+ }
+ }
+
+ /* recurse for the private dictionary */
+ if (privatelen)
+ {
+ int code = gslt_read_cff_dict(
+ fontobj->cffdata + privateofs,
+ fontobj->cffdata + privateofs + privatelen,
+ fontobj, pt1);
+ if (code < 0)
+ return gs_rethrow(code, "cannot read private dictionary");
+ }
+
+ return 0;
+}
+
+/*
+ * Get the number of items in an INDEX, and return
+ * a pointer to the end of the INDEX or NULL on
+ * failure.
+ */
+static byte *
+gslt_count_cff_index(byte *p, byte *e, int *countp)
+{
+ int count, offsize, last;
+
+ if (p + 3 > e)
+ {
+ gs_throw(-1, "not enough data for index header");
+ return 0;
+ }
+
+ count = u16(p); p += 2;
+ *countp = count;
+
+ if (count == 0)
+ return p;
+
+ offsize = *p++;
+
+ if (offsize < 1 || offsize > 4)
+ {
+ gs_throw(-1, "corrupt index header");
+ return 0;
+ }
+
+ if (p + count * offsize > e)
+ {
+ gs_throw(-1, "not enough data for index offset table");
+ return 0;
+ }
+
+ p += count * offsize;
+ last = uofs(p, offsize);
+ p += offsize;
+ p --; /* stupid offsets */
+
+ if (p + last > e)
+ {
+ gs_throw(-1, "not enough data for index data");
+ return 0;
+ }
+
+ p += last;
+
+ return p;
+}
+
+/*
+ * Locate and store pointers to the data of an
+ * item in the index that starts at 'p'.
+ * Return pointer to the end of the index,
+ * or NULL on failure.
+ */
+static byte *
+gslt_find_cff_index(byte *p, byte *e, int idx, byte **pp, byte **ep)
+{
+ int count, offsize, sofs, eofs, last;
+
+ if (p + 3 > e)
+ {
+ gs_throw(-1, "not enough data for index header");
+ return 0;
+ }
+
+ count = u16(p); p += 2;
+ if (count == 0)
+ return 0;
+
+ offsize = *p++;
+
+ if (offsize < 1 || offsize > 4)
+ {
+ gs_throw(-1, "corrupt index header");
+ return 0;
+ }
+
+ if (p + count * offsize > e)
+ {
+ gs_throw(-1, "not enough data for index offset table");
+ return 0;
+ }
+
+ if (idx < 0 || idx >= count)
+ {
+ gs_throw(-1, "tried to access non-existing index item");
+ return 0;
+ }
+
+ sofs = uofs(p + idx * offsize, offsize);
+ eofs = uofs(p + (idx + 1) * offsize, offsize);
+ last = uofs(p + count * offsize, offsize);
+
+ p += count * offsize;
+ p += offsize;
+ p --; /* stupid offsets */
+
+ if (p + last > e)
+ {
+ gs_throw(-1, "not enough data for index data");
+ return 0;
+ }
+
+ if (sofs < 0 || eofs < 0 || sofs > eofs || eofs > last)
+ {
+ gs_throw(-1, "corrupt index offset table");
+ return 0;
+ }
+
+ *pp = p + sofs;
+ *ep = p + eofs;
+
+ return p + last;
+}
+
+/*
+ * Scan the CFF file structure and extract important data.
+ */
+
+static int
+gslt_read_cff_file(gslt_font_t *fontobj, gs_font_type1 *pt1)
+{
+ byte *p = fontobj->cffdata;
+ byte *e = fontobj->cffend;
+ byte *dictp, *dicte;
+ int ngsubrs;
+ int nsubrs;
+ int count;
+ int code;
+
+ /* CFF header */
+ {
+ int major, minor, hdrsize, offsize;
+
+ if (p + 4 > e)
+ return gs_throw(-1, "not enough data for header");
+
+ major = *p++;
+ minor = *p++;
+ hdrsize = *p++;
+ offsize = *p++;
+
+ if (major != 1 || minor != 0)
+ return gs_throw(-1, "not a CFF 1.0 file");
+
+ if (p + hdrsize - 4 > e)
+ return gs_throw(-1, "not enough data for extended header");
+ }
+
+ /* Name INDEX */
+ p = gslt_count_cff_index(p, e, &count);
+ if (!p)
+ return gs_throw(-1, "cannot read name index");
+ if (count != 1)
+ return gs_throw(-1, "file did not contain exactly one font");
+
+ /* Top Dict INDEX */
+ p = gslt_find_cff_index(p, e, 0, &dictp, &dicte);
+ if (!p)
+ return gs_throw(-1, "cannot read top dict index");
+
+ /* String index */
+ p = gslt_count_cff_index(p, e, &count);
+ if (!p)
+ return gs_throw(-1, "cannot read string index");
+
+ /* Global Subr INDEX */
+ fontobj->gsubrs = p;
+ p = gslt_count_cff_index(p, e, &ngsubrs);
+ if (!p)
+ return gs_throw(-1, "cannot read gsubr index");
+
+ /* Read the top and private dictionaries */
+ code = gslt_read_cff_dict(dictp, dicte, fontobj, pt1);
+ if (code < 0)
+ return gs_rethrow(code, "cannot read top dictionary");
+
+ /* Check the subrs index */
+ nsubrs = 0;
+ if (fontobj->subrs)
+ {
+ p = gslt_count_cff_index(fontobj->subrs, e, &nsubrs);
+ if (!p)
+ return gs_rethrow(-1, "cannot read subrs index");
+ }
+
+ /* Check the charstrings index */
+ if (fontobj->charstrings)
+ {
+ p = gslt_count_cff_index(fontobj->charstrings, e, &count);
+ if (!p)
+ return gs_rethrow(-1, "cannot read charstrings index");
+ }
+
+ pt1->data.subroutineNumberBias = subrbias(nsubrs);
+ pt1->data.gsubrNumberBias = subrbias(ngsubrs);
+ // nominal and defaultWidthX
+
+ return 0;
+}
+
+
+/*
+ *
+ */
+
+static gs_glyph
+gslt_post_callback_encode_char(gs_font *pfont, gs_char chr, gs_glyph_space_t spc)
+{
+ gslt_font_t *xf = pfont->client_data;
+ int value;
+ value = gslt_encode_font_char(xf, chr);
+ if (value == 0)
+ return gs_no_glyph;
+ return value;
+}
+
+static gs_char
+gslt_post_callback_decode_glyph(gs_font *p42, gs_glyph glyph)
+{
+ return GS_NO_CHAR;
+}
+
+static int
+gslt_post_callback_glyph_name(gs_font *pf, gs_glyph glyph, gs_const_string *pstr)
+{
+ return -1;
+}
+
+static int
+gslt_post_callback_glyph_info(gs_font *font, gs_glyph glyph,
+ const gs_matrix *pmat, int members, gs_glyph_info_t *info)
+{
+ return -1;
+}
+
+static int
+gslt_post_callback_glyph_outline(gs_font *font, int wmode, gs_glyph glyph,
+ const gs_matrix *pmat, gx_path *ppath, double sbw[4])
+{
+ dprintf2("glyph_outline wmode=%d glyph=%d\n", wmode, glyph);
+ return -1;
+}
+
+typedef struct gs_type1exec_state_s
+{
+ gs_type1_state cis; /* must be first */
+ /* i_ctx_t *i_ctx_p; */ /* so push/pop can access o-stack */
+ double sbw[4];
+ gs_rect char_bbox;
+ /*
+ * The following elements are only used locally to make the stack clean
+ * for OtherSubrs: they don't need to be declared for the garbage
+ * collector.
+ */
+ void * save_args[6];
+ int num_args;
+ bool AlignToPixels;
+} gs_type1exec_state;
+
+static int
+gslt_post_callback_glyph_data(gs_font_type1 * pfont, gs_glyph glyph, gs_glyph_data_t *pgd)
+{
+ gslt_font_t *fontobj = pfont->client_data;
+ byte *s, *e;
+ byte *p;
+
+ // z1_glyph_data
+ // zchar_charstring_data
+ // gs_glyph_data_from_string
+
+ dprintf1("get glyph data for %d\n", glyph);
+
+ p = gslt_find_cff_index(fontobj->charstrings, fontobj->cffend, glyph, &s, &e);
+ if (!p)
+ return gs_rethrow(-1, "cannot find charstring");
+
+ gs_glyph_data_from_string(pgd, s, e - s, NULL);
+
+ return 0;
+}
+
+static int
+gslt_post_callback_subr_data(gs_font_type1 * pfont,
+ int subr_num, bool global, gs_glyph_data_t *pgd)
+{
+ gslt_font_t *fontobj = pfont->client_data;
+ byte *s, *e;
+ byte *p;
+
+ dprintf2("get %s subr data for %d\n", global?"global":"local", subr_num);
+
+ if (global)
+ {
+ p = gslt_find_cff_index(fontobj->gsubrs, fontobj->cffend, subr_num, &s, &e);
+ if (!p)
+ return gs_rethrow(-1, "cannot find gsubr");
+ }
+ else
+ {
+ p = gslt_find_cff_index(fontobj->subrs, fontobj->cffend, subr_num, &s, &e);
+ if (!p)
+ return gs_rethrow(-1, "cannot find subr");
+ }
+
+ gs_glyph_data_from_string(pgd, s, e - s, NULL);
+
+ return 0;
+}
+
+static int
+gslt_post_callback_seac_data(gs_font_type1 * pfont, int ccode, gs_glyph * pglyph,
+ gs_const_string *gstr, gs_glyph_data_t *pgd)
+{
+ return gs_throw(-1, "seac is deprecated in CFF fonts");
+}
+
+static int
+gslt_post_callback_push(void *callback_data, const fixed *values, int count)
+{
+ return gs_throw(-1, "push not implemented");;
+}
+
+static int
+gslt_post_callback_pop(void *callback_data, fixed *value)
+{
+ return gs_throw(-1, "pop not implemented");;
+}
+
+
+static int
+gslt_cff_append(gs_state *pgs, gs_font_type1 *pt1, gs_glyph glyph, int donthint)
+{
+ int code, value;
+ gs_type1exec_state cxs;
+ gs_glyph_data_t gd;
+ gs_type1_state *const pcis = &cxs.cis;
+ gs_imager_state *pgis = (gs_imager_state*)pgs;
+ gs_glyph_data_t *pgd = &gd;
+ double wv[4];
+ double sbw[4];
+ gs_matrix mtx;
+
+ // get charstring data
+ code = gslt_post_callback_glyph_data(pt1, glyph, pgd);
+ if (code < 0)
+ return gs_rethrow(code, "cannot get glyph data");
+
+ mtx.xx = ctm_only(pgs).xx;
+ mtx.xy = ctm_only(pgs).xy;
+ mtx.yx = ctm_only(pgs).yx;
+ mtx.yy = ctm_only(pgs).yy;
+ mtx.tx = 0.0;
+ mtx.ty = 0.0;
+ gs_matrix_scale(&mtx, 0.001, 0.001, &mtx);
+ gs_matrix_fixed_from_matrix(&pgis->ctm, &mtx);
+ pgis->flatness = 0;
+
+ code = gs_type1_interp_init(&cxs.cis, pgis, pgs->path, NULL, NULL, donthint, 0, pt1);
+ if (code < 0)
+ return gs_throw(code, "cannot init type1 interpreter");
+
+ gs_type1_set_callback_data(pcis, &cxs);
+
+ // TODO: check if this is set in the font dict
+ // gs_type1_set_lsb(pcis, &mpt);
+ // gs_type1_set_width(pcis, &mpt);
+
+ // ...
+
+ while (1)
+ {
+ code = pt1->data.interpret(pcis, pgd, &value);
+ switch (code)
+ {
+ case type1_result_callothersubr: /* unknown OtherSubr */
+ return_error(-15); /* can't handle it */
+ case type1_result_sbw: /* [h]sbw, just continue */
+ type1_cis_get_metrics(pcis, cxs.sbw);
+ type1_cis_get_metrics(pcis, sbw);
+ pgd = 0;
+ break;
+ case 0: /* all done */
+ default: /* code < 0, error */
+ return code;
+ }
+ }
+}
+
+static int
+gslt_post_callback_build_char(gs_text_enum_t *ptextenum, gs_state *pgs,
+ gs_font *pfont, gs_char chr, gs_glyph glyph)
+{
+ gs_show_enum *penum = (gs_show_enum*)ptextenum;
+ gs_font_type1 *pt1 = (gs_font_type1*)pfont;
+ const gs_rect *pbbox;
+ float sbw[4], w2[6];
+ int code;
+
+ dprintf2("build_char chr=%d glyph=%d\n", chr, glyph);
+
+ // get the metrics
+ w2[0] = 0;
+ w2[1] = 1;
+
+ pbbox = &pt1->FontBBox;
+ w2[2] = pbbox->p.x * 0.001;
+ w2[3] = pbbox->p.y * 0.001;
+ w2[4] = pbbox->q.x * 0.001;
+ w2[5] = pbbox->q.y * 0.001;
+
+ /* Expand the bbox when stroking */
+ if ( pfont->PaintType )
+ {
+ float expand = max(1.415, gs_currentmiterlimit(pgs)) * gs_currentlinewidth(pgs) / 2;
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 )
+ return code;
+
+ code = gslt_cff_append(pgs, pt1, glyph,
+ gs_show_in_charpath(penum) != cpm_show);
+ if (code < 0)
+ return code;
+
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ if (code < 0)
+ return code;
+
+ return 0;
+}
+
+int
+gslt_init_postscript_font(gs_memory_t *mem,
+ gs_font_dir *fontdir, gslt_font_t *fontobj)
+{
+ gs_font_type1 *pt1;
+ int cffofs;
+ int cfflen;
+ int code;
+
+ /* Find the CFF table and parse it to create a charstring based font */
+ /* We don't need to support CFF files with multiple fonts */
+ /* Find the VORG table for easier vertical metrics */
+
+#if 0
+ gs_glyph_data_t;
+ gs_type1_data_procs_t {
+ z1_glyph_data, z1_subr_data, z1_seac_data, z1_push, z1_pop
+ };
+ gs_type1_data_s { procs; ...;
+ subroutineNumberBias;
+ gsubrNumberBias;
+ defaultWidthX;
+ nominalWidthX;
+ }
+ gs_font_type1 { font_base_common; data }
+#endif
+
+ cffofs = gslt_find_sfnt_table(fontobj, "CFF ", &cfflen);
+ if (cffofs < 0)
+ return gs_throw(-1, "cannot find CFF table");
+
+ if (cfflen < 0 || cffofs + cfflen > fontobj->length)
+ return gs_throw(-1, "corrupt CFF table location");
+
+ fontobj->cffdata = fontobj->data + cffofs;
+ fontobj->cffend = fontobj->data + cffofs + cfflen;
+
+ fontobj->gsubrs = 0;
+ fontobj->subrs = 0;
+ fontobj->charstrings = 0;
+
+ pt1 = (void*) gs_alloc_struct(mem, gs_font_type1, &st_gs_font_type1, "gslt_font type1");
+ if (!pt1)
+ return gs_throw(-1, "out of memory");
+
+ fontobj->font = (void*) pt1;
+
+ /*
+ * No shortage of things to initialize
+ */
+
+ // build_gs_font_procs
+ // build_gs_primitive_font
+ // build_gs_outline_font
+ // build_base_font = build_gs_simple_font
+ // build_gs_font
+ // init_gs_simple_font
+ // charstring_font_init
+ // glyph_outline = zchar1_glyph_outline
+ // e
+ // define_gs_font
+
+ /* Common to all fonts */
+
+ pt1->next = 0;
+ pt1->prev = 0;
+ pt1->memory = mem;
+
+ pt1->dir = fontdir; /* NB also set by gs_definefont later */
+ pt1->base = fontobj->font; /* NB also set by gs_definefont later */
+ pt1->is_resource = false;
+ gs_notify_init(&pt1->notify_list, gs_memory_stable(mem));
+ pt1->id = gs_next_ids(mem, 1);
+
+ pt1->client_data = fontobj; /* that's us */
+
+ gs_make_identity(&pt1->FontMatrix);
+ gs_make_identity(&pt1->orig_FontMatrix);
+
+ pt1->FontType = ft_encrypted2;
+ pt1->BitmapWidths = true;
+ pt1->ExactSize = fbit_use_outlines;
+ pt1->InBetweenSize = fbit_use_outlines;
+ pt1->TransformedChar = fbit_use_outlines;
+ pt1->WMode = 0;
+ pt1->PaintType = 0;
+ pt1->StrokeWidth = 0;
+
+ pt1->procs.define_font = gs_no_define_font;
+ pt1->procs.make_font = gs_no_make_font;
+ pt1->procs.font_info = gs_default_font_info;
+ // same_font
+ pt1->procs.encode_char = gslt_post_callback_encode_char;
+ pt1->procs.decode_glyph = gslt_post_callback_decode_glyph;
+ // enumerate_glyph
+ pt1->procs.glyph_info = gslt_post_callback_glyph_info;;
+ pt1->procs.glyph_outline = gslt_post_callback_glyph_outline;
+ pt1->procs.glyph_name = gslt_post_callback_glyph_name;
+ pt1->procs.init_fstack = gs_default_init_fstack;
+ pt1->procs.next_char_glyph = gs_default_next_char_glyph;
+ pt1->procs.build_char = gslt_post_callback_build_char;
+
+ pt1->font_name.size = 0;
+ pt1->key_name.size = 0;
+
+ /* Base font specific */
+
+ pt1->FontBBox.p.x = 0; // -0.5;
+ pt1->FontBBox.p.y = 0; // -0.5;
+ pt1->FontBBox.q.x = 0; // 1.5;
+ pt1->FontBBox.q.y = 0; // 1.5;
+
+ uid_set_UniqueID(&pt1->UID, pt1->id);
+
+ pt1->encoding_index = ENCODING_INDEX_UNKNOWN;
+ pt1->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
+
+ pt1->FAPI = 0;
+ pt1->FAPI_font_data = 0;
+
+ /* Type 1/2 specific */
+ /* defaults from the CFF spec */
+
+ pt1->data.procs.glyph_data = gslt_post_callback_glyph_data;
+ pt1->data.procs.subr_data = gslt_post_callback_subr_data;
+ pt1->data.procs.seac_data = gslt_post_callback_seac_data;
+ pt1->data.procs.push_values = gslt_post_callback_push;
+ pt1->data.procs.pop_value = gslt_post_callback_pop;
+
+ pt1->data.interpret = gs_type2_interpret;
+ pt1->data.proc_data = fontobj;
+ pt1->data.parent = NULL;
+ pt1->data.lenIV = -1; // DEFAULT_LENIV_2
+
+ pt1->data.subroutineNumberBias = 0;
+ pt1->data.gsubrNumberBias = 0;
+ pt1->data.initialRandomSeed = 0;
+ pt1->data.defaultWidthX = 0;
+ pt1->data.nominalWidthX = 0;
+
+ pt1->data.BlueFuzz = 1;
+ pt1->data.BlueScale = 0.039625;
+ pt1->data.BlueShift = 7;
+ pt1->data.BlueValues.count = 0;
+ pt1->data.ExpansionFactor = 0.06;
+ pt1->data.ForceBold = 0;
+ pt1->data.FamilyBlues.count = 0;
+ pt1->data.FamilyOtherBlues.count = 0;
+ pt1->data.LanguageGroup = 0;
+ pt1->data.OtherBlues.count = 0;
+
+ pt1->data.RndStemUp = 0;
+ memset(&pt1->data.StdHW, 0, sizeof(pt1->data.StdHW));
+ memset(&pt1->data.StdVW, 0, sizeof(pt1->data.StdVW));
+ memset(&pt1->data.StemSnapH, 0, sizeof(pt1->data.StemSnapH));
+ memset(&pt1->data.StemSnapV, 0, sizeof(pt1->data.StemSnapH));
+ memset(&pt1->data.WeightVector, 0, sizeof(pt1->data.WeightVector));
+
+ code = gslt_read_cff_file(fontobj, pt1);
+ if (code < 0)
+ {
+ // TODO free pt1 here?
+ return gs_rethrow(code, "cannot read cff file structure");
+ }
+
+ gs_definefont(fontdir, fontobj->font);
+
+ return 0;
+}
+
diff --git a/tools/gslite/gslt_font_encoding.c b/tools/gslite/gslt_font_encoding.c
new file mode 100644
index 000000000..fc0eb47af
--- /dev/null
+++ b/tools/gslite/gslt_font_encoding.c
@@ -0,0 +1,215 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+#include "gslt_font_int.h"
+
+#include "gslt.h"
+#include "gslt_font.h"
+
+/*
+ * Locate the 'cmap' table and count the number of subtables.
+ */
+
+int
+gslt_load_sfnt_cmap(gslt_font_t *xf)
+{
+ byte *cmapdata;
+ int offset, length;
+ int nsubtables;
+
+ offset = gslt_find_sfnt_table(xf, "cmap", &length);
+ if (offset < 0)
+ return -1;
+
+ if (length < 4)
+ return -1;
+
+ cmapdata = xf->data + offset;
+
+ nsubtables = u16(cmapdata + 2);
+ if (nsubtables < 0)
+ return -1;
+ if (length < 4 + nsubtables * 8)
+ return -1;
+
+ xf->cmaptable = offset;
+ xf->cmapsubcount = nsubtables;
+ xf->cmapsubtable = 0;
+
+ return 0;
+}
+
+/*
+ * Return the number of cmap subtables.
+ */
+
+int
+gslt_count_font_encodings(gslt_font_t *xf)
+{
+ return xf->cmapsubcount;
+}
+
+/*
+ * Extract PlatformID and EncodingID for a cmap subtable.
+ */
+
+int
+gslt_identify_font_encoding(gslt_font_t *xf, int idx, int *pid, int *eid)
+{
+ byte *cmapdata, *entry;
+ if (idx < 0 || idx >= xf->cmapsubcount)
+ return -1;
+ cmapdata = xf->data + xf->cmaptable;
+ entry = cmapdata + 4 + idx * 8;
+ *pid = u16(entry + 0);
+ *eid = u16(entry + 2);
+ return 0;
+}
+
+/*
+ * Select a cmap subtable for use with encoding functions.
+ */
+
+int
+gslt_select_font_encoding(gslt_font_t *xf, int idx)
+{
+ byte *cmapdata, *entry;
+ int pid, eid;
+ if (idx < 0 || idx >= xf->cmapsubcount)
+ return -1;
+ cmapdata = xf->data + xf->cmaptable;
+ entry = cmapdata + 4 + idx * 8;
+ pid = u16(entry + 0);
+ eid = u16(entry + 2);
+ xf->cmapsubtable = xf->cmaptable + u32(entry + 4);
+ xf->usepua = (pid == 3 && eid == 0);
+ return 0;
+}
+
+/*
+ * Encode a character using the selected cmap subtable.
+ * TODO: extend this to cover more cmap formats.
+ */
+
+static int
+gslt_encode_font_char_int(gslt_font_t *xf, int code)
+{
+ byte *table;
+
+ /* no cmap selected: return identity */
+ if (xf->cmapsubtable <= 0)
+ return code;
+
+ table = xf->data + xf->cmapsubtable;
+
+ switch (u16(table))
+ {
+ case 0: /* Apple standard 1-to-1 mapping. */
+ return table[code + 6];
+
+ case 4: /* Microsoft/Adobe segmented mapping. */
+ {
+ int segCount2 = u16(table + 6);
+ byte *endCount = table + 14;
+ byte *startCount = endCount + segCount2 + 2;
+ byte *idDelta = startCount + segCount2;
+ byte *idRangeOffset = idDelta + segCount2;
+ int i2;
+
+ for (i2 = 0; i2 < segCount2 - 3; i2 += 2)
+ {
+ int delta, roff;
+ int start = u16(startCount + i2);
+ int glyph;
+
+ if ( code < start )
+ return 0;
+ if ( code > u16(endCount + i2) )
+ continue;
+ delta = s16(idDelta + i2);
+ roff = s16(idRangeOffset + i2);
+ if ( roff == 0 )
+ {
+ return ( code + delta ) & 0xffff; /* mod 65536 */
+ return 0;
+ }
+ glyph = u16(idRangeOffset + i2 + roff + ((code - start) << 1));
+ return (glyph == 0 ? 0 : glyph + delta);
+ }
+
+ /*
+ * The TrueType documentation says that the last range is
+ * always supposed to end with 0xffff, so this shouldn't
+ * happen; however, in some real fonts, it does.
+ */
+ return 0;
+ }
+
+ case 6: /* Single interval lookup. */
+ {
+ int firstCode = u16(table + 6);
+ int entryCount = u16(table + 8);
+ if ( code < firstCode || code >= firstCode + entryCount )
+ return 0;
+ return u16(table + 10 + ((code - firstCode) << 1));
+ }
+
+ case 10: /* Trimmed array (like 6) */
+ {
+ int startCharCode = u32(table + 12);
+ int numChars = u32(table + 16);
+ if ( code < startCharCode || code >= startCharCode + numChars )
+ return 0;
+ return u32(table + 20 + (code - startCharCode) * 4);
+ }
+
+ case 12: /* Segmented coverage. (like 4) */
+ {
+ int nGroups = u32(table + 12);
+ byte *group = table + 16;
+ int i;
+
+ for (i = 0; i < nGroups; i++)
+ {
+ int startCharCode = u32(group + 0);
+ int endCharCode = u32(group + 4);
+ int startGlyphID = u32(group + 8);
+ if ( code < startCharCode )
+ return 0;
+ if ( code <= endCharCode )
+ return startGlyphID + (code - startCharCode);
+ group += 12;
+ }
+
+ return 0;
+ }
+
+ case 2: /* High-byte mapping through table. */
+ case 8: /* Mixed 16-bit and 32-bit coverage (like 2) */
+ default:
+ errprintf("error: unknown cmap format: %d\n", u16(table));
+ return 0;
+ }
+
+ return 0;
+}
+
+int
+gslt_encode_font_char(gslt_font_t *xf, int code)
+{
+ int gid = gslt_encode_font_char_int(xf, code);
+ if (gid == 0 && xf->usepua)
+ gid = gslt_encode_font_char_int(xf, 0xF000 | code);
+ return gid;
+}
+
diff --git a/tools/gslite/gslt_font_glyph.c b/tools/gslite/gslt_font_glyph.c
new file mode 100644
index 000000000..f4f809edd
--- /dev/null
+++ b/tools/gslite/gslt_font_glyph.c
@@ -0,0 +1,334 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+#include "gslt_font_int.h"
+
+#include "gslt.h"
+#include "gslt_font.h"
+
+void
+gslt_retain_font_glyph(gs_memory_t *mem, gslt_glyph_bitmap_t *slot)
+{
+ gx_retain_cached_char(slot->cc);
+}
+
+void
+gslt_release_font_glyph(gs_memory_t *mem, gslt_glyph_bitmap_t *slot)
+{
+ gx_release_cached_char(slot->cc);
+}
+
+/*
+ * Draw a glyph to the device, and extract the bitmap from
+ * the ccache afterwards... only works if the bitmap is not
+ * too large.
+ */
+
+int
+gslt_render_font_glyph(gs_state *pgs, gslt_font_t *xf, gs_matrix *tm, int gid, gslt_glyph_bitmap_t *slot)
+{
+ gs_fixed_point subpixel = {0, 0}; /* we don't use subpixel accurate device metrics */
+ gs_log2_scale_point oversampling = {0, 0}; /* we don't use oversampling */
+ gs_text_params_t params;
+ gs_text_enum_t *textenum;
+ gs_matrix matrix;
+ cached_fm_pair *ppair;
+ cached_char *cc;
+ int code;
+
+ /* get the real font matrix (this is a little dance) */
+ gs_setfont(pgs, xf->font); /* set pgs->font and invalidate existing charmatrix */
+ gs_setcharmatrix(pgs, tm); /* set the charmatrix to ctm * tm */
+ gs_currentcharmatrix(pgs, &matrix, true); /* extract charmatrix (and multiply by FontMatrix) */
+
+ // dprintf4("tm = [%g %g %g %g]\n", matrix.xx, matrix.xy, matrix.yx, matrix.yy);
+
+ /* find the font/matrix pair (or add it) */
+ code = gx_lookup_fm_pair(xf->font, &matrix, &oversampling, false, &ppair);
+ if (code != 0)
+ return gs_throw(-1, "cannot gx_lookup_fm_pair()");
+
+ cc = gx_lookup_cached_char(xf->font, ppair, gid, 0, 1, &subpixel);
+ if (!cc)
+ {
+ /* No luck ... now we need to get it into the cache somehow.
+ *
+ * We do this by rendering one glyph (that's why we need a device and pgs).
+ * The renderer always renders the bitmap into the cache, and draws
+ * from out of the cache when blitting to the device.
+ *
+ * Things don't get evicted from the cache until there is a collision,
+ * so we have a safe window to snarf it back out of the cache
+ * after it's been drawn to the device.
+ */
+
+ // dprintf1("cache miss for glyph %d\n", gid);
+
+ params.operation = TEXT_FROM_SINGLE_GLYPH | TEXT_DO_DRAW | TEXT_RETURN_WIDTH;
+ params.data.d_glyph = gid;
+ params.size = 1;
+
+ gs_moveto(pgs, 100.0, 100.0); // why?
+
+ code = gs_text_begin(pgs, &params, xf->font->memory, &textenum);
+ if (code != 0)
+ return gs_throw1(-1, "cannot gs_text_begin() (%d)", code);
+
+ code = gs_text_process(textenum);
+ if (code != 0)
+ return gs_throw1(-1, "cannot gs_text_process() (%d)", code);
+
+ gs_text_release(textenum, "gslt font render");
+
+ cc = gx_lookup_cached_char(xf->font, ppair, gid, 0, 1, &subpixel);
+ if (!cc)
+ {
+ /* merde! it rendered but was not placed in the cache. */
+ return gs_throw(-2, "cannot render from cache");
+ }
+ }
+
+ /* copy values from the cache into the client struct */
+ slot->w = cc->width;
+ slot->h = cc->height;
+ slot->stride = cc_raster(cc);
+ slot->lsb = fixed2int(cc->offset.x);
+ slot->top = fixed2int(cc->offset.y);
+
+ slot->cc = cc;
+ slot->data = cc_bits(cc);
+ gx_retain_cached_char(cc);
+
+#define XXX
+#ifndef XXX
+ static int xxx = 0; /* declaration out in the wild not allowed in ansi c */
+ dprintf1("glyph %d\n", xxx);
+ debug_dump_bitmap(cc_bits(cc), cc_raster(cc), cc->height, "");
+ {
+ char fn[32];
+ sprintf(fn, "glyph%d.pbm", xxx);
+ FILE *fo = fopen(fn, "wb");
+ if (!fo)
+ return -1;
+ fprintf(fo, "P4\n%d %d\n", cc->width, cc->height);
+ int y;
+ int s = (cc->width + 7) / 8;
+ for (y = 0; y < cc->height; y++)
+ fwrite(cc_bits(cc) + y * cc_raster(cc), 1, s, fo);
+ fclose(fo);
+ }
+ xxx ++;
+#endif
+
+ return 0;
+}
+
+int
+gslt_outline_font_glyph(gs_state *pgs, gslt_font_t *xf, int gid, gslt_outline_walker_t *walk)
+{
+ gs_text_params_t params;
+ gs_text_enum_t *textenum;
+ gs_matrix matrix;
+ segment *seg;
+ curve_segment *cseg;
+
+ gs_gsave(pgs);
+ gs_make_identity(&matrix);
+ gs_setmatrix(pgs, &matrix);
+ gs_scale(pgs, 1000.0, 1000.0); /* otherwise we hit serious precision problems with fixpoint math */
+
+ /* set gstate params */
+ gs_setfont(pgs, xf->font); /* set pgs->font and invalidate existing charmatrix */
+ gs_make_identity(&matrix);
+ gs_setcharmatrix(pgs, &matrix); /* set the charmatrix to identity */
+
+ /* reset the path */
+ gs_newpath(pgs);
+ gs_moveto(pgs, 0.0, 0.0);
+
+ /* draw the glyph, in charpath mode */
+ params.operation = TEXT_FROM_SINGLE_GLYPH | TEXT_DO_FALSE_CHARPATH | TEXT_RETURN_WIDTH;
+ params.data.d_glyph = gid;
+ params.size = 1;
+
+ if (gs_text_begin(pgs, &params, xf->font->memory, &textenum) != 0)
+ return gs_throw(-1, "cannot gs_text_begin()");
+ if (gs_text_process(textenum) != 0)
+ return gs_throw(-1, "cannot gs_text_process()");
+ gs_text_release(textenum, "gslt font outline");
+
+ /* walk the resulting path */
+ seg = (segment*)pgs->path->first_subpath;
+ while (seg)
+ {
+ switch (seg->type)
+ {
+ case s_start:
+ walk->moveto(walk->user,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ case s_line:
+ walk->lineto(walk->user,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ case s_line_close:
+ walk->closepath(walk->user);
+ break;
+ case s_curve:
+ cseg = (curve_segment*)seg;
+ walk->curveto(walk->user,
+ fixed2float(cseg->p1.x) * 0.001,
+ fixed2float(cseg->p1.y) * 0.001,
+ fixed2float(cseg->p2.x) * 0.001,
+ fixed2float(cseg->p2.y) * 0.001,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ }
+ seg = seg->next;
+ }
+
+ /* and toss it away... */
+ gs_newpath(pgs);
+
+ gs_grestore(pgs);
+ return 0;
+}
+
+int
+gslt_measure_font_glyph(gs_state *pgs, gslt_font_t *xf, int gid, gslt_glyph_metrics_t *mtx)
+{
+ int head, format, loca, glyf;
+ int ofs, len;
+ int idx, i, n;
+ int hadv, vadv, vorg;
+ int vtop, ymax, desc;
+ int scale;
+
+ /* some insane defaults */
+
+ scale = 2048; /* units-per-em */
+ mtx->hadv = 0.5;
+ mtx->vadv = -1.0;
+ mtx->vorg = 1.0;
+
+ /*
+ * Horizontal metrics are easy.
+ */
+
+ ofs = gslt_find_sfnt_table(xf, "hhea", &len);
+ if (ofs < 0)
+ return gs_throw(-1, "cannot find hhea table");
+
+ if (len < 2 * 18)
+ return gs_throw(-1, "hhea table is too short");
+
+ vorg = s16(xf->data + ofs + 4); /* ascender is default vorg */
+ desc = s16(xf->data + ofs + 6); /* descender */
+ if (desc < 0)
+ desc = -desc;
+ n = u16(xf->data + ofs + 17 * 2);
+
+ ofs = gslt_find_sfnt_table(xf, "hmtx", &len);
+ if (ofs < 0)
+ return gs_throw(-1, "cannot find hmtx table");
+
+ idx = gid;
+ if (idx > n - 1)
+ idx = n - 1;
+
+ hadv = u16(xf->data + ofs + idx * 4);
+ vadv = 0;
+
+ /*
+ * Vertical metrics are hairy (with missing tables).
+ */
+
+ head = gslt_find_sfnt_table(xf, "head", &len);
+ if (head > 0)
+ {
+ scale = u16(xf->data + head + 18); /* units per em */
+ }
+
+ ofs = gslt_find_sfnt_table(xf, "OS/2", &len);
+ if (ofs > 0 && len > 70)
+ {
+ vorg = s16(xf->data + ofs + 68); /* sTypoAscender */
+ desc = s16(xf->data + ofs + 70); /* sTypoDescender */
+ if (desc < 0)
+ desc = -desc;
+ }
+
+ ofs = gslt_find_sfnt_table(xf, "vhea", &len);
+ if (ofs > 0)
+ {
+ if (len < 2 * 18)
+ return gs_throw(-1, "vhea table is too short");
+
+ n = u16(xf->data + ofs + 17 * 2);
+
+ ofs = gslt_find_sfnt_table(xf, "vmtx", &len);
+ if (ofs < 0)
+ return gs_throw(-1, "cannot find vmtx table");
+
+ idx = gid;
+ if (idx > n - 1)
+ idx = n - 1;
+
+ vadv = u16(xf->data + ofs + idx * 4);
+ vtop = u16(xf->data + ofs + idx * 4 + 2);
+
+ glyf = gslt_find_sfnt_table(xf, "glyf", &len);
+ loca = gslt_find_sfnt_table(xf, "loca", &len);
+ if (head > 0 && glyf > 0 && loca > 0)
+ {
+ format = u16(xf->data + head + 50); /* indexToLocaFormat */
+
+ if (format == 0)
+ ofs = u16(xf->data + loca + gid * 2) * 2;
+ else
+ ofs = u32(xf->data + loca + gid * 4);
+
+ ymax = u16(xf->data + glyf + ofs + 8); /* yMax */
+
+ vorg = ymax + vtop;
+ }
+ }
+
+ ofs = gslt_find_sfnt_table(xf, "VORG", &len);
+ if (ofs > 0)
+ {
+ vorg = u16(xf->data + ofs + 6);
+ n = u16(xf->data + ofs + 6);
+ for (i = 0; i < n; i++)
+ {
+ if (u16(xf->data + ofs + 8 + 4 * i) == gid)
+ {
+ vorg = s16(xf->data + ofs + 8 + 4 * i + 2);
+ break;
+ }
+ }
+ }
+
+ if (vadv == 0)
+ vadv = vorg + desc;
+
+ mtx->hadv = hadv / (float) scale;
+ mtx->vadv = vadv / (float) scale;
+ mtx->vorg = vorg / (float) scale;
+
+ return 0;
+}
+
diff --git a/tools/gslite/gslt_font_int.h b/tools/gslite/gslt_font_int.h
new file mode 100644
index 000000000..3fe0001ba
--- /dev/null
+++ b/tools/gslite/gslt_font_int.h
@@ -0,0 +1,107 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* No shortage of gslib headers to include... */
+
+#ifndef GSLITE
+#define GSLITE
+#endif
+
+#include <stdlib.h>
+#include "stdio_.h"
+#include "math_.h"
+#include "string_.h"
+
+#include "gp.h"
+
+#include "gscdefs.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gslib.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsutil.h"
+#include "gsgdata.h"
+
+#include "gx.h"
+#include "gxdevice.h"
+#include "gxmatrix.h"
+#include "gxpath.h"
+
+#include "gxfont.h"
+#include "gxchar.h"
+#include "gxtype1.h"
+#include "gxfont1.h"
+#include "gxfont42.h"
+#include "gxfcache.h"
+
+#include "gzstate.h"
+#include "gzpath.h"
+
+/*
+ * Font API internals.
+ */
+
+struct gslt_font_s
+{
+ byte *data;
+ int length;
+ gs_font *font;
+
+ int subfontid;
+ int cmaptable;
+ int cmapsubcount;
+ int cmapsubtable;
+ int usepua;
+
+ /* these are for CFF opentypes only */
+ byte *cffdata;
+ byte *cffend;
+ byte *gsubrs;
+ byte *subrs;
+ byte *charstrings;
+};
+
+int gslt_find_sfnt_table(struct gslt_font_s *xf, char *name, int *lengthp);
+int gslt_load_sfnt_cmap(struct gslt_font_s *xf);
+int gslt_init_truetype_font(gs_memory_t *mem, gs_font_dir *xfc, struct gslt_font_s *xf);
+int gslt_init_postscript_font(gs_memory_t *mem, gs_font_dir *xfc, struct gslt_font_s *xf);
+
+/*
+ * Big-endian memory accessor functions
+ */
+
+static inline int s16(byte *p)
+{
+ return (signed short)( (p[0] << 8) | p[1] );
+}
+
+static inline int u16(byte *p)
+{
+ return (p[0] << 8) | p[1];
+}
+
+static inline int u24(byte *p)
+{
+ return (p[0] << 16) | (p[1] << 8) | p[2];
+}
+
+static inline int u32(byte *p)
+{
+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
diff --git a/tools/gslite/gslt_font_test.c b/tools/gslite/gslt_font_test.c
new file mode 100644
index 000000000..44fa42352
--- /dev/null
+++ b/tools/gslite/gslt_font_test.c
@@ -0,0 +1,319 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_font_api_test.c 2490 2006-08-08 22:33:47Z giles $ */
+/* gslt OpenType font library example client */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gserror.h>
+
+#include "gslt.h"
+#include "gslt_font.h"
+
+/*
+ * Read a file from disk into memory.
+ */
+
+int readfile(char *filename, char **datap, int *lengthp)
+{
+ FILE *fp;
+ int t, n;
+ char *p;
+
+ fp = fopen(filename, "rb");
+ if (!fp) {
+ printf("cannot open font file\n");
+ return 1;
+ }
+ t = fseek(fp, 0, 2);
+ if (t < 0)
+ {
+ fclose(fp);
+ printf("cannot seek in font file\n");
+ return 1;
+ }
+
+ n = ftell(fp);
+ if (n < 0)
+ {
+ fclose(fp);
+ printf("cannot tell in font file\n");
+ return 1;
+ }
+
+ t = fseek(fp, 0, 0);
+ if (t < 0)
+ {
+ fclose(fp);
+ printf("cannot seek in font file\n");
+ return 1;
+ }
+
+ p = malloc(n);
+ if (!p)
+ {
+ fclose(fp);
+ printf("out of memory\n");
+ return 1;
+ }
+
+ t = fread(p, 1, n, fp);
+ if (t != n)
+ {
+ free(p);
+ fclose(fp);
+ printf("cannot read font file data\n");
+ return 1;
+ }
+
+ t = fclose(fp);
+ if (t < 0)
+ {
+ printf("cannot close font file\n");
+ /* ... continue anyway */
+ }
+
+ *lengthp = n;
+ *datap = p;
+
+ return 0;
+}
+
+/*
+ * Test program.
+ */
+
+static int mymoveto(void *ctx, float x, float y)
+{
+ x *= 1000; y *= 1000;
+ printf("%g %g moveto\n", x, y);
+ return 0;
+}
+
+static int mylineto(void *ctx, float x, float y)
+{
+ x *= 1000; y *= 1000;
+ printf("%g %g lineto\n", x, y);
+ return 0;
+}
+
+static int mycurveto(void *ctx, float x0, float y0, float x1, float y1, float x2, float y2)
+{
+ x0 *= 1000; y0 *= 1000;
+ x1 *= 1000; y1 *= 1000;
+ x2 *= 1000; y2 *= 1000;
+ printf("%g %g %g %g %g %g curveto\n", x0, y0, x1, y1, x2, y2);
+ return 0;
+}
+
+static int myclosepath(void *ctx)
+{
+ printf("closepath\n");
+ return 0;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ gs_memory_t *mem;
+ gx_device *dev;
+ gs_state *pgs;
+ gs_font_dir *cache;
+ gslt_font_t *font;
+ gslt_outline_walker_t walk;
+ gslt_glyph_bitmap_t slot;
+ gslt_glyph_metrics_t mtx;
+ gs_matrix ctm;
+ int code;
+ char *s;
+ char *devicename;
+ char *filename;
+ int i, k, n, pid, eid, best;
+ int subfontid;
+ char *buf;
+ int len;
+
+ char *text;
+
+ devicename = getenv("DEVICE");
+ if (!devicename)
+ devicename = "nullpage";
+
+ mem = gslt_init_library();
+ dev = gslt_init_device(mem, devicename);
+ pgs = gslt_init_state(mem, dev);
+
+ if (argc < 2)
+ {
+ filename = "/Users/tor/src/work/gslite/TrajanPro-Regular.otf";
+ // filename = "/Users/tor/src/work/gslite/GenR102.TTF";
+ // return gs_throw(1, "usage: gslt_font_api_test font.otf [subfontid]");
+ }
+ else
+ {
+ filename = argv[1];
+ }
+
+ subfontid = 0;
+ if (argc == 3)
+ subfontid = atoi(argv[2]);
+
+ printf("Loading font '%s' subfont %d.\n", filename, subfontid);
+
+ n = readfile(filename, &buf, &len);
+ if (n < 0) {
+ printf("cannot read font file '%s'", filename);
+ return 1;
+ }
+
+ /*
+ * Set up ghostscript library
+ */
+
+ // gslt_get_device_param(mem, dev, "Name");
+ gslt_set_device_param(mem, dev, "OutputFile", "-");
+
+
+ /*
+ * Create a font cache
+ */
+
+ cache = gslt_new_font_cache(mem);
+ if (!cache) {
+ printf("cannot create font cache\n");
+ return 1;
+ }
+
+ /*
+ * Create the font and select an encoding
+ */
+
+ font = gslt_new_font(mem, cache, buf, len, subfontid);
+ if (!font) {
+ printf("cannot create font");
+ return 1;
+ }
+
+ static struct { int pid, eid; } xps_cmap_list[] =
+ {
+ { 3, 10 }, /* Unicode with surrogates */
+ { 3, 1 }, /* Unicode without surrogates */
+ { 3, 5 }, /* Wansung */
+ { 3, 4 }, /* Big5 */
+ { 3, 3 }, /* Prc */
+ { 3, 2 }, /* ShiftJis */
+ { 3, 0 }, /* Symbol */
+ // { 0, * }, -- Unicode (deprecated)
+ { 1, 0 },
+ { -1, -1 },
+ };
+
+ n = gslt_count_font_encodings(font);
+ best = -1;
+ for (k = 0; xps_cmap_list[k].pid != -1; k++)
+ {
+ for (i = 0; i < n; i++)
+ {
+ gslt_identify_font_encoding(font, i, &pid, &eid);
+ if (pid == xps_cmap_list[k].pid && eid == xps_cmap_list[k].eid)
+ goto found_cmap;
+ }
+ }
+ gs_throw(-1, "could not find a suitable cmap");
+ return 1;
+
+found_cmap:
+ printf("found a cmap to use %d %d\n", pid, eid);
+ gslt_select_font_encoding(font, i);
+
+ /*
+ * Test outline extraction.
+ */
+
+ printf("walking the outline\n");
+
+ walk.user = NULL;
+ walk.moveto = mymoveto;
+ walk.lineto = mylineto;
+ walk.curveto = mycurveto;
+ walk.closepath = myclosepath;
+
+ code = gslt_outline_font_glyph(pgs, font, gslt_encode_font_char(font, 'I'), &walk);
+ if (code < 0)
+ printf("error in gslt_outline_font_glyph\n");
+
+ /*
+ * Test bitmap rendering.
+ */
+
+ printf("getting bitmaps\n");
+
+ text = "Pack my box with five dozen liquor jugs!";
+
+text = "This";
+
+ ctm.xx = 100.0;
+ ctm.xy = 0.0;
+ ctm.yx = 0.0;
+ ctm.yy = 100.0;
+ ctm.tx = ctm.ty = 0.0;
+
+ for (s = text; *s; s++)
+ {
+ int gid = gslt_encode_font_char(font, *s);
+
+ if (s == text)
+ gid = 2119;
+
+ printf("char '%c' -> glyph %d\n", *s, gid);
+
+ code = gslt_measure_font_glyph(pgs, font, gid, &mtx);
+ if (code < 0)
+ {
+ printf("error in gslt_measure_font_glyph\n");
+ }
+
+ printf("glyph %3d: hadv=%f vadv=%f vorg=%f ", gid, mtx.hadv, mtx.vadv, mtx.vorg);
+
+ code = gslt_render_font_glyph(pgs, font, &ctm, gid, &slot);
+ if (code < 0)
+ {
+ printf("error in gslt_render_font_glyph\n");
+ return 1;
+ }
+
+ printf(" -> %dx%d+(%d,%d)\n",
+ slot.w, slot.h,
+ slot.lsb, slot.top);
+
+ gslt_release_font_glyph(mem, &slot);
+ }
+
+ /*
+ * Clean up.
+ */
+ gslt_free_font(mem, font);
+ gslt_free_font_cache(mem, cache);
+ free(buf);
+
+ gslt_free_state(mem, pgs);
+ gslt_free_device(mem, dev);
+ gslt_free_library(mem);
+
+ gslt_alloc_print_leaks();
+
+ return 0;
+}
+
diff --git a/tools/gslite/gslt_font_ttf.c b/tools/gslite/gslt_font_ttf.c
new file mode 100644
index 000000000..3829ab28d
--- /dev/null
+++ b/tools/gslite/gslt_font_ttf.c
@@ -0,0 +1,196 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+#include "gslt_font_int.h"
+
+#include "gslt.h"
+#include "gslt_font.h"
+
+/*
+ * A bunch of callback functions that the ghostscript
+ * font machinery will call. The most important one
+ * is the build_char function. These are specific to
+ * truetype (loca/glyf) flavored opentypes.
+ */
+
+static gs_glyph
+gslt_true_callback_encode_char(gs_font *pfont, gs_char chr, gs_glyph_space_t spc)
+{
+ gslt_font_t *xf = pfont->client_data;
+ int value;
+ value = gslt_encode_font_char(xf, chr);
+ if (value == 0)
+ return gs_no_glyph;
+ return value;
+}
+
+static gs_char
+gslt_true_callback_decode_glyph(gs_font *p42, gs_glyph glyph)
+{
+ return GS_NO_CHAR;
+}
+
+static int
+gslt_true_callback_glyph_name(gs_font *pf, gs_glyph glyph, gs_const_string *pstr)
+{
+ return 0;
+}
+
+static int
+gslt_true_callback_string_proc(gs_font_type42 *p42, ulong offset, uint length, const byte **pdata)
+{
+ /* NB bounds check offset + length - use gs_object_size for memory
+ buffers - if file read should fail */
+ gslt_font_t *xf = p42->client_data;
+// ulong adjusted_offset = offset + ttc_offset;
+ *pdata = xf->data + offset;
+ return 0;
+}
+
+static int
+gslt_true_callback_build_char(gs_text_enum_t *ptextenum, gs_state *pgs, gs_font *pfont,
+ gs_char chr, gs_glyph glyph)
+{
+ gs_show_enum *penum = (gs_show_enum*)ptextenum;
+ gs_font_type42 *p42 = (gs_font_type42*)pfont;
+ const gs_rect *pbbox;
+ float sbw[4], w2[6];
+ int code;
+
+ code = gs_type42_get_metrics(p42, glyph, sbw);
+ if (code < 0)
+ return code;
+
+ w2[0] = sbw[2];
+ w2[1] = sbw[3];
+
+ pbbox = &p42->FontBBox;
+ w2[2] = pbbox->p.x;
+ w2[3] = pbbox->p.y;
+ w2[4] = pbbox->q.x;
+ w2[5] = pbbox->q.y;
+
+ dprintf6(" bbox (%g %g) %g %g %g %g\n", w2[0], w2[1], w2[2], w2[3], w2[4], w2[5]);
+
+ /* Expand the bbox when stroking */
+ if ( pfont->PaintType )
+ {
+ float expand = max(1.415, gs_currentmiterlimit(pgs)) * gs_currentlinewidth(pgs) / 2;
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 )
+ return code;
+
+ code = gs_type42_append(glyph, pgs,
+ gx_current_path(pgs),
+ ptextenum, (gs_font*)p42,
+ gs_show_in_charpath(penum) != cpm_show);
+ if (code < 0)
+ return code;
+
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ if (code < 0)
+ return code;
+
+ return 0;
+}
+
+/*
+ * Initialize the ghostscript font machinery for a truetype
+ * (type42 in postscript terminology) font.
+ */
+
+int
+gslt_init_truetype_font(gs_memory_t *mem, gs_font_dir *fontdir, gslt_font_t *xf)
+{
+ xf->font = (void*) gs_alloc_struct(mem, gs_font_type42, &st_gs_font_type42, "gslt_font type42");
+ if (!xf->font)
+ return gs_throw(-1, "out of memory");
+
+ /* no shortage of things to initialize */
+ {
+ gs_font_type42 *p42 = (gs_font_type42*) xf->font;
+
+ /* Common to all fonts: */
+
+ p42->next = 0;
+ p42->prev = 0;
+ p42->memory = mem;
+
+ p42->dir = fontdir; /* NB also set by gs_definefont later */
+ p42->base = xf->font; /* NB also set by gs_definefont later */
+ p42->is_resource = false;
+ gs_notify_init(&p42->notify_list, gs_memory_stable(mem));
+ p42->id = gs_next_ids(mem, 1);
+
+ p42->client_data = xf; /* that's us */
+
+ gs_make_identity(&p42->FontMatrix);
+ gs_make_identity(&p42->orig_FontMatrix); /* NB ... original or zeroes? */
+
+ p42->FontType = ft_TrueType;
+ p42->BitmapWidths = true;
+ p42->ExactSize = fbit_use_outlines;
+ p42->InBetweenSize = fbit_use_outlines;
+ p42->TransformedChar = fbit_use_outlines;
+ p42->WMode = 0;
+ p42->PaintType = 0;
+ p42->StrokeWidth = 0;
+
+ p42->procs.init_fstack = gs_default_init_fstack;
+ p42->procs.next_char_glyph = gs_default_next_char_glyph;
+ p42->procs.glyph_name = gslt_true_callback_glyph_name;
+ p42->procs.decode_glyph = gslt_true_callback_decode_glyph;
+ p42->procs.define_font = gs_no_define_font;
+ p42->procs.make_font = gs_no_make_font;
+ p42->procs.font_info = gs_default_font_info;
+ p42->procs.glyph_info = gs_default_glyph_info;
+ p42->procs.glyph_outline = gs_no_glyph_outline;
+ p42->procs.encode_char = gslt_true_callback_encode_char;
+ p42->procs.build_char = gslt_true_callback_build_char;
+
+ p42->font_name.size = 0;
+ p42->key_name.size = 0;
+
+ /* Base font specific: */
+
+ p42->FontBBox.p.x = 0;
+ p42->FontBBox.p.y = 0;
+ p42->FontBBox.q.x = 0;
+ p42->FontBBox.q.y = 0;
+
+ uid_set_UniqueID(&p42->UID, p42->id);
+
+ p42->encoding_index = ENCODING_INDEX_UNKNOWN;
+ p42->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
+
+ p42->FAPI = 0;
+ p42->FAPI_font_data = 0;
+
+ /* Type 42 specific: */
+
+ p42->data.string_proc = gslt_true_callback_string_proc;
+ p42->data.proc_data = xf;
+ gs_type42_font_init(p42, xf->subfontid);
+ }
+
+ gs_definefont(fontdir, xf->font);
+
+ return 0;
+}
+
diff --git a/tools/gslite/gslt_image.c b/tools/gslite/gslt_image.c
new file mode 100644
index 000000000..09f463f76
--- /dev/null
+++ b/tools/gslite/gslt_image.c
@@ -0,0 +1,117 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image.c 2991 2007-12-18 23:05:58Z giles $ */
+/* gslt image loading implementation */
+
+#include "memory_.h"
+#include "gsmemory.h"
+#include "gp.h"
+#include "gslt_image.h"
+#include "ctype_.h"
+#include "strimpl.h"
+#include "scommon.h"
+#include "jpeglib_.h" /* for jpeg filter */
+#include "sdct.h"
+#include "sjpeg.h"
+#include "gdebug.h"
+#include "gsutil.h"
+#include "gserror.h"
+
+/* gs memory management structure descriptor for gslt_image_t */
+/* normally this would be in the header with the structure
+ declaration, with which is must be synchronized, but we
+ wish to hide such details from the client */
+#define public_st_gslt_image() \
+ gs_public_st_ptrs1(st_gslt_image, gslt_image_t,\
+ "gslt_image_t", gslt_image_enum_ptrs, gslt_image_reloc_ptrs,\
+ samples)
+
+/* define the gslt_image_t structure descriptor */
+public_st_gslt_image();
+
+
+/*
+ * Strip alpha channel from an image
+ * assumes a collapsed stride
+ */
+static void
+gslt_strip_alpha(gslt_image_t *image)
+{
+ gslt_image_colorspace cs = image->colorspace;
+ int n = image->components;
+ int y, x, k;
+ byte *sp, *dp;
+
+ if (image->bits != 8)
+ {
+ gs_warn1("cannot strip alpha from %dbpc images", image->bits);
+ return;
+ }
+
+ if ((cs != GSLT_GRAY_A) && (cs != GSLT_RGB_A) && (cs != GSLT_CMYK_A))
+ return;
+
+ for (y = 0; y < image->height; y++)
+ {
+ sp = image->samples + image->width * n * y;
+ dp = image->samples + image->width * (n - 1) * y;
+ for (x = 0; x < image->width; x++)
+ {
+ for (k = 0; k < n - 1; k++)
+ *dp++ = *sp++;
+ sp++;
+ }
+ }
+
+ image->colorspace --; /* assume foo_A follows foo */
+ image->components --;
+ image->stride = (n - 1) * image->width;
+}
+
+/*
+ * Switch on file magic to decode an image.
+ */
+gslt_image_t *
+gslt_image_decode(gs_memory_t *mem, byte *buf, int len)
+{
+ gslt_image_t *image = NULL;
+ int error = gs_okay;
+
+ if (buf[0] == 0xff && buf[1] == 0xd8)
+ image = gslt_image_decode_jpeg(mem, buf, len);
+ else if (memcmp(buf, "\211PNG\r\n\032\n", 8) == 0)
+ image = gslt_image_decode_png(mem, buf, len);
+ else if (memcmp(buf, "MM", 2) == 0)
+ image = gslt_image_decode_tiff(mem, buf, len);
+ else if (memcmp(buf, "II", 2) == 0)
+ image = gslt_image_decode_tiff(mem, buf, len);
+ else
+ error = gs_throw(-1, "unknown image file format");
+
+ if (image == NULL)
+ error = gs_rethrow(error, "could not decode image");
+
+ return image;
+}
+
+void
+gslt_image_free(gs_memory_t *mem, gslt_image_t *image)
+{
+ if (image != NULL) {
+ if (image->samples) {
+ gs_free_object(mem, image->samples, "free gslt_image samples");
+ }
+ gs_free_object(mem, image, "free gslt_image");
+ }
+}
diff --git a/tools/gslite/gslt_image.h b/tools/gslite/gslt_image.h
new file mode 100644
index 000000000..bdafb9a45
--- /dev/null
+++ b/tools/gslite/gslt_image.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image.h 2713 2007-01-02 22:22:14Z henrys $*/
+/* gslt image loading interface */
+
+#ifndef gslt_image_INCLUDED
+# define gslt_image_INCLUDED
+
+/* primary image object type */
+typedef struct gslt_image_s gslt_image_t;
+
+/* colorspace enumeration for image data */
+typedef enum {
+ GSLT_GRAY,
+ GSLT_GRAY_A,
+ GSLT_RGB,
+ GSLT_RGB_A,
+ GSLT_CMYK,
+ GSLT_CMYK_A,
+ GSLT_UNDEFINED /* sentinel for the last defined colorspace */
+} gslt_image_colorspace;
+
+/* definition of the image object structure */
+struct gslt_image_s {
+ int width; /* image width */
+ int height; /* image height */
+ int stride; /* byte offset between image data rows */
+ int components; /* number of components (channels) per pixel */
+ int bits; /* bits per component */
+ int xres; /* horizontal image resolution in pixels per meter */
+ int yres; /* vertical image resolution in pixels per meter */
+ byte *samples; /* image data buffer */
+ gslt_image_colorspace colorspace; /* image pixel component mapping */
+};
+
+/* decode an image from a memory buffer */
+gslt_image_t *gslt_image_decode(gs_memory_t *mem, byte *buf, int len);
+
+/* free an image object when it is no longer needed */
+void gslt_image_free(gs_memory_t *mem, gslt_image_t *image);
+
+
+/* decode a memory buffer as a particular image format */
+gslt_image_t *gslt_image_decode_jpeg(gs_memory_t *mem, byte *buf, int len);
+gslt_image_t *gslt_image_decode_png( gs_memory_t *mem, byte *buf, int len);
+gslt_image_t *gslt_image_decode_tiff(gs_memory_t *mem, byte *buf, int len);
+
+#endif /* gslt_image_INCLUDED */
diff --git a/tools/gslite/gslt_image_jpeg.c b/tools/gslite/gslt_image_jpeg.c
new file mode 100644
index 000000000..ebc6b4957
--- /dev/null
+++ b/tools/gslite/gslt_image_jpeg.c
@@ -0,0 +1,144 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image_jpeg.c 2713 2007-01-02 22:22:14Z henrys $ */
+/* gslt image loading implementation for JPEG images */
+
+#include "std.h"
+#include "gsmemory.h"
+#include "stream.h"
+#include "strimpl.h"
+#include "gsstate.h"
+#include "jpeglib_.h"
+#include "sdct.h"
+#include "sjpeg.h"
+#include "gslt_image.h"
+#include "gserror.h"
+
+/* import the gs structure descriptor for gslt_image_t */
+extern const gs_memory_struct_type_t st_gslt_image;
+
+static int gslt_report_error(stream_state * st, const char *str)
+{
+ (void) gs_throw1(-1, "%s", str);
+ return 0;
+}
+
+gslt_image_t *
+gslt_image_decode_jpeg(gs_memory_t *mem, byte *buf, int len)
+{
+ gslt_image_t *image;
+ jpeg_decompress_data jddp;
+ stream_DCT_state state;
+ stream_cursor_read rp;
+ stream_cursor_write wp;
+ int code, error = gs_okay;
+ int wlen;
+ byte *wbuf;
+
+ s_init_state((stream_state*)&state, &s_DCTD_template, mem);
+ state.report_error = gslt_report_error;
+
+ s_DCTD_template.set_defaults((stream_state*)&state);
+
+ state.jpeg_memory = mem;
+ state.data.decompress = &jddp;
+
+ jddp.template = s_DCTD_template;
+ jddp.memory = mem;
+ jddp.scanline_buffer = NULL;
+
+ if ((code = gs_jpeg_create_decompress(&state)) < 0) {
+ error = gs_throw(-1, "cannot gs_jpeg_create_decompress");
+ return NULL;
+ }
+
+ s_DCTD_template.init((stream_state*)&state);
+
+ rp.ptr = buf - 1;
+ rp.limit = buf + len - 1;
+
+ /* read the header only by not having a write buffer */
+ wp.ptr = 0;
+ wp.limit = 0;
+
+ code = s_DCTD_template.process((stream_state*)&state, &rp, &wp, true);
+ if (code != 1) {
+ error = gs_throw(-1, "premature EOF or error in jpeg");
+ return NULL;
+ }
+
+ image = gs_alloc_struct_immovable(mem, gslt_image_t,
+ &st_gslt_image, "jpeg gslt_image");
+ if (image == NULL) {
+ error = gs_throw(-1, "unable to allocate jpeg gslt_image");
+ gs_jpeg_destroy(&state);
+ return NULL;
+ }
+
+ image->width = jddp.dinfo.output_width;
+ image->height = jddp.dinfo.output_height;
+ image->components = jddp.dinfo.output_components;
+ image->bits = 8;
+ image->stride = image->width * image->components;
+
+ if (image->components == 1)
+ image->colorspace = GSLT_GRAY;
+ if (image->components == 3)
+ image->colorspace = GSLT_RGB;
+ if (image->components == 4)
+ image->colorspace = GSLT_CMYK;
+
+ if (jddp.dinfo.density_unit == 1)
+ {
+ image->xres = jddp.dinfo.X_density;
+ image->yres = jddp.dinfo.Y_density;
+ }
+ else if (jddp.dinfo.density_unit == 2)
+ {
+ image->xres = jddp.dinfo.X_density * 2.54;
+ image->yres = jddp.dinfo.Y_density * 2.54;
+ }
+ else
+ {
+ image->xres = 96;
+ image->yres = 96;
+ }
+
+ wlen = image->stride * image->height;
+ wbuf = gs_alloc_bytes(mem, wlen, "decodejpeg");
+ if (!wbuf) {
+ error = gs_throw1(-1, "out of memory allocating samples: %d", wlen);
+ gs_free_object(mem, image, "free jpeg gslt_image");
+ gs_jpeg_destroy(&state);
+ return NULL;
+ }
+ image->samples = wbuf;
+
+ wp.ptr = wbuf - 1;
+ wp.limit = wbuf + wlen - 1;
+
+ code = s_DCTD_template.process((stream_state*)&state, &rp, &wp, true);
+ if (code != EOFC) {
+ error = gs_throw1(-1, "error in jpeg (code = %d)", code);
+#ifndef DEBUG /* return whatever we got when debugging */
+ gs_free_object(mem, image, "free jpeg gslt_image");
+ gs_jpeg_destroy(&state);
+ return NULL;
+#endif
+ }
+
+ gs_jpeg_destroy(&state);
+
+ return image;
+}
diff --git a/tools/gslite/gslt_image_png.c b/tools/gslite/gslt_image_png.c
new file mode 100644
index 000000000..b46eab8ca
--- /dev/null
+++ b/tools/gslite/gslt_image_png.c
@@ -0,0 +1,226 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image_png.c 2991 2007-12-18 23:05:58Z giles $ */
+/* gslt image loading implementation for PNG images */
+
+#include "std.h"
+#include "gsmemory.h"
+#include "stream.h"
+#include "strimpl.h"
+#include "gsstate.h"
+#include "png_.h"
+#include "gslt_image.h"
+#include "gserror.h"
+
+/* import the gs structure descriptor for gslt_image_t */
+extern const gs_memory_struct_type_t st_gslt_image;
+
+/*
+ * PNG using libpng directly (no gs wrappers)
+ */
+
+struct gslt_png_io_s
+{
+ byte *ptr;
+ byte *lim;
+};
+
+static void gslt_png_read(png_structp png, png_bytep data, png_size_t length)
+{
+ struct gslt_png_io_s *io = png_get_io_ptr(png);
+ if (io->ptr + length > io->lim)
+ png_error(png, "Read Error");
+ memcpy(data, io->ptr, length);
+ io->ptr += length;
+}
+
+static png_voidp gslt_png_malloc(png_structp png, png_size_t size)
+{
+ gs_memory_t *mem = png_get_mem_ptr(png);
+ return gs_alloc_bytes(mem, size, "libpng");
+}
+
+static void gslt_png_free(png_structp png, png_voidp ptr)
+{
+ gs_memory_t *mem = png_get_mem_ptr(png);
+ gs_free_object(mem, ptr, "libpng");
+}
+
+gslt_image_t *
+gslt_image_decode_png(gs_memory_t *mem, byte *buf, int len)
+{
+ gslt_image_t *image;
+ png_structp png;
+ png_infop info;
+ struct gslt_png_io_s io;
+ int npasses;
+ int pass;
+ int y;
+
+ /*
+ * Set up PNG structs and input source
+ */
+
+ io.ptr = buf;
+ io.lim = buf + len;
+
+ png = png_create_read_struct_2(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL, /* error callbacks */
+ mem, gslt_png_malloc, gslt_png_free);
+ if (!png) {
+ gs_throw(-1, "png_create_read_struct_2 failed");
+ return NULL;
+ }
+ info = png_create_info_struct(png);
+ if (!info) {
+ gs_throw(-1, "png_create_info_struct");
+ png_destroy_read_struct(&png, NULL, NULL);
+ return NULL;
+ }
+ png_set_read_fn(png, &io, gslt_png_read);
+
+ /*
+ * Jump to here on errors.
+ */
+
+ if (setjmp(png_jmpbuf(png)))
+ {
+ png_destroy_read_struct(&png, &info, NULL);
+ gs_throw(-1, "png reading failed");
+ return NULL;
+ }
+
+ /*
+ * Read PNG header
+ */
+
+ png_read_info(png, info);
+
+ image = gs_alloc_struct_immovable(mem, gslt_image_t,
+ &st_gslt_image, "new png gslt_image");
+ if (image == NULL) {
+ gs_throw(-1, "unable to allocate png gslt_image");
+ png_destroy_read_struct(&png, &info, NULL);
+ return NULL;
+ }
+
+ image->width = png_get_image_width(png, info);
+ image->height = png_get_image_height(png, info);
+ image->bits = png_get_bit_depth(png, info);
+
+ if (png_get_interlace_type(png, info) == PNG_INTERLACE_ADAM7)
+ {
+ npasses = png_set_interlace_handling(png);
+ }
+ else
+ {
+ npasses = 1;
+ }
+
+ if (image->bits == 16)
+ {
+ png_set_strip_16(png);
+ image->bits = 8;
+ }
+
+ switch (png_get_color_type(png, info))
+ {
+ case PNG_COLOR_TYPE_GRAY:
+ image->components = 1;
+ image->colorspace = GSLT_GRAY;
+ break;
+
+ case PNG_COLOR_TYPE_PALETTE:
+ /* ask libpng to expand palettes to rgb triplets */
+ png_set_palette_to_rgb(png);
+ image->bits = 8;
+
+ /* libpng will expand to rgba if there is a tRNS chunk */
+ if (png_get_valid(png, info, PNG_INFO_tRNS))
+ {
+ image->components = 4;
+ image->colorspace = GSLT_RGB_A;
+ }
+ else
+ {
+ image->components = 3;
+ image->colorspace = GSLT_RGB;
+ }
+ break;
+
+ case PNG_COLOR_TYPE_RGB:
+ image->components = 3;
+ image->colorspace = GSLT_RGB;
+ break;
+
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ image->components = 2;
+ image->colorspace = GSLT_GRAY_A;
+ break;
+
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ image->components = 4;
+ image->colorspace = GSLT_RGB_A;
+ break;
+
+ default:
+ gs_throw(-1, "cannot handle this png color type");
+ png_destroy_read_struct(&png, &info, NULL);
+ gs_free_object(mem, image, "free png gslt_image");
+ return NULL;
+ }
+
+ image->stride = (image->width * image->components * image->bits + 7) / 8;
+
+ /*
+ * Extract DPI, default to 96 dpi
+ */
+
+ image->xres = 96;
+ image->yres = 96;
+
+ if (info->valid & PNG_INFO_pHYs)
+ {
+ png_uint_32 xres, yres;
+ int unit;
+ png_get_pHYs(png, info, &xres, &yres, &unit);
+ if (unit == PNG_RESOLUTION_METER)
+ {
+ image->xres = xres * 0.0254 + 0.5;
+ image->yres = yres * 0.0254 + 0.5;
+ }
+ }
+
+ /*
+ * Read rows, filling transformed output into image buffer.
+ */
+
+ image->samples = gs_alloc_bytes(mem, image->stride * image->height, "decodepng");
+
+ for (pass = 0; pass < npasses; pass++)
+ {
+ for (y = 0; y < image->height; y++)
+ {
+ png_read_row(png, image->samples + (y * image->stride), NULL);
+ }
+ }
+
+ /*
+ * Clean up memory.
+ */
+
+ png_destroy_read_struct(&png, &info, NULL);
+
+ return image;
+}
diff --git a/tools/gslite/gslt_image_test.c b/tools/gslite/gslt_image_test.c
new file mode 100644
index 000000000..bdae1393b
--- /dev/null
+++ b/tools/gslite/gslt_image_test.c
@@ -0,0 +1,181 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image_test.c 2716 2007-01-05 05:27:37Z henrys $ */
+/* example client for the gslt image loading library */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+typedef unsigned char byte;
+#include "gslt.h"
+#include "gslt_image.h"
+
+gslt_image_t *
+decode_image_file(gs_memory_t *mem, FILE *in)
+{
+ gslt_image_t *image;
+ int len, bytes;
+ byte *buf;
+
+ /* get compressed data size */
+ fseek(in, 0, SEEK_END);
+ len = ftell(in);
+
+ /* load the file into memory */
+ fseek(in, 0, SEEK_SET);
+ buf = malloc(len);
+ if (buf == NULL) return NULL;
+
+ bytes = fread(buf, 1, len, in);
+ if (bytes != len) {
+ free(buf);
+ return NULL;
+ }
+
+ image = gslt_image_decode(mem, buf, len);
+ free(buf);
+
+ return image;
+}
+
+gslt_image_t *
+decode_image_filename(gs_memory_t *mem, const char *filename)
+{
+ gslt_image_t *image;
+ FILE *in;
+
+ in = fopen(filename, "rb");
+ if (in == NULL) return NULL;
+
+ image = decode_image_file(mem, in);
+ fclose(in);
+
+ return image;
+}
+
+/* write out the image as a pnm file for verification */
+int
+write_image_file(gslt_image_t *image, FILE *out)
+{
+ byte *row;
+ int j, bytes;
+
+ if (image == NULL || image->samples == NULL) {
+ fprintf(stderr, "ignoring empty image object\n");
+ return -1;
+ }
+
+ if (image->components == 1 && image->bits == 1) {
+ /* PBM file */
+ int i;
+ int rowbytes = (image->width+7)>>3;
+ byte *local = malloc(rowbytes);
+
+ fprintf(out, "P4\n%d %d\n", image->width, image->height);
+ row = image->samples;
+ for (j = 0; j < image->height; j++) {
+ /* PBM images are inverted relative to our XPS/PS convention */
+ for (i = 0; i < rowbytes; i++)
+ local[i] = row[i] ^ 0xFF;
+ bytes = fwrite(local, 1, rowbytes, out);
+ row += image->stride;
+ }
+ free(local);
+ } else if (image->components == 1 && image->bits == 8) {
+ /* PGM file */
+ fprintf(out, "P5\n%d %d\n255\n", image->width, image->height);
+ row = image->samples;
+ for (j = 0; j < image->height; j++) {
+ bytes = fwrite(row, 1, image->width, out);
+ row += image->stride;
+ }
+ } else {
+ /* PPM file */
+ fprintf(out, "P6\n%d %d\n255\n", image->width, image->height);
+ row = image->samples;
+ for (j = 0; j < image->height; j++) {
+ bytes = fwrite(row, image->components, image->width, out);
+ row += image->stride;
+ }
+ }
+
+ return 0;
+}
+
+int
+write_image_filename(gslt_image_t *image, const char *filename)
+{
+ FILE *out;
+ int error;
+
+ out = fopen(filename, "wb");
+ if (out == NULL) {
+ fprintf(stderr, "could not open '%s' for writing\n", filename);
+ return -1;
+ }
+
+ error = write_image_file(image, out);
+ fclose(out);
+
+ return error;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ gs_memory_t *mem;
+ gx_device *dev;
+ gs_state *gs;
+ const char *filename;
+ gslt_image_t *image;
+ char *s;
+ int code = 0;
+
+ /* get the device from the environment, or default */
+ s = getenv("DEVICE");
+ if (!s)
+ s = "nullpage";
+
+ /* initialize the graphicis library and set up a drawing state */
+ mem = gslt_init_library();
+ dev = gslt_init_device(mem, s);
+ gs = gslt_init_state(mem, dev);
+
+ gslt_get_device_param(mem, dev, "Name");
+ gslt_set_device_param(mem, dev, "OutputFile", "gslt.out");
+
+ filename = argv[argc-1];
+ fprintf(stderr, "loading '%s'\n", filename);
+
+ /* load and decode the image */
+ image = decode_image_filename(mem, argv[argc-1]);
+ if (image == NULL) {
+ fprintf(stderr, "reading image failed.\n");
+ code = -1;
+ }
+ /* save an uncompressed copy for verification */
+ write_image_filename(image, "out.pnm");
+
+ /* image could be drawn to the page here */
+
+ /* release the image */
+ gslt_image_free(mem, image);
+
+ /* clean up the library */
+ gslt_free_state(mem, gs);
+ gslt_free_device(mem, dev);
+ gslt_free_library(mem);
+ return code;
+}
+
diff --git a/tools/gslite/gslt_image_threads_test.c b/tools/gslite/gslt_image_threads_test.c
new file mode 100644
index 000000000..0cdab1d2f
--- /dev/null
+++ b/tools/gslite/gslt_image_threads_test.c
@@ -0,0 +1,219 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image_threads_test.c 2993 2007-12-18 23:28:31Z giles $ */
+/* example client for the gslt image loading library */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>
+
+typedef unsigned char byte;
+#include "gslt.h"
+#include "gslt_image.h"
+
+extern void gs_erasepage(gs_state *gs);
+extern void gs_moveto(gs_state *gs, double, double);
+extern void gs_output_page(gs_state *gs, int, int);
+
+gslt_image_t *
+decode_image_file(gs_memory_t *mem, FILE *in)
+{
+ gslt_image_t *image;
+ int len, bytes;
+ byte *buf;
+
+ /* get compressed data size */
+ fseek(in, 0, SEEK_END);
+ len = ftell(in);
+
+ /* load the file into memory */
+ fseek(in, 0, SEEK_SET);
+ buf = malloc(len);
+ if (buf == NULL) return NULL;
+
+ bytes = fread(buf, 1, len, in);
+ if (bytes != len) {
+ free(buf);
+ return NULL;
+ }
+
+ image = gslt_image_decode(mem, buf, len);
+ free(buf);
+
+ return image;
+}
+
+gslt_image_t *
+decode_image_filename(gs_memory_t *mem, const char *filename)
+{
+ gslt_image_t *image;
+ FILE *in;
+
+ in = fopen(filename, "rb");
+ if (in == NULL) return NULL;
+
+ image = decode_image_file(mem, in);
+ fclose(in);
+
+ return image;
+}
+
+/* write out the image as a pnm file for verification */
+int
+write_image_file(gslt_image_t *image, FILE *out)
+{
+ byte *row;
+ int j, bytes;
+
+ if (image == NULL || image->samples == NULL) {
+ fprintf(stderr, "ignoring empty image object\n");
+ return -1;
+ }
+
+ if (image->components == 1 && image->bits == 1) {
+ /* PBM file */
+ int i;
+ int rowbytes = (image->width+7)>>3;
+ byte *local = malloc(rowbytes);
+
+ fprintf(out, "P4\n%d %d\n", image->width, image->height);
+ row = image->samples;
+ for (j = 0; j < image->height; j++) {
+ /* PBM images are inverted relative to our XPS/PS convention */
+ for (i = 0; i < rowbytes; i++)
+ local[i] = row[i] ^ 0xFF;
+ bytes = fwrite(local, 1, rowbytes, out);
+ row += image->stride;
+ }
+ free(local);
+ } else if (image->components == 1 && image->bits == 8) {
+ /* PGM file */
+ fprintf(out, "P5\n%d %d\n255\n", image->width, image->height);
+ row = image->samples;
+ for (j = 0; j < image->height; j++) {
+ bytes = fwrite(row, 1, image->width, out);
+ row += image->stride;
+ }
+ } else {
+ /* PPM file */
+ fprintf(out, "P6\n%d %d\n255\n", image->width, image->height);
+ row = image->samples;
+ for (j = 0; j < image->height; j++) {
+ bytes = fwrite(row, image->components, image->width, out);
+ row += image->stride;
+ }
+ }
+
+ return 0;
+}
+
+int
+write_image_filename(gslt_image_t *image, const char *filename)
+{
+ FILE *out;
+ int error;
+
+ out = fopen(filename, "wb");
+ if (out == NULL) {
+ fprintf(stderr, "could not open '%s' for writing\n", filename);
+ return -1;
+ }
+
+ error = write_image_file(image, out);
+ fclose(out);
+
+ return error;
+}
+
+/* global input filename. */
+char *filename;
+
+void *
+print_image(void *threadid)
+{
+ gs_memory_t *mem;
+ gx_device *dev;
+ gs_state *gs;
+ gslt_image_t *image;
+ char *s;
+ int code = 0;
+
+ /* get the device from the environment, or default */
+ s = getenv("DEVICE");
+ if (!s)
+ s = "nullpage";
+
+ /* initialize the graphicis library and set up a drawing state */
+ mem = gslt_init_library();
+ dev = gslt_init_device(mem, s);
+ gs = gslt_init_state(mem, dev);
+
+ gslt_get_device_param(mem, dev, "Name");
+ gslt_set_device_param(mem, dev, "OutputFile", "gslt.out");
+
+ /* prepare page for drawing (unused) */
+ gs_erasepage(gs);
+ gs_moveto(gs, 72.0, 72.0);
+
+
+ /* load and decode the image */
+ image = decode_image_filename(mem, filename);
+ if (image == NULL) {
+ fprintf(stderr, "reading image failed.\n");
+ code = -1;
+ }
+ /* save an uncompressed copy for verification */
+ {
+ char outname[50];
+ sprintf(outname, "out_%d.pnm", (int)threadid);
+ fprintf(stderr, "writing %s\n", outname);
+ write_image_filename(image, outname);
+ }
+
+ /* image could be drawn to the page here */
+
+ /* release the image */
+ gslt_image_free(mem, image);
+
+ /* output the page (unused) */
+ gs_output_page(gs, 1, 1);
+
+ /* clean up the library */
+ gslt_free_state(mem, gs);
+ gslt_free_device(mem, dev);
+ gslt_free_library(mem);
+
+ pthread_exit(NULL);
+}
+
+int
+main(int argc, const char *argv[])
+{
+
+ pthread_t thread1, thread2;
+ int ret;
+ int t1 = 1;
+ int t2 = 2;
+
+ filename = argv[argc-1];
+ fprintf(stderr, "loading '%s'\n", filename);
+
+ if ( ((ret=pthread_create(&thread1, NULL, print_image, (void *)t1)) != 0) ||
+ ((ret=pthread_create(&thread2, NULL, print_image, (void *)t2)) != 0) ) {
+ fprintf(stderr, "Error creating thread code=%d", ret);
+ exit(-1);
+ }
+ pthread_exit(NULL);
+}
+
diff --git a/tools/gslite/gslt_image_tiff.c b/tools/gslite/gslt_image_tiff.c
new file mode 100644
index 000000000..51419d5c2
--- /dev/null
+++ b/tools/gslite/gslt_image_tiff.c
@@ -0,0 +1,1069 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_image_tiff.c 2991 2007-12-18 23:05:58Z giles $ */
+/* gslt image loading implementation for TIFF images */
+
+#include "std.h"
+#include "gsmemory.h"
+#include "stream.h"
+#include "strimpl.h"
+#include "gsstate.h"
+#include "jpeglib_.h"
+#include "sdct.h"
+#include "sjpeg.h"
+#include "srlx.h"
+#include "slzwx.h"
+#include "szlibx.h"
+#include "scfx.h"
+#include "memory_.h"
+#include "gslt_image.h"
+#include "gserror.h"
+
+/* import the gs structure descriptor for gslt_image_t */
+extern const gs_memory_struct_type_t st_gslt_image;
+
+/*
+ * TIFF image loader. Should be enough to support TIFF files in XPS.
+ * Baseline TIFF 6.0 plus CMYK, LZW, Flate and JPEG support.
+ * Limited bit depths (1,2,4,8).
+ * Limited planar configurations (1=chunky).
+ * No tiles (easy fix if necessary).
+ * TODO: RGBPal images
+ */
+
+typedef struct gslt_tiff_s gslt_tiff_t;
+
+struct gslt_tiff_s
+{
+ /* "file" */
+ byte *bp, *rp, *ep;
+
+ /* byte order */
+ unsigned order;
+
+ /* where we can find the strips of image data */
+ unsigned rowsperstrip;
+ unsigned *stripoffsets;
+ unsigned *stripbytecounts;
+
+ /* colormap */
+ unsigned *colormap;
+
+ /* assorted tags */
+ unsigned subfiletype;
+ unsigned photometric;
+ unsigned compression;
+ unsigned imagewidth;
+ unsigned imagelength;
+ unsigned samplesperpixel;
+ unsigned bitspersample;
+ unsigned planar;
+ unsigned extrasamples;
+ unsigned xresolution;
+ unsigned yresolution;
+ unsigned resolutionunit;
+ unsigned fillorder;
+ unsigned g3opts;
+ unsigned g4opts;
+ unsigned predictor;
+
+ unsigned ycbcrsubsamp[2];
+
+ byte *jpegtables; /* point into "file" buffer */
+ unsigned jpegtableslen;
+};
+
+enum
+{
+ TII = 0x4949, /* 'II' */
+ TMM = 0x4d4d, /* 'MM' */
+ TBYTE = 1,
+ TASCII = 2,
+ TSHORT = 3,
+ TLONG = 4,
+ TRATIONAL = 5
+};
+
+#define NewSubfileType 254
+#define ImageWidth 256
+#define ImageLength 257
+#define BitsPerSample 258
+#define Compression 259
+#define PhotometricInterpretation 262
+#define FillOrder 266
+#define StripOffsets 273
+#define SamplesPerPixel 277
+#define RowsPerStrip 278
+#define StripByteCounts 279
+#define XResolution 282
+#define YResolution 283
+#define PlanarConfiguration 284
+#define T4Options 292
+#define T6Options 293
+#define ResolutionUnit 296
+#define Predictor 317
+#define ColorMap 320
+#define TileWidth 322
+#define TileLength 323
+#define TileOffsets 324
+#define TileByteCounts 325
+#define ExtraSamples 338
+#define JPEGTables 347
+#define YCbCrSubSampling 520
+
+static const byte bitrev[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
+};
+
+#ifdef GSLT_DEBUG_TIFF
+static void
+gslt_debug_tiff(gs_memory_t *mem, gslt_tiff_t *tiff);
+#endif
+
+static int
+gslt_report_error(stream_state * st, const char *str)
+{
+ (void) gs_throw1(-1, "%s", str);
+ return 0;
+}
+
+static inline int
+readbyte(gslt_tiff_t *tiff)
+{
+ if (tiff->rp < tiff->ep)
+ return *tiff->rp++;
+ return EOF;
+}
+
+static inline unsigned
+readshort(gslt_tiff_t *tiff)
+{
+ unsigned a = readbyte(tiff);
+ unsigned b = readbyte(tiff);
+ if (tiff->order == TII)
+ return (b << 8) | a;
+ return (a << 8) | b;
+}
+
+static inline unsigned
+readlong(gslt_tiff_t *tiff)
+{
+ unsigned a = readbyte(tiff);
+ unsigned b = readbyte(tiff);
+ unsigned c = readbyte(tiff);
+ unsigned d = readbyte(tiff);
+ if (tiff->order == TII)
+ return (d << 24) | (c << 16) | (b << 8) | a;
+ return (a << 24) | (b << 16) | (c << 8) | d;
+}
+
+static int
+gslt_decode_tiff_uncompressed(gs_memory_t *mem, gslt_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ memcpy(wp, tiff->rp, wl - wp);
+ return gs_okay;
+}
+
+static int
+gslt_decode_tiff_packbits(gs_memory_t *mem, gslt_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_RLD_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_RLD_template, mem);
+ state.report_error = gslt_report_error;
+
+ s_RLD_template.set_defaults((stream_state*)&state);
+ s_RLD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_RLD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ return gs_throw1(-1, "error in packbits data (code = %d)", code);
+
+ return gs_okay;
+}
+
+static int
+gslt_decode_tiff_lzw(gs_memory_t *mem, gslt_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_LZW_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_LZWD_template, mem);
+ state.report_error = gslt_report_error;
+
+ s_LZWD_template.set_defaults((stream_state*)&state);
+
+ /* old-style TIFF 5.0 reversed bit order, late change */
+ if (rp[0] == 0 && rp[1] & 0x01)
+ {
+ state.EarlyChange = 0;
+ state.FirstBitLowOrder = 1;
+ }
+
+ /* new-style TIFF 6.0 normal bit order, early change */
+ else
+ {
+ state.EarlyChange = 1;
+ state.FirstBitLowOrder = 0;
+ }
+
+ s_LZWD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_LZWD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ {
+ s_LZWD_template.release((stream_state*)&state);
+ return gs_throw1(-1, "error in lzw data (code = %d)", code);
+ }
+
+ s_LZWD_template.release((stream_state*)&state);
+
+ return gs_okay;
+}
+
+static int
+gslt_decode_tiff_flate(gs_memory_t *mem, gslt_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_zlib_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_zlibD_template, mem);
+ state.report_error = gslt_report_error;
+
+ s_zlibD_template.set_defaults((stream_state*)&state);
+
+ s_zlibD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_zlibD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ {
+ s_zlibD_template.release((stream_state*)&state);
+ return gs_throw1(-1, "error in flate data (code = %d)", code);
+ }
+
+ s_zlibD_template.release((stream_state*)&state);
+ return gs_okay;
+}
+
+static int
+gslt_decode_tiff_fax(gs_memory_t *mem, gslt_tiff_t *tiff, int comp, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_CFD_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_CFD_template, mem);
+ state.report_error = gslt_report_error;
+
+ s_CFD_template.set_defaults((stream_state*)&state);
+
+ state.EndOfLine = false;
+ state.EndOfBlock = false;
+ state.Columns = tiff->imagewidth;
+ state.Rows = tiff->imagelength;
+ state.BlackIs1 = tiff->photometric == 0;
+
+ state.K = 0;
+ if (comp == 4)
+ state.K = -1;
+ if (comp == 2)
+ state.EncodedByteAlign = true;
+
+ s_CFD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_CFD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ {
+ s_CFD_template.release((stream_state*)&state);
+ return gs_throw1(-1, "error in fax data (code = %d)", code);
+ }
+
+ s_CFD_template.release((stream_state*)&state);
+ return gs_okay;
+}
+
+/*
+ * We need more find control over JPEG decoding parameters than
+ * the s_DCTD_template filter will give us. So we abuse the
+ * filter, and take control after the filter setup (which sets up
+ * the memory manager and error handling) and call the gs_jpeg
+ * wrappers directly for doing the actual decoding.
+ */
+
+static int
+gslt_decode_tiff_jpeg(gs_memory_t *mem, gslt_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_DCT_state state; /* used by gs_jpeg_* wrappers */
+ jpeg_decompress_data jddp;
+ struct jpeg_source_mgr *srcmgr;
+ JSAMPROW scanlines[1];
+ int stride;
+ int code;
+
+ /*
+ * Set up the JPEG and DCT filter voodoo.
+ */
+
+ s_init_state((stream_state*)&state, &s_DCTD_template, mem);
+ state.report_error = gslt_report_error;
+ s_DCTD_template.set_defaults((stream_state*)&state);
+
+ state.jpeg_memory = mem;
+ state.data.decompress = &jddp;
+
+ jddp.template = s_DCTD_template;
+ jddp.memory = mem;
+ jddp.scanline_buffer = NULL;
+
+ if ((code = gs_jpeg_create_decompress(&state)) < 0)
+ return gs_throw(-1, "error in gs_jpeg_create_decompress");
+
+ s_DCTD_template.init((stream_state*)&state);
+
+ srcmgr = jddp.dinfo.src;
+
+ /*
+ * Read the abbreviated table file.
+ */
+
+ if (tiff->jpegtables)
+ {
+ srcmgr->next_input_byte = tiff->jpegtables;
+ srcmgr->bytes_in_buffer = tiff->jpegtableslen;
+
+ code = gs_jpeg_read_header(&state, FALSE);
+ if (code != JPEG_HEADER_TABLES_ONLY)
+ return gs_throw(-1, "error in jpeg table data");
+ }
+
+ /*
+ * Read the image jpeg header.
+ */
+
+ srcmgr->next_input_byte = rp;
+ srcmgr->bytes_in_buffer = rl - rp;
+
+ if ((code = gs_jpeg_read_header(&state, TRUE)) < 0)
+ return gs_throw(-1, "error in jpeg_read_header");
+
+ /* when TIFF says RGB and libjpeg says YCbCr, libjpeg is wrong */
+ if (tiff->photometric == 2 && jddp.dinfo.jpeg_color_space == JCS_YCbCr)
+ {
+ jddp.dinfo.jpeg_color_space = JCS_RGB;
+ }
+
+ /*
+ * Decode the strip image data.
+ */
+
+ if ((code = gs_jpeg_start_decompress(&state)) < 0)
+ return gs_throw(-1, "error in jpeg_start_decompress");
+
+ stride = jddp.dinfo.output_width * jddp.dinfo.output_components;
+
+ while (wp + stride <= wl && jddp.dinfo.output_scanline < jddp.dinfo.output_height)
+ {
+ scanlines[0] = wp;
+ code = gs_jpeg_read_scanlines(&state, scanlines, 1);
+ if (code < 0)
+ return gs_throw(01, "error in jpeg_read_scanlines");
+ wp += stride;
+ }
+
+ /*
+ * Clean up.
+ */
+
+ if ((code = gs_jpeg_finish_decompress(&state)) < 0)
+ return gs_throw(-1, "error in jpeg_finish_decompress");
+
+ gs_jpeg_destroy(&state);
+
+ return gs_okay;
+}
+
+static inline int
+getcomp(byte *line, int x, int bpc)
+{
+ switch (bpc)
+ {
+ case 1: return line[x / 8] >> (7 - (x % 8)) & 0x01;
+ case 2: return line[x / 4] >> ((3 - (x % 4)) * 2) & 0x03;
+ case 4: return line[x / 2] >> ((1 - (x % 2)) * 4) & 0x0f;
+ case 8: return line[x];
+ }
+ return 0;
+}
+
+static inline void
+putcomp(byte *line, int x, int bpc, int value)
+{
+ int maxval = (1 << bpc) - 1;
+
+ // clear bits first
+ switch (bpc)
+ {
+ case 1: line[x / 8] &= ~(maxval << (7 - (x % 8))); break;
+ case 2: line[x / 4] &= ~(maxval << ((3 - (x % 4)) * 2)); break;
+ case 4: line[x / 2] &= ~(maxval << ((1 - (x % 2)) * 4)); break;
+ }
+
+ switch (bpc)
+ {
+ case 1: line[x / 8] |= value << (7 - (x % 8)); break;
+ case 2: line[x / 4] |= value << ((3 - (x % 4)) * 2); break;
+ case 4: line[x / 2] |= value << ((1 - (x % 2)) * 4); break;
+ case 8: line[x] = value; break;
+ }
+}
+
+static void
+gslt_unpredict_tiff(byte *line, int width, int components, int bits)
+{
+ byte left[32];
+ int i, k, v;
+
+ for (k = 0; k < components; k++)
+ left[k] = 0;
+
+ for (i = 0; i < width; i++)
+ {
+ for (k = 0; k < components; k++)
+ {
+ v = getcomp(line, i * components + k, bits);
+ v = v + left[k];
+ v = v % (1 << bits);
+ putcomp(line, i * components + k, bits, v);
+ left[k] = v;
+ }
+ }
+}
+
+static void
+gslt_invert_tiff(byte *line, int width, int components, int bits)
+{
+ int i, k, v;
+ int m = (1 << bits) - 1;
+
+ for (i = 0; i < width; i++)
+ {
+ for (k = 0; k < components; k++)
+ {
+ v = getcomp(line, i * components + k, bits);
+ v = m - v;
+ putcomp(line, i * components + k, bits, v);
+ }
+ }
+}
+
+static int
+gslt_expand_colormap(gs_memory_t *mem, gslt_tiff_t *tiff, gslt_image_t *image)
+{
+ int maxval = 1 << image->bits;
+ byte *samples;
+ byte *src, *dst;
+ int stride;
+ int x, y;
+
+ /* colormap has first all red, then all green, then all blue values */
+ /* colormap values are 0..65535, bits is 4 or 8 */
+ /* image can be with or without extrasamples: components is 1 or 2 */
+
+ if (image->components != 1 && image->components != 2)
+ return gs_throw(-1, "invalid number of samples for RGBPal");
+
+ if (image->bits != 4 && image->bits != 8)
+ return gs_throw(-1, "invalid number of bits for RGBPal");
+
+ stride = image->width * (image->components + 2);
+
+ samples = gs_alloc_bytes(mem, stride * image->height, "samples");
+ if (!samples)
+ return gs_throw(-1, "out of memory: samples");
+
+ for (y = 0; y < image->height; y++)
+ {
+ src = image->samples + (image->stride * y);
+ dst = samples + (stride * y);
+
+ for (x = 0; x < image->width; x++)
+ {
+ if (tiff->extrasamples)
+ {
+ int c = getcomp(src, x * 2, image->bits);
+ int a = getcomp(src, x * 2 + 1, image->bits);
+ *dst++ = tiff->colormap[c + 0] >> 8;
+ *dst++ = tiff->colormap[c + maxval] >> 8;
+ *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+ *dst++ = a << (8 - image->bits);
+ }
+ else
+ {
+ int c = getcomp(src, x, image->bits);
+ *dst++ = tiff->colormap[c + 0] >> 8;
+ *dst++ = tiff->colormap[c + maxval] >> 8;
+ *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+ }
+ }
+ }
+
+ gs_free_object(mem, image->samples, "samples");
+
+ image->bits = 8;
+ image->stride = stride;
+ image->samples = samples;
+
+ return gs_okay;
+}
+
+static int
+gslt_decode_tiff_strips(gs_memory_t *mem, gslt_tiff_t *tiff, gslt_image_t *image)
+{
+ int error;
+
+ /* switch on compression to create a filter */
+ /* feed each strip to the filter */
+ /* read out the data and pack the samples into an gslt_image */
+
+ /* type 32773 / packbits -- nothing special (same row-padding as PDF) */
+ /* type 2 / ccitt rle -- no EOL, no RTC, rows are byte-aligned */
+ /* type 3 and 4 / g3 and g4 -- each strip starts new section */
+ /* type 5 / lzw -- each strip is handled separately */
+
+ byte *wp;
+ unsigned row;
+ unsigned strip;
+ unsigned i;
+
+ if (!tiff->rowsperstrip || !tiff->stripoffsets || !tiff->rowsperstrip)
+ return gs_throw(-1, "no image data in tiff; maybe it is tiled");
+
+ if (tiff->planar != 1)
+ return gs_throw(-1, "image data is not in chunky format");
+
+ image->width = tiff->imagewidth;
+ image->height = tiff->imagelength;
+ image->components = tiff->samplesperpixel;
+ image->bits = tiff->bitspersample;
+ image->stride = (image->width * image->components * image->bits + 7) / 8;
+
+ switch (tiff->photometric)
+ {
+ case 0: /* WhiteIsZero -- inverted */
+ image->colorspace = GSLT_GRAY;
+ break;
+ case 1: /* BlackIsZero */
+ image->colorspace = GSLT_GRAY;
+ break;
+ case 2: /* RGB */
+ image->colorspace = GSLT_RGB;
+ break;
+ case 3: /* RGBPal */
+ image->colorspace = GSLT_RGB;
+ break;
+ case 5: /* CMYK */
+ image->colorspace = GSLT_CMYK;
+ break;
+ case 6: /* YCbCr */
+ /* it's probably a jpeg ... we let jpeg convert to rgb */
+ image->colorspace = GSLT_RGB;
+ break;
+ default:
+ return gs_throw1(-1, "unknown photometric: %d", tiff->photometric);
+ }
+
+ switch (tiff->resolutionunit)
+ {
+ case 2:
+ image->xres = tiff->xresolution;
+ image->yres = tiff->yresolution;
+ case 3:
+ image->xres = tiff->xresolution * 2.54 + 0.5;
+ image->yres = tiff->yresolution * 2.54 + 0.5;
+ default:
+ image->xres = 96;
+ image->yres = 96;
+ }
+
+ image->samples = gs_alloc_bytes(mem, image->stride * image->height, "samples");
+ if (!image->samples)
+ return gs_throw(-1, "could not allocate image samples");
+
+ memset(image->samples, 0x55, image->stride * image->height);
+
+ wp = image->samples;
+
+ strip = 0;
+ for (row = 0; row < tiff->imagelength; row += tiff->rowsperstrip)
+ {
+ unsigned offset = tiff->stripoffsets[strip];
+ unsigned rlen = tiff->stripbytecounts[strip];
+ unsigned wlen = image->stride * tiff->rowsperstrip;
+ byte *rp = tiff->bp + offset;
+
+ if (wp + wlen > image->samples + image->stride * image->height)
+ wlen = image->samples + image->stride * image->height - wp;
+
+ if (rp + rlen > tiff->ep)
+ return gs_throw(-1, "strip extends beyond the end of the file");
+
+ /* the bits are in un-natural order */
+ if (tiff->fillorder == 2)
+ for (i = 0; i < rlen; i++)
+ rp[i] = bitrev[rp[i]];
+
+ switch (tiff->compression)
+ {
+ case 1:
+ error = gslt_decode_tiff_uncompressed(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 2:
+ error = gslt_decode_tiff_fax(mem, tiff, 2, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 3:
+ error = gslt_decode_tiff_fax(mem, tiff, 3, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 4:
+ error = gslt_decode_tiff_fax(mem, tiff, 4, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 5:
+ error = gslt_decode_tiff_lzw(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 6:
+ error = gs_throw(-1, "deprecated JPEG in TIFF compression not supported");
+ break;
+ case 7:
+ error = gslt_decode_tiff_jpeg(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 8:
+ error = gslt_decode_tiff_flate(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 32773:
+ error = gslt_decode_tiff_packbits(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ default:
+ error = gs_throw1(-1, "unknown TIFF compression: %d", tiff->compression);
+ }
+
+ if (error)
+ return gs_rethrow1(error, "could not decode strip %d", row / tiff->rowsperstrip);
+
+ /* scramble the bits back into original order */
+ if (tiff->fillorder == 2)
+ for (i = 0; i < rlen; i++)
+ rp[i] = bitrev[rp[i]];
+
+ wp += image->stride * tiff->rowsperstrip;
+ strip ++;
+ }
+
+ /* Predictor (only for LZW and Flate) */
+ if ((tiff->compression == 5 || tiff->compression == 8) && tiff->predictor == 2)
+ {
+ byte *p = image->samples;
+ for (i = 0; i < image->height; i++)
+ {
+ gslt_unpredict_tiff(p, image->width, tiff->samplesperpixel, image->bits);
+ p += image->stride;
+ }
+ }
+
+ /* RGBPal */
+ if (tiff->photometric == 3 && tiff->colormap)
+ {
+ error = gslt_expand_colormap(mem, tiff, image);
+ if (error)
+ return gs_rethrow(error, "could not expand colormap");
+ }
+
+ /* WhiteIsZero .. invert */
+ if (tiff->photometric == 0)
+ {
+ byte *p = image->samples;
+ for (i = 0; i < image->height; i++)
+ {
+ gslt_invert_tiff(p, image->width, image->components, image->bits);
+ p += image->stride;
+ }
+ }
+
+ /* Premultiplied transparency */
+ if (tiff->extrasamples == 1)
+ {
+ image->colorspace ++;
+ }
+
+ /* Non-pre-multiplied transparency */
+ if (tiff->extrasamples == 2)
+ {
+ image->colorspace ++;
+ }
+
+ return gs_okay;
+}
+
+static void
+gslt_read_tiff_tag_value(unsigned *p, gslt_tiff_t *tiff, unsigned type, unsigned ofs, unsigned n)
+{
+ tiff->rp = tiff->bp + ofs;
+ if (tiff->rp > tiff->ep)
+ tiff->rp = tiff->bp;
+
+ while (n--)
+ {
+ switch (type)
+ {
+ case TRATIONAL:
+ *p = readlong(tiff);
+ *p = *p / readlong(tiff);
+ p ++;
+ break;
+ case TBYTE: *p++ = readbyte(tiff); break;
+ case TSHORT: *p++ = readshort(tiff); break;
+ case TLONG: *p++ = readlong(tiff); break;
+ default: *p++ = 0; break;
+ }
+ }
+}
+
+static int
+gslt_read_tiff_tag(gs_memory_t *mem, gslt_tiff_t *tiff, unsigned offset)
+{
+ unsigned tag;
+ unsigned type;
+ unsigned count;
+ unsigned value;
+
+ tiff->rp = tiff->bp + offset;
+
+ tag = readshort(tiff);
+ type = readshort(tiff);
+ count = readlong(tiff);
+
+ if ((type == TBYTE && count <= 4) ||
+ (type == TSHORT && count <= 2) ||
+ (type == TLONG && count <= 1))
+ value = tiff->rp - tiff->bp;
+ else
+ value = readlong(tiff);
+
+ switch (tag)
+ {
+ case NewSubfileType:
+ gslt_read_tiff_tag_value(&tiff->subfiletype, tiff, type, value, 1);
+ break;
+ case ImageWidth:
+ gslt_read_tiff_tag_value(&tiff->imagewidth, tiff, type, value, 1);
+ break;
+ case ImageLength:
+ gslt_read_tiff_tag_value(&tiff->imagelength, tiff, type, value, 1);
+ break;
+ case BitsPerSample:
+ gslt_read_tiff_tag_value(&tiff->bitspersample, tiff, type, value, 1);
+ break;
+ case Compression:
+ gslt_read_tiff_tag_value(&tiff->compression, tiff, type, value, 1);
+ break;
+ case PhotometricInterpretation:
+ gslt_read_tiff_tag_value(&tiff->photometric, tiff, type, value, 1);
+ break;
+ case FillOrder:
+ gslt_read_tiff_tag_value(&tiff->fillorder, tiff, type, value, 1);
+ break;
+ case SamplesPerPixel:
+ gslt_read_tiff_tag_value(&tiff->samplesperpixel, tiff, type, value, 1);
+ break;
+ case RowsPerStrip:
+ gslt_read_tiff_tag_value(&tiff->rowsperstrip, tiff, type, value, 1);
+ break;
+ case XResolution:
+ gslt_read_tiff_tag_value(&tiff->xresolution, tiff, type, value, 1);
+ break;
+ case YResolution:
+ gslt_read_tiff_tag_value(&tiff->yresolution, tiff, type, value, 1);
+ break;
+ case PlanarConfiguration:
+ gslt_read_tiff_tag_value(&tiff->planar, tiff, type, value, 1);
+ break;
+ case T4Options:
+ gslt_read_tiff_tag_value(&tiff->g3opts, tiff, type, value, 1);
+ break;
+ case T6Options:
+ gslt_read_tiff_tag_value(&tiff->g4opts, tiff, type, value, 1);
+ break;
+ case Predictor:
+ gslt_read_tiff_tag_value(&tiff->predictor, tiff, type, value, 1);
+ break;
+ case ResolutionUnit:
+ gslt_read_tiff_tag_value(&tiff->resolutionunit, tiff, type, value, 1);
+ break;
+ case YCbCrSubSampling:
+ gslt_read_tiff_tag_value(tiff->ycbcrsubsamp, tiff, type, value, 2);
+ break;
+ case ExtraSamples:
+ gslt_read_tiff_tag_value(&tiff->extrasamples, tiff, type, value, 1);
+ break;
+
+ case JPEGTables:
+ tiff->jpegtables = tiff->bp + value;
+ tiff->jpegtableslen = count;
+ break;
+
+ case StripOffsets:
+ tiff->stripoffsets = (unsigned*) gs_alloc_bytes(mem, count * sizeof(unsigned), "StripOffsets");
+ if (!tiff->stripoffsets)
+ return gs_throw(-1, "could not allocate strip offsets");
+ gslt_read_tiff_tag_value(tiff->stripoffsets, tiff, type, value, count);
+ break;
+
+ case StripByteCounts:
+ tiff->stripbytecounts = (unsigned*) gs_alloc_bytes(mem, count * sizeof(unsigned), "StripByteCounts");
+ if (!tiff->stripbytecounts)
+ return gs_throw(-1, "could not allocate strip byte counts");
+ gslt_read_tiff_tag_value(tiff->stripbytecounts, tiff, type, value, count);
+ break;
+
+ case ColorMap:
+ tiff->colormap = (unsigned*) gs_alloc_bytes(mem, count * sizeof(unsigned), "ColorMap");
+ if (!tiff->colormap)
+ return gs_throw(-1, "could not allocate color map");
+ gslt_read_tiff_tag_value(tiff->colormap, tiff, type, value, count);
+ break;
+
+ case TileWidth:
+ case TileLength:
+ case TileOffsets:
+ case TileByteCounts:
+ return gs_throw(-1, "tiled tiffs not supported");
+
+ default:
+ /*
+ printf("unknown tag: %d t=%d n=%d\n", tag, type, count);
+ */
+ break;
+ }
+
+ return gs_okay;
+}
+
+gslt_image_t *
+gslt_image_decode_tiff(gs_memory_t *mem, byte *buf, int len)
+{
+ gslt_image_t *image;
+ int error;
+ gslt_tiff_t tiffst;
+ gslt_tiff_t *tiff = &tiffst;
+
+ unsigned version;
+ unsigned offset;
+ unsigned count;
+ unsigned i;
+
+ memset(tiff, 0, sizeof(gslt_tiff_t));
+
+ tiff->bp = buf;
+ tiff->rp = buf;
+ tiff->ep = buf + len;
+
+ /* tag defaults, where applicable */
+ tiff->bitspersample = 1;
+ tiff->compression = 1;
+ tiff->samplesperpixel = 1;
+ tiff->resolutionunit = 2;
+ tiff->rowsperstrip = 0xFFFFFFFF;
+ tiff->fillorder = 1;
+ tiff->planar = 1;
+ tiff->subfiletype = 0;
+ tiff->predictor = 1;
+ tiff->ycbcrsubsamp[0] = 2;
+ tiff->ycbcrsubsamp[1] = 2;
+
+ /*
+ * Read IFH
+ */
+
+ /* get byte order marker */
+ tiff->order = TII;
+ tiff->order = readshort(tiff);
+ if (tiff->order != TII && tiff->order != TMM)
+ gs_throw(-1, "not a TIFF file, wrong magic marker");
+
+ /* check version */
+ version = readshort(tiff);
+ if (version != 42)
+ gs_throw(-1, "not a TIFF file, wrong version marker");
+
+ /* get offset of IFD */
+ offset = readlong(tiff);
+
+ /*
+ * Read IFD
+ */
+
+ tiff->rp = tiff->bp + offset;
+
+ count = readshort(tiff);
+
+ offset += 2;
+ for (i = 0; i < count; i++)
+ {
+ error = gslt_read_tiff_tag(mem, tiff, offset);
+ if (error) {
+ error = gs_rethrow(error, "could not read TIFF header tag");
+ return NULL;
+ }
+ offset += 12;
+ }
+#ifdef GSLT_DEBUG_TIFF
+ gslt_debug_tiff(mem, tiff);
+#endif
+ /* new image */
+ image = gs_alloc_struct_immovable(mem, gslt_image_t,
+ &st_gslt_image, "new tiff gslt_image");
+ if (image == NULL) {
+ error = gs_throw(-1, "unable to allocate tiff gslt_image");
+ return NULL;
+ }
+ image->samples = gs_alloc_bytes(mem, image->stride * image->height,
+ "decoded tiff data");
+ if (image->samples == NULL) {
+ error = gs_throw(-1, "unable to allocate tiff gslt_image pixel data");
+ gs_free_object(mem, image, "free tiff gslt_image");
+ return NULL;
+ }
+
+ /*
+ * Decode the image strips
+ */
+
+ if (tiff->rowsperstrip > tiff->imagelength)
+ tiff->rowsperstrip = tiff->imagelength;
+
+ error = gslt_decode_tiff_strips(mem, tiff, image);
+ if (error) {
+ error = gs_rethrow(error, "could not decode image data");
+ return NULL;
+ }
+
+ /*
+ * Clean up scratch memory
+ */
+ /* todo: we need to handle this on error conditions too */
+ if (tiff->colormap) gs_free_object(mem, tiff->colormap, "ColorMap");
+ if (tiff->stripoffsets) gs_free_object(mem, tiff->stripoffsets, "StripOffsets");
+ if (tiff->stripbytecounts) gs_free_object(mem, tiff->stripbytecounts, "StripByteCounts");
+
+ return image;
+}
+
+#ifdef GSLT_DEBUG_TIFF
+static void
+gslt_debug_tiff(gs_memory_t *mem, gslt_tiff_t *tiff)
+{
+ int n;
+
+ dputs("TIFF <<\n");
+ dprintf1("\t/NewSubfileType %u\n", tiff->subfiletype);
+ dprintf1("\t/PhotometricInterpretation %u\n", tiff->photometric);
+ dprintf1("\t/Compression %u\n", tiff->compression);
+ dprintf1("\t/ImageWidth %u\n", tiff->imagewidth);
+ dprintf1("\t/ImageLength %u\n", tiff->imagelength);
+ dprintf1("\t/BitsPerSample %u\n", tiff->bitspersample);
+ dprintf1("\t/SamplesPerPixel %u\n", tiff->samplesperpixel);
+ dprintf1("\t/PlanarConfiguration %u\n", tiff->planar);
+ dprintf1("\t/ExtraSamples %u\n", tiff->extrasamples);
+ dprintf1("\t/ColorMap $%p\n", tiff->colormap);
+ dprintf1("\t/XResolution %u\n", tiff->xresolution);
+ dprintf1("\t/YResolution %u\n", tiff->yresolution);
+ dprintf1("\t/ResolutionUnit %u\n", tiff->resolutionunit);
+ dprintf1("\t/FillOrder %u\n", tiff->fillorder);
+ dprintf1("\t/T4Options %u\n", tiff->g3opts);
+ dprintf1("\t/T6Options %u\n", tiff->g4opts);
+ dprintf1("\t/Predictor %u\n", tiff->predictor);
+ dprintf1("\t/JPEGTables %u\n", tiff->jpegtableslen);
+ dprintf2("\t/YCbCrSubSampling %u %u\n", tiff->ycbcrsubsamp[0], tiff->ycbcrsubsamp[1]);
+
+ n = (tiff->imagelength + tiff->rowsperstrip - 1) / tiff->rowsperstrip;
+
+ dprintf1("\t/RowsPerStrip %u\n", tiff->rowsperstrip);
+
+ if (tiff->stripoffsets)
+ dprintf1("\t/StripOffsets %u\n", n);
+
+ if (tiff->stripbytecounts)
+ dprintf1("\t/StripByteCounts %u\n", n);
+
+ dputs(">>\n");
+}
+#endif
diff --git a/tools/gslite/gslt_init.c b/tools/gslite/gslt_init.c
new file mode 100644
index 000000000..4d58f984c
--- /dev/null
+++ b/tools/gslite/gslt_init.c
@@ -0,0 +1,215 @@
+/* Copyright (C) 1995, 2000 Aladdin Enterprises. All rights reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ For more information about licensing, please refer to
+ http://www.ghostscript.com/licensing/. For information on
+ commercial licensing, go to http://www.artifex.com/licensing/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861.
+*/
+
+/* GS lite initialization and setup */
+
+#include <stdlib.h>
+#include "stdio_.h"
+#include "math_.h"
+#include "string_.h"
+
+#include "gp.h"
+#include "gscdefs.h"
+#include "gserrors.h"
+#include "gslib.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gscoord.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsutil.h"
+#include "gx.h"
+#include "gxdevice.h"
+#include "gxpath.h"
+
+#include "gslt.h"
+
+/* Include the extern for the device list. */
+extern_gs_lib_device_list();
+
+init_proc(gs_iodev_init);
+
+gs_memory_t *
+gslt_init_library()
+{
+ gs_memory_t *mem;
+
+ /* A simple allocator to avoid the complications of the full
+ * featured memory allocator
+ */
+ mem = gslt_alloc_init();
+ gp_init();
+ gs_lib_init1(mem);
+
+ /* Debugging flags
+ */
+ memset(gs_debug, 0, 128);
+ gs_debug['@'] = 1;
+ gs_debug['?'] = 1;
+ gs_log_errors = 1; /* print error returns */
+
+ /* gs_iodev_init must be called after the rest of the inits, for
+ * obscure reasons that really should be documented!
+ */
+ gs_iodev_init(mem);
+
+ return mem;
+}
+
+gx_device *
+gslt_init_device(gs_memory_t *mem, char *name)
+{
+ const gx_device *const *list;
+ gx_device *dev;
+ int count, i;
+
+ count = gs_lib_device_list(&list, NULL);
+ for (i = 0; i < count; ++i)
+ {
+ if (!strcmp(gs_devicename(list[i]), name))
+ {
+ gs_copydevice(&dev, list[i], mem);
+ // stefan foo: pulled for linking to gs 8.13
+ //check_device_separable(dev);
+ gx_device_fill_in_procs(dev); /* really? i thought gs_setdevice_no_erase did that. */
+ return dev;
+ }
+ }
+
+ lprintf1("device %s not found\n", name);
+ exit(1);
+
+ return NULL;
+}
+
+void
+gslt_get_device_param(gs_memory_t *mem, gx_device *dev, char *key)
+{
+ gs_c_param_list list;
+ gs_param_string nstr;
+ int code;
+
+ gs_c_param_list_write(&list, mem);
+ code = gs_getdeviceparams(dev, (gs_param_list *) & list);
+ if (code < 0)
+ {
+ lprintf1("getdeviceparams failed! code = %d\n", code);
+ exit(1);
+ }
+
+ gs_c_param_list_read(&list);
+ code = param_read_string((gs_param_list *) & list, key, &nstr);
+ if (code < 0)
+ {
+ lprintf1("reading device parameter %s failed\n", key);
+ exit(1);
+ }
+
+ dprintf1("device %s = ", key);
+ debug_print_string(nstr.data, nstr.size);
+ dputs("\n");
+ gs_c_param_list_release(&list);
+}
+
+void
+gslt_set_device_param(gs_memory_t *mem, gx_device *dev, char *key, char *val)
+{
+ gs_c_param_list list;
+ gs_param_string nstr;
+ int code;
+
+ gs_c_param_list_write(&list, mem);
+ param_string_from_string(nstr, val);
+ code = param_write_string((gs_param_list *)&list, key, &nstr);
+ if (code < 0)
+ {
+ lprintf1("writing device parameter %s failed\n", key);
+ exit(1);
+ }
+
+ gs_c_param_list_read(&list);
+ code = gs_putdeviceparams(dev, (gs_param_list *)&list);
+ gs_c_param_list_release(&list);
+ if (code < 0 && code != gs_error_undefined)
+ {
+ lprintf1("putdeviceparams failed! code = %d\n", code);
+ exit(1);
+ }
+}
+
+gs_state *gslt_init_state(gs_memory_t *mem, gx_device *dev)
+{
+ gs_state *pgs;
+
+ pgs = gs_state_alloc(mem);
+ gs_setdevice_no_erase(pgs, dev); /* set device, but don't erase */
+
+ /* gsave and grestore (among other places) assume that */
+ /* there are at least 2 gstates on the graphics stack. */
+ /* Ensure that now. */
+ gs_gsave(pgs);
+
+ return pgs;
+}
+
+void gslt_free_state(gs_memory_t *mem, gs_state *pgs)
+{
+ gs_state_free(pgs);
+}
+
+void gslt_free_device(gs_memory_t *mem, gx_device *dev)
+{
+ gs_free_object(mem, dev, "gslt device"); // TODO: how do i free devices?
+}
+
+void gslt_free_library(gs_memory_t *mem)
+{
+ // TODO: how do i free the allocator?
+}
+
+#if 0
+
+int
+main(int argc, const char *argv[])
+{
+ gs_memory_t *mem;
+ gx_device *dev;
+ gs_state *pgs;
+
+ mem = gslt_init_library();
+ dev = gslt_init_device(mem, "x11");
+ pgs = gslt_init_state(mem, dev);
+
+ gslt_get_device_param(mem, dev, "Name");
+ gslt_set_device_param(mem, dev, "OutputFile", "-");
+
+ gs_erasepage(pgs);
+
+ gs_moveto(pgs, 10, 10);
+ gs_lineto(pgs, 20, 50);
+ gs_stroke(pgs);
+
+ gs_output_page(pgs, 1, 1);
+
+ fgetc(mem->gs_lib_ctx->fstdin);
+
+ gslt_free_library(mem, dev, pgs);
+ return 0;
+}
+
+#endif
+
diff --git a/tools/gslite/gslt_lib_gcc.mak b/tools/gslite/gslt_lib_gcc.mak
new file mode 100644
index 000000000..e0baf0f2b
--- /dev/null
+++ b/tools/gslite/gslt_lib_gcc.mak
@@ -0,0 +1,147 @@
+# gslite library makefile.
+MAKEFILE=gslt_lib_gcc.mak
+
+# needed to tell how to build the shared library
+PLATFORM := $(shell uname)
+
+# this is where we build everything. The ghostscript makefiles will
+# need all of these set to work properly.
+GENDIR=./obj
+GLGENDIR=./obj
+GLOBJDIR=./obj
+
+# location of ghostscript source code.
+GLSRCDIR=../../gs/src
+
+# sigh. will we ever fix this?
+GX_COLOR_INDEX_DEFINE=-DGX_COLOR_INDEX_TYPE="unsigned long long"
+
+# set up flags. NB refactor duplication - see gccdefs.mak included
+# below and figure out how best to set up GCFLAGS, XCFLAGS, and
+# .*FLAGS
+
+GCFLAGS=-DGSLITE -Wall -Wpointer-arith -Wstrict-prototypes -Wwrite-strings -DNDEBUG $(GX_COLOR_INDEX_DEFINE) -fPIC -fno-common
+XCFLAGS=-DGSLITE -Wall -Wpointer-arith -Wstrict-prototypes -Wwrite-strings -DNDEBUG $(GX_COLOR_INDEX_DEFINE) -fPIC -fno-common
+
+DD=$(GLGENDIR)/
+
+# output devices - none required.
+DEVICES=
+
+# required features in addition to libcore.dev. NB This should be
+# pruned.
+FEATURES=\
+ $(DD)page.dev $(DD)gsnogc.dev $(DD)ttflib.dev $(DD)sdctd.dev\
+ $(DD)psf1lib.dev $(DD)psf2lib.dev\
+ $(DD)path1lib.dev $(DD)shadelib.dev $(DD)cidlib.dev\
+ $(DD)psl3lib.dev $(DD)slzwd.dev $(DD)szlibd.dev\
+ $(DD)cmaplib.dev $(DD)libpng.dev
+
+# jpeg
+JSRCDIR=../../gs/jpeg
+JGENDIR=$(GENDIR)
+JOBJDIR=$(GENDIR)
+
+# zlib
+ZSRCDIR=../../gs/zlib
+ZGENDIR=$(GENDIR)
+ZOBJDIR=$(GENDIR)
+
+# lib png
+PNGSRCDIR=../../gs/libpng
+PNGGENDIR=$(GENDIR)
+PNGOBJDIR=$(GENDIR)
+
+SHARE_ZLIB=0
+SHARE_LIBPNG=0
+SHARE_JPEG=0
+
+# ill-named extra libraries.
+STDLIBS=-lm
+
+# shared library NB - needs soname.
+GSLITE_LIB=libgslt.so
+
+all: $(GSLITE_LIB)
+
+# gs library config and miscellany.
+GSXLIBS=$(GLOBJDIR)/gsargs.$(OBJ) $(GLOBJDIR)/gconfig.$(OBJ) $(GLOBJDIR)/gscdefs.$(OBJ)
+
+# invoke the gs *library* makefile to build needed
+# devices, objects and configuration files.
+GSLIB_PARTS=$(GLOBJDIR)/ld.tr
+$(GSLIB_PARTS): $(MAKEFILE)
+ -mkdir $(GLOBJDIR)
+ $(MAKE) \
+ GCFLAGS='$(GCFLAGS)' \
+ STDLIBS="$(STDLIBS)" \
+ FEATURE_DEVS="$(FEATURES)"\
+ DEVICE_DEVS="$(DEVICES)"\
+ GLSRCDIR=$(GLSRCDIR) GLGENDIR=$(GLGENDIR) GLOBJDIR=$(GLOBJDIR) \
+ JSRCDIR=$(JSRCDIR) JGENDIR=$(JGENDIR) JOBJDIR=$(JOBJDIR)\
+ ZSRCDIR=$(ZSRCDIR) ZGENDIR=$(ZGENDIR) ZOBJDIR=$(ZOBJDIR)\
+ PNGSRCDIR=$(PNGSRCDIR) PNGGENDIR=$(PNGGENDIR) PNGOBJDIR=$(PNGOBJDIR)\
+ PSD='$(GENDIR)/'\
+ SHARE_ZLIB=$(SHARE_ZLIB) SHARE_LIBPNG=$(SHARE_LIBPNG) SHARE_JPEG=$(SHARE_JPEG)\
+ -f $(GLSRCDIR)/ugcclib.mak \
+ $(GLOBJDIR)/ld.tr \
+ $(GSXLIBS) \
+ $(GLOBJDIR)/jpeglib_.h
+
+# ---------------------------------
+# settings needed for building the gslite objects of gslt.mak
+
+GSLTSRCDIR=.
+
+# common definitions - CC_, I_ etc.
+COMMONDIR=../../common
+include $(COMMONDIR)/unixdefs.mak
+include $(COMMONDIR)/gccdefs.mak
+
+# include for gslt sources
+include gslt.mak
+
+# ---------------------------------
+# put gslite and graphics library objects in one library
+
+# ---------------------------------
+# put gslite and graphics library objects in one library
+
+LIBS = -lgslt -lpthread -L./
+
+# NB missing soname, version business.
+$(GSLITE_LIB): $(GSLIB_PARTS) $(GSLT_OBJS) $(MAKEFILE)
+ifeq ($(PLATFORM), Darwin)
+ gcc -dynamiclib -o libgslt.dylib $(shell cat obj/ld.tr | sed 's/\\//g') $(GSXLIBS) $(GSLT_OBJS) $(STDLIBS)
+else
+ gcc -shared $(shell cat obj/ld.tr | sed 's/\\//g') $(GSXLIBS) $(GSLT_OBJS) -o $(GSLITE_LIB) $(STDLIBS)
+endif
+
+$(GSLTOBJ)gslt_image_test.$(OBJ) : $(GSLITE_LIB) $(GSLTSRC)gslt_image_test.c
+ $(GSLT_CC) $(GSLTO_)gslt_image_test.$(OBJ) $(C_) $(GSLTSRC)gslt_image_test.c
+
+$(GSLTOBJ)gslt_font_test.$(OBJ) : $(GSLITE_LIB) $(GSLTSRC)gslt_font_test.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_test.$(OBJ) $(C_) $(GSLTSRC)gslt_font_test.c
+
+$(GSLTOBJ)gslt_image_threads_test.$(OBJ) : $(GSLITE_LIB) $(GSLTSRC)gslt_image_threads_test.c
+ $(GSLT_CC) $(GSLTO_)gslt_image_threads_test.$(OBJ) $(C_) $(GSLTSRC)gslt_image_threads_test.c
+
+gslt_image_test: $(GSLTOBJ)gslt_image_test.$(OBJ) $(gslt_OBJS)
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+gslt_font_test: $(GSLTOBJ)gslt_font_test.$(OBJ) $(gslt_OBJS)
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+gslt_image_threads_test: $(GSLTOBJ)gslt_image_threads_test.$(OBJ) $(gslt_OBJS)
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(INCLUDES) -o $@ $^ $(LDFLAGS) $(LIBS)
+
+
+check: $(GSLITE_LIB) gslt_image_test gslt_font_test gslt_image_threads_test
+ LD_LIBRARY_PATH=. ./gslt_image_test tiger.jpg
+ LD_LIBRARY_PATH=. ./gslt_image_threads_test tiger.jpg
+ LD_LIBRARY_PATH=. ./gslt_font_test ../../urwfonts/CenturySchL-Bold.ttf
+
+clean:
+ $(RM) *.pnm *.pbm *.so *.o *~ obj/* gslt_image_test gslt_font_test gslt_image_threads_test
+
+.PHONY: clean check all
diff --git a/tools/gslite/gslt_lib_msvc.mak b/tools/gslite/gslt_lib_msvc.mak
new file mode 100644
index 000000000..54d91bd11
--- /dev/null
+++ b/tools/gslite/gslt_lib_msvc.mak
@@ -0,0 +1,147 @@
+# gslite library makefile.
+
+MAKEFILE=gslt_lib_msvc.mak
+MSVC_VERSION=8
+
+# Debugging options. For production system DEBUG=0 and TDEBUG=0.
+DEBUG=1
+TDEBUG=1
+
+DEVSTUDIO=
+NOPRIVATE=0
+
+COMPILE_INITS=0
+
+
+# this is where we build everything. The ghostscript makefiles will
+# need all of these set to work properly.
+GENDIR=.\obj
+GLGENDIR=.\obj
+GLOBJDIR=.\obj
+
+# location of ghostscript source code.
+GLSRCDIR=..\..\gs\src
+
+# sigh. will we ever fix this? Definitions to force gx_color_index
+# to 64 bits and define GSLITE.
+
+XCFLAGS=/DGSLITE
+
+DD=$(GLGENDIR)
+
+# output devices - none required.
+DEVICES=
+
+# required features in addition to libcore.dev. NB This should be
+# pruned.
+FEATURES=\
+ $(DD)\page.dev $(DD)\gsnogc.dev $(DD)\ttflib.dev $(DD)\sdctd.dev\
+ $(DD)\psf1lib.dev $(DD)\psf2lib.dev\
+ $(DD)\path1lib.dev $(DD)\shadelib.dev $(DD)\cidlib.dev\
+ $(DD)\psl3lib.dev $(DD)\slzwd.dev $(DD)\szlibd.dev\
+ $(DD)\cmaplib.dev $(DD)\libpng.dev
+
+# jpeg
+JSRCDIR=..\..\gs\jpeg
+JGENDIR=$(GENDIR)
+JOBJDIR=$(GENDIR)
+
+# zlib
+ZSRCDIR=..\..\gs\zlib
+ZGENDIR=$(GENDIR)
+ZOBJDIR=$(GENDIR)
+
+# lib png
+PNGSRCDIR=..\..\gs\libpng
+PNGGENDIR=$(GENDIR)
+PNGOBJDIR=$(GENDIR)
+
+# indicate we do not want use system shared libraries for zlib, png,
+# and jpeg.
+SHARE_ZLIB=0
+SHARE_LIBPNG=0
+SHARE_JPEG=0
+
+STDLIBS=-lm
+
+GSLITE_LIB=libgslt.dll
+all: $(GSLITE_LIB)
+
+# invoke the gs *library* makefile to build needed
+# devices, objects and configuration files.
+GSLIB_PARTS=$(GLOBJDIR)\ld.tr
+$(GSLIB_PARTS): $(MAKEFILE)
+ -mkdir $(GLOBJDIR)
+ $(MAKE) \
+ DEBUG=$(DEBUG) \
+ TDEBUG=$(TDEBUG) \
+ MSVC_VERSION=$(MSVC_VERSION) \
+ DEVSTUDIO=$(DEVSTUDIO) \
+ GCFLAGS=$(GCFLAGS) \
+ XCFLAGS=$(XCFLAGS) \
+ STDLIBS=$(STDLIBS) \
+ FEATURE_DEVS="$(FEATURES)"\
+ DEVICE_DEVS="$(DEVICES)"\
+ GLSRCDIR=$(GLSRCDIR) GLGENDIR=$(GLGENDIR) GLOBJDIR=$(GLOBJDIR) \
+ JSRCDIR=$(JSRCDIR) JGENDIR=$(JGENDIR) JOBJDIR=$(JOBJDIR)\
+ ZSRCDIR=$(ZSRCDIR) ZGENDIR=$(ZGENDIR) ZOBJDIR=$(ZOBJDIR)\
+ PNGSRCDIR=$(PNGSRCDIR) PNGGENDIR=$(PNGGENDIR) PNGOBJDIR=$(PNGOBJDIR)\
+ PSD="$(GENDIR)/"\
+ SHARE_ZLIB=$(SHARE_ZLIB) SHARE_LIBPNG=$(SHARE_LIBPNG) SHARE_JPEG=$(SHARE_JPEG)\
+ /f $(GLSRCDIR)\msvclib.mak \
+ $(GLOBJDIR)\ld.tr \
+ $(GLOBJDIR)\gsargs.obj \
+ $(GLOBJDIR)\gconfig.obj $(GLOBJDIR)\gscdefs.obj \
+ $(GLOBJDIR)\jpeglib_.h
+
+
+# ---------------------------------
+# settings needed for building the gslite objects of gslt.mak
+
+GSLTSRCDIR=.
+
+
+# common definitions - CC_, I_ etc.
+COMMONDIR=..\..\common
+!include $(COMMONDIR)\pcdefs.mak
+!include $(COMMONDIR)\msvcdefs.mak
+!include $(GLSRCDIR)\msvccmd.mak
+
+# include for gslt sources
+!include gslt.mak
+
+# ---------------------------------
+# put gslite and graphics library objects in one library
+
+
+
+# windows clutter.
+MSXLIBS=shell32.lib comdlg32.lib gdi32.lib user32.lib winspool.lib advapi32.lib
+# gs library config and miscellany.
+GSXLIBS=$(GLOBJDIR)\gsargs.obj $(GLOBJDIR)\gconfig.obj $(GLOBJDIR)\gscdefs.obj
+
+$(GSLITE_LIB): $(GSLIB_PARTS) $(GSLT_OBJS) $(GSXLIBS) $(MAKEFILE)
+ link -dll -out:$(GSLITE_LIB) -def:gslt.def \
+ -implib:gsltimp.lib $(GSLT_OBJS) $(MSXLIBS) $(GSXLIBS) @obj\ld.tr
+
+# the dependency on GSLIB_LIB is needed because the c compiler line
+# @ccf32.tr is a needed side effect from building the library.
+$(GSLTOBJ)gslt_image_test.$(OBJ) : $(GSLITE_LIB) $(GSLTSRC)gslt_image_test.c
+ $(GSLT_CC) $(GSLTO_)gslt_image_test.$(OBJ) $(C_) $(GSLTSRC)gslt_image_test.c
+
+$(GSLTOBJ)gslt_font_test.$(OBJ) : $(GSLITE_LIB) $(GSLTSRC)gslt_font_test.c
+ $(GSLT_CC) $(GSLTO_)gslt_font_test.$(OBJ) $(C_) $(GSLTSRC)gslt_font_test.c
+
+gslt_image_test.exe: $(GSLTOBJ)gslt_image_test.$(OBJ) $(GSLT_OBJS) $(GSLITE_LIB)
+ link $(GSLTOBJ)gslt_image_test.$(OBJ) gsltimp.lib
+
+gslt_font_test.exe: $(GSLTOBJ)gslt_font_test.$(OBJ) $(GSLT_OBJS) $(GSLITE_LIB)
+ link $(GSLTOBJ)gslt_font_test.$(OBJ) gsltimp.lib
+
+
+check: gslt_font_test.exe gslt_image_test.exe
+ gslt_font_test ..\..\urwfonts\CenturySchL-Bold.ttf
+ gslt_image_test tiger.jpg
+
+clean:
+ del *.pnm *.pbm *.lib *.exe obj\*.obj *.obj obj\*.tr
diff --git a/tools/gslite/gslt_stubs.c b/tools/gslite/gslt_stubs.c
new file mode 100644
index 000000000..307994d8a
--- /dev/null
+++ b/tools/gslite/gslt_stubs.c
@@ -0,0 +1,44 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: $ */
+/* gslt stubs */
+
+/* NB includes and stubs copied from plplatf.c */
+#include "string_.h"
+#include "gdebug.h"
+#include "gsio.h"
+#include "gstypes.h"
+#include "gsmemory.h"
+#include "gsstruct.h"
+#include "gp.h"
+#include "gslib.h"
+
+/* ---------------- Stubs ---------------- */
+
+/* Stubs for GC */
+const gs_ptr_procs_t ptr_struct_procs = { NULL, NULL, NULL };
+const gs_ptr_procs_t ptr_string_procs = { NULL, NULL, NULL };
+const gs_ptr_procs_t ptr_const_string_procs = { NULL, NULL, NULL };
+void * /* obj_header_t * */
+gs_reloc_struct_ptr(const void * /* obj_header_t * */ obj, gc_state_t *gcst)
+{ return (void *)obj;
+}
+void
+gs_reloc_string(gs_string *sptr, gc_state_t *gcst)
+{
+}
+void
+gs_reloc_const_string(gs_const_string *sptr, gc_state_t *gcst)
+{
+}
diff --git a/tools/gslite/gslt_test.c b/tools/gslite/gslt_test.c
new file mode 100644
index 000000000..8a5db50ac
--- /dev/null
+++ b/tools/gslite/gslt_test.c
@@ -0,0 +1,1272 @@
+/* Copyright (C) 2006 artofcode LLC.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id: gslt_test.c 2991 2007-12-18 23:05:58Z giles $ */
+/* Test program for Ghostscript library */
+
+/* Capture stdin/out/err before gsio.h redefines them. */
+#include "stdio_.h"
+#include "math_.h"
+#include "string_.h"
+#include "gx.h"
+#include "gp.h"
+#include "gslt_alloc.h"
+#include "gscdefs.h"
+#include "gserrors.h"
+#include "gslib.h"
+#include "gsmatrix.h"
+#include "gsstate.h"
+#include "gscspace.h"
+#include "gscolor2.h"
+#include "gscoord.h"
+#include "gscie.h"
+#include "gscrd.h"
+#include "gsiparm3.h"
+#include "gsiparm4.h"
+#include "gsparam.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gspath2.h"
+#include "gsrop.h"
+#include "gsstruct.h"
+#include "gsutil.h"
+#include "gxalloc.h"
+#include "gxdcolor.h" /* for gx_device_white/black */
+#include "gxdevice.h"
+#include "gxht.h" /* for gs_halftone */
+// #include "gdevcmap.h"
+#include "gshtx.h"
+#include "gxpath.h"
+
+/* Test programs */
+static int test1(gs_state *, gs_memory_t *); /* kaleidoscope */
+static int test2(gs_state *, gs_memory_t *); /* pattern fill */
+static int test3(gs_state *, gs_memory_t *); /* RasterOp */
+static int test4(gs_state *, gs_memory_t *); /* set resolution */
+static int test5(gs_state *, gs_memory_t *); /* images */
+static int test6(gs_state *, gs_memory_t *); /* CIE API, snapping */
+#ifdef HALFTONE_FIX
+static int test7(gs_state *, gs_memory_t *); /* non-monot HT */
+#endif
+static int test8(gs_state *, gs_memory_t *); /* transp patterns */
+static int test9(gs_state *, gs_memory_t *); /* type 42 font */
+
+static int (*tests[]) (gs_state *, gs_memory_t *) =
+{
+ test1, test2, test3, test4, test5,
+ test6,
+#ifdef HALFTONE_FIX
+ test7,
+#else
+ 0,
+#endif
+ test8, test9,
+};
+
+/* Include the extern for the device list. */
+extern_gs_lib_device_list();
+
+/* Forward references */
+static float odsf(floatp, floatp);
+
+
+/* return index in gs device list -1 if not found */
+static inline int
+get_device_index(const gs_memory_t *mem, const char *value)
+{
+ const gx_device *const *dev_list;
+ int num_devs = gs_lib_device_list(&dev_list, NULL);
+ int di;
+
+ for ( di = 0; di < num_devs; ++di )
+ if ( !strcmp(gs_devicename(dev_list[di]), value) )
+ break;
+ if ( di == num_devs ) {
+ lprintf1("Unknown device name %s.\n", value);
+ return -1;
+ }
+ return di;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ char achar;
+ gs_memory_t *mem;
+ /* memory braindamage */
+#define gs_stdin mem->gs_lib_ctx->fstdin
+ gs_state *pgs;
+ const gx_device *const *list;
+ gx_device *dev;
+ int code = 0;
+
+ /* a simple allocator to avoid the complications of the full
+ featured memory allocator */
+ mem = gslt_alloc_init();
+ gp_init();
+ gs_lib_init1(mem);
+ if (argc < 3 || (achar = argv[2][0]) < '1' ||
+ achar > '0' + countof(tests)
+ ) {
+ lprintf1("Usage: gslt [device] 1..%c\n", '0' + (char)countof(tests));
+ exit(1);
+ }
+ memset(gs_debug, 0, 128);
+ gs_debug['@'] = 1;
+ gs_debug['?'] = 1;
+/*gs_debug['B'] = 1; *//****** PATCH ******/
+/*gs_debug['L'] = 1; *//****** PATCH ******/
+ gs_log_errors = 0;
+ /*
+ * gs_iodev_init must be called after the rest of the inits, for
+ * obscure reasons that really should be documented!
+ */
+ gs_iodev_init(mem);
+ {
+ int devindex = get_device_index(mem, argv[1]);
+ if (devindex < 0) {
+ lprintf1("device %s not found\n", argv[1]);
+ exit(1);
+ }
+ gs_lib_device_list(&list, NULL);
+ gs_copydevice(&dev, list[devindex], mem);
+ }
+ // stefan foo: pulled for linking to gs 8.13
+ //check_device_separable(dev);
+ gx_device_fill_in_procs(dev);
+ /* Print out the device name just to test the gsparam.c API. */
+ {
+ gs_c_param_list list;
+ gs_param_string nstr;
+
+ gs_c_param_list_write(&list, mem);
+ code = gs_getdeviceparams(dev, (gs_param_list *) & list);
+ if (code < 0) {
+ lprintf1("getdeviceparams failed! code = %d\n", code);
+ exit(1);
+ }
+ gs_c_param_list_read(&list);
+ code = param_read_string((gs_param_list *) & list, "Name", &nstr);
+ if (code < 0) {
+ lprintf1("reading Name failed! code = %d\n", code);
+ exit(1);
+ }
+ dputs("Device name = ");
+ debug_print_string(nstr.data, nstr.size);
+ dputs("\n");
+ gs_c_param_list_release(&list);
+ }
+ /*
+ * If this is a device that takes an OutputFile, set the OutputFile
+ * to "-" in the copy.
+ */
+ {
+ gs_c_param_list list;
+ gs_param_string nstr;
+
+ gs_c_param_list_write(&list, mem);
+ param_string_from_string(nstr, "-");
+ code = param_write_string((gs_param_list *)&list, "OutputFile", &nstr);
+ if (code < 0) {
+ lprintf1("writing OutputFile failed! code = %d\n", code);
+ exit(1);
+ }
+ gs_c_param_list_read(&list);
+ code = gs_putdeviceparams(dev, (gs_param_list *)&list);
+ gs_c_param_list_release(&list);
+ if (code < 0 && code != gs_error_undefined) {
+ lprintf1("putdeviceparams failed! code = %d\n", code);
+ exit(1);
+ }
+ }
+ pgs = gs_state_alloc(mem);
+ gs_setdevice_no_erase(pgs, dev); /* can't erase yet */
+ {
+ gs_point dpi;
+ gs_screen_halftone ht;
+
+ gs_dtransform(pgs, 72.0, 72.0, &dpi);
+ ht.frequency = min(fabs(dpi.x), fabs(dpi.y)) / 16.001;
+ ht.angle = 0;
+ ht.spot_function = odsf;
+ gs_setscreen(pgs, &ht);
+ }
+ /* gsave and grestore (among other places) assume that */
+ /* there are at least 2 gstates on the graphics stack. */
+ /* Ensure that now. */
+ gs_gsave(pgs);
+ gs_erasepage(pgs);
+
+ if (tests[achar - '1']) {
+ dprintf1("gslt test case = %d\n", achar - '1');
+ code = (*tests[achar - '1']) (pgs, mem);
+ gs_output_page(pgs, 1, 1);
+ if (code)
+ dprintf1("**** Test returned code = %d.\n", code);
+ dputs("Done. Press <enter> to exit.\n");
+ fgetc(gs_stdin);
+ } else {
+ dputs("test not defined\n");
+ }
+ gs_lib_finit(0, 0, mem);
+ return code;
+
+#undef mem
+}
+/* Ordered dither spot function */
+static float
+odsf(floatp x, floatp y)
+{
+ static const byte dither[256] =
+ {
+ 0x0E, 0x8E, 0x2E, 0xAE, 0x06, 0x86, 0x26, 0xA6, 0x0C, 0x8C, 0x2C, 0xAC, 0x04, 0x84, 0x24, 0xA4,
+ 0xCE, 0x4E, 0xEE, 0x6E, 0xC6, 0x46, 0xE6, 0x66, 0xCC, 0x4C, 0xEC, 0x6C, 0xC4, 0x44, 0xE4, 0x64,
+ 0x3E, 0xBE, 0x1E, 0x9E, 0x36, 0xB6, 0x16, 0x96, 0x3C, 0xBC, 0x1C, 0x9C, 0x34, 0xB4, 0x14, 0x94,
+ 0xFE, 0x7E, 0xDE, 0x5E, 0xF6, 0x76, 0xD6, 0x56, 0xFC, 0x7C, 0xDC, 0x5C, 0xF4, 0x74, 0xD4, 0x54,
+ 0x01, 0x81, 0x21, 0xA1, 0x09, 0x89, 0x29, 0xA9, 0x03, 0x83, 0x23, 0xA3, 0x0B, 0x8B, 0x2B, 0xAB,
+ 0xC1, 0x41, 0xE1, 0x61, 0xC9, 0x49, 0xE9, 0x69, 0xC3, 0x43, 0xE3, 0x63, 0xCB, 0x4B, 0xEB, 0x6B,
+ 0x31, 0xB1, 0x11, 0x91, 0x39, 0xB9, 0x19, 0x99, 0x33, 0xB3, 0x13, 0x93, 0x3B, 0xBB, 0x1B, 0x9B,
+ 0xF1, 0x71, 0xD1, 0x51, 0xF9, 0x79, 0xD9, 0x59, 0xF3, 0x73, 0xD3, 0x53, 0xFB, 0x7B, 0xDB, 0x5B,
+ 0x0D, 0x8D, 0x2D, 0xAD, 0x05, 0x85, 0x25, 0xA5, 0x0F, 0x8F, 0x2F, 0xAF, 0x07, 0x87, 0x27, 0xA7,
+ 0xCD, 0x4D, 0xED, 0x6D, 0xC5, 0x45, 0xE5, 0x65, 0xCF, 0x4F, 0xEF, 0x6F, 0xC7, 0x47, 0xE7, 0x67,
+ 0x3D, 0xBD, 0x1D, 0x9D, 0x35, 0xB5, 0x15, 0x95, 0x3F, 0xBF, 0x1F, 0x9F, 0x37, 0xB7, 0x17, 0x97,
+ 0xFD, 0x7D, 0xDD, 0x5D, 0xF5, 0x75, 0xD5, 0x55, 0xFF, 0x7F, 0xDF, 0x5F, 0xF7, 0x77, 0xD7, 0x57,
+ 0x02, 0x82, 0x22, 0xA2, 0x0A, 0x8A, 0x2A, 0xAA, 0x00, 0x80, 0x20, 0xA0, 0x08, 0x88, 0x28, 0xA8,
+ 0xC2, 0x42, 0xE2, 0x62, 0xCA, 0x4A, 0xEA, 0x6A, 0xC0, 0x40, 0xE0, 0x60, 0xC8, 0x48, 0xE8, 0x68,
+ 0x32, 0xB2, 0x12, 0x92, 0x3A, 0xBA, 0x1A, 0x9A, 0x30, 0xB0, 0x10, 0x90, 0x38, 0xB8, 0x18, 0x98,
+ 0xF2, 0x72, 0xD2, 0x52, 0xFA, 0x7A, 0xDA, 0x5A, 0xF0, 0x70, 0xD0, 0x50, 0xF8, 0x78, 0xD8, 0x58
+ };
+ int i = (int)((x + 1) * 7.9999);
+ int j = (int)((y + 1) * 7.9999);
+
+ return dither[16 * i + j] / 256.0;
+}
+
+/* Fill a rectangle. */
+static int
+fill_rect1(gs_state * pgs, floatp x, floatp y, floatp w, floatp h)
+{
+ gs_rect r;
+
+ r.q.x = (r.p.x = x) + w;
+ r.q.y = (r.p.y = y) + h;
+ return gs_rectfill(pgs, &r, 1);
+}
+
+/* Stubs for GC */
+const gs_ptr_procs_t ptr_struct_procs =
+{NULL, NULL, NULL};
+const gs_ptr_procs_t ptr_string_procs =
+{NULL, NULL, NULL};
+const gs_ptr_procs_t ptr_const_string_procs =
+{NULL, NULL, NULL};
+void * /* obj_header_t * */
+gs_reloc_struct_ptr(const void * /* obj_header_t * */ obj, gc_state_t * gcst)
+{
+ return (void *)obj;
+}
+void
+gs_reloc_string(gs_string * sptr, gc_state_t * gcst)
+{
+}
+void
+gs_reloc_const_string(gs_const_string * sptr, gc_state_t * gcst)
+{
+}
+
+/* Other stubs */
+void
+gs_to_exit(const gs_memory_t *mem, int exit_status)
+{
+ gs_lib_finit(exit_status, 0, mem);
+}
+
+void
+gs_abort(const gs_memory_t *mem)
+{
+ gs_to_exit(mem, 1); /* cleanup */
+ gp_do_exit(1); /* system independent exit() */
+}
+
+
+/* Return the number with the magnitude of x and the sign of y. */
+/* This is a BSD addition to libm; not all compilers have it. */
+static double
+gs_copysign(floatp x, floatp y)
+{
+ return ( y >= 0 ? fabs(x) : -fabs(x) );
+}
+
+
+/* ---------------- Test program 1 ---------------- */
+/* Draw a colored kaleidoscope. */
+
+/* Random number generator */
+static long rand_state = 1;
+static long
+rand(void)
+{
+#define A 16807
+#define M 0x7fffffff
+#define Q 127773 /* M / A */
+#define R 2836 /* M % A */
+ rand_state = A * (rand_state % Q) - R * (rand_state / Q);
+ /* Note that rand_state cannot be 0 here. */
+ if (rand_state <= 0)
+ rand_state += M;
+#undef A
+#undef M
+#undef Q
+#undef R
+ return rand_state;
+}
+static int
+test1(gs_state * pgs, gs_memory_t * mem)
+{
+ int n;
+
+ gs_scale(pgs, 72.0, 72.0);
+ gs_translate(pgs, 4.25, 5.5);
+ gs_scale(pgs, 4.0, 4.0);
+ gs_newpath(pgs);
+ for (n = 200; --n >= 0;) {
+ int j;
+
+#define rf() (rand() / (1.0 * 0x10000 * 0x8000))
+ double r = rf(), g = rf(), b = rf();
+ double x0 = rf(), y0 = rf(), x1 = rf(), y1 = rf(), x2 = rf(), y2 = rf();
+
+ gs_setrgbcolor(pgs, r, g, b);
+ for (j = 0; j < 6; j++) {
+ gs_gsave(pgs);
+ gs_rotate(pgs, 60.0 * j);
+ gs_moveto(pgs, x0, y0);
+ gs_lineto(pgs, x1, y1);
+ gs_lineto(pgs, x2, y2);
+ gs_fill(pgs);
+ gs_grestore(pgs);
+ }
+ }
+#undef mem
+ return 0;
+}
+
+/* ---------------- Test program 2 ---------------- */
+/* Fill an area with a pattern. */
+
+static int
+test2(gs_state * pgs, gs_memory_t * mem)
+{
+ gs_client_color cc;
+ gx_tile_bitmap tile;
+ /*const */ byte tpdata[] =
+ {
+ /* Define a pattern that looks like this:
+ ..xxxx
+ .....x
+ .....x
+ ..xxxx
+ .x....
+ x.....
+ */
+ 0x3c, 0, 0, 0, 0x04, 0, 0, 0, 0x04, 0, 0, 0, 0x3c, 0, 0, 0,
+ 0x40, 0, 0, 0, 0x80, 0, 0, 0
+ };
+
+ gs_newpath(pgs);
+ gs_moveto(pgs, 100.0, 300.0);
+ gs_lineto(pgs, 500.0, 500.0);
+ gs_lineto(pgs, 200.0, 100.0);
+ gs_lineto(pgs, 300.0, 500.0);
+ gs_lineto(pgs, 500.0, 200.0);
+ gs_closepath(pgs);
+ gs_setrgbcolor(pgs, 0.0, 0.0, 0.0);
+ gs_gsave(pgs);
+ gs_fill(pgs);
+ gs_grestore(pgs);
+ tile.data = tpdata;
+ tile.raster = 4;
+ tile.size.x = tile.rep_width = 6;
+ tile.size.y = tile.rep_height = 6;
+ tile.id = gx_no_bitmap_id;
+ gs_makebitmappattern(&cc, &tile, true, pgs, NULL);
+ /* Note: color space is DeviceRGB */
+ cc.paint.values[0] = 0.0;
+ cc.paint.values[1] = 1.0;
+ cc.paint.values[2] = 1.0;
+ gs_setpattern(pgs, &cc);
+ gs_eofill(pgs);
+ gs_makebitmappattern(&cc, &tile, false, pgs, NULL);
+ gs_setcolor(pgs, &cc);
+ gs_moveto(pgs, 50.0, 50.0);
+ gs_lineto(pgs, 300.0, 50.0);
+ gs_lineto(pgs, 50.0, 300.0);
+ gs_closepath(pgs);
+ gs_setrgbcolor(pgs, 1.0, 0.0, 0.0);
+ gs_gsave(pgs);
+ gs_fill(pgs);
+ gs_grestore(pgs);
+ gs_setpattern(pgs, &cc);
+ gs_eofill(pgs);
+ return 0;
+}
+
+/* ---------------- Test program 3 ---------------- */
+/* Exercise RasterOp a little. */
+/* Currently, this only works with monobit devices. */
+
+static int
+test3(gs_state * pgs, gs_memory_t * mem)
+{
+ gx_device *dev = gs_currentdevice(pgs);
+ gx_color_index black = gx_device_black(dev);
+ gx_color_index white = gx_device_white(dev);
+ gx_color_index black2[2];
+ gx_color_index black_white[2];
+ gx_color_index white_black[2];
+ long pattern[max(align_bitmap_mod / sizeof(long), 1) * 4];
+
+#define pbytes ((byte *)pattern)
+ gx_tile_bitmap tile;
+
+ black2[0] = black2[1] = black;
+ black_white[0] = white_black[1] = black;
+ black_white[1] = white_black[0] = white;
+ pbytes[0] = 0xf0;
+ pbytes[align_bitmap_mod] = 0x90;
+ pbytes[align_bitmap_mod * 2] = 0x90;
+ pbytes[align_bitmap_mod * 3] = 0xf0;
+ tile.data = pbytes;
+ tile.raster = align_bitmap_mod;
+ tile.size.x = tile.size.y = 4;
+ tile.id = gs_next_ids(mem, 1);
+ tile.rep_width = tile.rep_height = 4;
+ (*dev_proc(dev, copy_rop))
+ (dev, NULL, 0, 0, gx_no_bitmap_id, black2,
+ &tile, white_black, 100, 100, 150, 150, 0, 0, rop3_T);
+ (*dev_proc(dev, copy_rop))
+ (dev, NULL, 0, 0, gx_no_bitmap_id, black2,
+ NULL, NULL, 120, 120, 110, 110, 0, 0, ~rop3_S & rop3_1);
+ (*dev_proc(dev, copy_rop))
+ (dev, NULL, 0, 0, gx_no_bitmap_id, black2,
+ &tile, white_black, 110, 110, 130, 130, 0, 0, rop3_T ^ rop3_D);
+#undef pbytes
+ return 0;
+}
+
+/* ---------------- Test program 4 ---------------- */
+/* Set the resolution dynamically. */
+
+static int
+test4(gs_state * pgs, gs_memory_t * mem)
+{
+ gs_c_param_list list;
+ float resv[2];
+ gs_param_float_array ares;
+ int code;
+ gx_device *dev = gs_currentdevice(pgs);
+
+ gs_c_param_list_write(&list, mem);
+ resv[0] = resv[1] = 100;
+ ares.data = resv;
+ ares.size = 2;
+ ares.persistent = true;
+ code = param_write_float_array((gs_param_list *) & list,
+ "HWResolution", &ares);
+ if (code < 0) {
+ lprintf1("Writing HWResolution failed: %d\n", code);
+ exit(1);
+ }
+ gs_c_param_list_read(&list);
+ code = gs_putdeviceparams(dev, (gs_param_list *) & list);
+ gs_c_param_list_release(&list);
+ if (code < 0) {
+ lprintf1("Setting HWResolution failed: %d\n", code);
+ exit(1);
+ }
+ gs_initmatrix(pgs);
+ gs_initclip(pgs);
+ if (code == 1) {
+ code = (*dev_proc(dev, open_device)) (dev);
+ if (code < 0) {
+ lprintf1("Reopening device failed: %d\n", code);
+ exit(1);
+ }
+ }
+ gs_moveto(pgs, 0.0, 72.0);
+ gs_rlineto(pgs, 72.0, 0.0);
+ gs_rlineto(pgs, 0.0, 72.0);
+ gs_closepath(pgs);
+ gs_stroke(pgs);
+ return 0;
+}
+
+/* ---------------- Test program 5 ---------------- */
+/* Test masked (and non-masked) images. */
+
+static int
+test5(gs_state * pgs, gs_memory_t * mem)
+{
+ gx_device *dev = gs_currentdevice(pgs);
+ gx_image_enum_common_t *info;
+ gx_image_plane_t planes[5];
+ gx_drawing_color dcolor;
+ int code;
+ static const byte data3[] =
+ {
+ 0x00, 0x44, 0x88, 0xcc,
+ 0x44, 0x88, 0xcc, 0x00,
+ 0x88, 0xcc, 0x00, 0x44,
+ 0xcc, 0x00, 0x44, 0x88
+ };
+ gs_color_space gray_cs;
+
+ gs_cspace_init_DeviceGray(mem, &gray_cs);
+
+ /*
+ * Neither ImageType 3 nor 4 needs a current color,
+ * but some intermediate code assumes it's valid.
+ */
+ set_nonclient_dev_color(&dcolor, 0);
+
+ /* Scale everything up, and fill the background. */
+ {
+ gs_matrix mat;
+
+ gs_currentmatrix(pgs, &mat);
+ mat.xx = gs_copysign(98.6, mat.xx);
+ mat.yy = gs_copysign(98.6, mat.yy);
+ mat.tx = floor(mat.tx) + 0.499;
+ mat.ty = floor(mat.ty) + 0.499;
+ gs_setmatrix(pgs, &mat);
+ }
+ gs_setrgbcolor(pgs, 1.0, 0.9, 0.9);
+ fill_rect1(pgs, 0.25, 0.25, 4.0, 6.0);
+ gs_setrgbcolor(pgs, 0.5, 1.0, 0.5);
+
+#if 0
+ /* Make things a little more interesting.... */
+ gs_translate(pgs, 1.0, 1.0);
+ gs_rotate(pgs, 10.0);
+ gs_scale(pgs, 1.3, 0.9);
+#endif
+
+#define do_image(image, idata)\
+ BEGIN\
+ code = gx_device_begin_typed_image(dev, (gs_imager_state *)pgs, NULL,\
+ (gs_image_common_t *)&image, NULL, &dcolor, NULL, mem, &info);\
+ /****** TEST code >= 0 ******/\
+ planes[0].data = idata;\
+ planes[0].data_x = 0;\
+ planes[0].raster = (image.Height * image.BitsPerComponent + 7) >> 3;\
+ code = gx_image_plane_data(info, planes, image.Height);\
+ /****** TEST code == 1 ******/\
+ code = gx_image_end(info, true);\
+ /****** TEST code >= 0 ******/\
+ END
+
+#define W 4
+#define H 4
+
+ /* Test an unmasked image. */
+ gs_gsave(pgs);
+ {
+ gs_image1_t image1;
+ void *info1;
+ gs_color_space cs;
+
+ gs_cspace_init_DeviceGray(mem, &cs);
+ gs_image_t_init(&image1, &cs);
+ /* image */
+ image1.ImageMatrix.xx = W;
+ image1.ImageMatrix.yy = -H;
+ image1.ImageMatrix.ty = H;
+ /* data_image */
+ image1.Width = W;
+ image1.Height = H;
+ image1.BitsPerComponent = 8;
+
+ gs_translate(pgs, 0.5, 4.0);
+ code = (*dev_proc(dev, begin_image))
+ (dev, (const gs_imager_state *)pgs, &image1,
+ gs_image_format_chunky, (const gs_int_rect *)0,
+ &dcolor, NULL, mem, &info1);
+/****** TEST code >= 0 ******/
+ planes[0].data = data3;
+ planes[0].data_x = 0;
+ planes[0].raster =
+ (image1.Height * image1.BitsPerComponent + 7) >> 3;
+ /* Use the old image_data API. */
+ code = (*dev_proc(dev, image_data))
+ (dev, info1, &planes[0].data, 0,
+ planes[0].raster, image1.Height);
+/****** TEST code == 1 ******/
+ code = (*dev_proc(dev, end_image))(dev, info1, true);
+/****** TEST code >= 0 ******/
+ }
+ gs_grestore(pgs);
+
+ /* Test an explicitly masked image. */
+ gs_gsave(pgs);
+ {
+ gs_image3_t image3;
+ static const byte data3mask[] =
+ {
+ 0x60,
+ 0x90,
+ 0x90,
+ 0x60
+ };
+ static const byte data3x2mask[] =
+ {
+ 0x66,
+ 0x99,
+ 0x99,
+ 0x66,
+ 0x66,
+ 0x99,
+ 0x99,
+ 0x66
+ };
+
+ gs_image3_t_init(&image3, &gray_cs, interleave_scan_lines);
+ /* image */
+ image3.ImageMatrix.xx = W;
+ image3.ImageMatrix.yy = -H;
+ image3.ImageMatrix.ty = H;
+ /* data_image */
+ image3.Width = W;
+ image3.Height = H;
+ image3.BitsPerComponent = 8;
+ /* MaskDict */
+ image3.MaskDict.ImageMatrix = image3.ImageMatrix;
+ image3.MaskDict.Width = image3.Width;
+ image3.MaskDict.Height = image3.Height;
+
+ /* Display with 1-for-1 mask and image. */
+ gs_translate(pgs, 0.5, 2.0);
+ code = gx_device_begin_typed_image(dev, (gs_imager_state *) pgs,
+ NULL, (gs_image_common_t *) & image3,
+ NULL, &dcolor, NULL, mem, &info);
+/****** TEST code >= 0 ******/
+ planes[0].data = data3mask;
+ planes[0].data_x = 0;
+ planes[0].raster = (image3.MaskDict.Height + 7) >> 3;
+ planes[1].data = data3;
+ planes[1].data_x = 0;
+ planes[1].raster =
+ (image3.Height * image3.BitsPerComponent + 7) >> 3;
+ code = gx_image_plane_data(info, planes, image3.Height);
+/****** TEST code == 1 ******/
+ code = gx_image_end(info, true);
+/****** TEST code >= 0 ******/
+
+ /* Display with 2-for-1 mask and image. */
+ image3.MaskDict.ImageMatrix.xx *= 2;
+ image3.MaskDict.ImageMatrix.yy *= 2;
+ image3.MaskDict.ImageMatrix.ty *= 2;
+ image3.MaskDict.Width *= 2;
+ image3.MaskDict.Height *= 2;
+ gs_translate(pgs, 1.5, 0.0);
+ code = gx_device_begin_typed_image(dev, (gs_imager_state *) pgs,
+ NULL, (gs_image_common_t *) & image3,
+ NULL, &dcolor, NULL, mem, &info);
+/****** TEST code >= 0 ******/
+ planes[0].data = data3x2mask;
+ planes[0].raster = (image3.MaskDict.Width + 7) >> 3;
+ {
+ int i;
+
+ for (i = 0; i < H; ++i) {
+ planes[1].data = 0;
+ code = gx_image_plane_data(info, planes, 1);
+ planes[0].data += planes[0].raster;
+/****** TEST code == 0 ******/
+ planes[1].data = data3 + i * planes[1].raster;
+ code = gx_image_plane_data(info, planes, 1);
+ planes[0].data += planes[0].raster;
+/****** TEST code >= 0 ******/
+ }
+ }
+/****** TEST code == 1 ******/
+ code = gx_image_end(info, true);
+/****** TEST code >= 0 ******/
+ }
+ gs_grestore(pgs);
+
+ /* Test a chroma-keyed masked image. */
+ gs_gsave(pgs);
+ {
+ gs_image4_t image4;
+ const byte *data4 = data3;
+
+ gs_image4_t_init(&image4, &gray_cs);
+ /* image */
+ image4.ImageMatrix.xx = W;
+ image4.ImageMatrix.yy = -H;
+ image4.ImageMatrix.ty = H;
+ /* data_image */
+ image4.Width = W;
+ image4.Height = H;
+ image4.BitsPerComponent = 8;
+
+ /* Display with a single mask color. */
+ gs_translate(pgs, 0.5, 0.5);
+ image4.MaskColor_is_range = false;
+ image4.MaskColor[0] = 0xcc;
+ do_image(image4, data4);
+
+ /* Display a second time with a color range. */
+ gs_translate(pgs, 1.5, 0.0);
+ image4.MaskColor_is_range = true;
+ image4.MaskColor[0] = 0x40;
+ image4.MaskColor[1] = 0x90;
+ do_image(image4, data4);
+ }
+ gs_grestore(pgs);
+
+#undef W
+#undef H
+#undef do_image
+ return 0;
+}
+
+/* ---------------- Test program 6 ---------------- */
+/* Test the C API for CIE CRDs, and color snapping. */
+
+static void
+spectrum(gs_state * pgs, int n)
+{
+ float den = n;
+ float den1 = n - 1;
+ float den2 = (n * 2 - 1) * n;
+ int a, b, c;
+
+ for (a = 0; a < n; ++a)
+ for (b = 0; b < n; ++b)
+ for (c = 0; c < n; ++c) {
+ double size = (n * 2 - c * 2 - 1) / den2;
+ gs_client_color cc;
+
+ cc.paint.values[0] = a / den1;
+ cc.paint.values[1] = b / den1;
+ cc.paint.values[2] = c / den1;
+ gs_setcolor(pgs, &cc);
+ fill_rect1(pgs,
+ a / den + c / den2, b / den + c / den2,
+ size, size);
+ }
+}
+static float
+render_abc(floatp v, const gs_cie_render * ignore_crd)
+{
+ return v / 2;
+}
+
+static int
+test6(gs_state * pgs, gs_memory_t * mem)
+{
+ gs_color_space *pcs;
+ gs_cie_abc *pabc;
+ gs_cie_render *pcrd;
+ static const gs_vector3 white_point =
+ {1, 1, 1};
+ static const gs_cie_render_proc3 encode_abc =
+ {
+ {render_abc, render_abc, render_abc}
+ };
+#ifdef COLOR_MAP_DEVICE
+ gx_device_cmap *cmdev;
+#endif /* COLOR_MAP_DEVICE */
+ int code;
+ gs_color_space rgb_cs;
+
+ gs_cspace_init_DeviceRGB(mem, &rgb_cs);
+
+ gs_scale(pgs, 150.0, 150.0);
+ gs_translate(pgs, 0.5, 0.5);
+ gs_setcolorspace(pgs, &rgb_cs);
+ spectrum(pgs, 5);
+ gs_translate(pgs, 1.2, 0.0);
+ /* We must set the CRD before the color space. */
+ code = gs_cie_render1_build(&pcrd, mem, "test6");
+ if (code < 0)
+ return code;
+ gs_cie_render1_initialize(mem, pcrd, NULL, &white_point, NULL,
+ NULL, NULL, NULL,
+ NULL, NULL, NULL,
+ NULL, &encode_abc, NULL,
+ NULL);
+ gs_setcolorrendering(pgs, pcrd);
+ gs_cspace_build_CIEABC(&pcs, NULL, mem);
+ /* There should be an API for initializing CIE color spaces too.... */
+ pabc = pcs->params.abc;
+ pabc->common.points.WhitePoint = white_point;
+ gs_cie_abc_complete(pabc);
+ /* End of initializing the color space. */
+ gs_setcolorspace(pgs, pcs);
+ spectrum(pgs, 5);
+#ifdef COLOR_MAP_DEVICE
+ /* Now test color snapping. */
+ cmdev =
+ gs_alloc_struct_immovable(mem, gx_device_cmap, &st_device_cmap,
+ "cmap device");
+ gdev_cmap_init(cmdev, gs_currentdevice(pgs),
+ device_cmap_snap_to_primaries);
+ gs_setdevice_no_init(pgs, (gx_device *) cmdev);
+#endif /* COLOR_MAP_DEVICE */
+ gs_setrgbcolor(pgs, 0.0, 0.0, 0.0); /* back to DeviceRGB space */
+ gs_translate(pgs, -1.2, 1.2);
+ spectrum(pgs, 5);
+ gs_translate(pgs, 1.2, 0.0);
+#ifdef COLOR_MAP_DEVICE
+ set_cmap_method(cmdev, device_cmap_monochrome, pgs, mem);
+#endif /* COLOR_MAP_DEVICE */
+ spectrum(pgs, 5);
+ gs_translate(pgs, -1.2, 1.2);
+#ifdef COLOR_MAP_DEVICE
+ set_cmap_method(cmdev, device_cmap_color_to_black_over_white, pgs, mem);
+#endif /* COLOR_MAP_DEVICE */
+ spectrum(pgs, 5);
+ return 0;
+}
+
+/* ---------------- Test program 7 ---------------- */
+/* Test the C API for non-monotonic halftones. */
+
+#ifdef HALFTONE_FIX
+static int
+test7(gs_state * pgs, gs_memory_t * mem)
+{
+ /* Define a non-monotonic 4 x 4 halftone with 4 gray levels. */
+ static const byte masks[1 * 4 * 4] =
+ {
+ /* 0% */
+ 0x00, 0x00, 0x00, 0x00,
+ /* 25% */
+ 0x80, 0x40, 0x20, 0x10,
+ /* 50% */
+ 0xa0, 0xa0, 0x50, 0x50,
+ /* 75% */
+ 0xd0, 0xe0, 0x70, 0xb0
+ };
+ gs_ht *pht;
+ int code;
+ int i;
+
+ /* Fabricate a Type 5 halftone. */
+ code = gs_ht_build(&pht, 1, mem);
+ dprintf1("ht build code = %d\n", code);
+ code = gs_ht_set_mask_comp(pht, 0,
+ 4, 4, 4, masks, NULL, NULL);
+ dprintf1("set mask code = %d\n", code);
+ code = gs_sethalftone(pgs, pht);
+ dprintf1("sethalftone code = %d\n", code);
+ for (i = 0; i <= 4; ++i) {
+ gs_setgray(pgs, i / 4.0);
+ fill_rect1(pgs, 100 + i * 100, 100, 50, 50);
+ }
+ return 0;
+}
+#endif
+
+/* ---------------- Test program 8 ---------------- */
+/* Test partially transparent patterns */
+
+static int
+test8(gs_state * pgs, gs_memory_t * mem)
+{
+ /*
+ * Define a 16 x 16 pattern using a 4-entry palette
+ * (white, red, green, black).
+ */
+ static const byte pdata[] =
+ {
+ 0x7f, 0xff, 0x00, 0x03,
+ 0x7f, 0xff, 0x00, 0x0c,
+ 0x50, 0x00, 0x00, 0x30,
+ 0x50, 0x00, 0x00, 0xc0,
+ 0x50, 0x00, 0x03, 0x00,
+ 0x50, 0x00, 0x0c, 0x00,
+ 0x50, 0x00, 0x30, 0x00,
+ 0x50, 0x00, 0xc0, 0x00,
+ 0xf0, 0x00, 0xc0, 0x00,
+ 0xf0, 0x00, 0x30, 0x00,
+ 0xf0, 0x00, 0x0c, 0x00,
+ 0xf0, 0x00, 0x03, 0x00,
+ 0xf0, 0x00, 0x00, 0xc0,
+ 0xf0, 0x00, 0x00, 0x30,
+ 0xea, 0x55, 0xaa, 0x5c,
+ 0xea, 0x55, 0xaa, 0x57,
+ };
+ gs_depth_bitmap ptile;
+ gs_const_string table;
+ gs_color_space *pcs;
+ gs_client_color ccolor;
+ gs_color_space rgb_cs;
+
+ gs_cspace_init_DeviceRGB(mem, &rgb_cs);
+
+ table.data =
+ (const byte *)"\377\377\377\377\000\000\000\377\000\000\000\000";
+ table.size = 12;
+ gs_cspace_build_Indexed(&pcs, &rgb_cs, 4, &table, mem);
+ ptile.data = pdata;
+ ptile.raster = 4;
+ ptile.size.x = ptile.size.y = 16;
+ ptile.id = gs_no_bitmap_id;
+ ptile.pix_depth = 2;
+ ptile.num_comps = 1;
+ gs_makepixmappattern(&ccolor, &ptile, false /*mask */ , NULL /*pmat */ ,
+ gs_no_id, pcs, 0 /*white_index */ , pgs, mem);
+ {
+ gs_rect r;
+
+ r.p.x = 100;
+ r.p.y = 100;
+ r.q.x = 200;
+ r.q.y = 200;
+ gs_setrgbcolor(pgs, 1.0, 1.0, 0.0);
+ gs_rectfill(pgs, &r, 1);
+ gs_setpattern(pgs, &ccolor);
+ // gs_settexturetransparent(pgs, true);
+ gs_rectfill(pgs, &r, 1);
+ r.p.x += 150;
+ r.q.x += 150;
+ gs_setrgbcolor(pgs, 1.0, 1.0, 0.0);
+ gs_rectfill(pgs, &r, 1);
+ gs_setpattern(pgs, &ccolor);
+ // gs_settexturetransparent(pgs, false);
+ gs_rectfill(pgs, &r, 1);
+ }
+ return 0;
+}
+
+/* type42 test. Lots of setup stuff here since the graphics library
+ leaves most font parsing to the client. */
+#include "gxfont.h"
+#include "gxchar.h"
+#include "gsgdata.h"
+#include "gxfont42.h"
+#include "gxfcache.h"
+
+/* big endian accessors */
+#define get_uint16(bptr)\
+ (((bptr)[0] << 8) | (bptr)[1])
+#define get_int16(bptr)\
+ (((int)get_uint16(bptr) ^ 0x8000) - 0x8000)
+
+static int
+test9_get_int16(const byte *bptr)
+{
+ return get_int16(bptr);
+}
+
+static uint
+test9_get_uint16(const byte *bptr)
+{
+ return get_uint16(bptr);
+}
+
+static long
+test9_get_int32(const byte *bptr)
+{
+ return ((long)get_int16(bptr) << 16) | get_uint16(bptr + 2);
+}
+
+static ulong
+test9_get_uint32(const byte *bptr)
+{
+ return ((ulong)get_uint16(bptr) << 16) | get_uint16(bptr + 2);
+}
+
+/* ACCESS is braindamage from gstype42.c - */
+/* Set up a pointer to a substring of the font data. */
+/* Free variables: pfont, string_proc. */
+#define ACCESS(mem, base, length, vptr)\
+ BEGIN\
+ code = (*string_proc)(pfont, (ulong)(base), length, &vptr);\
+ if ( code < 0 ) return code;\
+ if ( code > 0 ) return_error(gs_error_invalidfont);\
+ END
+
+/* find a tt table by name derived from plchar.c */
+ulong
+test9_tt_find_table(gs_font_type42 *pfont, const char *tname, uint *plen)
+{
+ const byte *OffsetTable;
+ int code;
+ uint numTables;
+ const byte *TableDirectory;
+ uint i;
+ ulong table_dir_offset = 0;
+ int (*string_proc)(gs_font_type42 *, ulong, uint, const byte **) =
+ pfont->data.string_proc;
+
+ /* nb check return values */
+ ACCESS(pfont->memory, 0, 12, OffsetTable);
+ ACCESS(pfont->memory, table_dir_offset, 12, OffsetTable);
+ numTables = test9_get_uint16(OffsetTable + 4);
+ ACCESS(pfont->memory, table_dir_offset + 12, numTables * 16, TableDirectory);
+ for ( i = 0; i < numTables; ++i ) {
+ const byte *tab = TableDirectory + i * 16;
+ if ( !memcmp(tab, tname, 4) ) {
+ if ( plen )
+ *plen = test9_get_uint32(tab + 12);
+ return test9_get_uint32(tab + 8);
+ }
+ }
+ return 0;
+}
+
+/* encode, derived from plchar.c */
+static gs_glyph
+test9_tt_encode_char(gs_font *p42, gs_char chr, gs_glyph not_used)
+{
+ /* NB encode me */
+ return chr - 29;
+}
+
+static gs_char
+test9_tt_decode_glyph(gs_font *p42, gs_glyph glyph)
+{
+ return GS_NO_CHAR;
+}
+
+static int
+test9_tt_glyph_name(gs_font *pf, gs_glyph glyph, gs_const_string *pstr)
+{
+ return 0;
+}
+
+static int
+test9_tt_string_proc(gs_font *p42, ulong offset, uint length, const byte **pdata)
+{
+
+ /* NB bounds check offset + length - use gs_object_size for memory
+ buffers - if file read should fail */
+ *pdata = p42->client_data + offset;
+ return 0;
+}
+
+/* derived from plchar.c */
+static int
+test9_tt_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont, gs_char chr, gs_glyph glyph)
+{
+ int code;
+ float sbw[4], w2[6];
+
+ code = gs_type42_get_metrics((gs_font_type42 *)pfont, glyph, sbw);
+ if (code < 0)
+ return code;
+ w2[0] = sbw[2], w2[1] = sbw[3];
+ /* don't ask me about the following, I just work here. */
+ {
+#define pbfont ((gs_font_base *)pfont)
+
+ const gs_rect *pbbox = &pbfont->FontBBox;
+#undef pbfont
+
+ w2[2] = pbbox->p.x, w2[3] = pbbox->p.y;
+ w2[4] = pbbox->q.x, w2[5] = pbbox->q.y;
+ if ( pfont->PaintType ) {
+ double expand = max(1.415, gs_currentmiterlimit(pgs)) *
+ gs_currentlinewidth(pgs) / 2;
+
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+ }
+
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 )
+ return code;
+
+ code = gs_type42_append(glyph,
+ (gs_imager_state *)pgs,
+ gx_current_path(pgs),
+ &penum->log2_scale,
+ gs_show_in_charpath(penum) != cpm_show,
+ pfont->PaintType,
+ (gs_font_type42 *)pfont);
+ if ( code >= 0 )
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ return code;
+}
+
+byte *
+test9_load_font_data(const char *filename, gs_memory_t * mem)
+{
+ FILE *in = fopen(filename, gp_fmode_rb);
+ byte *data;
+ ulong size;
+ if (in == NULL)
+ return NULL;
+ size = (fseek(in, 0L, SEEK_END), ftell(in));
+ rewind(in);
+ data = gs_alloc_bytes(mem, size, "test9_load_font data");
+ if ( data == 0 ) {
+ fclose(in);
+ return NULL;
+ }
+
+ /* NB check size */
+ fread(data, 1, size, in);
+ fclose(in);
+ return data;
+}
+
+/* windows tt file name */
+
+#define TTF_FILENAME "/windows/fonts/A028-Ext.ttf"
+
+/* TEST9 NB:
+
+ 1) assumes character successfully renders to cache. There should
+ be a charpath fallback if looking up the character in the cache
+ returns NULL.
+
+ 2) Cache memory management needs investigation
+
+ 3) This implementation is one character at a time.
+
+ 4) needs encoding - fill in test9_tt_encode_char().
+
+*/
+
+static int
+test9(gs_state * pgs, gs_memory_t * mem)
+{
+
+ gs_font_type42 *p42 = gs_alloc_struct(mem, gs_font_type42,
+ &st_gs_font_type42,
+ "new p42");
+ gs_font_dir *pfont_dir = gs_font_dir_alloc(mem);
+
+ byte *pfont_data = test9_load_font_data(TTF_FILENAME, mem);
+
+ if (!pfont_data || !pfont_dir || !p42)
+ return -1;
+
+ /* no shortage of things to initialize */
+ p42->next = p42->prev = 0;
+ p42->memory = mem;
+ p42->dir = pfont_dir;
+ p42->is_resource = false;
+ gs_notify_init(&p42->notify_list, gs_memory_stable(mem));
+ p42->base = p42;
+ p42->client_data = pfont_data;
+ p42->WMode = 0;
+ p42->PaintType = 0;
+ p42->StrokeWidth = 0;
+ p42->procs.init_fstack = gs_default_init_fstack;
+ p42->procs.next_char_glyph = gs_default_next_char_glyph;
+ p42->font_name.size = 0;
+ p42->key_name.size = 0;
+ p42->procs.glyph_name = test9_tt_glyph_name;
+ p42->procs.decode_glyph = test9_tt_decode_glyph;
+ p42->procs.define_font = gs_no_define_font;
+ p42->procs.make_font = gs_no_make_font;
+ p42->procs.font_info = gs_default_font_info;
+ p42->procs.glyph_info = gs_default_glyph_info;
+ p42->procs.glyph_outline = gs_no_glyph_outline;
+ p42->procs.encode_char = test9_tt_encode_char;
+ p42->procs.build_char = test9_tt_build_char;
+ p42->id = gs_next_ids(mem, 1);
+ gs_make_identity(&p42->FontMatrix);
+ p42->FontType = ft_TrueType;
+ p42->BitmapWidths = true;
+ p42->ExactSize = fbit_use_outlines;
+ p42->InBetweenSize = fbit_use_outlines;
+ p42->TransformedChar = fbit_use_outlines;
+ p42->FontBBox.p.x = p42->FontBBox.p.y =
+ p42->FontBBox.q.x = p42->FontBBox.q.y = 0;
+ uid_set_UniqueID(&p42->UID, p42->id);
+ p42->encoding_index = ENCODING_INDEX_UNKNOWN;
+ p42->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
+ /* Initialize Type 42 specific data. */
+ p42->data.string_proc = test9_tt_string_proc;
+ gs_type42_font_init(p42);
+
+ gs_definefont(pfont_dir, (gs_font *)p42);
+ gs_setfont(pgs, (gs_font *)p42);
+ {
+ gs_text_params_t text_params;
+ gs_text_enum_t *penum;
+ byte *mystr = "The quick brown fox";
+ floatp FontRenderingEmSize = 20; /* XPS terminology */
+ gs_matrix fmat; /* font matrix */
+ int code;
+ {
+ int i;
+ if (gs_moveto(pgs, 72.0, 72.0) != 0)
+ return -1;
+
+ for (i = 0; i < strlen(mystr); i++) {
+ dprintf1("%d\n", i);
+ text_params.operation = (TEXT_FROM_STRING | TEXT_DO_DRAW | TEXT_RETURN_WIDTH);
+ text_params.data.bytes = mystr + i;
+ text_params.size = 1;
+
+
+ gs_make_identity(&fmat);
+ if ((gs_matrix_scale(&fmat, FontRenderingEmSize, FontRenderingEmSize, &fmat) != 0) ||
+ (gs_setcharmatrix(pgs, &fmat) != 0) ||
+ (gs_text_begin(pgs, &text_params, mem, &penum) != 0) ||
+ (gs_text_process(penum) != 0)) {
+ dprintf("text_failed\n");
+ return -1;
+ }
+ {
+ gs_show_enum *psenum = (gs_show_enum *)penum;
+ cached_fm_pair *ppair;
+ gs_fixed_point sub_pix_or = {0, 0};
+ cached_char *cc;
+ gs_matrix cmat;
+ gs_currentcharmatrix(pgs, &cmat, true);
+ code = gx_lookup_fm_pair(penum->current_font,
+ &cmat,
+ &penum->log2_scale,
+ /* NB design grid */
+ false,
+ &ppair);
+
+ cc = gx_lookup_cached_char(penum->current_font,
+ ppair,
+ penum->returned.current_glyph,
+ /* nb next three assume
+ no veritcal writing
+ '0', bitdepth '1'
+ and no sub pixel
+ stuff */
+ 0,
+ 1,
+ &sub_pix_or);
+
+ debug_dump_bitmap(cc_bits(cc),
+ cc_raster(cc),
+ cc->height, "");
+ /* update point (device space) */
+ gx_path_add_relative_point(gx_current_path(pgs),
+ cc->wxy.x,
+ cc->wxy.y);
+ gs_text_release(penum, "test_9");
+
+ }
+ }
+ }
+ }
+ return 0;
+}
diff --git a/tools/gslite/tiger.jpg b/tools/gslite/tiger.jpg
new file mode 100644
index 000000000..d3bd2c465
--- /dev/null
+++ b/tools/gslite/tiger.jpg
Binary files differ
diff --git a/tools/label.tst b/tools/label.tst
new file mode 100644
index 000000000..1f1f0f7a9
--- /dev/null
+++ b/tools/label.tst
@@ -0,0 +1,185 @@
+E%1BINSP1;SD1,21,2,1,4,6,5,0,6,0,7,4148;SS;PU0,10000;LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+LBABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+E
diff --git a/tools/lineprinter.pcl b/tools/lineprinter.pcl
new file mode 100644
index 000000000..ee39b86d7
--- /dev/null
+++ b/tools/lineprinter.pcl
Binary files differ
diff --git a/tools/make_snapshot.sh b/tools/make_snapshot.sh
new file mode 100755
index 000000000..16d4246da
--- /dev/null
+++ b/tools/make_snapshot.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+
+# this is a script to make a snapshot of ghostpcl+gs trunk and upload
+# it casper. This is mostly because casper has an old svn installation
+# which can't be conveniently upgraded, so we have to do this manually.
+# Note that all the code gets pulled to wherever you run it and then
+# pushed back to casper, so it takes a few minutes.
+
+# it constructs a snapshot from a clean export from the repository,
+# but BASED ON THE REVISIONS IN THE CURRENT CHECKOUT it's run from.
+# a little confusing, but it gives you some control over the version
+# posted. Run 'svn up' first if you want to do the latest.
+
+# this script must be run from the top level of a ghostpcl working copy
+# requires svn export --ignore-externals, which is svn 1.2 or later I think
+
+# cut off revision numbers for the changelogs
+ghostpcl_NEWSREV=3034
+ghostscript_NEWSREV=8567
+
+# svn urls
+ghostpcl_SVNROOT=svn+ssh://svn.ghostscript.com/var/lib/svn-private/ghostpcl/trunk/ghostpcl
+ghostscript_SVNROOT=svn+ssh://svn.ghostscript.com/svn/ghostscript/trunk/gs
+
+ghostpcl_REV=`svn info | grep Revision: | cut -f 2 -d ' '`
+ghostscript_REV=`svn info gs | grep Revision: | cut -f 2 -d ' '`
+
+echo "creating changelogs ..."
+echo " ghostscript-r${ghostscript_REV}_NEWS.txt"
+svn log -r${ghostscript_REV}:${ghostscript_NEWSREV} $ghostscript_SVNROOT \
+ > ghostscript-r${ghostscript_REV}_NEWS.txt
+echo " ghostpcl-r${ghostpcl_REV}_NEWS.txt"
+svn log -r${ghostpcl_REV}:${ghostpcl_NEWSREV} $ghostpcl_SVNROOT \
+ > ghostpcl-r${ghostpcl_REV}_NEWS.txt
+
+exportdir="ghostpcl-r${ghostpcl_REV}+${ghostscript_REV}"
+if test -d "$exportdir"; then
+ echo "export target directory $exportdir already exists!"
+ exit 1
+fi
+
+echo "creating ${exportdir}.tar.gz ..."
+
+# export the ghostpcl code
+svn export -q --ignore-externals -r ${ghostpcl_REV} $ghostpcl_SVNROOT \
+ $exportdir
+# export ghostscript code
+cd $exportdir
+svn export -q -r ${ghostscript_REV} $ghostscript_SVNROOT gs
+cd ..
+
+# remove proprietary subdirectories
+echo "removing proprietary code ... "
+for verboten in ufst tools/metro_tests; do
+ if test -d $exportdir/$verboten; then
+ echo " $verboten"
+ rm -rf $exportdir/$verboten
+ fi
+done
+
+# copy in the changelogs
+cp ghostpcl-r${ghostpcl_REV}_NEWS.txt ghostscript-r${ghostscript_REV}_NEWS.txt \
+ $exportdir
+tar czf $exportdir.tar.gz $exportdir/*
+rm -rf $exportdir
+
+#echo $exportdir.tar.gz ready for upload
+echo "uploading changelogs and $exportdir.tar.gz ..."
+scp ghostpcl-r${ghostpcl_REV}_NEWS.txt \
+ ghostscript-r${ghostscript_REV}_NEWS.txt \
+ $exportdir.tar.gz \
+ www.ghostscript.com:/www/ghostscript.com/snapshots/
+
+echo "updating links ..."
+echo "cd /www/ghostscript.com/snapshots/ && \
+ if test -w ghostpcl-current.tar.gz; then \
+ rm ghostpcl-current.tar.gz; \
+ ln -s ${exportdir}.tar.gz ghostpcl-current.tar.gz; \
+ fi; \
+ if test -w ghostpcl-current_NEWS.txt; then \
+ rm ghostpcl-current_NEWS.txt; \
+ ln -s ghostpcl-r${ghostpcl_REV}_NEWS.txt ghostpcl-current_NEWS.txt; \
+ fi" \
+ | ssh ghostscript.com
diff --git a/tools/makeromttf.py b/tools/makeromttf.py
new file mode 100755
index 000000000..980c85639
--- /dev/null
+++ b/tools/makeromttf.py
@@ -0,0 +1,145 @@
+#!/usr/bin/env python
+
+# Creates C program data files for each ttf file given on the command
+# line. Also a C header file is generated. The C files are compiled
+# using gcc and archived into a large library using gnu ar, the final
+# result can be linked with pcl. DEVELOPERS ONLY.
+
+# This program does not do any error checking, clean up data files or
+# anything that might be construed as user friendly - please use with
+# caution.
+
+# ./makeromttf.py /windows/fonts/*.ttf
+
+FILTER_NONE=0
+FILTER_ZLIB=1
+FILTER_GZIP=2
+
+import tempfile, os, zlib
+
+def font_filter(ttfont, filter):
+ if (filter == FILTER_NONE):
+ return ttfont
+ if (filter == FILTER_ZLIB):
+ return zlib.compress(ttfont)
+ if (filter == FILTER_GZIP):
+ outfile=tempfile.mktemp()
+ infile=tempfile.mktemp()
+ open(infile, "wb").write(ttfont)
+ command="gzip -c < %s > %s" % (infile, outfile)
+ os.system(command)
+ filtered_font=open(outfile, "rb").read()
+ os.remove(outfile)
+ os.remove(infile)
+ return filtered_font
+ return None
+
+import struct
+
+def find_table(ttfont, table_name):
+ # index error not handled.
+ num_tables = struct.unpack(">H", ttfont[4:6])[0]
+ for table in range(num_tables):
+ this_table_offset= 12 + (table * 16)
+ if (ttfont[this_table_offset:this_table_offset+len(table_name)] == table_name):
+ table_length = struct.unpack(">L", ttfont[this_table_offset+12:this_table_offset+16])[0]
+ table_offset = struct.unpack(">L", ttfont[this_table_offset+8:this_table_offset+12])[0]
+ return ttfont[table_offset:table_offset+table_length]
+
+ return None
+
+def get_name(ttfont):
+ name_table = find_table(ttfont, "name")
+ if (name_table):
+ storageOffset = struct.unpack(">H", name_table[4:6])[0]
+ name_recs = name_table[6:]
+ windows_name_len = struct.unpack(">H", name_recs[12*4+8:12*4+10])[0];
+ windows_name_offset = struct.unpack(">H", name_recs[12*4+10:12*4+12])[0];
+ # at last
+ windows_name = name_table[storageOffset+windows_name_offset:storageOffset+windows_name_offset+windows_name_len]
+ return_string = ""
+ for ch in windows_name:
+ if (ord(ch) in range(32, 127)):
+ return_string += ch
+
+ return return_string
+ return None
+
+
+if __name__ == '__main__':
+ import sys, os, tempfile
+
+ if not sys.argv[1:]:
+ print "Usage: %s pxl files" % sys.argv[0]
+
+ files = sys.argv[1:]
+ font_table_dict = {}
+ font_cfile_name = {}
+ for file in files:
+ try:
+ fp = open(file, 'rb')
+ except:
+ print "Cannot find file %s" % file
+ continue
+ # read the whole damn thing. If this get too cumbersome we
+ # can switch to string i/o which will use a disk
+ ttfont = fp.read()
+ fp.close()
+ font_name = get_name(ttfont)
+
+ c_file = os.path.basename(file) + ".c"
+ fp = open(c_file, 'wb')
+ # no spaces in C variables.
+ variable_name = font_name.replace(' ', '_')
+ tmp_str = "const unsigned char " + variable_name + "[] = {\n"
+ fp.write(tmp_str)
+ # 6 dummy bytes
+ tmp_str = "%c%c%c%c%c%c" % (0, 0, 0, 0, 0, 0)
+ ttfont = tmp_str + ttfont
+ for byte in font_filter(ttfont, FILTER_ZLIB):
+ array_entry = "%d," % ord(byte)
+ fp.write(array_entry)
+ tmp_str = '};\n'
+ fp.write(tmp_str)
+ font_table_dict[variable_name] = font_name
+ font_cfile_name[variable_name] = c_file
+ fp.close()
+
+ # Generate a header file with externs for each font
+ print "put romfnttab.h and libttffont.a in the pl directory"
+ fp = open("romfnttab.h", 'wb')
+ # write out the externs
+ for k in font_table_dict.keys():
+ tmp_str = "extern const unsigned char " + k + ";\n"
+ fp.write(tmp_str)
+
+ tmp_str = """typedef struct pcl_font_variable_name {
+ const char font_name[40];
+ const unsigned char *data;
+ } pcl_font_variable_name_t;
+
+ const pcl_font_variable_name_t pcl_font_variable_name_table[] = {"""
+ fp.write(tmp_str)
+ # build the table
+ for k in font_table_dict.keys():
+ fp.write("{\n")
+ # font name
+ tmp_str = "\"" + font_table_dict[k] + "\","
+ fp.write(tmp_str)
+ tmp_str = "&" + k + "},"
+ fp.write(tmp_str)
+
+ # table terminator
+ fp.write("{\"\", 0}};\n")
+ fp.close()
+
+ # compile the code
+ for k in font_cfile_name.keys():
+ os.system("gcc -c " + font_cfile_name[k]);
+
+ # archive the objects
+ object_names = ""
+ for k in font_cfile_name.keys():
+ object_names = object_names + font_cfile_name[k][:-1] + 'o' + " "
+ os.system("rm libttffont.a")
+ os.system("ar rcv libttffont.a " + object_names)
diff --git a/tools/null.pxl b/tools/null.pxl
new file mode 100644
index 000000000..666b3f22e
--- /dev/null
+++ b/tools/null.pxl
Binary files differ
diff --git a/tools/opaque.pcl b/tools/opaque.pcl
new file mode 100644
index 000000000..2130e7800
--- /dev/null
+++ b/tools/opaque.pcl
@@ -0,0 +1,5 @@
+E&a720h720V*c4520h6480v15g2P(s3B&a10l1440h1440VThis is text.
+*v1NOpaque text.
+*v0N*l51OInverted transparent text.
+*v1NInverted opaque text.
+E \ No newline at end of file
diff --git a/tools/origins.pcl b/tools/origins.pcl
new file mode 100644
index 000000000..ae0f0cce9
--- /dev/null
+++ b/tools/origins.pcl
@@ -0,0 +1,78 @@
+E%0BIN;SP1;SD1,21,2,1,4,8,6,-3,7,4148;AD1,21,2,1,4,16,6,-3,7,4148;
+DV0;
+LO1;PU0500,500;CI40;PD;LBjLWjLW
+LO2;PU1300,500;CI40;PD;LBjLWjLW
+LO3;PU2100,500;CI40;PD;LBjLWjLW
+LO4;PU2900,500;CI40;PD;LBjLWjLW
+LO5;PU3700,500;CI40;PD;LBjLWjLW
+LO6;PU4500,500;CI40;PD;LBjLWjLW
+LO7;PU5300,500;CI40;PD;LBjLWjLW
+LO8;PU6100,500;CI40;PD;LBjLWjLW
+LO9;PU6900,500;CI40;PD;LBjLWjLW
+LO11;PU0500,1500;CI40;PD;LBjLWjLW
+LO12;PU1300,1500;CI40;PD;LBjLWjLW
+LO13;PU2100,1500;CI40;PD;LBjLWjLW
+LO14;PU2900,1500;CI40;PD;LBjLWjLW
+LO15;PU3700,1500;CI40;PD;LBjLWjLW
+LO16;PU4500,1500;CI40;PD;LBjLWjLW
+LO17;PU5300,1500;CI40;PD;LBjLWjLW
+LO18;PU6100,1500;CI40;PD;LBjLWjLW
+LO19;PU6900,1500;CI40;PD;LBjLWjLW
+DV1;
+LO1;PU0500,2500;CI40;PD;LBjLWjLW
+LO2;PU1300,2500;CI40;PD;LBjLWjLW
+LO3;PU2100,2500;CI40;PD;LBjLWjLW
+LO4;PU2900,2500;CI40;PD;LBjLWjLW
+LO5;PU3700,2500;CI40;PD;LBjLWjLW
+LO6;PU4500,2500;CI40;PD;LBjLWjLW
+LO7;PU5300,2500;CI40;PD;LBjLWjLW
+LO8;PU6100,2500;CI40;PD;LBjLWjLW
+LO9;PU6900,2500;CI40;PD;LBjLWjLW
+LO11;PU0500,3500;CI40;PD;LBjLWjLW
+LO12;PU1300,3500;CI40;PD;LBjLWjLW
+LO13;PU2100,3500;CI40;PD;LBjLWjLW
+LO14;PU2900,3500;CI40;PD;LBjLWjLW
+LO15;PU3700,3500;CI40;PD;LBjLWjLW
+LO16;PU4500,3500;CI40;PD;LBjLWjLW
+LO17;PU5300,3500;CI40;PD;LBjLWjLW
+LO18;PU6100,3500;CI40;PD;LBjLWjLW
+LO19;PU6900,3500;CI40;PD;LBjLWjLW
+DV2;
+LO1;PU0500,4500;CI40;PD;LBjLWjLW
+LO2;PU1300,4500;CI40;PD;LBjLWjLW
+LO3;PU2100,4500;CI40;PD;LBjLWjLW
+LO4;PU2900,4500;CI40;PD;LBjLWjLW
+LO5;PU3700,4500;CI40;PD;LBjLWjLW
+LO6;PU4500,4500;CI40;PD;LBjLWjLW
+LO7;PU5300,4500;CI40;PD;LBjLWjLW
+LO8;PU6100,4500;CI40;PD;LBjLWjLW
+LO9;PU6900,4500;CI40;PD;LBjLWjLW
+LO11;PU0500,5500;CI40;PD;LBjLWjLW
+LO12;PU1300,5500;CI40;PD;LBjLWjLW
+LO13;PU2100,5500;CI40;PD;LBjLWjLW
+LO14;PU2900,5500;CI40;PD;LBjLWjLW
+LO15;PU3700,5500;CI40;PD;LBjLWjLW
+LO16;PU4500,5500;CI40;PD;LBjLWjLW
+LO17;PU5300,5500;CI40;PD;LBjLWjLW
+LO18;PU6100,5500;CI40;PD;LBjLWjLW
+LO19;PU6900,5500;CI40;PD;LBjLWjLW
+DV3;
+LO1;PU0500,6500;CI40;PD;LBjLWjLW
+LO2;PU1300,6500;CI40;PD;LBjLWjLW
+LO3;PU2100,6500;CI40;PD;LBjLWjLW
+LO4;PU2900,6500;CI40;PD;LBjLWjLW
+LO5;PU3700,6500;CI40;PD;LBjLWjLW
+LO6;PU4500,6500;CI40;PD;LBjLWjLW
+LO7;PU5300,6500;CI40;PD;LBjLWjLW
+LO8;PU6100,6500;CI40;PD;LBjLWjLW
+LO9;PU6900,6500;CI40;PD;LBjLWjLW
+LO11;PU0500,7500;CI40;PD;LBjLWjLW
+LO12;PU1300,7500;CI40;PD;LBjLWjLW
+LO13;PU2100,7500;CI40;PD;LBjLWjLW
+LO14;PU2900,7500;CI40;PD;LBjLWjLW
+LO15;PU3700,7500;CI40;PD;LBjLWjLW
+LO16;PU4500,7500;CI40;PD;LBjLWjLW
+LO17;PU5300,7500;CI40;PD;LBjLWjLW
+LO18;PU6100,7500;CI40;PD;LBjLWjLW
+LO19;PU6900,7500;CI40;PD;LBjLWjLW
+E \ No newline at end of file
diff --git a/tools/owl.pcl b/tools/owl.pcl
new file mode 100644
index 000000000..32f73601b
--- /dev/null
+++ b/tools/owl.pcl
Binary files differ
diff --git a/tools/owl2.pcl b/tools/owl2.pcl
new file mode 100644
index 000000000..fd0428adc
--- /dev/null
+++ b/tools/owl2.pcl
Binary files differ
diff --git a/tools/pattern.pcl b/tools/pattern.pcl
new file mode 100644
index 000000000..8c8ebe130
--- /dev/null
+++ b/tools/pattern.pcl
Binary files differ
diff --git a/tools/pattern.pxl b/tools/pattern.pxl
new file mode 100644
index 000000000..3f7db140b
--- /dev/null
+++ b/tools/pattern.pxl
Binary files differ
diff --git a/tools/pcl2pdf b/tools/pcl2pdf
new file mode 100755
index 000000000..f3c61d633
--- /dev/null
+++ b/tools/pcl2pdf
@@ -0,0 +1,7 @@
+#!/bin/sh
+# $RCSfile$ $Revision: 1412 $
+# Convert PCL or PXL to PDF.
+
+# Currently, we produce PDF 1.2 by default, but this is not guaranteed
+# not to change in the future.
+exec pcl2pdfwr "$@"
diff --git a/tools/pcl2pdf.bat b/tools/pcl2pdf.bat
new file mode 100644
index 000000000..8c778dd06
--- /dev/null
+++ b/tools/pcl2pdf.bat
@@ -0,0 +1,16 @@
+@echo off
+@rem $RCSfile$ $Revision: 1412 $
+
+rem Convert PCL or PXL to PDF 1.3 (Acrobat 4-and-later compatible).
+rem The default PDF compatibility level may change in the future:
+
+echo -dCompatibilityLevel#1.3 >_.at
+goto bot
+
+rem Pass arguments through a file to avoid overflowing the command line.
+:top
+echo %1 >>_.at
+shift
+:bot
+if not "%3"=="" goto top
+call pcl2pdfwr %1 %2
diff --git a/tools/pcl2pdfwr b/tools/pcl2pdfwr
new file mode 100755
index 000000000..0d5f93f49
--- /dev/null
+++ b/tools/pcl2pdfwr
@@ -0,0 +1,36 @@
+#!/bin/sh
+# $RCSfile$ $Revision: 2063 $
+# Convert PCL or PCL to PDF without specifying CompatibilityLevel.
+
+OPTIONS=
+while true
+do
+ case "$1" in
+ -?*) OPTIONS="$OPTIONS $1" ;;
+ *) break ;;
+ esac
+ shift
+done
+
+if [ $# -lt 1 -o $# -gt 2 ]; then
+ echo "Usage: `basename $0` [options...] (input.pcl|-) [output.pdf|-]" 1>&2
+ exit 1
+fi
+
+infile=$1;
+
+if [ $# -eq 1 ]
+then
+ case "${infile}" in
+ -) outfile=- ;;
+ *.pcl) base=`basename ${infile} .pcl`; outfile=${base}.pdf ;;
+ *.pxl) base=`basename ${infile} .pxl`; outfile=${base}.pdf ;;
+ *) base=`basename ${infile}`; outfile=${base}.pdf ;;
+ esac
+else
+ outfile=$2
+fi
+
+# We have to include the options twice because -I only takes effect if it
+# appears before other options.
+exec pcl6 $OPTIONS -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$outfile $OPTIONS $infile
diff --git a/tools/pcl2pdfwr.bat b/tools/pcl2pdfwr.bat
new file mode 100644
index 000000000..358faf1a0
--- /dev/null
+++ b/tools/pcl2pdfwr.bat
@@ -0,0 +1,57 @@
+@echo off
+@rem $RCSfile$ $Revision: 2063 $
+rem Convert PCL or PXL to PDF without specifying CompatibilityLevel.
+
+set PS2PDFPARAMS= -dNOPAUSE -dBATCH -sDEVICE#pdfwrite
+set PS2PDFOPT=
+set PS2PDFGS=pcl6
+
+if "%OS%"=="Windows_NT" goto nt
+
+rem Run pcl2pdf on any Microsoft OS.
+
+:run
+if "%1"=="" goto usage
+if "%2"=="" goto usage
+:opt
+if "%3"=="" goto exec
+set PS2PDFOPT=%PS2PDFOPT% %1
+shift
+goto opt
+
+:exec
+rem Watcom C deletes = signs, so use # instead.
+%PS2PDFGS% %PS2PDFOPT% %PS2PDFPARAMS% -sOutputFile#%2 %1
+goto end
+
+:usage
+echo "Usage: pcl2pdf [options...] input.pcl output.pdf"
+goto end
+
+rem Run pcl2pdf on Windows NT.
+
+:nt
+if not CMDEXTVERSION 1 goto run
+if "%1"=="" goto ntusage
+if "%2"=="" goto nooutfile
+if not "%3"=="" goto opt
+
+rem Watcom C deletes = signs, so use # instead.
+%PS2PDFGS% %PS2PDFOPT% %PS2PDFPARAMS% -sOutputFile#%2 %1
+goto end
+
+:ntusage
+echo "Usage: pcl2pdf input.pcl [output.pdf]"
+echo " or: pcl2pdf [options...] input.pcl output.pdf"
+goto end
+
+:nooutfile
+set PS2PDF=%1
+set PS2PDF=%PS2PDF:.PS=.PDF%
+%PS2PDFGS% %PS2PDFOPT% %PS2PDFPARAMS% -sOutputFile#%PS2PDF% %1
+
+:end
+rem Clean up.
+SET PS2PDFPARAMS=
+SET PS2PDFGS=
+SET PS2PDFOPT=
diff --git a/tools/pxlasm.py b/tools/pxlasm.py
new file mode 100755
index 000000000..a28c5e9f9
--- /dev/null
+++ b/tools/pxlasm.py
@@ -0,0 +1,796 @@
+#!/usr/bin/env python
+# Portions Copyright (C) 2001 Artifex Software Inc.
+#
+# This software is distributed under license and may not be copied, modified
+# or distributed except as expressly authorized under the terms of that
+# license. Refer to licensing information at http://www.artifex.com/ or
+# contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+# San Rafael, CA 94903, (415)492-9861, for further information.
+#
+# TODO
+# array data should be wrapped.
+#
+# text data should be printed as a string not an array of ascii values.
+#
+# enumerations should printed we now print the ordinal value of the enumeration.
+#
+# make self.unpack endian like with binding
+
+# DIFFS between HP
+# Artifex reports the file offset of each operator HP does not.
+
+# for packing and unpacking binary data
+import re
+from struct import *
+import string
+
+DEBUG = 0
+
+
+# tags
+pxl_tags_dict = {
+ 'ArcPath' : 0x91,
+ 'BeginChar' : 0x52,
+ 'BeginFontHeader' : 0x4f,
+ 'BeginImage' : 0xb0,
+ 'BeginPage' : 0x43,
+ 'BeginRastPattern' : 0xb3,
+ 'BeginScan' : 0xb6,
+ 'BeginSession' : 0x41,
+ 'BeginStream' : 0x5b,
+ 'BeginUserDefinedLineCap' : 0x82,
+ 'BezierPath' : 0x93,
+ 'BezierRelPath' : 0x95,
+ 'Chord' : 0x96,
+ 'ChordPath' : 0x97,
+ 'CloseDataSource' : 0x49,
+ 'CloseSubPath' : 0x84,
+ 'Comment' : 0x47,
+ 'Ellipse' : 0x98,
+ 'EllipsePath' : 0x99,
+ 'EndChar' : 0x54,
+ 'EndFontHeader' : 0x51,
+ 'EndImage' : 0xb2,
+ 'EndPage' : 0x44,
+ 'EndRastPattern' : 0xb5,
+ 'EndScan' : 0xb8,
+ 'EndSession' : 0x42,
+ 'EndStream' : 0x5d,
+ 'EndUserDefinedLineCaps' : 0x83,
+ 'ExecStream' : 0x5e,
+ 'LinePath' : 0x9b,
+ 'LineRelPath' : 0x9d,
+ 'NewPath' : 0x85,
+ 'OpenDataSource' : 0x48,
+ 'PaintPath' : 0x86,
+ 'Passthrough' : 0xbf,
+ 'Pie' : 0x9e,
+ 'PiePath' : 0x9f,
+ 'PopGS' : 0x60,
+ 'PushGS' : 0x61,
+ 'ReadChar' : 0x53,
+ 'ReadFontHeader' : 0x50,
+ 'ReadImage' : 0xb1,
+ 'ReadRastPattern' : 0xb4,
+ 'ReadStream' : 0x5c,
+ 'Rectangle' : 0xa0,
+ 'RectanglePath' : 0xa1,
+ 'RemoveFont' : 0x55,
+ 'RemoveStream' : 0x5f,
+ 'RoundRectangle' : 0xa2,
+ 'RoundRectanglePath' : 0xa3,
+ 'ScanLineRel' : 0xb9,
+ 'SetAdaptiveHalftoning' : 0x94,
+ 'SetBrushSource' : 0x63,
+ 'SetCharAttributes' : 0x56,
+ 'SetCharAngle' : 0x64,
+ 'SetCharBoldValue' : 0x7d,
+ 'SetCharScale' : 0x65,
+ 'SetCharShear' : 0x66,
+ 'SetCharSubMode' : 0x81,
+ 'SetClipIntersect' : 0x67,
+ 'SetClipMode' : 0x7f,
+ 'SetClipRectangle' : 0x68,
+ 'SetClipReplace' : 0x62,
+ 'SetClipToPage' : 0x69,
+ 'SetColorSpace' : 0x6a,
+ 'SetColorTrapping' : 0x92,
+ 'SetColorTreatment' : 0x58,
+ 'SetCursor' : 0x6b,
+ 'SetCursorRel' : 0x6c,
+ 'SetDefaultGS' : 0x57,
+ 'SetHalftoneMethod' : 0x6d,
+ 'SetFillMode' : 0x6e,
+ 'SetFont' : 0x6f,
+ 'SetHalftoneMethod' : 0x6d,
+ 'SetLineCap' : 0x71,
+ 'SetLineDash' : 0x70,
+ 'SetLineJoin' : 0x72,
+ 'SetMiterLimit' : 0x73,
+ 'SetNeutralAxis' : 0x7e,
+ 'SetPageDefaultCTM' : 0x74,
+ 'SetPageOrigin' : 0x75,
+ 'SetPageRotation' : 0x76,
+ 'SetPageScale' : 0x77,
+ 'SetPathToClip' : 0x80,
+ 'SetPatternTxMode' : 0x78,
+ 'SetPenSource' : 0x79,
+ 'SetPenWidth' : 0x7a,
+ 'SetROP' : 0x7b,
+ 'SetSourceTxMode' : 0x7c,
+ 'Text' : 0xa8,
+ 'TextPath' : 0xa9,
+ 'VendorUnique' : 0x46,
+ 'attr_ubyte' : 0xf8,
+ 'attr_uint16' : 0xf9,
+ 'embedded_data' : 0xfa,
+ 'embedded_data_byte' : 0xfb,
+ 'real32' : 0xc5,
+ 'real32_array' : 0xcd,
+ 'real32_box' : 0xe5,
+ 'real32_xy' : 0xd5,
+ 'sint16' : 0xc3,
+ 'sint16_array' : 0xcb,
+ 'sint16_box' : 0xe3,
+ 'sint16_xy' : 0xd3,
+ 'sint32' : 0xc4,
+ 'sint32_array' : 0xcc,
+ 'sint32_box' : 0xe4,
+ 'sint32_xy' : 0xd4,
+ 'ubyte' : 0xc0,
+ 'ubyte_array' : 0xc8,
+ 'ubyte_box' : 0xe0,
+ 'ubyte_xy' : 0xd0,
+ 'uint16' : 0xc1,
+ 'uint16_array' : 0xc9,
+ 'uint16_box' : 0xe1,
+ 'uint16_xy' : 0xd1,
+ 'uint32' : 0xc2,
+ 'uint32_array' : 0xca,
+ 'uint32_box' : 0xe2,
+ 'uint32_xy' : 0xd2
+}
+
+pxl_enumerations_dict = {
+ 'ArcDirection' : [ 'eClockWise=0', 'eCounterClockWise=1' ],
+ 'BackCh' : ['eErrorPage=0'], # deprecated.
+ 'CharSubModeArray' : [ 'eNoSubstitution=0', 'eVerticalSubstitution=1' ],
+ 'ClipMode' : ['eNonZeroWinding=0', 'eEvenOdd=1' ],
+ 'ClipRegion' : ['eInterior=0', 'eExterior=1'],
+ 'ColorDepth' : [ 'e1Bit=0', 'e4Bit=1', 'e8Bit=2' ],
+ 'ColorMapping' : [ 'eDirectPixel=0', 'eIndexedPixel=1' ],
+ 'ColorSpace' : [ 'eGray=1', 'eRGB=2', 'eSRGB=3' ], # srgb deprecated
+ 'ColorTreatment' : [ 'eNoTreatment=0', 'eScreenMatch=1', 'eVivid=2' ],
+ 'CompressMode' : [ 'eNoCompression=0', 'eRLECompression=1',
+ 'eJPEGCompression=2', 'eDeltaRowCompression=3' ],
+ 'DataOrg' : [ 'eBinaryHighByteFirst=0', 'eBinaryLowByteFirst=1' ],
+ 'DataSource' : [ 'eDefault=0' ],
+ 'DataType' : [ 'eUByte=0', 'eSByte=1', 'eUint16=2', 'eSint16=3' ],
+ 'DitherMatrix' : [ 'eDeviceBest=0' ],
+ 'DuplexPageMode' : [ 'eDuplexHorizontalBinding=0', 'eDuplexVerticalBinding=1' ],
+ 'DuplexPageSide' : [ 'eFrontMediaSide=0', 'eBackMediaSide=1' ],
+ 'ErrorReport' : ['eNoReporting=0', 'eBackChannel=1', 'eErrorPage=2',
+ 'eBackChAndErrPage=3', 'eNWBackChannel=4', 'eNWErrorPage=5',
+ 'eNWBackChAndErrPage=6' ],
+ 'FillMode' : ['eNonZeroWinding=0', 'eEvenOdd=1' ],
+ 'LineJoineMiterJoin' : [ 'eRoundJoin=0', 'eBevelJoin=1', 'eNoJoin=2' ],
+ 'MediaSource' : [ 'eDefaultSource=0', 'eAutoSelect=1', 'eManualFeed=2',
+ 'eMultiPurposeTray=3', 'eUpperCassette=4', 'eLowerCassette=5',
+ 'eEnvelopeTray=6', 'eThirdCassette=7', 'External Trays=8-255' ],
+ 'MediaDestination' : [ 'eDefaultDestination=0', 'eFaceDownBin=1', 'eFaceUpBin=2',
+ 'eJobOffsetBin=3', 'External Bins=5-255' ],
+ 'LineCapStyle' : [ 'eButtCap=0' 'eRoundCap=1', 'eSquareCap=2', 'eTriangleCap=3' ],
+ 'LineJoin' : [ 'eMiterJoin=0', 'eRoundJoin=1', 'eBevelJoin=2', 'eNoJoin=3' ],
+ 'Measure' : [ 'eInch=0', 'eMillimeter=1', 'eTenthsOfAMillimeter=2' ],
+ 'MediaSize' : [ 'eDefault = 96', 'eLetterPaper=0', 'eLegalPaper=1', 'eA4Paper=2',
+ 'eExecPaper=3', 'eLedgerPaper=4', 'eA3Paper=5',
+ 'eCOM10Envelope=6', 'eMonarchEnvelope=7', 'eC5Envelope=8',
+ 'eDLEnvelope=9', 'eJB4Paper=10', 'eJB5Paper=11', 'eB5Paper=13',
+ 'eB5Envelope=12', 'eJPostcard=14', 'eJDoublePostcard=15',
+ 'eA5Paper=16', 'eA6Paper=17', 'eJBPaper=18', 'JIS8K=19',
+ 'JIS16K=20', 'JISExec=21' ],
+ 'Orientation' : ['ePortraitOrientation=0', 'eLandscapeOrientation=1',
+ 'eReversePortrait=2', 'eReverseLandscape=3',
+ 'eDefaultOrientation=4' ],
+ 'PatternPersistence' : [ 'eTempPattern=0', 'ePagePattern=1', 'eSessionPattern=2'],
+ 'SimplexPageMode' : ['eSimplexFrontSide=0'],
+ 'TxMode' : [ 'eOpaque=0', 'eTransparent=1' ],
+ 'WritingMode' : [ 'eHorizontal=0', 'eVertical=1' ]
+}
+
+pxl_attribute_name_to_attribute_number_dict = {
+ 'AllObjectTypes' : 29,
+ 'ArcDirection' : 65,
+ 'BlockByteLength' : 111,
+ 'BlockHeight' : 99,
+ 'BoundingBox' : 66,
+ 'ColorimetricColorSpace': 17, # deprecated
+ 'CharAngle' : 161,
+ 'CharBoldValue' : 177,
+ 'CharCode' : 162,
+ 'CharDataSize' : 163,
+ 'CharScale' : 164,
+ 'CharShear' : 165,
+ 'CharSize' : 166,
+ 'CharSubModeArray' : 172,
+ 'ClipMode' : 84,
+ 'ClipRegion' : 83,
+ 'ColorDepth' : 98,
+ 'ColorMapping' : 100,
+ 'ColorSpace' : 3,
+ 'ColorTreatment' : 120,
+ 'CommentData' : 129,
+ 'CompressMode' : 101,
+ 'ControlPoint1' : 81,
+ 'ControlPoint2' : 82,
+ 'CRGBMinMax' : 20, # deprecated
+ 'CustomMediaSize' : 47,
+ 'CustomMediaSizeUnits' : 48,
+ 'DashOffset' : 67,
+ 'DataOrg' : 130,
+ 'DestinationBox' : 102,
+ 'DestinationSize' : 103,
+ 'DeviceMatrix' : 33,
+ 'DitherMatrixDataType' : 34,
+ 'DitherMatrixDepth' : 51,
+ 'DitherMatrixSize' : 50,
+ 'DitherOrigin' : 35,
+ 'DuplexPageMode' : 53,
+ 'DuplexPageSide' : 54,
+ 'EllipseDimension' : 68,
+ 'EndPoint' : 69,
+ 'ErrorReport' : 143,
+ 'FillMode' : 70,
+ 'FontFormat' : 169,
+ 'FontHeaderLength' : 167,
+ 'FontName' : 168,
+ 'GammaGain' : 21, # deprecated.
+ 'GrayLevel' : 9,
+ 'LineCapStyle' : 71,
+ 'LineDashStyle' : 74,
+ 'LineJoinStyle' : 72,
+ 'Measure' : 134,
+ 'MediaDestination' : 36,
+ 'MediaSize' : 37,
+ 'MediaSource' : 38,
+ 'MediaType' : 39,
+ 'MiterLength' : 73,
+ 'NewDestinationSize' : 13,
+ 'NullBrush' : 4,
+ 'NullPen' : 5,
+ 'NumberOfPoints' : 77,
+ 'NumberOfScanLines' : 115,
+ 'Orientation' : 40,
+ 'PCLSelectFont' : 173,
+ 'PadBytesMultiple' : 110,
+ 'PageAngle' : 41,
+ 'PageCopies' : 49,
+ 'PageOrigin' : 42,
+ 'PageScale' : 43,
+ 'PaletteData' : 6,
+ 'PaletteDepth' : 2,
+ 'PatternDefineID' : 105,
+ 'PatternOrigin' : 12,
+ 'PatternPersistence' : 104,
+ 'PatternSelectID' : 8,
+ 'PenWidth' : 75,
+ 'Point' : 76,
+ 'PointType' : 80,
+ 'PrimaryArray' : 14,
+ 'PrimaryDepth' : 15,
+ 'RGBColor' : 11,
+ 'ROP3' : 44,
+ 'RasterObjects' : 32,
+ 'SimplexPageMode' : 52,
+ 'SolidLine' : 78,
+ 'SourceHeight' : 107,
+ 'SourceType' : 136,
+ 'SourceWidth' : 108,
+ 'StartLine' : 109,
+ 'StartPoint' : 79,
+ 'StreamDataLength' : 140,
+ 'StreamName' : 139,
+ 'SymbolSet' : 170,
+ 'TextData' : 171,
+ 'TextObjects' : 30,
+ 'TxMode' : 45,
+ 'UnitsPerMeasure' : 137,
+ 'VectorObjects' : 31,
+ 'VUExtension' : 145,
+ 'VUAttr' : 147,
+ 'WhiteReferencePoint' : 19, # deprecated.
+ 'WritingMode' : 173, # deprecated.
+ 'XSpacingData' : 175,
+ 'XYChromaticities' : 18, # deprecated.
+ 'YSpacingData' : 176,
+}
+
+class pxl_asm:
+
+ def __init__(self, data):
+ # ` HP-PCL XL;3;0
+ index = data.index("` HP-PCL XL;")
+ data = data[index:]
+ self.data = data
+ # parse out data order and protocol
+ self.binding = data[0]
+ self.protocol = data[12]
+ self.revision = data[14]
+
+ # pointer to data
+ self.index = 0
+ # NB this screws up file indexing - remove all comments
+ self.data = re.sub( '\/\/.*\n', '', self.data )
+
+ # print out big endian protocol and revision. NB should check
+ # revisions are the same.
+ print "\033%-12345X@PJL ENTER LANGUAGE = PCLXL"
+ print ") HP-PCL XL;" + self.protocol + ";" + self.revision
+
+ # skip over protocol and revision
+ while( data[self.index] != '\n' ):
+ self.index = self.index + 1
+ self.index = self.index + 1
+
+ # saved size of last array parsed
+ self.size_of_array = -1;
+ self.pack_string = ""
+
+ # dictionary of streams keyed by stream name
+ self.user_defined_streams = {}
+
+ # the n'th operator in the stream
+ self.operator_position = 0
+ self.__verbose = DEBUG
+
+ # the file must be ascii encode to assemble.
+ if (self.binding != '`'):
+ raise(SyntaxError)
+
+ # output is always little endian.
+ self.assembled_binding = '<'
+
+ def nullAttributeList(self):
+ return 0
+
+ # does not consume the string
+ def next_string(self):
+ index = self.index
+ while self.data[index] in string.whitespace: index = index + 1
+ start = index
+ while self.data[index] not in string.whitespace: index = index + 1
+ end = index
+ return self.data[start:end]
+
+ def consume_next_string(self):
+ while self.data[self.index] in string.whitespace:
+ self.index = self.index + 1
+ while self.data[self.index] not in string.whitespace:
+ self.index = self.index + 1
+
+ # redefine pack to handle endianness
+ def pack(self, format, *data):
+ for args in data:
+ try:
+ sys.stdout.write(pack(self.assembled_binding + format, args))
+ except:
+ sys.stderr.write("assemble failed at: ")
+ # dump surrounding context.
+ sys.stderr.write(self.data[self.index:self.index+40])
+ sys.stderr.write("\n")
+ raise
+ # implicitly read when parsing the tag
+ def attributeIDValue(self):
+ return 1
+
+ # search for next expected tag "tag" and print its hex value.
+ def getTag(self, tag):
+ new_tag = self.next_string()
+ if ( new_tag == tag ):
+ self.consume_next_string()
+ self.pack( "B", pxl_tags_dict[tag] )
+ return 1
+
+ return 0
+
+ # get the next operator
+ def operatorTag(self):
+ tag = self.next_string()
+ if ( not self.is_Embedded(tag) ):
+ self.operator_position = self.operator_position + 1
+ if ( tag in pxl_tags_dict.keys() ):
+ self.pack( 'B', pxl_tags_dict[tag] )
+ self.consume_next_string()
+ # handle special cases
+ if ( self.is_Embedded(tag) ):
+ self.process_EmbeddedInfo(tag)
+ return 1
+ return 0
+
+ def Tag_ubyte(self):
+ if ( self.getTag( 'ubyte' ) ):
+ self.pack_string = 'B'
+ return 1
+ return 0
+
+ def Tag_sint16(self):
+ if ( self.getTag( 'sint16' ) ):
+ self.pack_string = 'h'
+ return 1
+ return 0
+
+ def Tag_uint16(self):
+ if ( self.getTag( 'uint16' ) ):
+ self.pack_string = 'H'
+ return 1
+ return 0
+
+ def Tag_sint32(self):
+ if ( self.getTag( 'sint32' ) ):
+ self.pack_string = 'l'
+ return 1
+ return 0
+
+ def Tag_uint32(self):
+ if ( self.getTag( 'uint32' ) ):
+ self.pack_string = 'L'
+ return 1
+ return 0
+
+ def Tag_real32(self):
+ if ( self.getTag( 'real32' ) ):
+ self.pack_string = 'f'
+ return 1
+ return 0
+
+ def consume_to_char_plus_one(self, chr):
+ while (self.data[self.index:self.index+len(chr)] != chr):
+ self.index = self.index + 1
+ self.index = self.index + len(chr)
+
+ def Tag_ubyte_array(self):
+ if ( self.getTag( 'ubyte_array' ) ):
+ self.consume_to_char_plus_one('[')
+ self.pack_string = 'B'
+ return 1
+ return 0
+
+ def Tag_uint16_array(self):
+ if ( self.getTag( 'uint16_array' ) ):
+ self.pack_string = 'H'
+ self.consume_to_char_plus_one('[')
+ return 1
+ return 0
+
+ def Tag_sint16_array(self):
+ if ( self.getTag( 'sint16_array' ) ):
+ self.pack_string = 'h'
+ self.consume_to_char_plus_one('[')
+ return 1
+ return 0
+
+ def Tag_uint32_array(self):
+ if ( self.getTag( 'uint32_array' ) ):
+ self.pack_string = 'L'
+ self.consume_to_char_plus_one('[')
+ return 1
+ return 0
+
+ def Tag_sint32_array(self):
+ if ( self.getTag( 'sint32_array' ) ):
+ self.pack_string = 'l'
+ self.consume_to_char_plus_one('[')
+ return 1
+ return 0
+
+ def Tag_real32_array(self):
+ if ( self.getTag( 'real32_array' ) ):
+ self.pack_string = 'f'
+ self.consume_to_char_plus_one('[')
+ return 1
+ return 0
+
+ def Tag_ubyte_xy(self):
+ if ( self.getTag( 'ubyte_xy' ) ):
+ self.pack('B', self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_uint16_xy(self):
+ if ( self.getTag( 'uint16_xy' ) ):
+ self.pack('H', self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_sint16_xy(self):
+ if ( self.getTag( 'sint16_xy' ) ):
+ self.pack('h', self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_uint32_xy(self):
+ if ( self.getTag( 'uint32_xy' ) ):
+ self.pack('L', self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_sint32_xy(self):
+ if ( self.getTag( 'sint32_xy' ) ):
+ self.pack('l', self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_real32_xy(self):
+ if ( self.getTag( 'real32_xy' ) ):
+ self.pack('f', self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_ubyte_box(self):
+ if ( self.getTag( 'ubyte_box' ) ):
+ self.pack('B', self.next_num(), self.next_num(),
+ self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_uint16_box(self):
+ if ( self.getTag( 'uint16_box' ) ):
+ self.pack('H', self.next_num(), self.next_num(),
+ self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_sint16_box(self):
+ if ( self.getTag( 'sint16_box' ) ):
+ self.pack('h', self.next_num(), self.next_num(),
+ self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_uint32_box(self):
+ if ( self.getTag( 'uint32_box' ) ):
+ self.pack('L', self.next_num(), self.next_num(),
+ self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_sint32_box(self):
+ if ( self.getTag( 'sint32_box' ) ):
+ self.pack('l', self.next_num(), self.next_num(),
+ self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ def Tag_real32_box(self):
+ if ( self.getTag( 'real32_box' ) ):
+ self.pack('f', self.next_num(), self.next_num(),
+ self.next_num(), self.next_num())
+ return 1
+ return 0
+
+ # check for embedded tags.
+ def is_Embedded(self, name):
+ return ( name == 'embedded_data' or name == 'embedded_data_byte' )
+
+ def process_EmbeddedInfo(self, name):
+ # skip over the
+ # finally write the list
+ self.consume_to_char_plus_one( '[' )
+ number_list = []
+ while (1):
+ num = self.next_hex_num()
+ # trick - num will fail on ']'
+ if (num != None):
+ number_list.append(num)
+ else:
+ break
+ # write the length of the list as the embedded data's size
+ if ( name == 'embedded_data' ):
+ format = 'L'
+ else:
+ format = 'B'
+ self.pack(format, len(number_list))
+ # NB needs wrapping
+ for num in number_list:
+ self.pack( 'B', num )
+
+ def Tag_attr_ubyte(self):
+ tag = self.next_string()
+ if ( tag in pxl_attribute_name_to_attribute_number_dict.keys() ):
+ self.pack( 'B', pxl_tags_dict['attr_ubyte'] )
+ self.pack( 'B', pxl_attribute_name_to_attribute_number_dict[tag] )
+ self.consume_next_string()
+ # handle special cases
+ if ( self.is_Embedded(tag) ):
+ self.process_EmbeddedInfo(tag)
+ return 1
+ return 0
+
+ def Tag_attr_uint16(self):
+ if ( self.getTag( 'attr_uint16' ) ):
+ print "Attribute tag uint16 # NOT IMPLEMENTED #", self.pack('HH', self.data[self.index] )
+ self.index = self.index + 2
+ return 1
+ return 0
+
+ def attributeID(self):
+ return (self.Tag_attr_ubyte() or self.Tag_attr_uint16()) and self.attributeIDValue()
+
+ # return the start and end position of the next string
+ def next_token(self):
+ # token begins or end on a line
+ while self.data[self.index] in string.whitespace:
+ self.index = self.index + 1
+ start = self.index
+ while self.data[self.index] not in string.whitespace:
+ self.index = self.index + 1
+ end = self.index
+ pos = start
+ # return offset within the line of the start of the token.
+ # Useful for assembling hex format.
+ while (self.data[pos] != '\n'):
+ if pos == 0:
+ break
+ pos -= 1
+ return self.data[start:end], start-pos-1
+
+ def next_hex_num(self):
+ num_str, offset = self.next_token()
+ # end of data
+ if ( offset == 0 and num_str == ']' ):
+ return None
+
+ # offset or ascii columns
+ if ( offset < 7 or offset > 57 ):
+ return self.next_hex_num()
+
+ # hex number
+ return string.atoi(num_str, 16)
+
+ def next_num(self):
+ # no checking.
+ num_str, offset = self.next_token()
+ try:
+ num = string.atoi(num_str)
+ except ValueError:
+ try:
+ num = string.atof(num_str)
+ except:
+ num = None
+ return num
+
+ def singleValueType(self):
+ if ( self.Tag_ubyte() or self.Tag_uint16() or self.Tag_uint32() or \
+ self.Tag_sint16() or self.Tag_sint32() or self.Tag_real32() ):
+ self.pack(self.pack_string, self.next_num()),
+ return 1
+ return 0
+
+ def xyValueType(self):
+ return self.Tag_ubyte_xy() or self.Tag_uint16_xy() or self.Tag_uint32_xy() or \
+ self.Tag_sint16_xy() or self.Tag_sint32_xy() or self.Tag_real32_xy()
+
+ def boxValueType(self):
+ return self.Tag_ubyte_box() or self.Tag_uint16_box() or self.Tag_uint32_box() or \
+ self.Tag_sint16_box() or self.Tag_sint32_box() or self.Tag_real32_box()
+
+ def valueType(self):
+ return self.singleValueType() or self.xyValueType() or self.boxValueType()
+
+ # don't confuse the size of the type with the size of the elements
+ # in the array
+ def arraySizeType(self):
+ return (self.Tag_ubyte() or self.Tag_uint16())
+
+ def arraySize(self):
+ # save the old pack string for the type of the array, the data
+ # type for the size will replace it.
+ pack_string = self.pack_string
+ if ( self.arraySizeType() ):
+ self.size_of_array = self.next_num()
+ self.pack(self.pack_string, self.size_of_array)
+ # restore the pack string
+ self.pack_string = pack_string
+ return 1
+ return 0
+
+ def singleValueArrayType(self):
+ return self.Tag_ubyte_array() or self.Tag_uint16_array() or \
+ self.Tag_uint32_array() or self.Tag_sint16_array() or \
+ self.Tag_sint32_array() or self.Tag_real32_array()
+
+ def arrayType(self):
+ if (self.singleValueArrayType() and self.arraySize()):
+ hex_dump_format = (self.pack_string == 'B')
+ for num in range(0, self.size_of_array):
+ # reading byte data hex dump format
+ if hex_dump_format:
+ n = self.next_hex_num()
+ # not hex dump format
+ else:
+ n = self.next_num()
+ self.pack(self.pack_string, n)
+ if hex_dump_format:
+ self.consume_to_char_plus_one('\n]')
+ else:
+ self.consume_to_char_plus_one(']')
+ return 1
+ return 0
+
+ def dataType(self):
+ return( self.valueType() or self.arrayType() or self.boxValueType() )
+
+ # these get parsed when doing the tags
+ def numericValue(self):
+ return 1;
+
+ def attributeValue(self):
+ return( self.dataType() and self.numericValue() )
+
+ def singleAttributePair(self):
+ return( self.attributeValue() and self.attributeID() )
+
+ def multiAttributeList(self):
+ # NB should be many 1+ not sure how this get handled yet
+ return( self.singleAttributePair() )
+
+ def nullAttributeList(self):
+ return 0
+
+ def attributeList(self):
+ return (self.singleAttributePair() or self.multiAttributeList() or self.nullAttributeList())
+
+ def attributeLists(self):
+ # save the beginning of the attribute list even if it is
+ # empty. So we can report the position of the command.
+ self.begin_attribute_pos = self.index
+ # 0 or more attribute lists
+ while( self.attributeList() ):
+ continue
+ return 1
+
+ def UEL(self):
+ uel_string_1 = 'string*'
+ uel_string_2 = '-12345X'
+ tag = self.next_string()
+ if ( tag == uel_string_1 ):
+ self.consume_next_string()
+ # an approximate search
+ if ( string.find(self.data[self.index:], uel_string_2 ) >= 0 ):
+ self.consume_to_char_plus_one('X')
+ sys.stdout.write( "\033%-12345X" )
+ return 1
+ return 0
+
+ def operatorSequences(self):
+ while ( self.attributeLists() and self.operatorTag() ) or self.UEL():
+ continue
+
+ def assemble(self):
+ try:
+ self.operatorSequences()
+ # assume an index error means we have processed everything - ugly
+ except IndexError:
+ return
+ else:
+ sys.stderr.write("assemble failed\n")
+
+if __name__ == '__main__':
+ import sys
+
+ if not sys.argv[1:]:
+ print "Usage: %s pxl files" % sys.argv[0]
+
+ for file in sys.argv[1:]:
+ try:
+ fp = open(file, 'rb')
+ except:
+ sys.stderr.write("Cannot find file %s" % file)
+ continue
+ # read the whole damn thing. Removing comments and blank lines.
+ pxl_code = fp.read()
+ fp.close()
+
+ # initialize and assemble.
+ pxl_stream = pxl_asm(pxl_code)
+ pxl_stream.assemble()
diff --git a/tools/pxldis.py b/tools/pxldis.py
new file mode 100755
index 000000000..7d657e704
--- /dev/null
+++ b/tools/pxldis.py
@@ -0,0 +1,899 @@
+#!/usr/bin/env python
+# Portions Copyright (C) 2001 Artifex Software Inc.
+#
+# This software is distributed under license and may not be copied, modified
+# or distributed except as expressly authorized under the terms of that
+# license. Refer to licensing information at http://www.artifex.com/ or
+# contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+# San Rafael, CA 94903, (415)492-9861, for further information.
+#
+# TODO
+# array data should be wrapped.
+#
+# text data should be printed as a string not an array of ascii values.
+#
+# enumerations should printed we now print the ordinal value of the enumeration.
+#
+# make self.unpack endian like with binding
+
+# DIFFS between HP
+# Artifex reports the file offset of each operator HP does not.
+
+import string
+
+# for packing and unpacking binary data
+from struct import *
+
+# tags
+pxl_tags_dict = {
+ 'ArcPath' : 0x91,
+ 'BeginChar' : 0x52,
+ 'BeginFontHeader' : 0x4f,
+ 'BeginImage' : 0xb0,
+ 'BeginPage' : 0x43,
+ 'BeginRastPattern' : 0xb3,
+ 'BeginScan' : 0xb6,
+ 'BeginSession' : 0x41,
+ 'BeginStream' : 0x5b,
+ 'BeginUserDefinedLineCap' : 0x82,
+ 'BezierPath' : 0x93,
+ 'BezierRelPath' : 0x95,
+ 'Chord' : 0x96,
+ 'ChordPath' : 0x97,
+ 'CloseDataSource' : 0x49,
+ 'CloseSubPath' : 0x84,
+ 'Comment' : 0x47,
+ 'Ellipse' : 0x98,
+ 'EllipsePath' : 0x99,
+ 'EndChar' : 0x54,
+ 'EndFontHeader' : 0x51,
+ 'EndImage' : 0xb2,
+ 'EndPage' : 0x44,
+ 'EndRastPattern' : 0xb5,
+ 'EndScan' : 0xb8,
+ 'EndSession' : 0x42,
+ 'EndStream' : 0x5d,
+ 'EndUserDefinedLineCaps' : 0x83,
+ 'ExecStream' : 0x5e,
+ 'LinePath' : 0x9b,
+ 'LineRelPath' : 0x9d,
+ 'NewPath' : 0x85,
+ 'OpenDataSource' : 0x48,
+ 'PaintPath' : 0x86,
+ 'Passthrough' : 0xbf,
+ 'Pie' : 0x9e,
+ 'PiePath' : 0x9f,
+ 'PopGS' : 0x60,
+ 'PushGS' : 0x61,
+ 'ReadChar' : 0x53,
+ 'ReadFontHeader' : 0x50,
+ 'ReadImage' : 0xb1,
+ 'ReadRastPattern' : 0xb4,
+ 'ReadStream' : 0x5c,
+ 'Rectangle' : 0xa0,
+ 'RectanglePath' : 0xa1,
+ 'RemoveFont' : 0x55,
+ 'RemoveStream' : 0x5f,
+ 'RoundRectangle' : 0xa2,
+ 'RoundRectanglePath' : 0xa3,
+ 'ScanLineRel' : 0xb9,
+ 'SetAdaptiveHalftoning' : 0x94,
+ 'SetBrushSource' : 0x63,
+ 'SetCharAttributes' : 0x56,
+ 'SetCharAngle' : 0x64,
+ 'SetCharBoldValue' : 0x7d,
+ 'SetCharScale' : 0x65,
+ 'SetCharShear' : 0x66,
+ 'SetCharSubMode' : 0x81,
+ 'SetClipIntersect' : 0x67,
+ 'SetClipMode' : 0x7f,
+ 'SetClipRectangle' : 0x68,
+ 'SetClipReplace' : 0x62,
+ 'SetClipToPage' : 0x69,
+ 'SetColorSpace' : 0x6a,
+ 'SetColorTrapping' : 0x92,
+ 'SetColorTreatment' : 0x58,
+ 'SetCursor' : 0x6b,
+ 'SetCursorRel' : 0x6c,
+ 'SetDefaultGS' : 0x57,
+ 'SetHalftoneMethod' : 0x6d,
+ 'SetFillMode' : 0x6e,
+ 'SetFont' : 0x6f,
+ 'SetHalftoneMethod' : 0x6d,
+ 'SetLineCap' : 0x71,
+ 'SetLineDash' : 0x70,
+ 'SetLineJoin' : 0x72,
+ 'SetMiterLimit' : 0x73,
+ 'SetNeutralAxis' : 0x7e,
+ 'SetPageDefaultCTM' : 0x74,
+ 'SetPageOrigin' : 0x75,
+ 'SetPageRotation' : 0x76,
+ 'SetPageScale' : 0x77,
+ 'SetPathToClip' : 0x80,
+ 'SetPatternTxMode' : 0x78,
+ 'SetPenSource' : 0x79,
+ 'SetPenWidth' : 0x7a,
+ 'SetROP' : 0x7b,
+ 'SetSourceTxMode' : 0x7c,
+ 'Text' : 0xa8,
+ 'TextPath' : 0xa9,
+ 'VendorUnique' : 0x46,
+ 'attr_ubyte' : 0xf8,
+ 'attr_uint16' : 0xf9,
+ 'embedded_data' : 0xfa,
+ 'embedded_data_byte' : 0xfb,
+ 'real32' : 0xc5,
+ 'real32_array' : 0xcd,
+ 'real32_box' : 0xe5,
+ 'real32_xy' : 0xd5,
+ 'sint16' : 0xc3,
+ 'sint16_array' : 0xcb,
+ 'sint16_box' : 0xe3,
+ 'sint16_xy' : 0xd3,
+ 'sint32' : 0xc4,
+ 'sint32_array' : 0xcc,
+ 'sint32_box' : 0xe4,
+ 'sint32_xy' : 0xd4,
+ 'ubyte' : 0xc0,
+ 'ubyte_array' : 0xc8,
+ 'ubyte_box' : 0xe0,
+ 'ubyte_xy' : 0xd0,
+ 'uint16' : 0xc1,
+ 'uint16_array' : 0xc9,
+ 'uint16_box' : 0xe1,
+ 'uint16_xy' : 0xd1,
+ 'uint32' : 0xc2,
+ 'uint32_array' : 0xca,
+ 'uint32_box' : 0xe2,
+ 'uint32_xy' : 0xd2
+}
+
+pxl_enumerations_dict = {
+ 'ArcDirection' : [ 'eClockWise=0', 'eCounterClockWise=1' ],
+ 'BackCh' : ['eErrorPage=0'], # deprecated.
+ 'CharSubModeArray' : [ 'eNoSubstitution=0', 'eVerticalSubstitution=1' ],
+ 'ClipMode' : ['eNonZeroWinding=0', 'eEvenOdd=1' ],
+ 'ClipRegion' : ['eInterior=0', 'eExterior=1'],
+ 'ColorDepth' : [ 'e1Bit=0', 'e4Bit=1', 'e8Bit=2' ],
+ 'ColorMapping' : [ 'eDirectPixel=0', 'eIndexedPixel=1' ],
+ 'ColorSpace' : [ 'eGray=1', 'eRGB=2', 'eSRGB=6' ], # srgb deprecated
+ 'ColorTreatment' : [ 'eNoTreatment=0', 'eScreenMatch=1', 'eVivid=2' ],
+ 'CompressMode' : [ 'eNoCompression=0', 'eRLECompression=1',
+ 'eJPEGCompression=2', 'eDeltaRowCompression=3' ],
+ 'DataOrg' : [ 'eBinaryHighByteFirst=0', 'eBinaryLowByteFirst=1' ],
+ 'DataSource' : [ 'eDefault=0' ],
+ 'DataType' : [ 'eUByte=0', 'eSByte=1', 'eUint16=2', 'eSint16=3' ],
+ 'DitherMatrix' : [ 'eDeviceBest=0' ],
+ 'DuplexPageMode' : [ 'eDuplexHorizontalBinding=0', 'eDuplexVerticalBinding=1' ],
+ 'DuplexPageSide' : [ 'eFrontMediaSide=0', 'eBackMediaSide=1' ],
+ 'ErrorReport' : ['eNoReporting=0', 'eBackChannel=1', 'eErrorPage=2',
+ 'eBackChAndErrPage=3', 'eNWBackChannel=4', 'eNWErrorPage=5',
+ 'eNWBackChAndErrPage=6' ],
+ 'FillMode' : ['eNonZeroWinding=0', 'eEvenOdd=1' ],
+ 'LineJoineMiterJoin' : [ 'eRoundJoin=0', 'eBevelJoin=1', 'eNoJoin=2' ],
+ 'MediaSource' : [ 'eDefaultSource=0', 'eAutoSelect=1', 'eManualFeed=2',
+ 'eMultiPurposeTray=3', 'eUpperCassette=4', 'eLowerCassette=5',
+ 'eEnvelopeTray=6', 'eThirdCassette=7', 'External Trays=8-255' ],
+ 'MediaDestination' : [ 'eDefaultDestination=0', 'eFaceDownBin=1', 'eFaceUpBin=2',
+ 'eJobOffsetBin=3', 'External Bins=5-255' ],
+ 'LineCapStyle' : [ 'eButtCap=0' 'eRoundCap=1', 'eSquareCap=2', 'eTriangleCap=3' ],
+ 'LineJoin' : [ 'eMiterJoin=0', 'eRoundJoin=1', 'eBevelJoin=2', 'eNoJoin=3' ],
+ 'Measure' : [ 'eInch=0', 'eMillimeter=1', 'eTenthsOfAMillimeter=2' ],
+ 'MediaSize' : [ 'eDefault = 96', 'eLetterPaper=0', 'eLegalPaper=1', 'eA4Paper=2',
+ 'eExecPaper=3', 'eLedgerPaper=4', 'eA3Paper=5',
+ 'eCOM10Envelope=6', 'eMonarchEnvelope=7', 'eC5Envelope=8',
+ 'eDLEnvelope=9', 'eJB4Paper=10', 'eJB5Paper=11', 'eB5Paper=13',
+ 'eB5Envelope=12', 'eJPostcard=14', 'eJDoublePostcard=15',
+ 'eA5Paper=16', 'eA6Paper=17', 'eJBPaper=18', 'JIS8K=19',
+ 'JIS16K=20', 'JISExec=21' ],
+ 'Orientation' : ['ePortraitOrientation=0', 'eLandscapeOrientation=1',
+ 'eReversePortrait=2', 'eReverseLandscape=3',
+ 'eDefaultOrientation=4' ],
+ 'PatternPersistence' : [ 'eTempPattern=0', 'ePagePattern=1', 'eSessionPattern=2'],
+ 'SimplexPageMode' : ['eSimplexFrontSide=0'],
+ 'TxMode' : [ 'eOpaque=0', 'eTransparent=1' ],
+ 'WritingMode' : [ 'eHorizontal=0', 'eVertical=1' ]
+}
+
+# see appendix F
+pxl_attribute_name_to_attribute_number_dict = {
+ 'AllObjectTypes' : 29,
+ 'ArcDirection' : 65,
+ 'BlockByteLength' : 111,
+ 'BlockHeight' : 99,
+ 'BoundingBox' : 66,
+ 'ColorimetricColorSpace': 17, # deprecated
+ 'CharAngle' : 161,
+ 'CharBoldValue' : 177,
+ 'CharCode' : 162,
+ 'CharDataSize' : 163,
+ 'CharScale' : 164,
+ 'CharShear' : 165,
+ 'CharSize' : 166,
+ 'CharSubModeArray' : 172,
+ 'ClipMode' : 84,
+ 'ClipRegion' : 83,
+ 'ColorDepth' : 98,
+ 'ColorMapping' : 100,
+ 'ColorSpace' : 3,
+ 'ColorTreatment' : 120,
+ 'CommentData' : 129,
+ 'CompressMode' : 101,
+ 'ControlPoint1' : 81,
+ 'ControlPoint2' : 82,
+ 'CRGBMinMax' : 20, # deprecated
+ 'CustomMediaSize' : 47,
+ 'CustomMediaSizeUnits' : 48,
+ 'DashOffset' : 67,
+ 'DataOrg' : 130,
+ 'DestinationBox' : 102,
+ 'DestinationSize' : 103,
+ 'DeviceMatrix' : 33,
+ 'DitherMatrixDataType' : 34,
+ 'DitherMatrixDepth' : 51,
+ 'DitherMatrixSize' : 50,
+ 'DitherOrigin' : 35,
+ 'DuplexPageMode' : 53,
+ 'DuplexPageSide' : 54,
+ 'EllipseDimension' : 68,
+ 'EndPoint' : 69,
+ 'ErrorReport' : 143,
+ 'FillMode' : 70,
+ 'FontFormat' : 169,
+ 'FontHeaderLength' : 167,
+ 'FontName' : 168,
+ 'GammaGain' : 21, # deprecated.
+ 'GrayLevel' : 9,
+ 'LineCapStyle' : 71,
+ 'LineDashStyle' : 74,
+ 'LineJoinStyle' : 72,
+ 'Measure' : 134,
+ 'MediaDestination' : 36,
+ 'MediaSize' : 37,
+ 'MediaSource' : 38,
+ 'MediaType' : 39,
+ 'MiterLength' : 73,
+ 'NewDestinationSize' : 13,
+ 'NullBrush' : 4,
+ 'NullPen' : 5,
+ 'NumberOfPoints' : 77,
+ 'NumberOfScanLines' : 115,
+ 'Orientation' : 40,
+ 'PCLSelectFont' : 173,
+ 'PadBytesMultiple' : 110,
+ 'PageAngle' : 41,
+ 'PageCopies' : 49,
+ 'PageOrigin' : 42,
+ 'PageScale' : 43,
+ 'PaletteData' : 6,
+ 'PaletteDepth' : 2,
+ 'PatternDefineID' : 105,
+ 'PatternOrigin' : 12,
+ 'PatternPersistence' : 104,
+ 'PatternSelectID' : 8,
+ 'PenWidth' : 75,
+ 'Point' : 76,
+ 'PointType' : 80,
+ 'PrimaryArray' : 14,
+ 'PrimaryDepth' : 15,
+ 'RGBColor' : 11,
+ 'ROP3' : 44,
+ 'RasterObjects' : 32,
+ 'SimplexPageMode' : 52,
+ 'SolidLine' : 78,
+ 'SourceHeight' : 107,
+ 'SourceType' : 136,
+ 'SourceWidth' : 108,
+ 'StartLine' : 109,
+ 'StartPoint' : 79,
+ 'StreamDataLength' : 140,
+ 'StreamName' : 139,
+ 'SymbolSet' : 170,
+ 'TextData' : 171,
+ 'TextObjects' : 30,
+ 'TxMode' : 45,
+ 'UnitsPerMeasure' : 137,
+ 'VectorObjects' : 31,
+ 'VUExtension' : 145,
+ 'VUAttr' : 147,
+ 'WhiteReferencePoint' : 19, # deprecated.
+ 'WritingMode' : 173, # deprecated.
+ 'XSpacingData' : 175,
+ 'XYChromaticities' : 18, # deprecated.
+ 'YSpacingData' : 176,
+}
+
+class pxl_dis:
+
+ def __init__(self, data):
+
+ # the class does not handle pjl, work around that here. NB
+ # should check for little endian protocol but we haven't seen
+ # it used yet.
+ index = data.index(") HP-PCL XL;")
+
+ # copy of the data without the PJL
+ data = data[index:]
+ self.data = data
+
+ # parse out data order and protocol
+ self.binding = data[0]
+ self.protocol = data[12]
+ self.revision = data[14]
+
+ # check binding NB - should check other stuff too:
+ # example: )<SP>HP-PCL XL;2;0<CR><LF>
+ if self.binding not in ['(', ')']:
+ if (self.binding == '`'):
+ print >> sys.stderr, "The PXL code is already ascii encoded\n"
+ raise(SyntaxError)
+
+ # replace with python's struct endian flag.
+ if (self.binding == ')'):
+ # little endian
+ self.binding = '<'
+ else:
+ self.binding = '>'
+
+ # save the what we skipped over so we can record file offsets
+ self.skipped_over = index
+ # pointer to data
+ self.index = 0
+ # graphic state number of pushes - number of pops
+ self.graphics_state_level = 0
+ # print out ascii protocol and revision. NB should check
+ # revisions are the same.
+ print "` HP-PCL XL;" + self.protocol + ";" + self.revision
+ # saved size of last array parsed
+ self.size_of_element = -1;
+ self.size_of_array = -1;
+ self.unpack_string = ""
+
+ # skip over protocol and revision
+ while( data[self.index] != '\n' ):
+ self.index = self.index + 1
+ self.index = self.index + 1
+
+ # dictionary of streams keyed by stream name
+ self.user_defined_streams = {}
+
+ # the n'th operator in the stream
+ self.operator_position = 0
+
+ # true if we get UEL
+ self.endjob = 0
+
+ def nullAttributeList(self):
+ return 0
+
+ # redefine unpack to handle endiannes
+ def unpack(self, format, data):
+
+ # prepend the binding to specify the endianness of the XL
+ # stream and standard format, not native. (see struct.py docs)
+ return unpack(self.binding + format, data)
+
+ # implicitly read when parsing the tag
+ def attributeIDValue(self):
+ return 1
+
+ def findTagKey(self, tag):
+ for key in pxl_tags_dict.keys():
+ if ( pxl_tags_dict[key] == tag ):
+ return key
+ return 0
+
+ # get the next operator
+ def operatorTag(self):
+ tag = unpack('B', self.data[self.index] )[0]
+ key = self.findTagKey(tag)
+ if (not key):
+ return 0
+ if ( key == "PopGS" ):
+ self.graphics_state_level = self.graphics_state_level - 1
+ if ( key == "PushGS" ):
+ self.graphics_state_level = self.graphics_state_level + 1
+
+ if (not self.isEmbedded(key)):
+ self.operator_position = self.operator_position + 1
+ print "// Op Pos: %d " % self.operator_position,
+ print "Op fOff: %d " % (self.index + self.skipped_over),
+ print "Op Hex: %X " % tag,
+ print "Level: %d" % self.graphics_state_level
+ print key
+ self.index = self.index + 1
+ # handle special cases
+ if (self.isEmbedded(key)):
+ self.process_EmbeddedInfo(key)
+ return 1
+
+ def Tag_ubyte(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+ if ( new_tag == pxl_tags_dict['ubyte'] ):
+ self.index = self.index + 1
+ print "ubyte",
+ self.unpack_string = 'B'
+ self.size_of_element = 1
+ return 1
+ return 0
+
+ def Tag_sint16(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+ if ( new_tag == pxl_tags_dict['sint16'] ):
+ self.index = self.index + 1
+ print "sint16",
+ self.unpack_string = 'h'
+ self.size_of_element = 2
+ return 1
+ return 0
+
+ def Tag_uint16(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+ if ( new_tag == pxl_tags_dict['uint16'] ):
+ self.index = self.index + 1
+ print "uint16",
+ self.unpack_string = 'H'
+ self.size_of_element = 2
+ return 1
+ return 0
+
+ def Tag_sint32(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['sint32'] ):
+ self.index = self.index + 1
+ print "sint32",
+ self.unpack_string = 'l'
+ self.size_of_element = 4
+ return 1
+ return 0
+
+ def Tag_uint32(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['uint32'] ):
+ self.index = self.index + 1
+
+ print "uint32",
+ self.unpack_string = 'L'
+ self.size_of_element = 4
+ return 1
+ return 0
+
+ def Tag_real32(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['real32'] ):
+ self.index = self.index + 1
+ print "real32",
+ self.unpack_string = 'f'
+ self.size_of_element = 4
+ return 1
+ return 0
+
+ def Tag_ubyte_array(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['ubyte_array'] ):
+ self.index = self.index + 1
+ self.unpack_string = 'B'
+ self.size_of_element = 1
+ print "ubyte_array [",
+ return 1
+ return 0
+
+ def Tag_uint16_array(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['uint16_array'] ):
+ self.index = self.index + 1
+ self.unpack_string = 'H'
+ self.size_of_element = 2
+ print "uint16_array [",
+ return 1
+ return 0
+
+ def Tag_sint16_array(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['sint16_array'] ):
+ self.index = self.index + 1
+ self.unpack_string = 'h'
+ self.size_of_element = 2
+ print "sint16_array [",
+ return 1
+ return 0
+
+ def Tag_uint32_array(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['uint32_array'] ):
+ self.index = self.index + 1
+ self.unpack_string = 'L'
+ self.size_of_element = 4
+ print "uint32_array [",
+ return 1
+ return 0
+
+ def Tag_sint32_array(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['sint32_array'] ):
+ self.index = self.index + 1
+ self.unpack_string = 'l'
+ self.size_of_element = 4
+ print "sint32_array [",
+ return 1
+ return 0
+
+ def Tag_real32_array(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['real32_array'] ):
+ self.index = self.index + 1
+ self.unpack_string = 'f'
+ self.size_of_element = 4
+ print "real32_array [",
+ return 1
+ return 0
+
+ def Tag_ubyte_xy(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['ubyte_xy'] ):
+ self.index = self.index + 1
+
+ print "ubyte_xy %d %d" % \
+ self.unpack('BB', self.data[self.index:self.index+2]),
+ self.index = self.index + 2
+ return 1
+ return 0
+
+ def Tag_uint16_xy(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['uint16_xy'] ):
+ self.index = self.index + 1
+
+ print "uint16_xy %d %d" % \
+ self.unpack('HH', self.data[self.index:self.index+4]),
+ self.index = self.index + 4
+ return 1
+ return 0
+
+ def Tag_sint16_xy(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['sint16_xy'] ):
+ self.index = self.index + 1
+
+ print "sint16_xy %d %d" % \
+ self.unpack('hh', self.data[self.index:self.index+4]),
+ self.index = self.index + 4
+ return 1
+ return 0
+
+ def Tag_uint32_xy(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['uint32_xy'] ):
+ self.index = self.index + 1
+
+ print "uint32_xy" % \
+ self.unpack('LL', self.data[self.index:self.index+8]),
+ self.index = self.index + 8
+ return 1
+ return 0
+
+ def Tag_sint32_xy(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['sint32_xy'] ):
+ self.index = self.index + 1
+
+ print "sint32_xy %d %d" % \
+ self.unpack('ll', self.data[self.index:self.index+8]),
+ self.index = self.index + 8
+ return 1
+ return 0
+
+ def Tag_real32_xy(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['real32_xy'] ):
+ self.index = self.index + 1
+
+ print "real32_xy %f %f" % \
+ self.unpack('ff', self.data[self.index:self.index+8]),
+ self.index = self.index + 8
+ return 1
+ return 0
+
+ def Tag_ubyte_box(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['ubyte_box'] ):
+ self.index = self.index + 1
+
+ print "ubyte_box %d %d %d %d" % \
+ self.unpack('BBBB', self.data[self.index:self.index+4]),
+ self.index = self.index + 4
+ return 1
+ return 0
+
+ def Tag_uint16_box(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['uint16_box'] ):
+ self.index = self.index + 1
+ print "uint16_box %d %d %d %d" % \
+ self.unpack('hhhh', self.data[self.index:self.index+8]),
+ self.index = self.index + 8
+ return 1
+ return 0
+
+ def Tag_sint16_box(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+ if ( new_tag == pxl_tags_dict['sint16_box'] ):
+ self.index = self.index + 1
+ print "sint16_box %d %d %d %d" % \
+ self.unpack('hhhh', self.data[self.index:self.index+8])
+ self.index = self.index + 8
+ return 1
+ return 0
+
+ def Tag_uint32_box(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+ if ( new_tag == pxl_tags_dict['uint32_box'] ):
+ self.index = self.index + 1
+ print "uint32_box %d %d %d %d" % \
+ self.unpack('LLLL', self.data[self.index:self.index+16])
+ self.index = self.index + 32
+ return 1
+ return 0
+
+ def Tag_sint32_box(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['sint32_box'] ):
+ self.index = self.index + 1
+
+ print "sint32_box %d %d %d %d" % \
+ self.unpack('llll', self.data[self.index:self.index+16])
+ self.index = self.index + 16
+ return 1
+ return 0
+
+ def Tag_real32_box(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['real32_box'] ):
+ self.index = self.index + 1
+
+ print "real32_box %f %f %f %f" % \
+ self.unpack('ffff', self.data[self.index:self.index+16])
+ self.index = self.index + 16
+ return 1
+ return 0
+
+
+ def dump(self, src):
+ N=0
+ result=''
+ while src:
+ s,src = src[:16],src[16:]
+ hexa = ' '.join(["%02X"%ord(x) for x in s])
+ s = s.translate(''.join([(len(repr(chr(x)))==3) and (x != 47) and chr(x) or '.' for x in range(256)]))
+ result += "%04X %-*s %s\n" % (N, 16*3, hexa, s)
+ N+=16
+ return result
+
+
+ # check for embedded tags.
+ def isEmbedded(self, name):
+ return ( name == 'embedded_data' or name == 'embedded_data_byte' )
+
+ def process_EmbeddedInfo(self, name):
+ if ( name == 'embedded_data' ):
+ length = self.unpack('I', self.data[self.index:self.index+4])[0]
+ self.index = self.index + 4
+ if ( name == 'embedded_data_byte' ):
+ length = int(self.unpack('B', self.data[self.index:self.index+1])[0])
+ self.index = self.index + 1
+ print "length:",
+ print length
+ print "["
+ print self.dump(self.data[self.index:self.index+length])
+ print "]"
+ self.index = self.index + length
+
+ def Tag_attr_ubyte(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+
+ if ( new_tag == pxl_tags_dict['attr_ubyte'] ):
+ self.index = self.index + 1
+
+ tag = unpack('B', self.data[self.index] )[0]
+ for k in pxl_attribute_name_to_attribute_number_dict.keys():
+ if ( pxl_attribute_name_to_attribute_number_dict[k] == tag ):
+ print k,
+ if pxl_enumerations_dict.has_key(k):
+ print "//",
+ searchstr = "=" + str(self.saved_ubyte)
+ enum = pxl_enumerations_dict[k]
+ for value in enum:
+ if ( value[value.index('='):] == searchstr ):
+ print value
+ break
+ else:
+ print
+ self.index = self.index + 1
+ # handle special cases
+ if ( self.isEmbedded(k) ):
+ self.process_EmbeddedInfo(k)
+ return 1
+ return 0
+
+ def Tag_attr_uint16(self):
+ new_tag = unpack('B', self.data[self.index])[0]
+ if ( new_tag == pxl_tags_dict['attr_uint16'] ):
+ self.index = self.index + 1
+ print "Attribute tag uint16 # NOT IMPLEMENTED #", self.unpack('HH', self.data[self.index] )
+ self.index = self.index + 2
+ return 1
+ return 0
+
+ def attributeID(self):
+ return (self.Tag_attr_ubyte() or self.Tag_attr_uint16()) and self.attributeIDValue()
+
+ def singleValueType(self):
+ if ( self.Tag_ubyte() or self.Tag_uint16() or self.Tag_uint32() or \
+ self.Tag_sint16() or self.Tag_sint32() or self.Tag_real32() ):
+ size = self.size_of_element
+ if ( self.unpack_string == 'f' ):
+ print "%f" % self.unpack(self.unpack_string, self.data[self.index:self.index+size]),
+ else:
+ print "%d" % self.unpack(self.unpack_string, self.data[self.index:self.index+size]),
+ if ( self.unpack_string == 'B' and size == 1 ):
+ self.saved_ubyte = self.unpack(self.unpack_string, self.data[self.index:self.index+size])[0]
+ self.index = self.index + self.size_of_element
+ return 1
+ return 0
+
+ def xyValueType(self):
+ return self.Tag_ubyte_xy() or self.Tag_uint16_xy() or self.Tag_uint32_xy() or \
+ self.Tag_sint16_xy() or self.Tag_sint32_xy() or self.Tag_real32_xy()
+
+ def boxValueType(self):
+ return self.Tag_ubyte_box() or self.Tag_uint16_box() or self.Tag_uint32_box() or \
+ self.Tag_sint16_box() or self.Tag_sint32_box() or self.Tag_real32_box()
+
+ def valueType(self):
+ return self.singleValueType() or self.xyValueType() or self.boxValueType()
+
+ def arraySizeType(self):
+ return self.Tag_ubyte() or self.Tag_uint16()
+
+ def arraySize(self):
+ # save the old unpack string for the type of the array, the data type for the size
+ # will replace it.
+ unpack_string = self.unpack_string
+ size_of_element = self.size_of_element
+ if ( self.arraySizeType() ):
+ self.size_of_array = self.unpack( self.unpack_string, \
+ self.data[self.index:self.index+self.size_of_element] )[0]
+ print self.size_of_array,
+ self.index = self.index + self.size_of_element
+ # restore the unpack string
+ self.unpack_string = unpack_string
+ self.size_of_element = size_of_element
+ return 1
+ return 0
+
+ def singleValueArrayType(self):
+ return self.Tag_ubyte_array() or self.Tag_uint16_array() or \
+ self.Tag_uint32_array() or self.Tag_sint16_array() or \
+ self.Tag_sint32_array() or self.Tag_real32_array()
+
+ def arrayType(self):
+ if (self.singleValueArrayType() and self.arraySize()):
+ array_size = self.size_of_element * self.size_of_array
+ array_elements = self.unpack( str(self.size_of_array) + self.unpack_string, \
+ self.data[self.index:self.index+array_size] )
+ # hex dump byte arrays
+ if (self.size_of_element == 1):
+ print
+ print self.dump(self.data[self.index:self.index+array_size])
+ print "]",
+ else:
+ for num in array_elements:
+ print num,
+ print "]",
+ self.index = self.index + array_size
+ return 1
+ return 0
+
+ def dataType(self):
+ return( self.valueType() or self.arrayType() or self.boxValueType() )
+
+ # these get parsed when doing the tags
+ def numericValue(self):
+ return 1;
+
+ def attributeValue(self):
+ return( self.dataType() and self.numericValue() )
+
+ def singleAttributePair(self):
+ return( self.attributeValue() and self.attributeID() )
+
+ def multiAttributeList(self):
+ # NB should be many 1+ not sure how this get handled yet
+ return( self.singleAttributePair() )
+
+ def nullAttributeList(self):
+ # NB not sure
+ return 0
+
+ def attributeList(self):
+ return (self.singleAttributePair() or self.multiAttributeList() or self.nullAttributeList())
+
+ def attributeLists(self):
+ # save the beginning of the attribute list even if it is
+ # empty. So we can report the position of the command.
+ self.begin_attribute_pos = self.index
+ # 0 or more attribute lists
+ while( self.attributeList() ):
+ continue
+ return 1
+
+ def UEL(self):
+ if ( self.data[self.index:self.index+9] == "\033%-12345X" ):
+ print 'string* \\x1B%-12345X'
+ self.index = self.index + 9
+ self.endjob = 1;
+ return 1
+ return 0
+
+ def operatorSequences(self):
+ while ( self.attributeLists() and self.operatorTag() ) or self.UEL():
+ print
+ if ( self.endjob == 1 ):
+ raise IndexError # hack see below
+ else:
+ continue
+
+ def disassemble(self):
+ try:
+ self.operatorSequences()
+ # assume an index error means we have processed everything - ugly
+ except IndexError:
+ return
+ else:
+ print >> sys.stderr, "dissassemble failed at file position %d" % self.index
+ endpos = min(len(self.data), self.index + 25)
+ for byte in self.data[self.index:endpos]:
+ print >> sys.stderr, hex(ord(byte)),
+ print
+
+if __name__ == '__main__':
+ import sys
+
+ if not sys.argv[1:]:
+ print "Usage: %s pxl files" % sys.argv[0]
+
+ files = sys.argv[1:]
+
+ for file in files:
+ try:
+ fp = open(file, 'rb')
+ except:
+ print "Cannot find file %s" % file
+ continue
+ # read the whole damn thing. If this get too cumbersome we
+ # can switch to string i/o which will use a disk
+ pxl_code = fp.read()
+ fp.close()
+
+ # initialize and disassemble.
+ pxl_stream = pxl_dis(pxl_code)
+ pxl_stream.disassemble()
diff --git a/tools/regress.sh b/tools/regress.sh
new file mode 100755
index 000000000..7baf2bcfc
--- /dev/null
+++ b/tools/regress.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+
+# regression testing program.
+
+# get test file directory - we will run all files in that directory.
+echo "Test files"
+read TEST
+
+# get directories for the old (working) and new (not working)
+# executable.
+
+echo "Old (working) executable directory"
+read DIR1
+
+echo "New (not working) executable directory"
+read DIR2
+
+# get the name of the executable for both old and new files
+echo "executable name"
+read EXE
+
+# get the device - we assume the chosen device from the new exe device
+# list is available on the old exe.
+
+echo "choose available device(s) use a space to delimit devices"
+(cd $DIR1; $EXE)
+read DEVICES
+
+# get the resolution
+echo "resolution"
+read RESOLUTION
+
+# verify continuation - exit program if not ok.
+echo $TEST
+echo $DIR1
+echo $DIR2
+echo $EXE
+echo $DEVICES
+echo $RESOLUTION
+
+echo "enter yes to continue"
+read ANSWER
+
+if [ "$ANSWER" != yes ]
+then
+ echo "bye"
+ exit 0
+fi
+
+# for all devices
+for device in $DEVICES
+do
+ echo processing $device
+ # for all of the files in the test file directory
+ for file in $TEST
+ do
+ # print test file name
+ echo processing $file
+ # calculate checksum for new and old exe. Note we always force banding.
+ CHECKSUM1=`(cd $DIR1; $EXE -Z@ -r$RESOLUTION -K40000 -dBATCH -dNOPAUSE -dMaxBitmap=200000 -dBufferSpace=200000 -sOutputFile="|sum" -sDEVICE=$device $file | grep "^[0-9]" 2> /dev/null)`
+ CHECKSUM2=`(cd $DIR2; $EXE -Z@ -r$RESOLUTION -K40000 -dBATCH -dNOPAUSE -dMaxBitmap=200000 -dBufferSpace=200000 -sOutputFile="|sum" -sDEVICE=$device $file | grep "^[0-9]" 2> /dev/null)`
+ # if the check sums are different report them and the file name.
+ if [ "$CHECKSUM1" != "$CHECKSUM2" ]
+ then
+ echo checksum1 $CHECKSUM1
+ echo checksum2 $CHECKSUM2
+ echo bad checksum $file
+ fi
+ done
+done \ No newline at end of file
diff --git a/tools/revlist.py b/tools/revlist.py
new file mode 100755
index 000000000..ce4b5ee3f
--- /dev/null
+++ b/tools/revlist.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+# script to parse svn log outputs from ghostpcl and gs
+# and merge them into a single list for time-based reference
+# run from the top level of the ghostpcl source tree
+
+# may be brittle as it's based on parsing human-readable output.
+
+import os, string
+import sys
+
+SVN_CMD = 'svn log -q'
+SVN_GS_REPOS = 'svn+ssh://svn.ghostscript.com/svn/ghostscript/trunk/gs'
+SVN_PCL_REPOS = 'svn+ssh://svn.ghostscript.com/var/lib/svn-private/ghostpcl'
+
+def parse(log, entries, module=None):
+ '''parse the output of SVN_CMD and dump the results
+ as tuples in the entries global'''
+ if not module: module = ''
+ for line in log.readlines():
+ if line[0] != 'r': continue
+ fields = line.split('|')
+ fields = map(string.strip, fields)
+ rev = fields[0][1:] # strip the initial 'r'
+ author = fields[1]
+ date = fields[2]
+ entries.append((date, rev, author, module))
+
+def report(entries):
+ 'print out the results'
+
+ # Every ghostscript revision creates a ghostpcl revision as
+ # well, during the period we've had an svn:external for it
+ first_ext_rev = 2609
+ last_gs_rev = 0
+ last_pcl_rev = 0
+
+ tab = reduce(max, [len(entry[1]) for entry in entries])
+
+ for entry in entries:
+ date = entry[0]
+ rev = entry[1]
+ author = entry[2]
+ module = entry[3]
+ if module == 'ghostscript':
+ last_gs_rev = int(rev)
+ if last_pcl_rev >= 2609:
+ rev = str(last_pcl_rev) + '+' + rev
+ else:
+ continue
+ elif module == 'ghostpcl':
+ last_pcl_rev = int(rev)
+ if last_pcl_rev >= 2609:
+ rev = rev + '+' + str(last_gs_rev)
+ pad = tab - len(rev)
+ print rev, ' ' * pad, date, author
+
+if __name__ == '__main__':
+ sys.stderr.write('Downloading logs. This may take a while...\n')
+
+ # array to hold the revision data
+ entries = []
+
+ log = os.popen(SVN_CMD + ' ' + SVN_PCL_REPOS)
+ parse(log, entries, 'ghostpcl')
+ log.close()
+
+ log = os.popen(SVN_CMD + ' ' + SVN_GS_REPOS)
+ parse(log, entries, 'ghostscript')
+ log.close()
+
+ # sort (by date, since that element is first)
+ entries.sort()
+
+ report(entries)
diff --git a/tools/smoke_baseline.txt b/tools/smoke_baseline.txt
new file mode 100644
index 000000000..319580c14
--- /dev/null
+++ b/tools/smoke_baseline.txt
@@ -0,0 +1,181 @@
+cbde0ca4208fdfc68881e537e1410e29 b6956c02b9563d7df58fe5471540b66d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0010
+c2658fb60fcf6b3523357b0349103a8e 96d23f35fc2930abc899dedf75561b3b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0040
+347fb682badf24b906c5a527a4d09edd df394a379924df56901ee8da4fa6e9d0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0051
+51431cdcafdcecd8dac530e09388fbb6 46df9622053ad94386f47d8d4c7e7a17 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0060
+c2310f0556c000cf29303cba711c237d 6b521622b15dbee8de5847361debe043 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0070
+c1e6fbaea21577d89b89c7043e6c05eb 1f91787f8204c50bd8c70f4bb819c4f0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0080
+47ace7a84e766001ec9605ac46b2d8c1 217fb52c19080132088c1ff5c52d26ba ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0090
+8f493e0d8254283ee95da692009bc6dc 687fd01349fa03cd3e2f44bc10986d2a ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0100
+2fc0d766947062a0ed02b922cc07dce5 77553c73ab7fbc0ef8907548bc7e907b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0110
+dbdef6327456602eb14e1f49bd418ff9 aa24f21c98d1273855c4a1aeed5d9da0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0120
+5e06c237726c150da41472d9103c580e 887b4d2be7d8db286044134a48c2dd02 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0130
+00ed39a5aa506a827fe0017436892551 e12fe52969833ba97fd8ce0ffd2f1cca ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0140
+a50facb7737514a988ac36c085729361 68e54929f649e2f511f18a6b803a063a ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0160
+9defbb93929e4f78fe64a04434c7ba03 4790be1a9f03ed3b1fcbe99e64276fbb ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0180
+cd573b829e6e5162891fbd030573d3f3 45efecfe6416ef0d0358479975bde26d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0193
+477d158ba7d86837d3eb8b6f94795b9b 4b8f29d387025c1b60cbc2e81d809ab4 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0210
+0c48107c44eff58258dcab424c06e75d 62543d3a1dbcb9f1e013c5982945ac87 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0220
+b144c0e9ffdeb8e759f01e348d4a5ab1 1a6ce6f7c6318fae62312cd9df9fbba3 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0230
+3bfde661d02002bcceebc6d06cb6b4df 45e8fd670b0263c7d956952e1a0aca5d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0240
+2477de6b3779f3880adcd295553a8b09 a94c187ab788396d1612e6bdbf16bbe0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0260
+b3bab328f55cfedfb1764963ccd994e0 b7bae8c846c35d1a50b3d94f4ea0ae13 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0270
+d9be0fbf9170a6ac3e681a047d49bda8 458b369856e5b6067537eb483cf3a14c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0275
+8f410dc526853f5d870ff17fd33032bd e67e9986cf7fa18fa61cf69d8997844e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0282
+15487d4d0d71a31d510b3a3a7eaa7f6b 2a09437f5a9988f874fcad04d677354c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0290
+dfa10185890613815f4c706886e6f789 0f355d016ceafa375d33b7109dd8d3fc ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0303
+774ee11f1181cbc90100fcd88d75042f 9d3f6645ebd791a62d0938ceb695de22 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0330
+ae620a8e38b843ee7a76b61bf45fa98b 88810fd57644bc4a4889f35e88c2ce29 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0351
+f79ff8becdec7fdfa47675358ab1c26b 5be65753d0539cb1914fdd4ac27e9604 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0390
+edcc537ba417a77729c0b1dcf59345d5 4da5a403fb20f35b33da27551b7f4c36 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0411
+7fd6d3ffeda4ad7a2b80ce65c9438b03 c6bc22a53ea13b604519480c9d98c029 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0422
+c9cd8ff09e093958b4f200c7a1f50986 9649435813037bcac092e961c8ac986f ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0440
+55bb4d528940f36ab486988c3f5d66bd 4902c5579b623f92792632474ec2c08b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0453
+51afb600bdfdbac6440ef2c30a939c23 9a5a4a3d7353f4d4e7b522eb19ddde91 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0460
+371f4aa82e3b4a0dc791da4980cd6f53 1810f6681d52af773d5b7d374898dbf5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0510
+707974538a996fe72984ddfb48c3c47e f043963f72fe5cd5c8e6571a023e23df ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0520
+727f580136b458c339d74a1befb835e4 c849054eb240fafdcfcdeb923bab431b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0530
+c856d91e9431ea98d35cced5ed857d5c e5f50764999fdc6818b3351ec72453ca ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0543
+07a1a1969426f414d22055a37af1f762 a0f8156945669b0f4dfb262b818587b8 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0560
+16e96cf95f79f326fd0a1e5450e08fc4 8284a34bce6c2ce1df17bd482fc718eb ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0573
+eb2f23b92dd3641eb3f17b61f1d1701a 1d510ac78e46c77da71d2cb526852237 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0602
+7d1ca3ec8929bdbe141ecea53561d5de 08b7e5bed7eb0462fcb0d22364ae0c3a ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0621
+d4c415a6dfab56b0ca7161d1f0b6e8b0 2c745a8a052d577199db2b001e9137ef ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0670
+53f02a54095a3e7e6e9d63b752ce0e70 587fdb44dde6bc16e96ee27cdf68244e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0680
+c16d60e36a293eb285857af80abf3ab6 acb9b2df9d33e8033bcc69bfe0bf5310 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0690
+693bdc906bfd0cb21230683ed0e1251e 842f1e2f7ee790d33d50c25f9a7d9674 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0700
+4c04cfe7761d1d6d7632df573e598293 a6ae6a0409930e3a2a7e8b3456a2a9b5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0713
+18cd7bb94afa03e46cc35d89b11703b6 25369582a9bf114a5ff375fdf292782e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0720
+435f9501e42f0e50f33fe510d078b22a 51778e37c7ff48cec8a1336b8f16dc5d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0730
+dd95d116605312e66dbfbceb6e0b1a26 f26b5c076519a8041e9c4d899f07ee10 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0740
+edcdaed42f1825d0a3bf954f97f664cb e2c454c12993ee818792c3bd43f236ce ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0750
+5765385dbbaf51c4d21eab1c6dd46d40 0d6a22ef17ea143bee75f682c12eefd3 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0760
+50d4d28f4cc0cee665a7bc4569dbe1e8 b7e2abbc067d438a4cb2442d68302b82 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0770
+683d45753910e36e6c54b79be9d63f99 4178b800b279fda2eccfa0fe60922797 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0774
+97257518d5f2dfe2c6572bf13491f2f5 f639edb8d40616ba5a41528b17c20df4 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0790
+d9125f1d37ffcbbe25649ec68006ed3d f3e7f40e3a99bf72198bb0184d4fbc16 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0800
+14b63c0af684dd0d26d5f8a0f9612ab4 a62160534336260189b9fe241052ae5e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0816
+2c491d2ad0ec971c284ea25a35d0c0ad 865ef1c47bb2678999d10d252fb038c5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0825
+492a0311940b91026333a132f603f4ac 634f066b75dd16d3b2aeecfa6848b787 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0832
+7d88d14995482a3d1455a7c0e0412d8d 873e55e61a6668d1a17c6d5d48f3b615 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0840
+77093b80dcc504ea1e66f6973ab10f71 93be7380a36754e33f8f83ffc857bcee ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0844
+799ff2e840e0f906f470a54e2da0056c 7c1553c8f51446e0441a06413c53f52c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0853
+c5fc6f02b7c8b049fc9468e9659d5bc3 a5dd7fdd5baef8ea30fd08982d029c11 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0861
+aae55d3e094e597f60ab59e429c3034e f1b166aedd2341b0237faf20fa2ea97d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0861.new
+e71a81210b5e563334fd463bb29689a6 db822844224bbf0f888d03e2ce77ae12 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0862
+42beb8a9e1f0230e7d7650c6a9e4f480 abff324377a61a37b127751f18a298f5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0865
+bf88dc3ca2b4037b32ad37d12262f1ae df04042f13912b049318a3ff19efe495 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0866
+c1aa9af3d0cb8bae8a97ea1b469de95b 764d4db7eaad3f2ef2c19509b0d6e47b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0870
+670dfc9f74b9b8ee72efc100b5978f00 47ea6e545deee5e614f71d71e1ae751e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0880
+73c8cd0bceafbe233b950200596b3ef4 030941a12e66c0e7f337bf4ee63548e6 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0884
+0bb56cecf8ce21968f5f7b71b996d287 71b1eaed960b43ab8ae717c5d6367209 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0891
+2fed9c862b1c8c3ca3a178b2c98ae8ff f16d7921e4d9e1be2d600930ba37857f ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0930
+0e167f163e0281d3a1b9b52801db4a4b 80a6e21499fe3b86508d68eed8716225 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0954
+5bce6c11c4b0e2b4cf484b8de48b3f1a 7d812798bab440c420c60dbb5d0e1e44 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0970
+358f57307609f0ff6f70a9e56b2fa197 973a7abef45970766255a34ec64950f4 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0976
+2a7160882f191c62c15aef8f4b6d2a9f e8814a8d809e3b17342d6f5bd089c5e1 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0980
+834f469aa61ad990a976449035596d79 7a00697b398c8c03eb3c6b93eb5dd9c1 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0982
+c3e54ff74f44225eeca519a4a9c2ae6d 0e77cf67ecd2df7271068fb047ae66d0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.0990
+83ce0fe84b22aeb5f5f7cda95987850c 44685b5faebf687c933e9c3a3e68bb08 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1020
+7d8019baaeaa721156b436ec6899e9bf 77fd46b237605f1ec6bae69e78e7cdae ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1051
+399242e42c86c685d89b9b522133fc1a 029b3e7ddaa8330bf7a557cff1002348 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1055
+7553e3bae7b81d4c1636ebd718f72694 872196304c9b6867cc0cd9da2ec01e0e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1060
+82a98a053973a4c1007984abe961acfd b93417204c9977f32a19038b73fe1e15 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1100
+7304ddc2d1fff20e41ff1c8b950442af 5d9273dfa86c7033bd05f756b2bd70ca ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1130
+533ac5d2e3f83d60ed21c181a2e6b04b c9b1c65039b3825872842d0183074fc6 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1180
+00cdb5f2b2e1a066f9dcaf0c2e9848b9 8bd3777d4f0674e7411e1cfed52c50c5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1230
+87d8fc88aaf0d13eed48f26d36589b82 0dc2ad8d90fe34dd66e3772ed0799f07 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1270
+d62409516933248746e8834aced87242 c8a5e947a487b4f8e6723d0e6eb2de3c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1280
+c51ed5166ec1671afaa7e9d95caf512c 7d392a5fe1794f3ae75f0b80aa7da937 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1290
+7501ccebfbeb6c56ea4fd0abb2512a4c ae075db0fafe97ad54af7e4633eeff37 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1300
+6ca4546eb93efe77e482202e605b9f1b 839267c94d3862e61da151476adc70be ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1310
+1732cf68d1a3ab427d098586c58ee410 1bb94728ec5a145b7ec1f71ba73b676c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1320
+5d27c5da5b6e8fcb7b10569e5acc51e7 f38f9c065e7e4651d7909426670abd3c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1330
+e8fa081cfcd2815e7bf1077304b90d6b 300fbe125103191ae3a61d762df31b24 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1340
+b30bc2e6da5e1084fdbddfe1f8de75a6 690ec706d547bbc4436c55fa6137e509 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1350
+0ec7cc75b08c1c0239136490b323fe91 d3c6342c9d3f1353adf983f56bf262a4 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1370
+57eda16fd02c188de6d8001e1755b39a 12e3ffd4191a3e6b62ba336d193260bf ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1380
+e30037c0200e879a60aaa5634a82d2b6 bb38f4c4d454b20602e85f486c9c9122 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1390
+a30662c99f3e267dfb0c9d67cc63dbf3 96470f3aaad64a3c38f5aff97f3e2d98 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1400
+67701a94ffb595985d1d1a0b87287af0 27ff01c890e67a62be1d0105b5712ee5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1410
+bf1f93730850861fd0bdf814fb8ff7c8 3dd38f70933912f0ea53f228916d36f8 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1420
+efcafc680735e137f5d7e24fb9935feb 74af05559ecb0b32be8f3311d9fb4bdd ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1430
+52f13922daf3d2ef621e9a1d2f8ea99c 2f65510756436c81496c2adac6c12b92 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1440
+ef15315b96e8a1c4b3712b74941d5143 13b4485b11c3ed2151a4f200a07b28a5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1450
+3bcbc5d2b30c6f1a29d469d3f1bcce8e c207a676e9d7e8fe1369c4906ecdfd1c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1460
+846e5237c005b71cee521b98e8f17585 db276e5db7b87d78e9afdcb820741712 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1470
+d8e501435042acff8c5013a9165ebed8 b072c00225a7ce38773a9e9052f418a9 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1480
+7ba119280e9e1359a3d4736b803d7f06 1c9e0862176e88a0c545945e7f8f7308 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1520
+100415d92bfd8a205e31b9d65cf29a5b f650dfc20de923f4958e4aad4bdeba58 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1552
+657ecb4e73f1792412fb5034e86a2794 962d5e8d2fb89c8ca461feb439f0c969 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1573
+9b20de36fbca7e667d6ce5846bc1f1ca 6f61e974fae14ee2ff5b5c982b89b572 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1601
+53490783615ab7c5268b5c034cbce30a 05a4daf9006a06cae8e02a488d7a3c3e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1640
+9371b414340229d1135ef5858d2ac0aa c8a1191d33286779121c3a7fa0f55bd8 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1670
+faabd7026baf1b2610971affc4bc93c3 465b4ae856bfc1cd01704260d8a35e15 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1700
+822c455192aec998aaf5ab8207e2e18c 965f6cd4d5db0940bd2d1619cbcc179f ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1740
+070829e103339a66e517c735747849b8 30adfc386b4491b43f548f483941c3db ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1762
+bcf8d2300736cb2f1805223a4e8b3989 d04bbdd3ffbf100b27285e3e6071df15 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1800
+e3d4f256326b87974659ed8eac9fba25 1fa04885f62e2fc84b6d7b3cde57942e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1810
+3763a1e2a1814c3d8c365964e017d696 4f80532d1c5c8ba731fb11f07bb8030c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1816
+d96f0754ab0d0f5ad907681b9042e656 f2a081895fd06a97af89240053435cc7 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1821
+59fcf37e04dfb1714e4f27ba5b264f6f c77d82a08ebe363fb5891bb12ad01ecd ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1832
+98cb2d34739f4d73074a8483f16a93a1 cd0e7a54901b9963da582a8f1a812aef ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1840
+0c0aacf23924e301e4810ca2fc46e5ec 6ce47f0d68125ee9e5dcb572731d651f ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1850
+69397e186e6acf90b3776ac2c684be6e 42c1c09c30c22995cc8f40ed21a05490 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1870
+ba5d55449a915a88bdd2facbc52270cc d6e8f0b02a9b19a2f0696031ad94489b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1890
+4cf5d0d224a42c0bcae1523e146504c3 73f54750b4c842c557c021407b737bc4 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1900
+252de97460035d527ed847bdee5d7e5b e5205ea2fd0100d8f8f2db5c65114ed2 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1920
+fb6ed95ac67dd6988939e7040fd0c1fc 4f2fac80f5249f595667c3fabbdd8429 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1924
+7b1e816cb87287a78456f26e28ba5bfa bd213774ef8824f3a199c4fef6edbfdf ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1925
+6e1ca291d614d101e460ed2d78b2f707 33dd673ee3d23cf6bf12a598dfefc629 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1930
+9f316a36e5aa742dc4d5608314cec442 ff1bbf4b1bc5960f7c94bf9c42906fc5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1932
+765f2fb0b5247ebae61656f9da8ab65a 9d97f4bda16778ef6b5f0a31e3679224 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1934
+279ef127f77a4d0871fb9ff9155c3689 d23497dc3d1dbb39525be8e5a64c1f8c ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1935
+ecd7c06388af348d4616d555fe057cc9 3d33d52482b52d0a930c38497d7a8aef ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1940
+5e1437f3a48f07aa029c5af8b53dd4c9 a4375d2e513e089bb68e03865576ac95 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1944
+6e75f4c67846fd4938420f8364ce1fc4 6f549beeaa0915ac968800649c359243 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1950
+5f482fb7eba19b59ecbc7c9ebe830cbd d1d1fccc30ccb9a9f8aba2dac341a0d5 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1960
+422da57dedd2dcd53a10b7446868f59a b2e2e6b6a54610694ba93b986c44a78f ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1962
+c533ddb0b9aafbe01ee11af48631df71 7a0fc131e7dc15ea6c8e9191505088d2 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.1965
+6fa0ad95ea6cc69c2191694962d35fc8 a4ef8edbbe35e58169e2b39116047476 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2000
+bb7535a9033cf150bc05c8729102beca bbb86ce017ccd79460272b80e13e30f0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2011
+af2a0be1274af4af6d86b3e6bb9966b3 fd68b51224c69ccd4234262f979c4b4b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2020
+c556971ac42e50e15d38ca98e695c81f 1f266a06198809eb8b1ed973ef98b26a ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2024
+89a38bc4f90d86ab26eedf11de3dc274 d460f12b296047632315ec9fbbf9f40d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2030
+02c68d1a1206ee2fc986e071f06fa6fc a2eb95a6f5e49ea93328289dd93f9657 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2040
+1c46bda81e4996d865cf5cb5d512aecb f461292a2d7ce95e9e00b3e482691241 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2070
+a5a2b2a8f151baf956befd7464438403 ca57ad6d4fb4917a9c444f6ffe000ab0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2092
+58abb64ac1d822dc30b0cdcd808779a4 4440c1326869fa29a4829cafb21ae09e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2103
+b1fb7605a3996c2c0d9597e36300306c 786d76bbec68b9d05fe63d5f1c0446ae ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2105
+b70dd38d5751e23f243d40ae094a4117 70e277f170977b30954048719c930c77 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2110
+523735fc397f8227891181d3edfb0ce2 63af075a5fa1dbc92d1b0d3bf5746d21 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2114
+6fd4aa2063c72b5e1da3f33b864e8d12 f0553426dcf11c9897e264c6e537d78e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2120
+5c92276a844531c6546a1de64550c0de 4e250641ffecbff63b48a0f26500a4df ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2130
+396e8bcfba50bdede79b8a24c98ea116 c1a1858f4d60c42a14387fdc18942ab0 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2131
+21785968a8c8a86dd2c72ee644ea74ff fe6338ae249a22fd3c8c501aab3dbdc3 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2140
+fb1cef22b2f7abbaf9fb207c022d37a8 3e8251f0bd9433ea746af453a1b832e3 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2141
+6c35ad1d8a1bf052eea9d22e5a48063c 637d4ac94f557694d418b8128a868b3d ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2142
+5a0df70c96d7af099d3c162699f16092 5ef273389d7f38c57e1651e628079222 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2160
+172bf79883bd4e71b7d96aaf60d6076d 9982a55d205d7ab333b928ef95bdf283 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2161
+2f3ba24444360ee233962ce6916ad1a2 cdf939713d0d48b84689a13555c59232 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2170
+45c8d8c605c17a53da34af9bdc4d91e9 aae9d4e24f3ebaf3100ff4ed270cbd9e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2171
+7a0d1dfa80b8b03085bb28d67500d17f 6560660df10c06a5ee9ae9c45dd4f8e4 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2180
+1b1cffeb5ca548e464c33202b3ba9ee1 c3dbab93b9631661ce1e5d68f5bfc7a3 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2190
+85bdf9a2648a7891a43beb83c753fe76 3eec11a64681a63b04a1a42cd947f825 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2200
+1c6390042a2f132614e7d81db6815330 d81b62529bd0584c2337bc45938631d2 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2201
+85d43c5700f87211b640dd28c72e046b 06322037321f8202bf862f50d68b7ade ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2210a
+2da59757ec9ebc895db4d321dbf7bfbd 14f497ba317993e10d56373a71257154 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2210b
+9e65ba7fb3b2910f6705f75663b5c22a 8ce7276c109b42a132bac0d6ded2c0f9 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2210c
+040ef064738c806aaf425bfe6ee902fe ecfbd3e9a98c0171450e6c2e18b7ee13 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2210d
+21dc464095ff6a4f3d389d8b705ca6ab 6137f557031c81e5f3d11e926d0cc9fa ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2210e
+6cb4fea28e53b2c6d308e1304df6c6cd da54004ca66ade84a0ea4dd76767571f ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2230
+c4e4c41de1b93dc3548e90657c422cad 816fd238ca39ade9e5587242216c668b ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2240
+87921ccb69e59fa1d937ae0a0fbc709f c699c2479eec30fe0ced247b66644f68 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2241
+5bc7f9cc9dfbf81d9a0c70def9716921 155a9fe2f5571753b12b58c0e15c51aa ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2320
+f06835a62d1d62f1b297e97ac5f7f1e3 fc03ce89d563f5490cad550b002812cd ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2330
+02e9041ac809334286ba59b59d67dc12 e50d790ae2de23d5c43a72ed340bd2d6 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2350
+c34ece4bc5cef52aa5e7a068afcb7189 dc82c7af6365d2d33a27f35127711676 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2354
+2d78140eae7fc7535f3b8cf743d4486c 38864a671f41af42a1bba6f0bbc6e714 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2380
+342b08aa9783337b0228008743a0cfbd 193fbce5a19365af667bed9ec576d094 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2410
+eb86ee72b8ada72b2b6ca661b1cdc3ca 8cb1d5e7b664919740c9294758040703 ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2411
+3e95615bf803a8eabf77dae3bee954b0 453b47e61c74020e2f02004b18cb906e ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.2412
+4fb7f41f20a81a344f6a577e5ab7eb97 fefa68596700e020109e02874aea21fc ./language_switch/obj/pspcl6 r2976+8398 ../tests/pcl/pcl5cfts/fts.5401
diff --git a/tools/smoke_check.sh b/tools/smoke_check.sh
new file mode 100755
index 000000000..20cdd56b9
--- /dev/null
+++ b/tools/smoke_check.sh
@@ -0,0 +1,51 @@
+#/bin/sh
+# script to smoke check the renderer against known files
+
+# define the parameters of the run
+TESTS=$(find ../tests/ -type f)
+TESTS=../tests/pcl/pcl5cfts/fts.*
+EXE=./language_switch/obj/pspcl6
+#EXE=./main/obj/pcl6
+OPTS="-dNOPAUSE -sDEVICE=ppmraw -r100"
+BASELINE=tools/smoke_baseline.txt
+
+# check for baseline and test files
+if ! test -r $BASELINE; then
+ echo "Couldn't find baseline data file '$BASELINE'"
+ exit 1
+fi
+if test -z "$TESTS"; then
+ echo "no test files found"
+ exit 1
+fi
+
+# loop over the test files comparing checksums
+all=0
+failed=0
+for file in $TESTS; do
+ echo -n "$file: "
+ fsum=`md5sum $file | cut -f 1 -d ' '`
+ result=`$EXE $OPTS -sOutputFile="|md5sum" $file`
+ rsum=`echo $result | cut -f 1 -d ' '`
+ bsumline=`cat $BASELINE | egrep ^$fsum`
+ if test -z "$bsumline"; then
+ echo "file doesn't exist in baseline"
+ else
+ all=`expr $all + 1`
+ bsum=`echo $bsumline | cut -f 2 -d ' '`
+ if test "x$rsum" = "x$bsum"; then
+ echo "ok"
+ else
+ echo "DIFFERS"
+# echo $rsum vs $bsum"
+ failed=`expr $failed + 1`
+ fi
+ fi
+done
+
+# report
+if test $failed -gt 0; then
+ echo "differences in $failed of $all files"
+else
+ echo "all known files match"
+fi
diff --git a/tools/smoke_update.sh b/tools/smoke_update.sh
new file mode 100755
index 000000000..684f5ed7c
--- /dev/null
+++ b/tools/smoke_update.sh
@@ -0,0 +1,38 @@
+#/bin/sh
+# script to generate a rough baseline for smoketests
+
+# define the parameters of the run
+#TESTS=$(find ../tests/ -type f)
+TESTS=../tests/pcl/pcl5cfts/fts.*
+#EXE=./main/obj/pcl6
+EXE=./language_switch/obj/pspcl6
+OPTS="-dNOPAUSE -sDEVICE=ppmraw -r100"
+BASELINE=tools/smoke_baseline.txt
+
+# get the current revisions
+rev=`svn info | grep Revision | cut -f 2 -d ' '`
+gsrev=`svn info gs | grep Revision | cut -f 2 -d ' '`
+
+echo "updating smoke test baseline for r$rev+$gsrev..."
+
+if test -z "$TESTS"; then
+ echo "no test files found"
+ exit 1
+fi
+
+# remove the old baseline
+if test -w $BASELINE; then
+ rm $BASELINE
+fi
+
+# loop over the test files
+for file in $TESTS; do
+ fsum=`md5sum $file | cut -f 1 -d ' '`
+ result=`$EXE $OPTS -sOutputFile="|md5sum" $file`
+ rsum=`echo $result | cut -f 1 -d ' '`
+ if test -z "$rsum"; then
+ echo "no output for $file"
+ else
+ echo "$fsum $rsum $EXE r$rev+$gsrev $file" >> $BASELINE
+ fi
+done
diff --git a/tools/suite.tcl b/tools/suite.tcl
new file mode 100755
index 000000000..87649bce4
--- /dev/null
+++ b/tools/suite.tcl
@@ -0,0 +1,191 @@
+#!/usr/bin/tclsh
+# Copyright (C) 1997, 1998 Aladdin Enterprises. All rights reserved.
+# Unauthorized use, copying, and/or distribution prohibited.
+
+# Run some or all of a Genoa test suite, optionally checking for memory leaks.
+# Command line syntax:
+# suite (--[no-]band | --[no-]check | --[no-]debug |
+# --[no-]print[=<device>] | --[no-]profile | --[no-]sort |
+# --[no-]together |
+# -<switch> |
+# <dirname>[,<filename>] | <filename>)*
+
+# Note: test failure is typically indicated by one or more of the following:
+# exit status
+# Error:
+# fail/FAIL
+# wrong:
+# *not* Final time
+
+set __band 1 ;# use banding
+set __check 0 ;# check for memory leaks
+set __debug 0 ;# don't actually execute the test
+set __display 0 ;# use display instead of printer
+set __print 0 ;# don't discard output, print for LJ4
+ ;# (or device if value != 1)
+set __profile 0 ;# assume -pg executable, profile execution
+set __sort 1 ;# do in order of increasing file size
+set __together 0 ;# run all files together, not individually
+
+proc test_args {band display print switches} {
+ set args [list -K40000 -Z@:? -dNOPAUSE -dBATCH]
+ if {$display} {
+ # Use the default device
+ } elseif {$print == "0"} {
+ lappend args -r600 -sDEVICE=pbmraw -sOutputFile=/dev/null
+ } else {
+ if {$print == "1"} {set print ljet4}
+ lappend args -r600 -sDEVICE=$print -sOutputFile=t.[exec date +%H%M%S].%03d.$print
+ }
+ if $band {
+ lappend args -dMaxBitmap=200000 -dBufferSpace=200000
+ }
+ return [concat $args $switches {-c false 0 startjob pop -f}]
+}
+
+proc test_xe {file} {
+ if {[string first xl $file] >= 0} {return pclxl}
+ if {[string first pcl $file] >= 0} {return pcl5}
+ return gs
+}
+
+proc catch_exec {command} {
+ global __debug
+
+ puts $command; flush stdout
+ if {!$__debug && [catch [concat exec $command] msg]} {
+ puts "*** Non-zero exit code from command:"
+ puts $command
+ puts $msg
+ }
+}
+
+proc output_name {fl} {
+ if {[llength $fl] == 1} {
+ set output [lindex $fl 0]
+ } else {
+ set output "[lindex $fl 0]-[lindex $fl end]"
+ }
+ regsub -all / $output - output
+ return $output
+}
+
+proc suite {filelist switches} {
+ global __band __check __display __print __profile __together
+
+ set files [list]
+ if $__together {
+ set left $filelist
+ set max_files 100
+ set max_files1 [expr $max_files - 1]
+ set test_xe [test_xe [lindex $filelist 0]]
+ while {[llength $left] > $max_files} {
+ lappend files [lrange $left 0 $max_files1]
+ set left [lreplace $left 0 $max_files1]
+ }
+ if {$left != {}} {
+ lappend files $left
+ }
+ } else {
+ foreach f $filelist {lappend files [list $f]}
+ }
+ foreach fl $files {
+ set test_args [test_args $__band $__display $__print $switches]
+ set test_xe [test_xe [lindex $fl 0]]
+ set output [output_name $fl]
+ if {$test_xe != "gs"} {
+ set pre [list]
+ set post $fl
+ } elseif {[llength $fl] == 1} {
+ set pre [list]
+ set post [list - < [lindex $fl 0]]
+ } else {
+ set pre [concat cat $fl |]
+ set post [list -]
+ }
+ if $__check {
+ puts $fl
+ flush stdout
+ catch_exec [concat $pre $test_xe -ZA $test_args $post > t]
+ exec leaks < t > ${output}.leak
+ } else {
+ set log ${output}.log
+ set command [concat $pre time $test_xe $test_args $post | tee -a $log >@ stdout 2>@ stderr]
+ exec echo $command > $log
+ catch_exec $command
+ if $__profile {
+ exec gprof $test_xe > ${output}.out
+ }
+ }
+ }
+}
+
+# Define the suites, sorted by increasing file size.
+# We compute the sorted lists lazily.
+proc compare_file_size {file1 file2} {
+ expr [file size $file1] - [file size $file2]
+}
+proc get_suite {dir {sort 1}} {
+ global list
+
+ set files [glob -nocomplain $dir/*.bin]
+ if {$files == {}} {
+ set files [glob -nocomplain $dir/*.ps]
+ }
+ if !$sort {
+ return [lsort $files]
+ }
+ if [info exists list($dir)] {
+ return $list($dir)
+ }
+ set files [lsort -command compare_file_size $files]
+ if {[lindex $files 0] == "0release.bin"} {
+ set files [lrange $files 1 end]
+ }
+ return [set list($dir) $files]
+}
+
+# Run the program.
+set switches ""
+set files ""
+puts "-- [exec date]"
+puts "-- $argv0 $argv"
+foreach file $argv {
+ if [regexp {^-} $file] {
+ if {$files != ""} {suite $files $switches; set files ""}
+ if [regexp {^--no-(.*)$} $file all var] {
+ if [info exists __$var] {
+ set __$var 0
+ } else {
+ puts "Unknown switch $file"
+ exit 1
+ }
+ } elseif {[regexp {^--(.*)$} $file all var]} {
+ if [info exists __$var] {
+ set __$var 1
+ } elseif {[regexp {^(print)=(.*)$} $var all var value]} {
+ set __$var $value
+ } else {
+ puts "Unknown switch $file"
+ exit 1
+ }
+ } else {
+ lappend switches $file
+ }
+ } elseif {[file isdir $file]} {
+ if {$files != ""} {suite $files $switches; set files ""}
+ suite [get_suite $file $__sort] $switches
+ } elseif {[regexp {(.*),(.*)$} $file all suite from] && [file isdir $suite]} {
+ if {$files != ""} {suite $files $switches; set files ""}
+ set sfiles [get_suite $suite $__sort]
+ set first [lsearch $sfiles $suite/$from]
+ if {$first < 0} {
+ puts "No such file: $suite/$from"
+ } else {
+ suite [lreplace $sfiles 0 [expr $first - 1]] $switches
+ }
+ } else {
+ lappend files $file
+ }
+}
+if {$files != ""} {suite $files $switches; set files ""}
diff --git a/tools/tiger.px3 b/tools/tiger.px3
new file mode 100644
index 000000000..7fd08b221
--- /dev/null
+++ b/tools/tiger.px3
Binary files differ
diff --git a/tools/tiger.xps b/tools/tiger.xps
new file mode 100644
index 000000000..bcb2176ad
--- /dev/null
+++ b/tools/tiger.xps
Binary files differ
diff --git a/tools/tt2pcl.c b/tools/tt2pcl.c
new file mode 100644
index 000000000..56583ddfc
--- /dev/null
+++ b/tools/tt2pcl.c
@@ -0,0 +1,629 @@
+/* Convert a TrueType font to a downloadable pcl soft font. */
+#include <stdio.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <stdlib.h>
+
+unsigned long stdout_offset = 0;
+
+#define get_uint16(bptr)\
+ (((bptr)[0] << 8) | (bptr)[1])
+#define get_int16(bptr)\
+ (((int)get_uint16(bptr) ^ 0x8000) - 0x8000)
+
+int
+pl_get_int16(const unsigned char *bptr)
+{ return get_int16(bptr);
+}
+
+unsigned int
+pl_get_uint16(const unsigned char *bptr)
+{ return get_uint16(bptr);
+}
+
+long
+pl_get_int32(const unsigned char *bptr)
+{ return ((long)get_int16(bptr) << 16) | get_uint16(bptr + 2);
+}
+
+unsigned long
+pl_get_uint32(const unsigned char *bptr)
+{ return ((unsigned long)get_uint16(bptr) << 16) | get_uint16(bptr + 2);
+}
+
+typedef struct pcl_font_header_s {
+ unsigned short FontDescriptorSize;
+ unsigned char HeaderFormat;
+ unsigned char FontType;
+ unsigned char StyleMSB;
+ unsigned char Reserved; /* must be 0 */
+ unsigned short BaselinePosition;
+ unsigned short CellWidth;
+ unsigned short CellHeight;
+ unsigned char Orientation;
+ unsigned char Spacing;
+ unsigned short SymbolSet;
+ unsigned short Pitch;
+ unsigned short Height;
+ unsigned short xHeight;
+ unsigned char WidthType;
+ unsigned char StyleLSB;
+ unsigned char StrokeWeight;
+ unsigned char TypefaceLSB;
+ unsigned char TypefaceMSB;
+ unsigned char SerifStyle;
+ unsigned char Quality;
+ unsigned char Placement;
+ unsigned char UnderlinePosition;
+ unsigned char UnderlineThickness;
+ unsigned short TextHeight;
+ unsigned short TextWidth;
+ unsigned short FirstCode;
+ unsigned short LastCode;
+ unsigned char PitchExtended;
+ unsigned char HeightExtended;
+ unsigned short CapHeight;
+ unsigned long FontNumber;
+ char FontName[16];
+ unsigned short ScaleFactor;
+ unsigned short Master_Underline_Position;
+ unsigned short Master_Underline_Thickness;
+ unsigned char Font_Scaling_Technology;
+ unsigned char Variety;
+} pcl_font_header_t;
+
+typedef struct pcl_segment_s {
+ unsigned short id;
+ unsigned short size;
+} pcl_segment_t;
+
+#define SYMSET_NUM 1023
+#define SYMSET_LETTER 'Z'
+
+#define NUM_TABLES 8
+/* alphabetical */
+const char *tables[NUM_TABLES] = {
+ "cvt ",
+ "fpgm",
+ "gdir",
+ "head",
+ "hhea",
+ "hmtx",
+ "maxp",
+ "prep"
+};
+
+
+typedef struct table_directory_s {
+ unsigned long sfnt_version; /* should be fixed 16.16 */
+ unsigned short num_tables;
+ unsigned short searchRange;
+ unsigned short entrySelector;
+ unsigned short rangeShift;
+} table_directory_t;
+
+typedef struct table_s {
+ unsigned long tag;
+ unsigned long checkSum;
+ unsigned long offset;
+ unsigned long length;
+} table_t;
+
+static void
+write_pcl_header()
+{
+ pcl_font_header_t hdr;
+ /* init header */
+ memset(&hdr, 0, sizeof(hdr));
+ /* truetype */
+ hdr.HeaderFormat = 15;
+ /* unicode */
+ //hdr.FontType = 11;
+ hdr.FontType = 2;
+ hdr.Spacing = 1;
+ hdr.TypefaceLSB = 100; /* don't know */
+ // hdr.SymbolSet = htons((SYMSET_NUM * 32) + (SYMSET_LETTER - 64));
+ hdr.FontDescriptorSize = htons(sizeof(pcl_font_header_t));
+ hdr.Font_Scaling_Technology = 1;
+ hdr.Pitch = htons(500); /* arbitrary */
+ hdr.CellHeight = htons(2048); /* don't know */
+ hdr.CellWidth = htons(2048); /* don't know */
+ hdr.FirstCode = htons(0);
+ hdr.LastCode = htons(255);
+ hdr.FontName[0] = 'f';
+ stdout_offset += fwrite(&hdr, 1, sizeof(pcl_font_header_t), stdout);
+}
+
+static int
+log2(int n)
+{
+ int lg = 0;
+
+ while (n != 1) {
+ n /= 2;
+ lg += 1;
+ }
+ return lg;
+}
+
+static void
+write_table_directory()
+{
+ table_directory_t td;
+ if ( NUM_TABLES & -NUM_TABLES != NUM_TABLES ) {
+ fprintf( stderr, "number of tables must be a power of 2");
+ exit(EXIT_FAILURE);
+ }
+ fprintf(stderr, "Table Directory started at %d\n", stdout_offset);
+ td.sfnt_version = htonl(0x00010000);
+ td.num_tables = htons(NUM_TABLES);
+ td.searchRange = htons(NUM_TABLES * 16);
+ td.entrySelector = htons(log2(NUM_TABLES));
+ td.rangeShift = htons(0); /* since power of 2 */
+
+ stdout_offset += fwrite(&td, 1, sizeof(table_directory_t), stdout);
+}
+
+static int
+get_tt_buffer(char *filename, unsigned char **pptt_font_data, unsigned long *size)
+{
+
+ unsigned long len;
+ FILE *fp;
+
+ fp = fopen(filename, "r");
+ if ( fp == NULL ) {
+ fprintf(stderr, "file %s not found\n", filename);
+ return -1;
+ }
+ fseek(fp, 0L, SEEK_END);
+ len = ftell(fp);
+ rewind(fp);
+ *size = len;
+ *pptt_font_data = (unsigned char *)malloc(*size);
+ if ( *pptt_font_data == 0 ) {
+ fprintf(stderr, "failed to allocate memory to buffer file %s\n", filename);
+ fclose(fp);
+ return -1;
+ }
+ fread(*pptt_font_data, 1, len, fp);
+ return 0;
+}
+
+/* offset of table "table_name" */
+static unsigned long
+find_table(const unsigned char *ptt_data, const char *table_name, unsigned long *table_size)
+{
+ unsigned int num_tables;
+ const unsigned char *ptt_table_directory;
+ int i;
+ num_tables = pl_get_uint16(ptt_data + 4);
+ ptt_table_directory = ptt_data + 12;
+ // fprintf(stderr, "number of tables %d ", num_tables);
+ for ( i = 0; i < num_tables; i++ ) {
+ const unsigned char *tab = ptt_table_directory + i * 16;
+ // fprintf(stderr, "found table %c%c%c%c table size=%d\n", tab[0], tab[1], tab[2], tab[3], pl_get_uint32(tab + 12));
+ if ( !memcmp(table_name, tab, 4) ) {
+ *table_size = pl_get_uint32(tab + 12);
+ return pl_get_uint32(tab + 8);
+ }
+ }
+ *table_size = 0;
+ return 0;
+}
+
+
+static int
+write_table_entrys(unsigned char *ptt_data)
+{
+ unsigned long current_offset = sizeof(table_directory_t) +
+ sizeof(table_t) * NUM_TABLES;
+ int i;
+ for ( i = 0; i < NUM_TABLES; i++ ) {
+ table_t t;
+ unsigned long length;
+ unsigned long offset;
+ unsigned long *ptable = (unsigned long *)tables[i];
+ t.tag = *ptable;
+ t.offset = htonl(current_offset);
+ offset = find_table(ptt_data, tables[i], &length);
+ if (offset < 0) {
+ fprintf(stderr, "table %s not found\n", tables[i]);
+ exit(EXIT_FAILURE);
+ }
+ t.length = htonl(length);
+ {
+ unsigned long sum = 0;
+ int k;
+ for ( k = 0; k < length; k++ )
+ sum += ptt_data[k + offset];
+ t.checkSum = sum;
+ }
+ fprintf(stderr, "writing table entry %c%c%c%c at %d\n",
+ tables[i][0], tables[i][1], tables[i][2], tables[i][3], stdout_offset);
+ fprintf(stderr, "the table should end up at offset %d with length %d \n", current_offset, length);
+ current_offset += length;
+ stdout_offset += fwrite(&t, 1, sizeof(t), stdout);
+ }
+}
+
+void
+write_tables(unsigned char *ptt_data)
+{
+ int i;
+ unsigned long offset;
+ for ( i = 0; i < NUM_TABLES; i++ ) {
+ unsigned long length;
+
+ offset = find_table(ptt_data, tables[i], &length);
+ if (offset < 0) {
+ fprintf(stderr, "table %s not found\n", tables[i]);
+ exit(EXIT_FAILURE);
+ }
+ fprintf(stderr, "writing table %c%c%c%c at %d\n",
+ tables[i][0], tables[i][1], tables[i][2], tables[i][3], stdout_offset);
+ stdout_offset += fwrite(ptt_data+offset, 1, length, stdout);
+ }
+}
+
+static unsigned long
+total_segments_size(unsigned char *ptt_data)
+{
+ int i;
+ unsigned long offset;
+ unsigned long total = 0;
+ for ( i = 0; i < NUM_TABLES; i++ ) {
+ unsigned long this_table;
+ offset = find_table(ptt_data, tables[i], &this_table);
+ if ( offset < 0 ) {
+ fprintf(stderr, "table %s not found\n", tables[i]);
+ exit(EXIT_FAILURE);
+ }
+ total += this_table;
+ }
+ return total;
+}
+
+static void
+write_GT_segment(unsigned char *ptt_data)
+{
+
+ pcl_segment_t GT_seg;
+ GT_seg.id = htons(18260); /* GT */
+ GT_seg.size = htons(sizeof(table_directory_t) +
+ sizeof(table_t) * NUM_TABLES +
+ total_segments_size(ptt_data));
+ fprintf(stderr, "GT seg started at %d size = %d\n", stdout_offset, sizeof(table_directory_t) +
+ sizeof(table_t) * NUM_TABLES + total_segments_size(ptt_data));
+ stdout_offset += fwrite(&GT_seg, 1, sizeof(pcl_segment_t), stdout);
+ write_table_directory();
+ write_table_entrys(ptt_data);
+ write_tables(ptt_data);
+
+}
+
+static void
+write_NULL_segment()
+{
+ pcl_segment_t NULL_seg;
+ NULL_seg.id = htons(0xffff);
+ NULL_seg.size = htons(0);
+ fprintf( stderr, "NULL segment started at %d\n", stdout_offset);
+ stdout_offset += fwrite(&NULL_seg, 1, sizeof(pcl_segment_t), stdout);
+}
+
+
+static void
+set_id(char *fontname)
+{
+ stdout_offset += fprintf(stdout, "\033*c1D");
+ /* nb alphanumeric is broken in pcl */
+ // fprintf(stdout, "\033&n%dW%c%s", strlen(fontname) + 1, 0 /* operation */, fontname);
+}
+
+typedef struct pcl_symbol_set_s {
+ unsigned short HeaderSize;
+ unsigned short EncodedSymbolSetDesignator;
+ unsigned char Format;
+ unsigned char SymbolSetType;
+ unsigned short FirstCode;
+ unsigned short LastCode;
+ unsigned char CharacterRequirements[8];
+} pcl_symbol_set_t;
+
+static void
+write_mac_glyph_pcl_symbol_set(unsigned char *glyph_table)
+{
+ int i;
+ pcl_symbol_set_t sym_hdr;
+ short symbol_set = (SYMSET_NUM * 32) + (SYMSET_LETTER - 64);
+ sym_hdr.HeaderSize = htons(18);
+ sym_hdr.EncodedSymbolSetDesignator = htons(symbol_set);
+ sym_hdr.Format = 3; /* unicode */
+ sym_hdr.SymbolSetType = 2; /* 0 - 255 are printable */
+ sym_hdr.FirstCode = htons(0);
+ sym_hdr.LastCode = htons(255);
+ memset(sym_hdr.CharacterRequirements, 0, sizeof(sym_hdr.CharacterRequirements));
+ sym_hdr.CharacterRequirements[7] = 1;
+ stdout_offset += fprintf(stdout, "\033*c%dR", symbol_set);
+ stdout_offset += fprintf(stdout, "\033(f%dW", sizeof(sym_hdr) + 256 * 2);
+ stdout_offset += fwrite(&sym_hdr, 1, sizeof(sym_hdr), stdout);
+ for (i = 0; i < 256; i++ ) {
+ unsigned short glyph = glyph_table[i];
+
+ // NB identity.
+ unsigned short pcl_glyph = glyph == 0 ? htons(0xffff) : htons(i);
+ // unsigned short pcl_glyph = glyph == 0 ? htons(0xffff) : htons(glyph);
+
+ stdout_offset += fwrite(&pcl_glyph, 1, sizeof(pcl_glyph), stdout);
+ }
+}
+
+static unsigned char *
+get_mac_glyph_index(unsigned char *ptt_data)
+{
+ unsigned long length, cmap_offset;
+ unsigned short table_version;
+ unsigned short n, i;
+ cmap_offset = find_table(ptt_data, "cmap", &length);
+ if ( cmap_offset <= 0 ) {
+ fprintf(stderr, "could not find cmap\n");
+ exit(EXIT_FAILURE);
+ }
+
+ table_version = pl_get_uint16(ptt_data + cmap_offset);
+ n = pl_get_uint16(ptt_data + cmap_offset + 2);
+ for ( i = 0; i < n; i++ ) {
+ unsigned char *enc_tab =
+ ptt_data + cmap_offset + 4 + i * 8;
+ unsigned short platform_id, platform_enconding;
+ unsigned long offset_subtable;
+ platform_id = pl_get_uint16(enc_tab);
+ platform_enconding = pl_get_uint16(enc_tab + 2);
+ offset_subtable = pl_get_uint32(enc_tab + 4);
+ fprintf(stderr, "found cmap platform id=%d, platform encoding=%d\n",
+ platform_id, platform_enconding);
+ {
+ unsigned char *subtable = ptt_data + cmap_offset + offset_subtable;
+ unsigned short format, length, version;
+ format = pl_get_uint16(subtable);
+ length = pl_get_uint16(subtable + 2);
+ version = pl_get_uint16(subtable + 4);
+ if ( (platform_id == 3) && (platform_enconding == 1) && (format == 4) )
+ return subtable;
+ }
+ }
+ return 0;
+}
+
+void
+write_symbol_set(unsigned char *ptt_data)
+{
+ // unsigned char *table;
+ // if ( (table = get_mac_glyph_index(ptt_data)) == 0 ) {
+ // fprintf(stderr, "mac table not found\n");
+ // exit(EXIT_FAILURE);
+ // }
+ // write_mac_glyph_pcl_symbol_set(table);
+}
+
+typedef struct character_descriptor_s {
+ unsigned char format;
+ unsigned char continuation;
+ unsigned char descriptor_size;
+ unsigned char class;
+ unsigned char addititonal_data[2];
+ unsigned short character_data_size;
+ unsigned short glyph_id;
+} character_descriptor_t;
+
+static unsigned char *
+find_glyph_data(const glyph_index, const unsigned char *ptt_data, unsigned long *glyph_length)
+{
+ unsigned long length;
+ unsigned long offset;
+ unsigned char indexToLocFormat;
+ const unsigned char *loca_table, *glyf_table;
+ offset = find_table(ptt_data, "head", &length);
+ if ( offset <= 0 ) {
+ fprintf(stderr, "could not find head table\n");
+ exit(EXIT_FAILURE);
+ }
+ indexToLocFormat = pl_get_uint16(ptt_data + offset + 50);
+ fprintf(stderr, "glyph index %d uses %s\n", glyph_index, indexToLocFormat == 0 ? "short format" : "long format");
+ offset = find_table(ptt_data, "loca", &length);
+ if ( offset <= 0 ) {
+ fprintf(stderr, "could not find loca table\n");
+ exit(EXIT_FAILURE);
+ }
+ loca_table = ptt_data + offset;
+ offset = find_table(ptt_data, "glyf", &length);
+ if ( offset <= 0 ) {
+ fprintf(stderr, "could not find glyf table\n");
+ exit(EXIT_FAILURE);
+ }
+ glyf_table = ptt_data + offset;
+ if ( indexToLocFormat == 0 ) {
+ unsigned char *pthis_glyph = loca_table + glyph_index * 2;
+ unsigned char *pnext_glyph = pthis_glyph + 2;
+ *glyph_length = pl_get_uint16(pnext_glyph) * 2 - pl_get_uint16(pthis_glyph) * 2;
+ return glyf_table + pl_get_uint16(pthis_glyph) * 2;
+ } else {
+ unsigned char *pthis_glyph = loca_table + glyph_index * 4;
+ unsigned char *pnext_glyph = pthis_glyph + 4;
+ *glyph_length = pl_get_uint32(pnext_glyph) - pl_get_uint32(pthis_glyph);
+ return glyf_table + pl_get_uint32(pthis_glyph);
+ }
+}
+
+void
+write_CC_segment()
+{
+ pcl_segment_t CC_seg;
+ unsigned char CharacterComplement[8];
+ memset(CharacterComplement, 0, 8);
+ CharacterComplement[7] = 0xfe;
+ CC_seg.id = htons(17219);
+ CC_seg.size = htons(8);
+ stdout_offset += fwrite(&CC_seg, 1, sizeof(pcl_segment_t), stdout);
+ stdout_offset += fwrite(&CharacterComplement, 1, 8, stdout);
+}
+
+
+static void
+write_character_descriptor(unsigned char *ptt_data)
+{
+ unsigned char *table;
+ character_descriptor_t tt_char_des;
+ unsigned short segment_count, seg;
+ unsigned char *start_charp;
+ unsigned char *end_charp;
+ unsigned char *id_deltap;
+ unsigned char *id_rangeoffsetp;
+ unsigned char *glyph_id_arrayp;
+ if ( (table = get_mac_glyph_index(ptt_data)) == 0 ) {
+ fprintf(stderr, "mac table not found\n");
+ exit(EXIT_FAILURE);
+ }
+
+ segment_count = pl_get_uint16(table + 6) / 2;
+ fprintf(stderr, "number of segments %d\n", segment_count);
+ end_charp = table + 14;
+ start_charp = end_charp + (segment_count * 2) + 2 /* reservedpad */;
+ id_deltap = start_charp + (segment_count * 2);
+ id_rangeoffsetp = id_deltap + (segment_count * 2);
+ glyph_id_arrayp = id_rangeoffsetp + (segment_count * 2);
+ for (seg = 0; seg < segment_count; seg++) {
+ unsigned short first_char = pl_get_uint16(start_charp + 2 * seg);
+ unsigned short last_char = pl_get_uint16(end_charp + 2 * seg);
+ unsigned short this_char;
+ int i;
+
+ // NB doesn't handle 0xffff terminating a segment with valid
+ // characters in it - don't think this happens in practice.
+ if ( last_char == 0xffff )
+ break;
+ fprintf(stderr, "segment=%d, first char=%d, last char=%d\n", seg, first_char, last_char);
+ for (i = 0, this_char = first_char; this_char <= last_char; i++, this_char++) {
+ unsigned long glyph_length;
+ unsigned char *glyph_data;
+ unsigned short deltad_char = this_char + pl_get_uint16(id_deltap + seg * 2);
+ unsigned short range_offset = pl_get_uint16(id_rangeoffsetp + seg * 2);
+ unsigned short glyph;
+ if ( range_offset == 0 )
+ glyph = deltad_char;
+ else
+ glyph = pl_get_uint16(id_rangeoffsetp + seg * 2 + range_offset + ((this_char - first_char) * 2));
+ fprintf(stderr, "this char=%d, char with delta=%d, range offset=%d glyph index %d\n", this_char, deltad_char, range_offset, glyph);
+ glyph_data = find_glyph_data(glyph, ptt_data, &glyph_length);
+ if (glyph_length == 0)
+ continue;
+ fprintf(stderr, "contours=%d, minx=%d, miny=%d, maxx=%d, maxy=%d\n",
+ pl_get_uint16(glyph_data), (short)pl_get_uint16(glyph_data+2),
+ (short)pl_get_uint16(glyph_data+4), (short)pl_get_uint16(glyph_data+6),
+ (short)pl_get_uint16(glyph_data+8));
+ stdout_offset += fprintf(stdout, "\033*c%dE", this_char);
+ stdout_offset += fprintf(stdout, "\033(s%dW", sizeof(tt_char_des) + glyph_length);
+ tt_char_des.format = 15;
+ tt_char_des.continuation = 0;
+ tt_char_des.descriptor_size = 4;
+ tt_char_des.class = 15;
+ tt_char_des.addititonal_data[0] = 0; tt_char_des.addititonal_data[1] = 0;
+ tt_char_des.character_data_size = tt_char_des.descriptor_size + glyph_length;
+ tt_char_des.glyph_id = htons(glyph);
+ {
+ unsigned long sum = 0;
+ int i;
+ for ( i = 0; i < glyph_length; i++ )
+ sum += glyph_data[i];
+
+ fprintf(stderr, "checksum=%d\n", sum);
+ }
+ stdout_offset += fwrite(&tt_char_des, 1, sizeof(character_descriptor_t), stdout);
+ stdout_offset += fwrite(glyph_data, 1, glyph_length, stdout);
+ }
+ }
+}
+
+void
+write_test(unsigned char *ptt_data, char *fontname)
+{
+ unsigned char *table;
+ character_descriptor_t tt_char_des;
+ unsigned short segment_count, seg;
+ unsigned char *start_charp;
+ unsigned char *end_charp;
+ unsigned char *id_deltap;
+ unsigned char *id_rangeoffsetp;
+ unsigned char *glyph_id_arrayp;
+ int i;
+
+ if ( (table = get_mac_glyph_index(ptt_data)) == 0 ) {
+ fprintf(stderr, "mac table not found\n");
+ exit(EXIT_FAILURE);
+ }
+ stdout_offset += fprintf(stdout, "\033(s1P\033(s14V\033(1X");
+ segment_count = pl_get_uint16(table + 6) / 2;
+ end_charp = table + 14;
+ start_charp = end_charp + (segment_count * 2) + 2 /* reservedpad */;
+ id_deltap = start_charp + (segment_count * 2);
+ id_rangeoffsetp = id_deltap + (segment_count * 2);
+ glyph_id_arrayp = id_rangeoffsetp + (segment_count * 2);
+ i = 0;
+ for (seg = 0; seg < segment_count; seg++) {
+ unsigned short first_char = pl_get_uint16(start_charp + 2 * seg);
+ unsigned short last_char = pl_get_uint16(end_charp + 2 * seg);
+ unsigned short this_char;
+
+
+ // NB doesn't handle 0xffff terminating a segment with valid
+ // characters in it - don't think this happens in practice.
+ if ( last_char == 0xffff )
+ break;
+ for (this_char = first_char; this_char <= last_char; this_char++) {
+ if (this_char & 0xff00) continue;
+ if ( (i % 39 == 0) && (i != 0) )
+ stdout_offset += fprintf(stdout, "\r\n");
+ i++;
+ stdout_offset += fprintf(stdout, "\033&p1X%c", this_char & 0xff);
+ }
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ unsigned char *ptt_data;
+ unsigned long tt_data_size;
+
+ /* NB - no parameter checking */
+ set_id(argv[1]);
+ if ( get_tt_buffer(argv[1], &ptt_data, &tt_data_size) < 0 )
+ return -1;
+ {
+ unsigned long total_bytes =
+ sizeof(pcl_font_header_t) +
+ sizeof(table_directory_t) +
+ sizeof(table_t) * NUM_TABLES +
+ total_segments_size(ptt_data) +
+ 3 * sizeof(pcl_segment_t) + /* GT segment + NULL segment + CC segiment */
+ 8 + /* character complement */
+ 2 /* reserved + checksum */;
+ stdout_offset += fprintf(stdout, "\033)s%dW", total_bytes);
+ }
+ write_pcl_header();
+ write_CC_segment();
+ write_GT_segment(ptt_data);
+ write_NULL_segment();
+ {
+ unsigned char reserved_and_checksum[2];
+ reserved_and_checksum[0] = 0;
+ reserved_and_checksum[1] = 0;
+ stdout_offset += fwrite(&reserved_and_checksum, 1, 2, stdout);
+ }
+
+ write_symbol_set(ptt_data);
+ write_character_descriptor(ptt_data);
+ write_test(ptt_data, argv[1]);
+ return 0;
+}
diff --git a/tools/viewer/Gpickle.java b/tools/viewer/Gpickle.java
new file mode 100644
index 000000000..27513e1bd
--- /dev/null
+++ b/tools/viewer/Gpickle.java
@@ -0,0 +1,426 @@
+/* Portions Copyright (C) 2001 Artifex Software Inc.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.io.*;
+import java.util.*;
+import com.sun.image.codec.jpeg.*;
+
+/** Interface to pcl/pxl interpreter
+ * Uses Process to interpret and pipe the results back.
+ * @author Henry Stiles
+ * @version $Revision: 1749 $
+*/
+
+public class Gpickle {
+ /** debug printf control */
+ private static boolean debug = true;
+
+ /** Render resolution */
+ private double xRes = 75f;
+ private double yRes = 75f;
+
+ /** translate origin */
+ private double xTrans = 0.0;
+ private double yTrans = 0.0;
+
+ /** scalefactor */
+ private double xScale = 1.0;
+ private double yScale = 1.0;
+
+ /** RTL PS command override */
+ private double plotsize1 = 1.0;
+ private double plotsize2 = 1.0;
+
+ /** Tray orientation */
+ private int trayOrientation = 0;
+
+ private String jobList = "startpage.pcl";
+ protected int pageToDisplay = 1;
+ /** This is a local counter */
+ private volatile int myTotalPageCount = -1; // defaults to error
+
+ /** We always use jpeg for output because java has good internal support for jpeg.
+ */
+ private String deviceName = "jpeg";
+
+ /** height of the generated image
+ */
+ private int height;
+ /** width of the generated image
+ */
+ private int width;
+
+ private boolean bRtl = false;
+ private final static String cRTLstr = "-PRTL";
+
+ /** set -PRTL mode we do not force other modes to allow language switching
+ * it maybe desireable to select mono/color
+ */
+ public void setRTL( boolean on ) {
+ bRtl = on;
+ }
+ public boolean getRTL() {
+ return( bRtl );
+ }
+
+ private boolean bTextAlpha = true;
+ private String textAlphaOptStr = "-dTextAlphaBits=2";
+ public boolean getTextAlpha() {
+ return bTextAlpha;
+ }
+ public void setTextAlpha( boolean textAlpha ) {
+ bTextAlpha = textAlpha;
+ }
+
+ /** GhostPrinter application path */
+ private String ghostAppStr;
+
+
+ /** langSwitch add postscript using pspcl6 */
+ private int langSwitch = 0;
+
+ /** look for relative path to executable first
+ */
+ private String[] ghostAppPathStr = {
+ "../../main/obj/pcl6",
+ "../../language_switch/obj/pspcl6",
+ "pcl6",
+ "pspcl6"
+ };
+
+ /** look for executable in path next */
+
+ /** find the GhostPrinter application
+ * first relative path
+ * then local directory
+ * default adds .exe for windows executables in search path
+ */
+ public void setGhostApp() {
+ ghostAppStr = ghostAppPathStr[0 + langSwitch];
+ File testIt = new File(ghostAppStr);
+ if (!testIt.exists()) {
+ ghostAppStr = ghostAppPathStr[0 + langSwitch] + ".exe";
+ testIt = new File(ghostAppStr);
+ if (!testIt.exists()) {
+ // looking for current directory application.
+ ghostAppStr = ghostAppPathStr[2 + langSwitch];
+ testIt = new File(ghostAppStr);
+ if (!testIt.exists()) {
+ ghostAppStr = ghostAppPathStr[2 + langSwitch] + ".exe";
+ // defaults to pcl6.exe, windows requires extension foo
+ // NB really should do a platform test on extension adding.
+ }
+ }
+ }
+ }
+
+ /**
+ * "command line" used to run interpreter.
+ * NB Client should be able to modify settings.
+ */
+ private String[] runString( int page )
+ {
+ int i = 0;
+ int numCommands = 15;
+ if ( bTextAlpha )
+ ++numCommands;
+ if (bRtl)
+ numCommands += 5;
+ String[] commandArr = new String[numCommands];
+ commandArr[i++] = ghostAppStr;
+ if ( bTextAlpha ) {
+ commandArr[i++] = textAlphaOptStr;
+ }
+ commandArr[i++] = "-dViewTransX= "+ Double.toString(xTrans);
+ commandArr[i++] = "-dViewTransY= "+ Double.toString(yTrans);
+ commandArr[i++] = "-dViewScaleX= "+ Double.toString(xScale);
+ commandArr[i++] = "-dViewScaleY= "+ Double.toString(yScale);
+ commandArr[i++] = "-dFirstPage=" + Integer.toString(page);
+ commandArr[i++] = "-dLastPage=" + Integer.toString(page);
+ commandArr[i++] = "-r" + Double.toString(xRes) + "x" + Double.toString(yRes);
+ commandArr[i++] = "-sDEVICE=" + deviceName;
+ commandArr[i++] = "-dNOPAUSE";
+ commandArr[i++] = "-J@PJL SET USECIECOLOR=ON";
+ commandArr[i++] = "-J@PJL SET VIEWER=ON";
+ commandArr[i++] = "-dTrayOrientation=" + Integer.toString(trayOrientation);
+ if (bRtl) {
+ commandArr[i++] = cRTLstr;
+ commandArr[i++] = "-J@PJL SET PLOTSIZEOVERRIDE=OFF";
+ commandArr[i++] = "-J@PJL SET PLOTSIZE1"+ Double.toString(plotsize1);
+ commandArr[i++] = "-J@PJL SET PLOTSIZE2"+ Double.toString(plotsize2);
+ commandArr[i++] = "-J@PJL SET PLOTSIZEROTATE=OFF";
+ }
+ commandArr[i++] = "-sOutputFile=-";
+ commandArr[i++] = jobList;
+ if (debug) {
+ for (int j = 0; j < commandArr.length; j++)
+ System.out.println( commandArr[j] );
+ }
+ return commandArr;
+ }
+
+ /**
+ * "command line" to get the page count quickly
+ */
+ private String pageCountString()
+ {
+ return ghostAppStr
+ + " -C -r10 -dNOPAUSE -sDEVICE=nullpage "
+ + jobList;
+ }
+
+ /**
+ * run the pcl interpreter to get a total page count for the job.
+ * Returns -1 if there is an error.
+ */
+ public int getPrinterPageCount()
+ {
+ Process p;
+
+ myTotalPageCount = -1;
+ if ( debug ) System.out.println("Kill PageCount" + myTotalPageCount );
+ try {
+ if ( debug ) System.out.println("pagecountstring=" + pageCountString());
+ p = Runtime.getRuntime().exec(pageCountString());
+ String line;
+ BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
+ while ((line = br.readLine()) != null)
+ if ( line.startsWith("%%%") ) {
+ // place after cursor after ':'
+ int index = line.indexOf(':') + 1;
+ // convert to integer
+ myTotalPageCount = Integer.parseInt((line.substring(index)).trim());
+ if (debug) System.out.println(myTotalPageCount);
+ // NB error checking ??
+ }
+ } catch (Exception e) {
+ System.out.println(e);
+ }
+ if ( debug ) System.out.println("Set PageCount" + myTotalPageCount );
+ return myTotalPageCount;
+ }
+
+
+ /** translation and scale options */
+ public void setTranslateScaleOptions( double tx, double ty, double sx, double sy ) {
+ xTrans = tx;
+ yTrans = ty;
+ xScale = sx;
+ yScale = sy;
+ }
+
+ /** size of page cache */
+ private final static int maxCached = 10;
+
+ /** cache of page images, circular queue. */
+ private BufferedImage[] pageCache;
+
+ /** hash of the options send to generate the page should be unique enough */
+ private int[] pageCacheHashCodes;
+
+ /** page number */
+ private int[] pageCacheNumber;
+
+ /** Next cache location to store into, circular queue. */
+ private int nextCache = 0;
+
+ /**
+ * run the pcl interpreter with the current settings and return a
+ * buffered image for the page. Sets height and width as a side
+ * effect.
+ */
+ public BufferedImage getPrinterOutputPage( int page ) {
+ int hit = -1;
+ int i;
+
+ for (i = 0; i < maxCached; i++ ) {
+ // search cache
+ if ( pageCacheNumber[i] == page ) {
+ hit = i;
+ }
+ }
+ // hash all strings together; only called from here.
+ int hashCode = 0;
+ String[] cmdStr = runString( page );
+ for (i = 0; i<cmdStr.length; i++)
+ hashCode += cmdStr[i].hashCode();
+
+ BufferedImage bi = null;
+ if ( hit >= 0 ) {
+ bi = pageCache[hit];
+ if ( bi != null && hashCode == pageCacheHashCodes[hit]) {
+ // return cache hit
+ if (debug) System.out.println("used cached page :" + page + " at "+ hit);
+ return bi;
+ }
+ // else right page but wrong file,resolution...
+ }
+
+ bi = getPrinterOutputPageNoCache( page );
+ if ( bi == null )
+ return null;
+
+ // store in cache
+ pageCache[nextCache] = bi;
+ pageCacheNumber[nextCache] = page;
+ pageCacheHashCodes[nextCache] = hashCode;
+ if (debug) System.out.println("cached page :" + page + " at "+ nextCache);
+ nextCache = (++nextCache) % maxCached;
+
+ return bi;
+ }
+
+ /**
+ * run the pcl interpreter with the current settings and return a
+ * buffered image for the page. Sets height and width as a side
+ * effect.
+ */
+
+ public BufferedImage getPrinterOutputPageNoCache( int page )
+ {
+ int ch;
+ int i = 0;
+ Process p = null;
+
+ try {
+ p = Runtime.getRuntime().exec(runString( page ));
+ // read process output and return a buffered image.
+ JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(p.getInputStream());
+ BufferedImage bim = decoder.decodeAsBufferedImage();
+ this.height = bim.getHeight();
+ this.width = bim.getWidth();
+ return bim;
+ } catch (Exception e) {
+ // exception but we have a real process - read for errors
+ if ( p != null ) {
+ BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
+ String line;
+ try {
+ while ((line = br.readLine()) != null)
+ System.out.println(line);
+ } catch (IOException ie) {
+ System.out.println(e);
+ }
+ } else {
+ System.out.println(e);
+ }
+ return null;
+ }
+ }
+
+ /** A list of file names that comprise a job.
+ * NB should be an array of String.
+ */
+ public void setJob(String jobList) {
+ if (debug) {
+ System.out.println( "Set Job" );
+ System.out.println( pageCache );
+ }
+ this.jobList = jobList;
+ }
+
+ public String getJob() {
+ return jobList;
+ }
+
+ /** NB needs error handling.
+ * set x and y resolution.
+ * @param Positive between 5 and 5000
+ */
+ public void setRes(double xRes, double yRes)
+ {
+ this.xRes = xRes;
+ this.yRes = yRes;
+ }
+
+ public double getResX() {
+ return xRes;
+ }
+ public double getResY() {
+ return yRes;
+ }
+
+ /**
+ * Page number to display.
+ * Previous pages are "skipped".
+ */
+ public void setPageNumber(int page)
+ {
+ this.pageToDisplay = page;
+ }
+ public int getPageNumber()
+ {
+ return pageToDisplay;
+ }
+
+ /** Accessor for image height.
+ */
+ public int getImgHeight()
+ {
+ return height;
+ }
+ /** Accessor for image width.
+ */
+ public int getImgWidth()
+ {
+ return width;
+ }
+ /** Accessor of TrayOrientation */
+ public int getTrayOrientation()
+ {
+ return trayOrientation;
+ }
+ public void setTrayOrientation(int angle)
+ {
+ if ( angle == 0 ||
+ angle == 90 ||
+ angle == 180 ||
+ angle == 270 )
+ trayOrientation = angle;
+ }
+ public boolean getLangSwitch()
+ {
+ return( langSwitch == 1 );
+ }
+ public void setLangSwitch(boolean useLangSwitch)
+ {
+ if (useLangSwitch)
+ langSwitch = 1;
+ else
+ langSwitch = 0;
+ }
+
+ public Gpickle()
+ {
+ pageCache = new BufferedImage[maxCached];
+ pageCacheHashCodes = new int [maxCached];
+ pageCacheNumber = new int [maxCached];
+ setGhostApp();
+ }
+
+ /** main for test purposes */
+ public static void main( String[] args ) {
+ debug = true;
+ Gpickle pcl = new Gpickle();
+ pcl.setRes(72, 72);
+ pcl.setJob("120pg.bin");
+ System.out.println(pcl.getPrinterPageCount());
+ System.out.println(pcl.getPrinterOutputPage( 5 ));
+ System.out.println("Width = " + pcl.getImgWidth());
+ System.out.println("Height = " + pcl.getImgWidth());
+ Gpickle pxl = new Gpickle();
+ pxl.setJob("frs96.pxl");
+ System.out.println(pcl.getPrinterPageCount());
+ System.out.println(pxl.getPrinterOutputPage( 5 ));
+ System.out.println("Width = " + pxl.getImgWidth());
+ System.out.println("Height = " + pxl.getImgWidth());
+
+ }
+}
diff --git a/tools/viewer/GpickleObserver.java b/tools/viewer/GpickleObserver.java
new file mode 100644
index 000000000..281b12eda
--- /dev/null
+++ b/tools/viewer/GpickleObserver.java
@@ -0,0 +1,14 @@
+
+import java.awt.image.*;
+
+/** Similar to ImageObserver but for BufferedImage
+ * @author Stefan Kemper
+ * @version $Revision: 1563 $
+ */
+public interface GpickleObserver {
+ /** newImage contains the completed image */
+ void imageIsReady( BufferedImage newImage );
+
+ /** pageCount contains the number of pages in the document */
+ void pageCountIsReady( int pageCount );
+}
diff --git a/tools/viewer/GpickleThread.java b/tools/viewer/GpickleThread.java
new file mode 100644
index 000000000..65036c8aa
--- /dev/null
+++ b/tools/viewer/GpickleThread.java
@@ -0,0 +1,227 @@
+/* Portions Copyright (C) 2001 Artifex Software Inc.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+import java.awt.image.*;
+
+
+/** Thread calls Gpickle asking for a page
+ * this tread will send the BufferedImage to
+ * the registered PickleObserver
+ *
+ * startCountingPages() uses the same thread to count the number of pages in a job
+ * since it maybe desirable to count while viewing a second GpickeTread is
+ * needed. One generates pages, the other counts the total number of pages.
+ *
+ * @author Stefan Kemper
+ * @version $Revision: 1645 $
+ */
+public class GpickleThread extends Gpickle implements Runnable {
+
+ /** debug printf control */
+ private final static boolean debug = false;
+ private final static boolean debugPerformance = debug && true;
+ private final static boolean debugSpew = debug && false;
+
+ private long gotItTime = 0;
+
+ /** call back for generated page */
+ private GpickleObserver observer;
+
+ /** they depreciated suspend and resume for Thread,
+ * could have used runnable but why not invent the wheel
+ */
+ private volatile boolean goFlag = false;
+
+ /** if not zero this is the last page requested while
+ * we were busy, fetch it when we are not busy.
+ */
+ private volatile int nextPage = 0;
+
+ /** the page we are fetching now
+ */
+ private volatile int currentPage = 0;
+
+ /** NB since the pagecount thread is a different object than
+ * the page generator the caller must set this in both objects.
+ */
+ private volatile int totalPageCount = 0;
+
+ /** Enable/disable lookahead fetches.
+ * NB would be nice to look back when user is paging backwards.
+ */
+ private volatile boolean lookAhead = true;
+ private final static boolean lookAheadFeatureEnabled = true;
+
+ /** true if getting page count, false if getting a page */
+ private volatile boolean getPageCount = false;
+
+ private Thread myThread;
+
+ /** Since I don't construct pickles caller needs to manage the one pickle per thread
+ * relationship.
+ * PickleObserver.ImageIsReady() will be called with the generated images.
+ */
+ GpickleThread( GpickleObserver callme )
+ {
+ observer = callme;
+
+ myThread = new Thread( this );
+ myThread.start();
+ }
+
+ /** Threads must run, this one runs the process in Gpickle
+ * sends generated page to observer.
+ * one page per request
+ */
+ public void run()
+ {
+ try {
+ while (true)
+ {
+ synchronized(this) {
+ while(!goFlag) {
+ wait(); // block, wait for resume
+ }
+ }
+
+ if (getPageCount) {
+ // generate count of pages in document and return it to the observer
+
+ if (debugSpew) System.out.println("Start Counting pages");
+ observer.pageCountIsReady( getPrinterPageCount() );
+ if (debugSpew) System.out.println("Finished Counting pages");
+ synchronized(this) {
+ getPageCount = false;
+ goFlag = false;
+ }
+ continue; // wait for next call, avoiding lookahead logic below.
+ }
+ else {
+ // generate page and return it to the observer
+ observer.imageIsReady( getPrinterOutputPage( currentPage ) );
+ }
+ if (debugPerformance) {
+ gotItTime = System.currentTimeMillis() - gotItTime;
+ System.out.println("Page " + currentPage + " User time: " +
+ gotItTime + " milliseconds" );
+ }
+
+ synchronized(this) {
+ // run once per page request
+ goFlag = false;
+
+ if (nextPage > 0) {
+ // the last page asked for while I was busy
+ // holding the the pageDown key down will get you the next page
+ // and one far into the document (nextPage)
+ if (debugSpew) System.out.println("Getting Next asked for " + nextPage );
+
+ startProduction( nextPage );
+ }
+ else if (lookAhead) {
+ if ( currentPage < totalPageCount) {
+ // look ahead fetches the next page into cache, not displayed;
+ // hopefully completes while the user is viewing the current page
+ if (debugSpew)
+ System.out.println("Fetching ahead " +
+ (currentPage + 1) +
+ " totalpages " +
+ totalPageCount);
+ getPrinterOutputPage(currentPage + 1);
+ }
+ else {
+ // if we don't know how many pages, then the page count is still running
+ // wait until its done to start looking ahead.
+ if (debugSpew)
+ System.out.println("Bad totalPageCount" +
+ (currentPage + 1) +
+ " totalpages " +
+ totalPageCount);
+ }
+ }
+ }
+ }
+ } catch (InterruptedException e) {}
+ }
+
+ /** Let the thread run one loop.
+ * Looks kind of like the depreciated Thread.resume().
+ */
+ private synchronized void resume()
+ {
+ goFlag = true;
+ nextPage = 0;
+ notify();
+ }
+
+ /** startProduction with defaulted lookAhead
+ */
+ public void startProduction( int pageNumber )
+ {
+ startProduction( pageNumber, lookAheadFeatureEnabled );
+ }
+
+ /** if not generating then start generated requested page
+ * if already generating remember last request and return
+ * Set lookAhead flag to prefetch next page into cache.
+ */
+ public void startProduction( int pageNumber, boolean _lookAhead )
+ {
+ if (debugSpew) System.out.println("Request =" + pageNumber +
+ " lookAhead " + _lookAhead );
+
+ if (goFlag) { // one at a time please
+ nextPage = pageNumber;
+ return;
+ }
+ currentPage = pageNumber;
+
+ if (debugPerformance) {
+ gotItTime = System.currentTimeMillis();
+ }
+
+ // look ahead flag
+ lookAhead = _lookAhead && lookAheadFeatureEnabled;
+
+ resume(); // kickStartTread
+ }
+
+ /** if not generating then start generated requested pageCount
+ */
+ public void startCountingPages( )
+ {
+ if (debugSpew) System.out.println("Request PageCount");
+ if (goFlag) { // one at a time please
+ if (debugSpew) System.out.println("Request PageCount goFlag true");
+ return;
+ }
+ getPageCount = true;
+
+ if (debugSpew) {
+ gotItTime = System.currentTimeMillis();
+ System.out.println("Getting Page Count");
+ }
+
+ resume(); // kickStartTread
+ }
+
+ public boolean busy() {
+ if (nextPage > 0)
+ return true;
+ return false;
+ }
+
+ /** Since muliple threads can view a single document, the caller must
+ * set the number of pages in the document for all threads.
+ * This page count is used to prevent look ahead past the end of document.
+ * It doesn't prevent the caller from doing this.
+ */
+ public void setPageCount( int pageCount ) {
+ totalPageCount = pageCount;
+ }
+}
diff --git a/tools/viewer/Gview.java b/tools/viewer/Gview.java
new file mode 100644
index 000000000..1a055d5cb
--- /dev/null
+++ b/tools/viewer/Gview.java
@@ -0,0 +1,988 @@
+/* Portions Copyright (C) 2001 Artifex Software Inc.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.image.*;
+import java.awt.print.*;
+import java.io.File;
+import javax.swing.filechooser.*;
+/**
+ * Simple Viewer for PCL and PXL files.
+ * Use:
+ * Keyboard:
+ * PageUp and PageDown move between pages of a document.
+ * 'q' quits
+ *
+ * Usage:
+ * java Gview ../frs96.pxl
+ *
+ * @version $Revision: 1749 $
+ * @author Henry Stiles, Stefan Kemper
+ */
+public class Gview
+ extends JFrame
+ implements KeyListener, MouseListener, MouseMotionListener, GpickleObserver, Printable
+{
+
+ /** enables printfs */
+ protected final static boolean debug = false;
+
+ /** starting resolution
+ * 75dpi scales nicely to 300,600,1200
+ * 100dpi gives a bigger starting window.
+ * 50 or even 25 may be needed for a very large plot on a small memory machine.
+ */
+ protected double startingRes = 100;
+
+ /** derived classes like: Nav will be 1/zoomWindowRatio in size
+ * startingRes = 100; zoomWindowRation = 2;
+ * Nav window res is 50.
+ */
+ protected double zoomWindowRatio = 3;
+
+
+ /** enable RTL mode in menu
+ * try with low startingRes = 25
+ */
+ protected boolean enableRTL = false;
+
+ // Non configurable members below
+
+ protected int pageNumber = 1;
+ protected int totalPageCount = 1;
+ protected BufferedImage currentPage;
+ /** fetches images page at a time */
+ protected GpickleThread pickle;
+ /** counts the number of pages in document */
+ protected GpickleThread pageCounter;
+ protected double desiredRes;
+ protected double origRes;
+ protected double origH;
+ protected double origW;
+ protected double origX = 0;
+ protected double origY = 0;
+ protected int tx;
+ protected int ty;
+ protected boolean drag = false;
+
+ /** File open, starts off in users home directory */
+ private JFileChooser chooser = new JFileChooser();
+
+ // lots of menu vars
+ private final static boolean popupMenuAllowed = true;
+ private java.awt.PopupMenu popup;
+ private java.awt.Menu menuFile;
+ private java.awt.MenuItem menuFileOpen;
+ private java.awt.MenuItem menuFilePrintPage;
+ private java.awt.MenuItem menuFileQuit;
+ private java.awt.Menu menuOpt;
+ private java.awt.Menu menuOptRes;
+ private java.awt.MenuItem menuOptResMinus;
+ private java.awt.MenuItem menuOptResPlus;
+ private java.awt.CheckboxMenuItem menuOptTextAntiAlias;
+ private java.awt.CheckboxMenuItem menuOptPSandPCL;
+ private java.awt.CheckboxMenuItem menuOptRTLMode;
+ private java.awt.MenuItem menuDPI;
+ private java.awt.MenuItem menuZoomIn;
+ private java.awt.MenuItem menuZoomOut;
+ private java.awt.Menu menuZoom;
+ private java.awt.MenuItem menuZoom1_8;
+ private java.awt.MenuItem menuZoom1_4;
+ private java.awt.MenuItem menuZoom1_2;
+ private java.awt.MenuItem menuZoom1_1;
+ private java.awt.MenuItem menuZoom2_1;
+ private java.awt.MenuItem menuZoom4_1;
+ private java.awt.MenuItem menuZoom8_1;
+ private java.awt.Menu menuZoomToDPI;
+ private java.awt.MenuItem menuZoom25;
+ private java.awt.MenuItem menuZoom72;
+ private java.awt.MenuItem menuZoom100;
+ private java.awt.MenuItem menuZoom150;
+ private java.awt.MenuItem menuZoom300;
+ private java.awt.MenuItem menuZoom600;
+ private java.awt.MenuItem menuZoom1200;
+ private java.awt.MenuItem menuZoom2400;
+ private java.awt.MenuItem menuPageNum;
+ private java.awt.MenuItem menuPageDwn;
+ private java.awt.MenuItem menuPageUp;
+
+
+ /** constructor */
+ public Gview()
+ {
+ super( "Ghost Pickle Viewer" );
+ pageNumber = 1;
+ pickle = new GpickleThread(this);
+ pageCounter = new GpickleThread(this);
+
+ addKeyListener(this);
+ addMouseListener(this);
+ addMouseMotionListener(this);
+
+ initPopupMenu();
+
+ addWindowListener(new java.awt.event.WindowAdapter() {
+ public void windowClosing(java.awt.event.WindowEvent evt) {
+ exitForm(evt);
+ }
+ }
+ );
+
+ }
+
+ /** initialize popup menu */
+ private void initPopupMenu() {
+
+ popup = new PopupMenu();
+
+ menuFile = new java.awt.Menu();
+ menuFile.setLabel("File");
+ menuFileOpen = new java.awt.MenuItem();
+ menuFileOpen.setLabel("Open");
+ menuFileOpen.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ fileOpen();
+ }
+ }
+ );
+ menuFile.add(menuFileOpen);
+
+ menuFilePrintPage = new java.awt.MenuItem();
+ menuFilePrintPage.setLabel("Print Page (alpha)");
+ menuFilePrintPage.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ filePrintPage();
+ }
+ }
+ );
+ menuFile.add(menuFilePrintPage);
+
+ menuFileQuit = new java.awt.MenuItem();
+ menuFileQuit.setLabel("Quit");
+ menuFileQuit.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ System.exit (0);
+ }
+ }
+ );
+ menuFile.add(menuFileQuit);
+
+ popup.add(menuFile);
+
+ menuOpt = new java.awt.Menu();
+ menuOpt.setLabel("Options");
+
+ menuOptRes = new java.awt.Menu();
+ menuOptRes.setLabel("Res: " + startingRes);
+
+ menuOptResMinus = new java.awt.MenuItem();
+ menuOptResMinus.setLabel("Decrease Resolution");
+ menuOptResMinus.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ if (startingRes > 25)
+ startingRes -= 10;
+ menuOptRes.setLabel("Res: " + startingRes);
+ }
+ }
+ );
+ menuOptRes.add(menuOptResMinus);
+
+ menuOptResPlus = new java.awt.MenuItem();
+ menuOptResPlus.setLabel("Increase Resolution");
+ menuOptResPlus.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ if (startingRes < 300)
+ startingRes += 10;
+ menuOptRes.setLabel("Res: " + startingRes);
+ }
+ }
+ );
+ menuOptRes.add(menuOptResPlus);
+
+ menuOpt.add(menuOptRes);
+
+ menuOptTextAntiAlias = new java.awt.CheckboxMenuItem();
+
+ menuOptTextAntiAlias.setState(pickle.getTextAlpha());
+ menuOptTextAntiAlias.setLabel("TextAntiAlias");
+ menuOptTextAntiAlias.addItemListener(new java.awt.event.ItemListener() {
+ public void itemStateChanged(java.awt.event.ItemEvent evt) {
+ pickle.setTextAlpha( ! pickle.getTextAlpha() );
+ }
+ }
+ );
+ menuOpt.add(menuOptTextAntiAlias);
+
+ menuOptPSandPCL = new java.awt.CheckboxMenuItem();
+
+ menuOptPSandPCL.setState(pickle.getLangSwitch());
+ menuOptPSandPCL.setLabel("Language Switching pspcl6");
+ menuOptPSandPCL.addItemListener(new java.awt.event.ItemListener() {
+ public void itemStateChanged(java.awt.event.ItemEvent evt) {
+ pickle.setLangSwitch( ! pickle.getLangSwitch() );
+ pickle.setGhostApp();
+ }
+ }
+ );
+ menuOpt.add(menuOptPSandPCL);
+
+
+
+
+ if ( enableRTL ) {
+ menuOptRTLMode = new java.awt.CheckboxMenuItem();
+
+ menuOptRTLMode.setState(pickle.getRTL());
+ menuOptRTLMode.setLabel("RTL");
+ menuOptRTLMode.addItemListener(new java.awt.event.ItemListener() {
+ public void itemStateChanged(java.awt.event.ItemEvent evt) {
+ // toggle rtl mode state
+ pickle.setRTL( ! pickle.getRTL() );
+ }
+ }
+ );
+ menuOpt.add(menuOptRTLMode);
+ }
+ popup.add(menuOpt);
+
+ popup.addSeparator();
+
+ menuDPI = new java.awt.MenuItem();
+ menuDPI.setLabel("dpi: " + desiredRes);
+ menuDPI.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ popup.add(menuDPI);
+
+ menuZoomIn = new java.awt.MenuItem();
+ menuZoomIn.setLabel("Zoom In");
+ menuZoomIn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ origX = 0;
+ origY = 0;
+ zoomIn(0,0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ System.out.println("menuZoomIn");
+ }
+ }
+ );
+ popup.add(menuZoomIn);
+
+ menuZoomOut = new java.awt.MenuItem();
+ menuZoomOut.setLabel("Zoom Out");
+ menuZoomOut.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ origX = 0;
+ origY = 0;
+ zoomOut(0,0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ popup.add(menuZoomOut);
+
+ menuZoom = new java.awt.Menu();
+ menuZoom.setLabel("Zoom");
+
+ menuZoom1_8 = new java.awt.MenuItem();
+ menuZoom1_8.setLabel("1:8");
+ menuZoom1_8.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomFactor(1/8.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom1_8);
+
+ menuZoom1_4 = new java.awt.MenuItem();
+ menuZoom1_4.setLabel("1:4");
+ menuZoom1_4.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomFactor(1/4.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom1_4);
+
+ menuZoom1_2 = new java.awt.MenuItem();
+ menuZoom1_2.setLabel("1:2");
+ menuZoom1_2.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomFactor(1/2.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom1_2);
+
+ menuZoom1_1 = new java.awt.MenuItem();
+ menuZoom1_1.setLabel("1:1");
+ menuZoom1_1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(startingRes);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom1_1);
+
+ menuZoom2_1 = new java.awt.MenuItem();
+ menuZoom2_1.setLabel("2:1");
+ menuZoom2_1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomFactor(2.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom2_1);
+
+ menuZoom4_1 = new java.awt.MenuItem();
+ menuZoom4_1.setLabel("4:1");
+ menuZoom4_1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomFactor(4.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom4_1);
+
+ menuZoom8_1 = new java.awt.MenuItem();
+ menuZoom8_1.setLabel("8:1");
+ menuZoom8_1.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomFactor(8.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoom.add(menuZoom8_1);
+
+ popup.add(menuZoom);
+
+ menuZoomToDPI = new java.awt.Menu();
+ menuZoomToDPI.setLabel("Zoom DPI");
+
+ menuZoom25 = new java.awt.MenuItem();
+ menuZoom25.setLabel("25 dpi");
+ menuZoom25.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(25.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom25);
+
+ menuZoom72 = new java.awt.MenuItem();
+ menuZoom72.setLabel("72 dpi");
+ menuZoom72.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(72.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom72);
+
+ menuZoom100 = new java.awt.MenuItem();
+ menuZoom100.setLabel("100 dpi");
+ menuZoom100.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(100.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom100);
+
+ menuZoom150 = new java.awt.MenuItem();
+ menuZoom150.setLabel("150 dpi");
+ menuZoom150.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(150.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom150);
+
+ menuZoom300 = new java.awt.MenuItem();
+ menuZoom300.setLabel("300 dpi");
+ menuZoom300.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(300.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom300);
+
+ menuZoom600 = new java.awt.MenuItem();
+ menuZoom600.setLabel("600 dpi");
+ menuZoom600.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(600.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom600);
+
+ menuZoom1200 = new java.awt.MenuItem();
+ menuZoom1200.setLabel("1200 dpi");
+ menuZoom1200.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(1200.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom1200);
+
+ menuZoom2400 = new java.awt.MenuItem();
+ menuZoom2400.setLabel("2400 dpi");
+ menuZoom2400.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zoomToRes(2400.0);
+ menuDPI.setLabel("dpi: " + desiredRes);
+ }
+ }
+ );
+ menuZoomToDPI.add(menuZoom2400);
+
+ popup.add(menuZoomToDPI);
+
+ popup.addSeparator();
+
+ menuPageNum = new java.awt.MenuItem();
+ menuPageNum.setLabel("page# " + pageNumber + " of " + totalPageCount);
+ menuPageNum.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ menuPageNum.setLabel("page# " + pageNumber + " of " + totalPageCount);
+ }
+ }
+ );
+ popup.add(menuPageNum);
+
+ menuPageDwn = new java.awt.MenuItem();
+ menuPageDwn.setLabel("Prev. Page");
+ menuPageDwn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ prevPage();
+ menuPageNum.setLabel("page# " + pageNumber + " of " + totalPageCount);
+ }
+ }
+ );
+ popup.add(menuPageDwn);
+
+ menuPageUp = new java.awt.MenuItem();
+ menuPageUp.setLabel("Next Page");
+ menuPageUp.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ nextPage();
+ menuPageNum.setLabel("page# " + pageNumber + " of " + totalPageCount);
+ }
+ }
+ );
+ popup.add(menuPageUp);
+
+ add( popup );
+ }
+
+ /** Exit the Application */
+ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
+ System.exit (0);
+ }
+
+ /**
+ * Page Up and Page Down Keys
+ * Increment and Decrement the current page respectively.
+ * Currently does't prevent keys strokes while a page is being generated,
+ * this give poor feedback when a key is pressed repeatedly while a long job runs.
+ */
+ public void keyPressed( KeyEvent e )
+ {
+ int key = e.getKeyCode();
+ // page down NB - increment past last page - BufferedImage
+ // will be null and no repaint operation
+ if ( key == KeyEvent.VK_PAGE_DOWN ) {
+ nextPage();
+ return;
+ }
+ else if ( key == KeyEvent.VK_PAGE_UP ) {
+ prevPage();
+ return;
+ }
+ else if ( key == KeyEvent.VK_Q ) {
+ System.exit(1);
+ }
+ else if ( key == KeyEvent.VK_Z ) {
+ origX = 0;
+ origY = 0;
+ zoomIn(0,0);
+ return;
+ }
+ else if ( key == KeyEvent.VK_X ) {
+ origX = 0;
+ origY = 0;
+ zoomOut(0,0);
+ return;
+ }
+ else if ( key == KeyEvent.VK_R ) {
+ // hack a smaller resolution and zoom ratio for rtl
+ // missing undo.
+ startingRes = 50;
+ zoomWindowRatio = 4;
+ pickle.setRTL(!pickle.getRTL()); // toggle
+ }
+ else if ( key == KeyEvent.VK_T ) {
+ pickle.setTrayOrientation((pickle.getTrayOrientation() + 90 ) % 360);
+ }
+ else if ( key == KeyEvent.VK_O ) {
+ fileOpen();
+ return;
+ }
+ else if ( key == KeyEvent.VK_M ) {
+ popup.show(this, 50, 50);
+ return;
+ }
+ else { // default keystroke behaviour, brings up menu
+ popup.show(this, 50, 50);
+ return;
+ }
+ pickle.startProduction( pageNumber );
+ }
+
+ /** file open dialog
+ */
+ void fileOpen() {
+ int result = chooser.showOpenDialog(null);
+ File file = chooser.getSelectedFile();
+ if (result == JFileChooser.APPROVE_OPTION) {
+ if (debug) System.out.println("file open " + file.getPath());
+ String[] args = new String[1];
+ args[0] = file.getPath();
+ runMain(args);
+ }
+ }
+
+ /** Prints the current page, not the Job
+ */
+ void filePrintPage() {
+ PrinterJob job = PrinterJob.getPrinterJob();
+ PageFormat pf = job.pageDialog(job.defaultPage());
+ job.setPrintable(this, pf);
+ job.setJobName( "New Fangled Pickle Job Pg #" + pageNumber );
+ if (job.printDialog()) {
+ // Print the job if the user didn't cancel printing
+ try {
+ job.print();
+ }
+ catch (Exception e) {
+ System.out.println(e.getMessage());
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ /**
+ * Unused required by KeyListener
+ */
+ public void keyTyped( KeyEvent e )
+ {
+ }
+
+ /**
+ * Unused required by KeyListener
+ */
+ public void keyReleased( KeyEvent e )
+ {
+ }
+
+ /** used to drag translations in realtime
+ */
+ protected int lastX;
+ protected int lastY;
+ /** used to drag translations in realtime
+ */
+ protected int newX = 0;
+ protected int newY = 0;
+ public void mouseDragged(MouseEvent e) {
+
+ lastX = newX;
+ lastY = newY;
+ newX = e.getX() - tx + (int)origX;
+ newY = e.getY() - ty + (int)origY;
+ repaint();
+ }
+ public void mouseMoved(MouseEvent e) {
+ }
+
+ /** paint frame contents */
+ public void paint( Graphics g )
+ {
+ if (drag == true) {
+ // ugly but gets the point across
+ g.drawImage(currentPage,
+ newX - (int)origX,
+ newY - (int)origY,
+ this);
+ }
+ else {
+ // setSize is the frame, not the contentpane :(
+ // g.drawImage(currentPage, 5, 20, this);
+ g.drawImage(currentPage, 0, 0, this);
+ }
+ }
+
+ public int print( Graphics g, PageFormat pf, int PageIndex ) throws PrinterException
+ {
+ // just printing the current page.
+ if ( PageIndex > 0 )
+ return Printable.NO_SUCH_PAGE;
+ Graphics2D g2 = (Graphics2D) g;
+ g2.drawImage(currentPage, 0, 0, this);
+ return Printable.PAGE_EXISTS;
+ }
+
+ /** callback from PickleObserver occurs when Image is complete. */
+ public void imageIsReady( BufferedImage newImage ) {
+ currentPage = newImage;
+
+ // update menu status
+ menuDPI.setLabel("dpi: " + desiredRes);
+ setPageCount( totalPageCount );
+ repaint();
+ }
+
+ /** count of pages done, update status display */
+ public void pageCountIsReady( int pageCount ) {
+ setPageCount( pageCount );
+ }
+
+ /** starts drag translation, or popup menu
+ */
+ public void mousePressed(MouseEvent e) {
+ if (debug)
+ System.out.println("mousePressed " + e +
+ " B1 " + (e.getModifiers() & (e.BUTTON1_MASK)) +
+ " B2 " + (e.getModifiers() & (e.BUTTON2_MASK)) +
+ " B3 " + (e.getModifiers() & (e.BUTTON3_MASK)) +
+ " Ctrl " + e.isControlDown()
+ );
+ // search for mouse button presses.
+ if ( (e.getModifiers() & e.BUTTON1_MASK) != 0 ) {
+ if ( e.isControlDown() ) {
+ // translate to origin
+ desiredRes = origRes;
+ origX = 0;
+ origY = 0;
+ translate(0,0);
+ }
+ else {
+ // drag translation BEGIN
+ tx = e.getX();
+ ty = e.getY();
+ drag = true;
+ setCursor( new Cursor(Cursor.MOVE_CURSOR) );
+ }
+ }
+ else if ( (e.getModifiers() & (e.BUTTON2_MASK | e.BUTTON3_MASK)) != 0 ) {
+ if ( !popupMenuAllowed ) {
+ // if menus are fixed then right mouse button zooms
+ if ( e.isControlDown() ) {
+ zoomOut(e.getX(), e.getY());
+ }
+ else {
+ zoomIn(e.getX(), e.getY());
+ }
+ }
+ else {
+ return;
+ // show menu on release // popup.show(this, e.getX(), e.getY());
+ }
+ }
+ }
+
+ /** ends drag translation */
+ public void mouseReleased(MouseEvent e) {
+ if (e.isControlDown() == false && drag) {
+ translate(tx - e.getX(), ty - e.getY());
+ drag = false;
+ setCursor( Cursor.getDefaultCursor() );
+ }
+ else if ( (e.getModifiers() & (e.BUTTON2_MASK | e.BUTTON3_MASK)) != 0 ) {
+ if ( popupMenuAllowed )
+ popup.show(this, e.getX(), e.getY());
+ }
+ }
+
+ /** Avoid using this since mousePressed and mouseRelease are being used. */
+ public void mouseClicked(MouseEvent e) {
+ }
+ public void mouseEntered(MouseEvent e) {
+ }
+ public void mouseExited(MouseEvent e) {
+ }
+
+ public void setPage(int _pageNumber) {
+ if (totalPageCount > 0 && _pageNumber > totalPageCount)
+ // repair case where out of bounds page is requested before page count is known.
+ pageNumber = totalPageCount;
+ else
+ pageNumber = _pageNumber;
+ }
+
+ /** Render and display the next page,
+ * stopping at the last page in document.
+ * NOTE: it is possible to request beyond the last page if the request comes faster
+ * than the computation of the number of pages in the job.
+ */
+ public void nextPage() {
+ if (totalPageCount > 0 && pageNumber >= totalPageCount)
+ // repair case where out of bounds page is requested before page count is known.
+ pageNumber = totalPageCount;
+ else
+ ++pageNumber;
+
+ pickle.startProduction( pageNumber );
+ }
+
+ /** Render and display the previous page */
+ public void prevPage() {
+ if (totalPageCount > 0 && pageNumber > totalPageCount) {
+ // repair case where out of bounds page is requested before page count is known.
+ pageNumber = totalPageCount;
+ }
+ else {
+ --pageNumber;
+ if ( pageNumber < 1 )
+ pageNumber = 1;
+ }
+ pickle.startProduction( pageNumber );
+ }
+
+ /** translate a viewport, moves by an offset
+ */
+ protected void translate(int x, int y) {
+ double x1 = origX = origX + x;
+ double y1 = origY = origY + y;
+
+ double sfx = desiredRes / origRes;
+ double sfy = desiredRes / origRes;
+
+ createViewPort( x1, y1, sfx, sfy, origRes, origRes);
+ }
+
+ /** translate a viewport, moves top,left of viewport to a coordinate
+ */
+ protected void translateTo( double x1, double y1 ) {
+ origX = x1;
+ origY = y1;
+
+ double sfx = desiredRes / origRes;
+ double sfy = desiredRes / origRes;
+
+ createViewPort( x1, y1, sfx, sfy, origRes, origRes);
+ }
+
+ /** Increase resolution by factor of 2 */
+ protected void zoomIn( int x, int y ) {
+
+ double x1 = origX = origX + (x * desiredRes / origRes);
+ double y1 = origY = origY + (y * desiredRes / origRes);
+ if ( debug ) System.out.println( "zoomIn " + desiredRes );
+ desiredRes *= 2.0;
+ if ( debug ) System.out.println( "zoomIn " + desiredRes );
+
+
+ double sfx = desiredRes / origRes;
+ double sfy = desiredRes / origRes;
+
+ createViewPort( x1, y1, sfx, sfy, origRes, origRes);
+ }
+
+ /** decrease resolution by factor of 2 */
+ protected void zoomOut( int x, int y ) {
+
+ double x1 = origX = origX + (x * desiredRes / origRes);
+ double y1 = origY = origY + (y * desiredRes / origRes);
+
+ desiredRes /= 2.0;
+
+ double sfx = desiredRes / origRes;
+ double sfy = desiredRes / origRes;
+
+ createViewPort( x1, y1, sfx, sfy, origRes, origRes );
+ }
+
+ /** Set zoom resolution to asked for resolution at 0,0
+ */
+ protected void zoomToRes( double res ) {
+ if ( res < startingRes) {
+ desiredRes = res;
+ origRes = desiredRes;
+ createViewPort( 0.0, 0.0, 1.0, 1.0, origRes, origRes );
+ }
+ else if ( origRes < startingRes )
+ {
+ origRes = startingRes;
+ origX = 0;
+ origY = 0;
+ desiredRes = res / 2.0;
+ zoomIn(0,0); // internal multiply by 2 gets back to asked for res
+ }
+ else {
+ origX = 0;
+ origY = 0;
+ desiredRes = res / 2.0;
+ zoomIn(0,0); // internal multiply by 2 gets back to asked for res
+ }
+ return;
+ }
+
+ /** Set zoom resolution to asked for resolution at 0,0
+ */
+ protected void zoomFactor( double factor ) {
+ zoomToRes(desiredRes*factor);
+ }
+
+ /** Generate a new page with translation, scale, resolution */
+ private void createViewPort( double tx, double ty,
+ double sx, double sy,
+ double resX, double resY)
+ {
+ if ( debug ) {
+ System.out.println( "viewTrans"
+ + "," + tx
+ + "," + ty
+ );
+ System.out.println( "viewScale"
+ + "," + sx
+ + "," + sy
+ );
+ System.out.println( "HWRes"
+ + " , " + resX
+ + " , " + resY
+ );
+ }
+ pickle.setRes( resX, resY );
+ pickle.setTranslateScaleOptions( tx, ty, sx, sy );
+ // disable lookahead for zoom and translate
+ pickle.startProduction( pageNumber, false);
+ }
+
+ /** main program */
+ public static void main( String[] args )
+ {
+ Gview view = new Gview();
+
+ if (args.length < 1) {
+ File file = new File("GhostPrinter.pcl");
+ if (file.exists()) {
+ // open demo file
+ args = new String[1];
+ args[0] = new String("GhostPrinter.pcl");
+ }
+ }
+ System.out.print(usage());
+
+ if (args.length < 1) {
+ // no demo file start with file open
+ view.fileOpen();
+ }
+ view.runMain(args);
+ }
+
+ /**
+ * usage:
+ */
+ public static String usage() {
+ String str =
+ "Usage::java Gview file.pcl\n"
+ + "q -> quit\n"
+ + "z -> zoomin\n"
+ + "x -> zoomout\n"
+ + "o -> open file\n"
+ + "PageUp & PageDown\n"
+ + "drag mouse1 -> translate\n"
+ + "mouse2 -> Popup Menu\n"
+ ;
+ return str;
+ }
+
+ /** defaults settings for runJob, override for different defaults.
+ */
+ public void runMain( String[] args ) {
+ runJob(args, startingRes, true);
+ }
+
+ /** setting page count so that multiple views can share the same page count result
+ * Note that the page count is also set in the pickleTreads
+ */
+ protected synchronized void setPageCount( int pageCount ) {
+ totalPageCount = pageCount;
+ if ( totalPageCount < 0 ) {
+ menuPageNum.setLabel("page# " + pageNumber + " of ?");
+ setTitle("GhostPickle: " +
+ pickle.getJob() +
+ " " +
+ pageNumber +
+ " of ?");
+ }
+ else {
+ menuPageNum.setLabel("page# " + pageNumber + " of " + totalPageCount);
+ setTitle("GhostPickle: " +
+ pickle.getJob() +
+ " " +
+ pageNumber +
+ " of " +
+ totalPageCount);
+ }
+ pickle.setPageCount(pageCount);
+ pageCounter.setPageCount(pageCount);
+ }
+
+ /** Sets the job, opening/reopening the window based on resolution.
+ * @param getPageCount determines if the page count should be computed.
+ */
+ protected void runJob(String[] args, double resolution, boolean getPageCount) {
+ pickle.setJob(args[0]);
+ origRes = desiredRes = resolution;
+ pickle.setRes(desiredRes, desiredRes);
+
+ // set the total page count as unknown for now
+ if (getPageCount == true) {
+ setPageCount(-1);
+ // get the total page count for the job
+ pageCounter.setJob(args[0]);
+ pageCounter.startCountingPages();
+ }
+ else
+ setPageCount(totalPageCount);
+
+ pageNumber = 1;
+ pickle.setPageNumber(pageNumber);
+ currentPage = pickle.getPrinterOutputPage( pageNumber );
+ setSize(pickle.getImgWidth(), pickle.getImgHeight());
+ origW = pickle.getImgWidth();
+ origH = pickle.getImgHeight();
+ show();
+ repaint();
+ }
+}
diff --git a/tools/viewer/JavaDoc/allclasses-frame.html b/tools/viewer/JavaDoc/allclasses-frame.html
new file mode 100644
index 000000000..1deaf8bcd
--- /dev/null
+++ b/tools/viewer/JavaDoc/allclasses-frame.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="Gpickle.html" TARGET="classFrame">Gpickle</A>
+<BR>
+<A HREF="GpickleObserver.html" TARGET="classFrame"><I>GpickleObserver</I></A>
+<BR>
+<A HREF="GpickleThread.html" TARGET="classFrame">GpickleThread</A>
+<BR>
+<A HREF="Gview.html" TARGET="classFrame">Gview</A>
+<BR>
+<A HREF="Nav.html" TARGET="classFrame">Nav</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/deprecated-list.html b/tools/viewer/JavaDoc/deprecated-list.html
new file mode 100644
index 000000000..da0e139f1
--- /dev/null
+++ b/tools/viewer/JavaDoc/deprecated-list.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Deprecated List
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="deprecated-list.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Deprecated API</B></H2>
+</CENTER>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="deprecated-list.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/gpickle.html b/tools/viewer/JavaDoc/gpickle.html
new file mode 100644
index 000000000..0d916b37f
--- /dev/null
+++ b/tools/viewer/JavaDoc/gpickle.html
@@ -0,0 +1,447 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Class Gpickle
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV CLASS&nbsp;
+&nbsp;<A HREF="GpickleThread.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="Gpickle.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;INNER&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+Class Gpickle</H2>
+<PRE>
+java.lang.Object
+ |
+ +--<B>Gpickle</B>
+</PRE>
+<DL>
+<DT><B>Direct Known Subclasses:</B> <DD><A HREF="GpickleThread.html">GpickleThread</A></DD>
+</DL>
+<HR>
+<DL>
+<DT>public class <B>Gpickle</B><DT>extends java.lang.Object</DL>
+
+<P>
+Interface to pcl/pxl interpreter
+ Uses Process to interpret and pipe the results back.
+<P>
+<DL>
+<DT><B>Version: </B><DD>$Revision: 1552 $</DD>
+<DT><B>Author: </B><DD>Henry Stiles</DD>
+</DL>
+<HR>
+
+<P>
+<!-- ======== INNER CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="Gpickle.html#Gpickle()">Gpickle</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getImgHeight()">getImgHeight</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accessor for image height.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getImgWidth()">getImgWidth</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Accessor for image width.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;java.awt.image.BufferedImage</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getPrinterOutputPage()">getPrinterOutputPage</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run the pcl interpreter with the current settings and return a
+ buffered image for the page.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getPrinterPageCount()">getPrinterPageCount</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run the pcl interpreter to get a total page count for the job.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getResX()">getResX</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getResY()">getResY</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getRTL()">getRTL</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#getTextAlpha()">getTextAlpha</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#main(java.lang.String[])">main</A></B>(java.lang.String[]&nbsp;args)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main for test purposes</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#setDeviceOptions(java.lang.String)">setDeviceOptions</A></B>(java.lang.String&nbsp;options)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#setJob(java.lang.String)">setJob</A></B>(java.lang.String&nbsp;jobList)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A list of file names that comprise a job.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#setPageNumber(int)">setPageNumber</A></B>(int&nbsp;page)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page number to display.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#setRes(double, double)">setRes</A></B>(double&nbsp;xRes,
+ double&nbsp;yRes)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NB needs error handling.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#setRTL(boolean)">setRTL</A></B>(boolean&nbsp;on)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gpickle.html#setTextAlpha(boolean)">setTextAlpha</A></B>(boolean&nbsp;textAlpha)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.lang.Object</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="Gpickle()"><!-- --></A><H3>
+Gpickle</H3>
+<PRE>
+public <B>Gpickle</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="setRTL(boolean)"><!-- --></A><H3>
+setRTL</H3>
+<PRE>
+public void <B>setRTL</B>(boolean&nbsp;on)</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="getRTL()"><!-- --></A><H3>
+getRTL</H3>
+<PRE>
+public boolean <B>getRTL</B>()</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="getTextAlpha()"><!-- --></A><H3>
+getTextAlpha</H3>
+<PRE>
+public boolean <B>getTextAlpha</B>()</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="setTextAlpha(boolean)"><!-- --></A><H3>
+setTextAlpha</H3>
+<PRE>
+public void <B>setTextAlpha</B>(boolean&nbsp;textAlpha)</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="getPrinterPageCount()"><!-- --></A><H3>
+getPrinterPageCount</H3>
+<PRE>
+public int <B>getPrinterPageCount</B>()</PRE>
+<DL>
+<DD>run the pcl interpreter to get a total page count for the job.
+ Returns -1 if there is an error.</DL>
+<HR>
+
+<A NAME="setDeviceOptions(java.lang.String)"><!-- --></A><H3>
+setDeviceOptions</H3>
+<PRE>
+public void <B>setDeviceOptions</B>(java.lang.String&nbsp;options)</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="getPrinterOutputPage()"><!-- --></A><H3>
+getPrinterOutputPage</H3>
+<PRE>
+public java.awt.image.BufferedImage <B>getPrinterOutputPage</B>()</PRE>
+<DL>
+<DD>run the pcl interpreter with the current settings and return a
+ buffered image for the page. Sets height and width as a side
+ effect.</DL>
+<HR>
+
+<A NAME="setJob(java.lang.String)"><!-- --></A><H3>
+setJob</H3>
+<PRE>
+public void <B>setJob</B>(java.lang.String&nbsp;jobList)</PRE>
+<DL>
+<DD>A list of file names that comprise a job.
+ NB should be an array of String.</DL>
+<HR>
+
+<A NAME="setRes(double, double)"><!-- --></A><H3>
+setRes</H3>
+<PRE>
+public void <B>setRes</B>(double&nbsp;xRes,
+ double&nbsp;yRes)</PRE>
+<DL>
+<DD>NB needs error handling.
+ set x and y resolution.<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>Positive</CODE> - between 5 and 5000</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getResX()"><!-- --></A><H3>
+getResX</H3>
+<PRE>
+public double <B>getResX</B>()</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="getResY()"><!-- --></A><H3>
+getResY</H3>
+<PRE>
+public double <B>getResY</B>()</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="setPageNumber(int)"><!-- --></A><H3>
+setPageNumber</H3>
+<PRE>
+public void <B>setPageNumber</B>(int&nbsp;page)</PRE>
+<DL>
+<DD>Page number to display.
+ Previous pages are "skipped".</DL>
+<HR>
+
+<A NAME="getImgHeight()"><!-- --></A><H3>
+getImgHeight</H3>
+<PRE>
+public int <B>getImgHeight</B>()</PRE>
+<DL>
+<DD>Accessor for image height.</DL>
+<HR>
+
+<A NAME="getImgWidth()"><!-- --></A><H3>
+getImgWidth</H3>
+<PRE>
+public int <B>getImgWidth</B>()</PRE>
+<DL>
+<DD>Accessor for image width.</DL>
+<HR>
+
+<A NAME="main(java.lang.String[])"><!-- --></A><H3>
+main</H3>
+<PRE>
+public static void <B>main</B>(java.lang.String[]&nbsp;args)</PRE>
+<DL>
+<DD>main for test purposes</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV CLASS&nbsp;
+&nbsp;<A HREF="GpickleThread.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="Gpickle.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;INNER&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/gpickleobserver.html b/tools/viewer/JavaDoc/gpickleobserver.html
new file mode 100644
index 000000000..a93954025
--- /dev/null
+++ b/tools/viewer/JavaDoc/gpickleobserver.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Interface GpickleObserver
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV CLASS&nbsp;
+&nbsp;NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="GpickleObserver.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;INNER&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+Interface GpickleObserver</H2>
+<DL>
+<DT><B>All Known Implementing Classes:</B> <DD><A HREF="Gview.html">Gview</A></DD>
+</DL>
+<HR>
+<DL>
+<DT>public interface <B>GpickleObserver</B></DL>
+
+<P>
+Similar to ImageObserver but for BufferedImage
+<P>
+<DL>
+<DT><B>Version: </B><DD>$Revision: 1552 $</DD>
+<DT><B>Author: </B><DD>Stefan Kemper</DD>
+</DL>
+<HR>
+
+<P>
+<!-- ======== INNER CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="GpickleObserver.html#imageIsReady(java.awt.image.BufferedImage)">imageIsReady</A></B>(java.awt.image.BufferedImage&nbsp;newImage)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newImage contains the completed image</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="imageIsReady(java.awt.image.BufferedImage)"><!-- --></A><H3>
+imageIsReady</H3>
+<PRE>
+public void <B>imageIsReady</B>(java.awt.image.BufferedImage&nbsp;newImage)</PRE>
+<DL>
+<DD>newImage contains the completed image</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV CLASS&nbsp;
+&nbsp;NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="GpickleObserver.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;INNER&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/gpicklethread.html b/tools/viewer/JavaDoc/gpicklethread.html
new file mode 100644
index 000000000..4eee0f1fc
--- /dev/null
+++ b/tools/viewer/JavaDoc/gpicklethread.html
@@ -0,0 +1,242 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Class GpickleThread
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="Gpickle.html"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="Gview.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="GpickleThread.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;INNER&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+Class GpickleThread</H2>
+<PRE>
+java.lang.Object
+ |
+ +--<A HREF="Gpickle.html">Gpickle</A>
+ |
+ +--<B>GpickleThread</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>java.lang.Runnable</DD>
+</DL>
+<HR>
+<DL>
+<DT>public class <B>GpickleThread</B><DT>extends <A HREF="Gpickle.html">Gpickle</A><DT>implements java.lang.Runnable</DL>
+
+<P>
+Thread calls Gpickle asking for a page
+ this tread will send the BufferedImage to
+ the registered PickleObserver
+<P>
+<DL>
+<DT><B>Version: </B><DD>$Revision: 1552 $</DD>
+<DT><B>Author: </B><DD>Stefan Kemper</DD>
+</DL>
+<HR>
+
+<P>
+<!-- ======== INNER CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="GpickleThread.html#busy()">busy</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="GpickleThread.html#run()">run</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads must run, this one runs the process in Gpickle
+ sends generated page to observer.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="GpickleThread.html#startProduction(int)">startProduction</A></B>(int&nbsp;pageNumber)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not generating then start generated requested page
+ if already generating remember last request and return</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_Gpickle"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class <A HREF="Gpickle.html">Gpickle</A></B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="Gpickle.html#getImgHeight()">getImgHeight</A>, <A HREF="Gpickle.html#getImgWidth()">getImgWidth</A>, <A HREF="Gpickle.html#getPrinterOutputPage()">getPrinterOutputPage</A>, <A HREF="Gpickle.html#getPrinterPageCount()">getPrinterPageCount</A>, <A HREF="Gpickle.html#getResX()">getResX</A>, <A HREF="Gpickle.html#getResY()">getResY</A>, <A HREF="Gpickle.html#getRTL()">getRTL</A>, <A HREF="Gpickle.html#getTextAlpha()">getTextAlpha</A>, <A HREF="Gpickle.html#main(java.lang.String[])">main</A>, <A HREF="Gpickle.html#setDeviceOptions(java.lang.String)">setDeviceOptions</A>, <A HREF="Gpickle.html#setJob(java.lang.String)">setJob</A>, <A HREF="Gpickle.html#setPageNumber(int)">setPageNumber</A>, <A HREF="Gpickle.html#setRes(double, double)">setRes</A>, <A HREF="Gpickle.html#setRTL(boolean)">setRTL</A>, <A HREF="Gpickle.html#setTextAlpha(boolean)">setTextAlpha</A></CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.lang.Object</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="run()"><!-- --></A><H3>
+run</H3>
+<PRE>
+public void <B>run</B>()</PRE>
+<DL>
+<DD>threads must run, this one runs the process in Gpickle
+ sends generated page to observer.
+ one page per request<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>run</CODE> in interface <CODE>java.lang.Runnable</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="startProduction(int)"><!-- --></A><H3>
+startProduction</H3>
+<PRE>
+public void <B>startProduction</B>(int&nbsp;pageNumber)</PRE>
+<DL>
+<DD>if not generating then start generated requested page
+ if already generating remember last request and return<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="busy()"><!-- --></A><H3>
+busy</H3>
+<PRE>
+public boolean <B>busy</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="Gpickle.html"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="Gview.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="GpickleThread.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;INNER&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/gview.html b/tools/viewer/JavaDoc/gview.html
new file mode 100644
index 000000000..b345686b6
--- /dev/null
+++ b/tools/viewer/JavaDoc/gview.html
@@ -0,0 +1,1212 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Class Gview
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="GpickleThread.html"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="Nav.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="Gview.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;<A HREF="#inner_classes_inherited_from_class_javax.swing.JFrame">INNER</A>&nbsp;|&nbsp;<A HREF="#field_summary">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;<A HREF="#field_detail">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+Class Gview</H2>
+<PRE>
+java.lang.Object
+ |
+ +--java.awt.Component
+ |
+ +--java.awt.Container
+ |
+ +--java.awt.Window
+ |
+ +--java.awt.Frame
+ |
+ +--javax.swing.JFrame
+ |
+ +--<B>Gview</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>javax.accessibility.Accessible, java.util.EventListener, <A HREF="GpickleObserver.html">GpickleObserver</A>, java.awt.image.ImageObserver, java.awt.event.KeyListener, java.awt.MenuContainer, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, javax.swing.RootPaneContainer, java.io.Serializable, javax.swing.WindowConstants</DD>
+</DL>
+<DL>
+<DT><B>Direct Known Subclasses:</B> <DD><A HREF="Nav.html">Nav</A></DD>
+</DL>
+<HR>
+<DL>
+<DT>public class <B>Gview</B><DT>extends javax.swing.JFrame<DT>implements java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, <A HREF="GpickleObserver.html">GpickleObserver</A></DL>
+
+<P>
+Simple Viewer for PCL and PXL files.
+ Use:
+ Keyboard:
+ PageUp and PageDown move between pages of a document.
+ 'q' quits
+
+ Usage:
+ java Gview ../frs96.pxl
+<P>
+<DL>
+<DT><B>Version: </B><DD>$Revision: 1552 $</DD>
+<DT><B>Author: </B><DD>Henry Stiles, Stefan Kemper</DD>
+<DT><B>See Also: </B><DD><A HREF="serialized-form.html#Gview">Serialized Form</A></DL>
+<HR>
+
+<P>
+<!-- ======== INNER CLASS SUMMARY ======== -->
+
+<A NAME="inner_classes_inherited_from_class_javax.swing.JFrame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class javax.swing.JFrame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>javax.swing.JFrame.AccessibleJFrame</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Frame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Frame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Frame.AccessibleAWTFrame</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Window"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Window</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Window.AccessibleAWTWindow</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Container"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Container</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Container.AccessibleAWTContainer</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Component"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Component</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Component.AccessibleAWTComponent</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;java.awt.image.BufferedImage</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#currentPage">currentPage</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected static&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#debug">debug</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enables printfs</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#desiredRes">desiredRes</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#drag">drag</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#enableRTL">enableRTL</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enable RTL mode in menu
+ try with low startingRes = 25</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#lastX">lastX</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used to drag translations in realtime</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#lastY">lastY</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#newX">newX</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used to drag translations in realtime</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#newY">newY</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#origH">origH</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#origRes">origRes</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#origW">origW</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#origX">origX</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#origY">origY</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#pageNumber">pageNumber</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;<A HREF="GpickleThread.html">GpickleThread</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#pickle">pickle</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#startingRes">startingRes</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starting resolution
+ 75dpi scales nicely to 300,600,1200
+ 100dpi gives a bigger starting window.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#totalPageCount">totalPageCount</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#tx">tx</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#ty">ty</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;double</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#zoomWindowRatio">zoomWindowRatio</A></B></CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;derived classes like: Nav will be 1/zoomWindowRatio in size
+ startingRes = 100; zoomWindowRation = 2;
+ Nav window res is 50.</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_javax.swing.JFrame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class javax.swing.JFrame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>accessibleContext, EXIT_ON_CLOSE, rootPane, rootPaneCheckingEnabled</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_java.awt.Frame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class java.awt.Frame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>CROSSHAIR_CURSOR, DEFAULT_CURSOR, E_RESIZE_CURSOR, HAND_CURSOR, ICONIFIED, MOVE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR, NORMAL, NW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR, SW_RESIZE_CURSOR, TEXT_CURSOR, W_RESIZE_CURSOR, WAIT_CURSOR</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_java.awt.Component"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class java.awt.Component</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_javax.swing.WindowConstants"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from interface javax.swing.WindowConstants</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_java.awt.image.ImageObserver"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from interface java.awt.image.ImageObserver</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="Gview.html#Gview()">Gview</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#imageIsReady(java.awt.image.BufferedImage)">imageIsReady</A></B>(java.awt.image.BufferedImage&nbsp;newImage)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;callback from PickleObserver occurs when Image is complete.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#keyPressed(java.awt.event.KeyEvent)">keyPressed</A></B>(java.awt.event.KeyEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page Up and Page Down Keys
+ Increment and Decrement the current page respectively.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#keyReleased(java.awt.event.KeyEvent)">keyReleased</A></B>(java.awt.event.KeyEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unused required by KeyListener</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#keyTyped(java.awt.event.KeyEvent)">keyTyped</A></B>(java.awt.event.KeyEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unused required by KeyListener</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#main(java.lang.String[])">main</A></B>(java.lang.String[]&nbsp;args)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main program</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mouseClicked(java.awt.event.MouseEvent)">mouseClicked</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mouseDragged(java.awt.event.MouseEvent)">mouseDragged</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mouseEntered(java.awt.event.MouseEvent)">mouseEntered</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mouseExited(java.awt.event.MouseEvent)">mouseExited</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mouseMoved(java.awt.event.MouseEvent)">mouseMoved</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mousePressed(java.awt.event.MouseEvent)">mousePressed</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;starts drag translation, or popup menu</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#mouseReleased(java.awt.event.MouseEvent)">mouseReleased</A></B>(java.awt.event.MouseEvent&nbsp;e)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ends drag translation</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#nextPage()">nextPage</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#paint(java.awt.Graphics)">paint</A></B>(java.awt.Graphics&nbsp;g)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint frame contents</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#prevPage()">prevPage</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#runJob(java.lang.String[], double, boolean)">runJob</A></B>(java.lang.String[]&nbsp;args,
+ double&nbsp;resolution,
+ boolean&nbsp;getPageCount)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sets the job, opening/reopening the window based on resolution.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#runMain(java.lang.String[])">runMain</A></B>(java.lang.String[]&nbsp;args)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaults settings for runJob, override for different defaults.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#setPage(int)">setPage</A></B>(int&nbsp;_pageNumber)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#setPageCount(int)">setPageCount</A></B>(int&nbsp;pageCount)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting page count so that multiple views can share the same page count result</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#translate(int, int)">translate</A></B>(int&nbsp;x,
+ int&nbsp;y)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#translateTo(double, double)">translateTo</A></B>(double&nbsp;x1,
+ double&nbsp;y1)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#usage()">usage</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage:</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#zoomIn(int, int)">zoomIn</A></B>(int&nbsp;x,
+ int&nbsp;y)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Increase resolution by factor of 2</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#zoomOut(int, int)">zoomOut</A></B>(int&nbsp;x,
+ int&nbsp;y)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decrease resolution by factor of 2</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Gview.html#zoomToRes(float)">zoomToRes</A></B>(float&nbsp;res)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set zoom resolution to asked for resolution at 0,0</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_javax.swing.JFrame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class javax.swing.JFrame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getJMenuBar, getLayeredPane, getRootPane, isRootPaneCheckingEnabled, paramString, processKeyEvent, processWindowEvent, remove, setContentPane, setDefaultCloseOperation, setGlassPane, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, update</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Frame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Frame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>addNotify, finalize, getCursorType, getFrames, getIconImage, getMenuBar, getState, getTitle, isResizable, remove, removeNotify, setCursor, setIconImage, setMenuBar, setResizable, setState, setTitle</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Window"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Window</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>addWindowListener, applyResourceBundle, applyResourceBundle, dispose, getFocusOwner, getGraphicsConfiguration, getInputContext, getListeners, getLocale, getOwnedWindows, getOwner, getToolkit, getWarningString, hide, isShowing, pack, postEvent, processEvent, removeWindowListener, setCursor, show, toBack, toFront</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Container"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Container</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>add, add, add, add, add, addContainerListener, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getInsets, getLayout, getMaximumSize, getMinimumSize, getPreferredSize, insets, invalidate, isAncestorOf, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setFont, validate, validateTree</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Component"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Component</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addPropertyChangeListener, addPropertyChangeListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, getBackground, getBounds, getBounds, getColorModel, getComponentOrientation, getCursor, getDropTarget, getFont, getFontMetrics, getForeground, getGraphics, getHeight, getInputMethodRequests, getLocation, getLocation, getLocationOnScreen, getName, getParent, getPeer, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isDisplayable, isDoubleBuffered, isEnabled, isFocusTraversable, isLightweight, isOpaque, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseEvent, processMouseMotionEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, reshape, resize, resize, setBackground, setBounds, setBounds, setComponentOrientation, setDropTarget, setEnabled, setForeground, setLocale, setLocation, setLocation, setName, setSize, setSize, setVisible, show, size, toString, transferFocus</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.lang.Object</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.MenuContainer"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from interface java.awt.MenuContainer</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>getFont, postEvent</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="debug"><!-- --></A><H3>
+debug</H3>
+<PRE>
+protected static final boolean <B>debug</B></PRE>
+<DL>
+<DD>enables printfs</DL>
+<HR>
+
+<A NAME="startingRes"><!-- --></A><H3>
+startingRes</H3>
+<PRE>
+protected double <B>startingRes</B></PRE>
+<DL>
+<DD>starting resolution
+ 75dpi scales nicely to 300,600,1200
+ 100dpi gives a bigger starting window.
+ 50 or even 25 may be needed for a very large plot on a small memory machine.</DL>
+<HR>
+
+<A NAME="zoomWindowRatio"><!-- --></A><H3>
+zoomWindowRatio</H3>
+<PRE>
+protected double <B>zoomWindowRatio</B></PRE>
+<DL>
+<DD>derived classes like: Nav will be 1/zoomWindowRatio in size
+ startingRes = 100; zoomWindowRation = 2;
+ Nav window res is 50.</DL>
+<HR>
+
+<A NAME="enableRTL"><!-- --></A><H3>
+enableRTL</H3>
+<PRE>
+protected boolean <B>enableRTL</B></PRE>
+<DL>
+<DD>enable RTL mode in menu
+ try with low startingRes = 25</DL>
+<HR>
+
+<A NAME="pageNumber"><!-- --></A><H3>
+pageNumber</H3>
+<PRE>
+protected int <B>pageNumber</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="totalPageCount"><!-- --></A><H3>
+totalPageCount</H3>
+<PRE>
+protected int <B>totalPageCount</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="currentPage"><!-- --></A><H3>
+currentPage</H3>
+<PRE>
+protected java.awt.image.BufferedImage <B>currentPage</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="pickle"><!-- --></A><H3>
+pickle</H3>
+<PRE>
+protected <A HREF="GpickleThread.html">GpickleThread</A> <B>pickle</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="desiredRes"><!-- --></A><H3>
+desiredRes</H3>
+<PRE>
+protected double <B>desiredRes</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="origRes"><!-- --></A><H3>
+origRes</H3>
+<PRE>
+protected double <B>origRes</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="origH"><!-- --></A><H3>
+origH</H3>
+<PRE>
+protected double <B>origH</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="origW"><!-- --></A><H3>
+origW</H3>
+<PRE>
+protected double <B>origW</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="origX"><!-- --></A><H3>
+origX</H3>
+<PRE>
+protected double <B>origX</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="origY"><!-- --></A><H3>
+origY</H3>
+<PRE>
+protected double <B>origY</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="tx"><!-- --></A><H3>
+tx</H3>
+<PRE>
+protected int <B>tx</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="ty"><!-- --></A><H3>
+ty</H3>
+<PRE>
+protected int <B>ty</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="drag"><!-- --></A><H3>
+drag</H3>
+<PRE>
+protected boolean <B>drag</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="lastX"><!-- --></A><H3>
+lastX</H3>
+<PRE>
+protected int <B>lastX</B></PRE>
+<DL>
+<DD>used to drag translations in realtime</DL>
+<HR>
+
+<A NAME="lastY"><!-- --></A><H3>
+lastY</H3>
+<PRE>
+protected int <B>lastY</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="newX"><!-- --></A><H3>
+newX</H3>
+<PRE>
+protected int <B>newX</B></PRE>
+<DL>
+<DD>used to drag translations in realtime</DL>
+<HR>
+
+<A NAME="newY"><!-- --></A><H3>
+newY</H3>
+<PRE>
+protected int <B>newY</B></PRE>
+<DL>
+</DL>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="Gview()"><!-- --></A><H3>
+Gview</H3>
+<PRE>
+public <B>Gview</B>()</PRE>
+<DL>
+<DD>constructor</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="keyPressed(java.awt.event.KeyEvent)"><!-- --></A><H3>
+keyPressed</H3>
+<PRE>
+public void <B>keyPressed</B>(java.awt.event.KeyEvent&nbsp;e)</PRE>
+<DL>
+<DD>Page Up and Page Down Keys
+ Increment and Decrement the current page respectively.
+ Currently does't prevent keys strokes while a page is being generated,
+ this give poor feedback when a key is pressed repeatedly while a long job runs.<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>keyPressed</CODE> in interface <CODE>java.awt.event.KeyListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="keyTyped(java.awt.event.KeyEvent)"><!-- --></A><H3>
+keyTyped</H3>
+<PRE>
+public void <B>keyTyped</B>(java.awt.event.KeyEvent&nbsp;e)</PRE>
+<DL>
+<DD>Unused required by KeyListener<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>keyTyped</CODE> in interface <CODE>java.awt.event.KeyListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="keyReleased(java.awt.event.KeyEvent)"><!-- --></A><H3>
+keyReleased</H3>
+<PRE>
+public void <B>keyReleased</B>(java.awt.event.KeyEvent&nbsp;e)</PRE>
+<DL>
+<DD>Unused required by KeyListener<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>keyReleased</CODE> in interface <CODE>java.awt.event.KeyListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mouseDragged(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mouseDragged</H3>
+<PRE>
+public void <B>mouseDragged</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mouseDragged</CODE> in interface <CODE>java.awt.event.MouseMotionListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mouseMoved(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mouseMoved</H3>
+<PRE>
+public void <B>mouseMoved</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mouseMoved</CODE> in interface <CODE>java.awt.event.MouseMotionListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="paint(java.awt.Graphics)"><!-- --></A><H3>
+paint</H3>
+<PRE>
+public void <B>paint</B>(java.awt.Graphics&nbsp;g)</PRE>
+<DL>
+<DD>paint frame contents<DD><DL>
+<DT><B>Overrides:</B><DD><CODE>paint</CODE> in class <CODE>java.awt.Container</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="imageIsReady(java.awt.image.BufferedImage)"><!-- --></A><H3>
+imageIsReady</H3>
+<PRE>
+public void <B>imageIsReady</B>(java.awt.image.BufferedImage&nbsp;newImage)</PRE>
+<DL>
+<DD>callback from PickleObserver occurs when Image is complete.<DD><DL>
+<DT><B>Specified by: </B><DD><CODE><A HREF="GpickleObserver.html#imageIsReady(java.awt.image.BufferedImage)">imageIsReady</A></CODE> in interface <CODE><A HREF="GpickleObserver.html">GpickleObserver</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mousePressed(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mousePressed</H3>
+<PRE>
+public void <B>mousePressed</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD>starts drag translation, or popup menu<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mousePressed</CODE> in interface <CODE>java.awt.event.MouseListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mouseReleased(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mouseReleased</H3>
+<PRE>
+public void <B>mouseReleased</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD>ends drag translation<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mouseReleased</CODE> in interface <CODE>java.awt.event.MouseListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mouseClicked(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mouseClicked</H3>
+<PRE>
+public void <B>mouseClicked</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mouseClicked</CODE> in interface <CODE>java.awt.event.MouseListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mouseEntered(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mouseEntered</H3>
+<PRE>
+public void <B>mouseEntered</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mouseEntered</CODE> in interface <CODE>java.awt.event.MouseListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="mouseExited(java.awt.event.MouseEvent)"><!-- --></A><H3>
+mouseExited</H3>
+<PRE>
+public void <B>mouseExited</B>(java.awt.event.MouseEvent&nbsp;e)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by: </B><DD><CODE>mouseExited</CODE> in interface <CODE>java.awt.event.MouseListener</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setPage(int)"><!-- --></A><H3>
+setPage</H3>
+<PRE>
+public void <B>setPage</B>(int&nbsp;_pageNumber)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="nextPage()"><!-- --></A><H3>
+nextPage</H3>
+<PRE>
+public void <B>nextPage</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="prevPage()"><!-- --></A><H3>
+prevPage</H3>
+<PRE>
+public void <B>prevPage</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="translate(int, int)"><!-- --></A><H3>
+translate</H3>
+<PRE>
+protected void <B>translate</B>(int&nbsp;x,
+ int&nbsp;y)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="translateTo(double, double)"><!-- --></A><H3>
+translateTo</H3>
+<PRE>
+protected void <B>translateTo</B>(double&nbsp;x1,
+ double&nbsp;y1)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="zoomIn(int, int)"><!-- --></A><H3>
+zoomIn</H3>
+<PRE>
+protected void <B>zoomIn</B>(int&nbsp;x,
+ int&nbsp;y)</PRE>
+<DL>
+<DD>Increase resolution by factor of 2<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="zoomOut(int, int)"><!-- --></A><H3>
+zoomOut</H3>
+<PRE>
+protected void <B>zoomOut</B>(int&nbsp;x,
+ int&nbsp;y)</PRE>
+<DL>
+<DD>decrease resolution by factor of 2<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="zoomToRes(float)"><!-- --></A><H3>
+zoomToRes</H3>
+<PRE>
+protected void <B>zoomToRes</B>(float&nbsp;res)</PRE>
+<DL>
+<DD>Set zoom resolution to asked for resolution at 0,0<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="main(java.lang.String[])"><!-- --></A><H3>
+main</H3>
+<PRE>
+public static void <B>main</B>(java.lang.String[]&nbsp;args)</PRE>
+<DL>
+<DD>main program<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="usage()"><!-- --></A><H3>
+usage</H3>
+<PRE>
+public static java.lang.String <B>usage</B>()</PRE>
+<DL>
+<DD>usage:<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="runMain(java.lang.String[])"><!-- --></A><H3>
+runMain</H3>
+<PRE>
+public void <B>runMain</B>(java.lang.String[]&nbsp;args)</PRE>
+<DL>
+<DD>defaults settings for runJob, override for different defaults.<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setPageCount(int)"><!-- --></A><H3>
+setPageCount</H3>
+<PRE>
+protected void <B>setPageCount</B>(int&nbsp;pageCount)</PRE>
+<DL>
+<DD>setting page count so that multiple views can share the same page count result<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="runJob(java.lang.String[], double, boolean)"><!-- --></A><H3>
+runJob</H3>
+<PRE>
+protected void <B>runJob</B>(java.lang.String[]&nbsp;args,
+ double&nbsp;resolution,
+ boolean&nbsp;getPageCount)</PRE>
+<DL>
+<DD>Sets the job, opening/reopening the window based on resolution.<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>getPageCount</CODE> - determines if the page count should be computed.</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="GpickleThread.html"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="Nav.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="Gview.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;<A HREF="#inner_classes_inherited_from_class_javax.swing.JFrame">INNER</A>&nbsp;|&nbsp;<A HREF="#field_summary">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;<A HREF="#field_detail">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/help-doc.html b/tools/viewer/JavaDoc/help-doc.html
new file mode 100644
index 000000000..80f2e851f
--- /dev/null
+++ b/tools/viewer/JavaDoc/help-doc.html
@@ -0,0 +1,138 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: API Help
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="help-doc.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<CENTER>
+<H1>
+How This API Document Is Organized</H1>
+</CENTER>
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
+Package</H3>
+<BLOCKQUOTE>
+
+<P>
+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL>
+<LI>Interfaces (italic)<LI>Classes<LI>Exceptions<LI>Errors</UL>
+</BLOCKQUOTE>
+<H3>
+Class/Interface</H3>
+<BLOCKQUOTE>
+
+<P>
+Each class, interface, inner class and inner interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL>
+<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description
+<P>
+<LI>Inner Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
+<P>
+<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE>
+<H3>
+Tree (Class Hierarchy)</H3>
+<BLOCKQUOTE>
+There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL>
+<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL>
+</BLOCKQUOTE>
+<H3>
+Deprecated API</H3>
+<BLOCKQUOTE>
+The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE>
+<H3>
+Index</H3>
+<BLOCKQUOTE>
+The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE>
+<H3>
+Prev/Next</H3>
+These links take you to the next or previous class, interface, package, or related page.<H3>
+Frames/No Frames</H3>
+These links show and hide the HTML frames. All pages are available with or without frames.
+<P>
+<H3>
+Serialized Form</H3>
+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
+<P>
+<FONT SIZE="-1">
+<EM>
+This help file applies to API documentation generated using the standard doclet. </EM>
+</FONT>
+<BR>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="help-doc.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/index-all.html b/tools/viewer/JavaDoc/index-all.html
new file mode 100644
index 000000000..f5f93f62b
--- /dev/null
+++ b/tools/viewer/JavaDoc/index-all.html
@@ -0,0 +1,426 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Index
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="index-all.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<A HREF="#_*_">*</A> <A HREF="#_B_">B</A> <A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_G_">G</A> <A HREF="#_I_">I</A> <A HREF="#_K_">K</A> <A HREF="#_L_">L</A> <A HREF="#_M_">M</A> <A HREF="#_N_">N</A> <A HREF="#_O_">O</A> <A HREF="#_P_">P</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_Z_">Z</A> <HR>
+<A NAME="_*_"><!-- --></A><H2>
+<B>*</B></H2>
+<DL>
+<DT><A HREF="package-summary.html"><B></B></A> - package <DD>&nbsp;</DL>
+<HR>
+<A NAME="_B_"><!-- --></A><H2>
+<B>B</B></H2>
+<DL>
+<DT><A HREF="GpickleThread.html#busy()"><B>busy()</B></A> -
+Method in class <A HREF="GpickleThread.html">GpickleThread</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_C_"><!-- --></A><H2>
+<B>C</B></H2>
+<DL>
+<DT><A HREF="Gview.html#currentPage"><B>currentPage</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_D_"><!-- --></A><H2>
+<B>D</B></H2>
+<DL>
+<DT><A HREF="Gview.html#debug"><B>debug</B></A> -
+Static variable in class <A HREF="Gview.html">Gview</A>
+<DD>enables printfs
+<DT><A HREF="Gview.html#desiredRes"><B>desiredRes</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#drag"><B>drag</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_E_"><!-- --></A><H2>
+<B>E</B></H2>
+<DL>
+<DT><A HREF="Gview.html#enableRTL"><B>enableRTL</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>enable RTL mode in menu
+ try with low startingRes = 25
+</DL>
+<HR>
+<A NAME="_G_"><!-- --></A><H2>
+<B>G</B></H2>
+<DL>
+<DT><A HREF="Gpickle.html#getImgHeight()"><B>getImgHeight()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>Accessor for image height.
+<DT><A HREF="Gpickle.html#getImgWidth()"><B>getImgWidth()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>Accessor for image width.
+<DT><A HREF="Gpickle.html#getPrinterOutputPage()"><B>getPrinterOutputPage()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>run the pcl interpreter with the current settings and return a
+ buffered image for the page.
+<DT><A HREF="Gpickle.html#getPrinterPageCount()"><B>getPrinterPageCount()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>run the pcl interpreter to get a total page count for the job.
+<DT><A HREF="Gpickle.html#getResX()"><B>getResX()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gpickle.html#getResY()"><B>getResY()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gpickle.html#getRTL()"><B>getRTL()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gpickle.html#getTextAlpha()"><B>getTextAlpha()</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gpickle.html"><B>Gpickle</B></A> - class <A HREF="Gpickle.html">Gpickle</A>.<DD>Interface to pcl/pxl interpreter
+ Uses Process to interpret and pipe the results back.<DT><A HREF="Gpickle.html#Gpickle()"><B>Gpickle()</B></A> -
+Constructor for class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="GpickleObserver.html"><B>GpickleObserver</B></A> - interface <A HREF="GpickleObserver.html">GpickleObserver</A>.<DD>Similar to ImageObserver but for BufferedImage<DT><A HREF="GpickleThread.html"><B>GpickleThread</B></A> - class <A HREF="GpickleThread.html">GpickleThread</A>.<DD>Thread calls Gpickle asking for a page
+ this tread will send the BufferedImage to
+ the registered PickleObserver<DT><A HREF="Gview.html"><B>Gview</B></A> - class <A HREF="Gview.html">Gview</A>.<DD>Simple Viewer for PCL and PXL files.<DT><A HREF="Gview.html#Gview()"><B>Gview()</B></A> -
+Constructor for class <A HREF="Gview.html">Gview</A>
+<DD>constructor
+</DL>
+<HR>
+<A NAME="_I_"><!-- --></A><H2>
+<B>I</B></H2>
+<DL>
+<DT><A HREF="Gview.html#imageIsReady(java.awt.image.BufferedImage)"><B>imageIsReady(BufferedImage)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>callback from PickleObserver occurs when Image is complete.
+<DT><A HREF="Nav.html#imageIsReady(java.awt.image.BufferedImage)"><B>imageIsReady(BufferedImage)</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>low res image is ready,
+ if we are not getting the next page
+ start generation of the high res image
+<DT><A HREF="GpickleObserver.html#imageIsReady(java.awt.image.BufferedImage)"><B>imageIsReady(BufferedImage)</B></A> -
+Method in interface <A HREF="GpickleObserver.html">GpickleObserver</A>
+<DD>newImage contains the completed image
+</DL>
+<HR>
+<A NAME="_K_"><!-- --></A><H2>
+<B>K</B></H2>
+<DL>
+<DT><A HREF="Gview.html#keyPressed(java.awt.event.KeyEvent)"><B>keyPressed(KeyEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>Page Up and Page Down Keys
+ Increment and Decrement the current page respectively.
+<DT><A HREF="Gview.html#keyReleased(java.awt.event.KeyEvent)"><B>keyReleased(KeyEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>Unused required by KeyListener
+<DT><A HREF="Gview.html#keyTyped(java.awt.event.KeyEvent)"><B>keyTyped(KeyEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>Unused required by KeyListener
+</DL>
+<HR>
+<A NAME="_L_"><!-- --></A><H2>
+<B>L</B></H2>
+<DL>
+<DT><A HREF="Gview.html#lastX"><B>lastX</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>used to drag translations in realtime
+<DT><A HREF="Gview.html#lastY"><B>lastY</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_M_"><!-- --></A><H2>
+<B>M</B></H2>
+<DL>
+<DT><A HREF="Gpickle.html#main(java.lang.String[])"><B>main(String[])</B></A> -
+Static method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>main for test purposes
+<DT><A HREF="Gview.html#main(java.lang.String[])"><B>main(String[])</B></A> -
+Static method in class <A HREF="Gview.html">Gview</A>
+<DD>main program
+<DT><A HREF="Nav.html#main(java.lang.String[])"><B>main(String[])</B></A> -
+Static method in class <A HREF="Nav.html">Nav</A>
+<DD>main program
+<DT><A HREF="Gview.html#mouseClicked(java.awt.event.MouseEvent)"><B>mouseClicked(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#mouseDragged(java.awt.event.MouseEvent)"><B>mouseDragged(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#mouseEntered(java.awt.event.MouseEvent)"><B>mouseEntered(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#mouseExited(java.awt.event.MouseEvent)"><B>mouseExited(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#mouseMoved(java.awt.event.MouseEvent)"><B>mouseMoved(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#mousePressed(java.awt.event.MouseEvent)"><B>mousePressed(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>starts drag translation, or popup menu
+<DT><A HREF="Gview.html#mouseReleased(java.awt.event.MouseEvent)"><B>mouseReleased(MouseEvent)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>ends drag translation
+</DL>
+<HR>
+<A NAME="_N_"><!-- --></A><H2>
+<B>N</B></H2>
+<DL>
+<DT><A HREF="Nav.html"><B>Nav</B></A> - class <A HREF="Nav.html">Nav</A>.<DD>Two window nav + zoomed Viewer for PCL and PXL files.<DT><A HREF="Nav.html#Nav()"><B>Nav()</B></A> -
+Constructor for class <A HREF="Nav.html">Nav</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#newX"><B>newX</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>used to drag translations in realtime
+<DT><A HREF="Gview.html#newY"><B>newY</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#nextPage()"><B>nextPage()</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Nav.html#nextPage()"><B>nextPage()</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_O_"><!-- --></A><H2>
+<B>O</B></H2>
+<DL>
+<DT><A HREF="Gview.html#origH"><B>origH</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#origRes"><B>origRes</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#origW"><B>origW</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#origX"><B>origX</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#origY"><B>origY</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_P_"><!-- --></A><H2>
+<B>P</B></H2>
+<DL>
+<DT><A HREF="Gview.html#pageNumber"><B>pageNumber</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#paint(java.awt.Graphics)"><B>paint(Graphics)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>paint frame contents
+<DT><A HREF="Nav.html#paint(java.awt.Graphics)"><B>paint(Graphics)</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>Paint low res image with red zoom box
+ zoom box uses xor realtime drag.
+<DT><A HREF="Gview.html#pickle"><B>pickle</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#prevPage()"><B>prevPage()</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Nav.html#prevPage()"><B>prevPage()</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_R_"><!-- --></A><H2>
+<B>R</B></H2>
+<DL>
+<DT><A HREF="GpickleThread.html#run()"><B>run()</B></A> -
+Method in class <A HREF="GpickleThread.html">GpickleThread</A>
+<DD>threads must run, this one runs the process in Gpickle
+ sends generated page to observer.
+<DT><A HREF="Gview.html#runJob(java.lang.String[], double, boolean)"><B>runJob(String[], double, boolean)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>Sets the job, opening/reopening the window based on resolution.
+<DT><A HREF="Gview.html#runMain(java.lang.String[])"><B>runMain(String[])</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>defaults settings for runJob, override for different defaults.
+<DT><A HREF="Nav.html#runMain(java.lang.String[])"><B>runMain(String[])</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_S_"><!-- --></A><H2>
+<B>S</B></H2>
+<DL>
+<DT><A HREF="Gpickle.html#setDeviceOptions(java.lang.String)"><B>setDeviceOptions(String)</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gpickle.html#setJob(java.lang.String)"><B>setJob(String)</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>A list of file names that comprise a job.
+<DT><A HREF="Gview.html#setPage(int)"><B>setPage(int)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#setPageCount(int)"><B>setPageCount(int)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>setting page count so that multiple views can share the same page count result
+<DT><A HREF="Gpickle.html#setPageNumber(int)"><B>setPageNumber(int)</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>Page number to display.
+<DT><A HREF="Gpickle.html#setRes(double, double)"><B>setRes(double, double)</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>NB needs error handling.
+<DT><A HREF="Gpickle.html#setRTL(boolean)"><B>setRTL(boolean)</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gpickle.html#setTextAlpha(boolean)"><B>setTextAlpha(boolean)</B></A> -
+Method in class <A HREF="Gpickle.html">Gpickle</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#startingRes"><B>startingRes</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>starting resolution
+ 75dpi scales nicely to 300,600,1200
+ 100dpi gives a bigger starting window.
+<DT><A HREF="GpickleThread.html#startProduction(int)"><B>startProduction(int)</B></A> -
+Method in class <A HREF="GpickleThread.html">GpickleThread</A>
+<DD>if not generating then start generated requested page
+ if already generating remember last request and return
+</DL>
+<HR>
+<A NAME="_T_"><!-- --></A><H2>
+<B>T</B></H2>
+<DL>
+<DT><A HREF="Gview.html#totalPageCount"><B>totalPageCount</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#translate(int, int)"><B>translate(int, int)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Nav.html#translate(int, int)"><B>translate(int, int)</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>moves/drags zoomin box and causes regerenation of a new viewport
+<DT><A HREF="Gview.html#translateTo(double, double)"><B>translateTo(double, double)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#tx"><B>tx</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+<DT><A HREF="Gview.html#ty"><B>ty</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>&nbsp;
+</DL>
+<HR>
+<A NAME="_U_"><!-- --></A><H2>
+<B>U</B></H2>
+<DL>
+<DT><A HREF="Gview.html#usage()"><B>usage()</B></A> -
+Static method in class <A HREF="Gview.html">Gview</A>
+<DD>usage:
+</DL>
+<HR>
+<A NAME="_Z_"><!-- --></A><H2>
+<B>Z</B></H2>
+<DL>
+<DT><A HREF="Gview.html#zoomIn(int, int)"><B>zoomIn(int, int)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>Increase resolution by factor of 2
+<DT><A HREF="Nav.html#zoomIn(int, int)"><B>zoomIn(int, int)</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>pageView gets regenerated at higher resolution,
+ repaint updates zoomin box.
+<DT><A HREF="Gview.html#zoomOut(int, int)"><B>zoomOut(int, int)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>decrease resolution by factor of 2
+<DT><A HREF="Nav.html#zoomOut(int, int)"><B>zoomOut(int, int)</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>pageView gets regenerated at lower resolution,
+ repaint updates zoomin box.
+<DT><A HREF="Gview.html#zoomToRes(float)"><B>zoomToRes(float)</B></A> -
+Method in class <A HREF="Gview.html">Gview</A>
+<DD>Set zoom resolution to asked for resolution at 0,0
+<DT><A HREF="Nav.html#zoomToRes(float)"><B>zoomToRes(float)</B></A> -
+Method in class <A HREF="Nav.html">Nav</A>
+<DD>pageView gets regenerated at requested resolution,
+ repaint updates zoomin box.
+<DT><A HREF="Gview.html#zoomWindowRatio"><B>zoomWindowRatio</B></A> -
+Variable in class <A HREF="Gview.html">Gview</A>
+<DD>derived classes like: Nav will be 1/zoomWindowRatio in size
+ startingRes = 100; zoomWindowRation = 2;
+ Nav window res is 50.
+</DL>
+<HR>
+<A HREF="#_*_">*</A> <A HREF="#_B_">B</A> <A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_G_">G</A> <A HREF="#_I_">I</A> <A HREF="#_K_">K</A> <A HREF="#_L_">L</A> <A HREF="#_M_">M</A> <A HREF="#_N_">N</A> <A HREF="#_O_">O</A> <A HREF="#_P_">P</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_Z_">Z</A>
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="index-all.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/index.html b/tools/viewer/JavaDoc/index.html
new file mode 100644
index 000000000..0f02e2fbe
--- /dev/null
+++ b/tools/viewer/JavaDoc/index.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd>
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001-->
+<TITLE>
+Generated Documentation (Untitled)
+</TITLE>
+</HEAD>
+<FRAMESET cols="20%,80%">
+<FRAME src="allclasses-frame.html" name="packageFrame">
+<FRAME src="package-summary.html" name="classFrame">
+</FRAMESET>
+<NOFRAMES>
+<H2>
+Frame Alert</H2>
+
+<P>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to <A HREF="package-summary.html">Non-frame version.</A></NOFRAMES>
+</HTML>
diff --git a/tools/viewer/JavaDoc/nav.html b/tools/viewer/JavaDoc/nav.html
new file mode 100644
index 000000000..cd4f465ae
--- /dev/null
+++ b/tools/viewer/JavaDoc/nav.html
@@ -0,0 +1,584 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Class Nav
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="Gview.html"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="Nav.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;<A HREF="#inner_classes_inherited_from_class_javax.swing.JFrame">INNER</A>&nbsp;|&nbsp;<A HREF="#fields_inherited_from_class_Gview">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+Class Nav</H2>
+<PRE>
+java.lang.Object
+ |
+ +--java.awt.Component
+ |
+ +--java.awt.Container
+ |
+ +--java.awt.Window
+ |
+ +--java.awt.Frame
+ |
+ +--javax.swing.JFrame
+ |
+ +--<A HREF="Gview.html">Gview</A>
+ |
+ +--<B>Nav</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>javax.accessibility.Accessible, java.util.EventListener, <A HREF="GpickleObserver.html">GpickleObserver</A>, java.awt.image.ImageObserver, java.awt.event.KeyListener, java.awt.MenuContainer, java.awt.event.MouseListener, java.awt.event.MouseMotionListener, javax.swing.RootPaneContainer, java.io.Serializable, javax.swing.WindowConstants</DD>
+</DL>
+<HR>
+<DL>
+<DT>public class <B>Nav</B><DT>extends <A HREF="Gview.html">Gview</A></DL>
+
+<P>
+Two window nav + zoomed Viewer for PCL and PXL files.
+
+ Usage:
+ java Nav ../frs96.pxl
+
+ Adds a smaller navigation window coupled to a Gview window.
+ This allows a small portion of a page to be viewed at high resolution
+ in the Gview window with navigation occuring via the Nav window.
+
+ Mostly inherits behavior and reflects action on this window and the
+ Gview zoomed window.
+<P>
+<DL>
+<DT><B>Version: </B><DD>$Revision: 1552 $</DD>
+<DT><B>Author: </B><DD>Stefan Kemper</DD>
+<DT><B>See Also: </B><DD><A HREF="serialized-form.html#Nav">Serialized Form</A></DL>
+<HR>
+
+<P>
+<!-- ======== INNER CLASS SUMMARY ======== -->
+
+<A NAME="inner_classes_inherited_from_class_javax.swing.JFrame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class javax.swing.JFrame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>javax.swing.JFrame.AccessibleJFrame</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Frame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Frame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Frame.AccessibleAWTFrame</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Window"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Window</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Window.AccessibleAWTWindow</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Container"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Container</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Container.AccessibleAWTContainer</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="inner_classes_inherited_from_class_java.awt.Component"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Inner classes inherited from class java.awt.Component</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>java.awt.Component.AccessibleAWTComponent</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="fields_inherited_from_class_Gview"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class <A HREF="Gview.html">Gview</A></B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="Gview.html#currentPage">currentPage</A>, <A HREF="Gview.html#debug">debug</A>, <A HREF="Gview.html#desiredRes">desiredRes</A>, <A HREF="Gview.html#drag">drag</A>, <A HREF="Gview.html#enableRTL">enableRTL</A>, <A HREF="Gview.html#lastX">lastX</A>, <A HREF="Gview.html#lastY">lastY</A>, <A HREF="Gview.html#newX">newX</A>, <A HREF="Gview.html#newY">newY</A>, <A HREF="Gview.html#origH">origH</A>, <A HREF="Gview.html#origRes">origRes</A>, <A HREF="Gview.html#origW">origW</A>, <A HREF="Gview.html#origX">origX</A>, <A HREF="Gview.html#origY">origY</A>, <A HREF="Gview.html#pageNumber">pageNumber</A>, <A HREF="Gview.html#pickle">pickle</A>, <A HREF="Gview.html#startingRes">startingRes</A>, <A HREF="Gview.html#totalPageCount">totalPageCount</A>, <A HREF="Gview.html#tx">tx</A>, <A HREF="Gview.html#ty">ty</A>, <A HREF="Gview.html#zoomWindowRatio">zoomWindowRatio</A></CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_javax.swing.JFrame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class javax.swing.JFrame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>accessibleContext, EXIT_ON_CLOSE, rootPane, rootPaneCheckingEnabled</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_java.awt.Frame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class java.awt.Frame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>CROSSHAIR_CURSOR, DEFAULT_CURSOR, E_RESIZE_CURSOR, HAND_CURSOR, ICONIFIED, MOVE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR, NORMAL, NW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR, SW_RESIZE_CURSOR, TEXT_CURSOR, W_RESIZE_CURSOR, WAIT_CURSOR</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_java.awt.Component"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from class java.awt.Component</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_javax.swing.WindowConstants"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from interface javax.swing.WindowConstants</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="fields_inherited_from_class_java.awt.image.ImageObserver"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Fields inherited from interface java.awt.image.ImageObserver</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="Nav.html#Nav()">Nav</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#imageIsReady(java.awt.image.BufferedImage)">imageIsReady</A></B>(java.awt.image.BufferedImage&nbsp;newImage)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low res image is ready,
+ if we are not getting the next page
+ start generation of the high res image</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#main(java.lang.String[])">main</A></B>(java.lang.String[]&nbsp;args)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main program</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#nextPage()">nextPage</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#paint(java.awt.Graphics)">paint</A></B>(java.awt.Graphics&nbsp;g)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paint low res image with red zoom box
+ zoom box uses xor realtime drag.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#prevPage()">prevPage</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#runMain(java.lang.String[])">runMain</A></B>(java.lang.String[]&nbsp;args)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaults settings for runJob, override for different defaults.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#translate(int, int)">translate</A></B>(int&nbsp;x,
+ int&nbsp;y)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;moves/drags zoomin box and causes regerenation of a new viewport</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#zoomIn(int, int)">zoomIn</A></B>(int&nbsp;x,
+ int&nbsp;y)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageView gets regenerated at higher resolution,
+ repaint updates zoomin box.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#zoomOut(int, int)">zoomOut</A></B>(int&nbsp;x,
+ int&nbsp;y)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageView gets regenerated at lower resolution,
+ repaint updates zoomin box.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>protected &nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="Nav.html#zoomToRes(float)">zoomToRes</A></B>(float&nbsp;res)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageView gets regenerated at requested resolution,
+ repaint updates zoomin box.</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_Gview"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class <A HREF="Gview.html">Gview</A></B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="Gview.html#keyPressed(java.awt.event.KeyEvent)">keyPressed</A>, <A HREF="Gview.html#keyReleased(java.awt.event.KeyEvent)">keyReleased</A>, <A HREF="Gview.html#keyTyped(java.awt.event.KeyEvent)">keyTyped</A>, <A HREF="Gview.html#mouseClicked(java.awt.event.MouseEvent)">mouseClicked</A>, <A HREF="Gview.html#mouseDragged(java.awt.event.MouseEvent)">mouseDragged</A>, <A HREF="Gview.html#mouseEntered(java.awt.event.MouseEvent)">mouseEntered</A>, <A HREF="Gview.html#mouseExited(java.awt.event.MouseEvent)">mouseExited</A>, <A HREF="Gview.html#mouseMoved(java.awt.event.MouseEvent)">mouseMoved</A>, <A HREF="Gview.html#mousePressed(java.awt.event.MouseEvent)">mousePressed</A>, <A HREF="Gview.html#mouseReleased(java.awt.event.MouseEvent)">mouseReleased</A>, <A HREF="Gview.html#runJob(java.lang.String[], double, boolean)">runJob</A>, <A HREF="Gview.html#setPage(int)">setPage</A>, <A HREF="Gview.html#setPageCount(int)">setPageCount</A>, <A HREF="Gview.html#translateTo(double, double)">translateTo</A>, <A HREF="Gview.html#usage()">usage</A></CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_javax.swing.JFrame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class javax.swing.JFrame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getJMenuBar, getLayeredPane, getRootPane, isRootPaneCheckingEnabled, paramString, processKeyEvent, processWindowEvent, remove, setContentPane, setDefaultCloseOperation, setGlassPane, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, update</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Frame"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Frame</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>addNotify, finalize, getCursorType, getFrames, getIconImage, getMenuBar, getState, getTitle, isResizable, remove, removeNotify, setCursor, setIconImage, setMenuBar, setResizable, setState, setTitle</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Window"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Window</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>addWindowListener, applyResourceBundle, applyResourceBundle, dispose, getFocusOwner, getGraphicsConfiguration, getInputContext, getListeners, getLocale, getOwnedWindows, getOwner, getToolkit, getWarningString, hide, isShowing, pack, postEvent, processEvent, removeWindowListener, setCursor, show, toBack, toFront</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Container"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Container</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>add, add, add, add, add, addContainerListener, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getInsets, getLayout, getMaximumSize, getMinimumSize, getPreferredSize, insets, invalidate, isAncestorOf, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setFont, validate, validateTree</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.Component"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.awt.Component</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addPropertyChangeListener, addPropertyChangeListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, getBackground, getBounds, getBounds, getColorModel, getComponentOrientation, getCursor, getDropTarget, getFont, getFontMetrics, getForeground, getGraphics, getHeight, getInputMethodRequests, getLocation, getLocation, getLocationOnScreen, getName, getParent, getPeer, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isDisplayable, isDoubleBuffered, isEnabled, isFocusTraversable, isLightweight, isOpaque, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseEvent, processMouseMotionEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, reshape, resize, resize, setBackground, setBounds, setBounds, setComponentOrientation, setDropTarget, setEnabled, setForeground, setLocale, setLocation, setLocation, setName, setSize, setSize, setVisible, show, size, toString, transferFocus</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from class java.lang.Object</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.awt.MenuContainer"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TD><B>Methods inherited from interface java.awt.MenuContainer</B></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>getFont, postEvent</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="Nav()"><!-- --></A><H3>
+Nav</H3>
+<PRE>
+public <B>Nav</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TD>
+</TR>
+</TABLE>
+
+<A NAME="runMain(java.lang.String[])"><!-- --></A><H3>
+runMain</H3>
+<PRE>
+public void <B>runMain</B>(java.lang.String[]&nbsp;args)</PRE>
+<DL>
+<DD><B>Description copied from class: <CODE><A HREF="Gview.html">Gview</A></CODE></B></DD>
+<DD>defaults settings for runJob, override for different defaults.<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#runMain(java.lang.String[])">runMain</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="main(java.lang.String[])"><!-- --></A><H3>
+main</H3>
+<PRE>
+public static void <B>main</B>(java.lang.String[]&nbsp;args)</PRE>
+<DL>
+<DD>main program</DL>
+<HR>
+
+<A NAME="nextPage()"><!-- --></A><H3>
+nextPage</H3>
+<PRE>
+public void <B>nextPage</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#nextPage()">nextPage</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="prevPage()"><!-- --></A><H3>
+prevPage</H3>
+<PRE>
+public void <B>prevPage</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#prevPage()">prevPage</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="imageIsReady(java.awt.image.BufferedImage)"><!-- --></A><H3>
+imageIsReady</H3>
+<PRE>
+public void <B>imageIsReady</B>(java.awt.image.BufferedImage&nbsp;newImage)</PRE>
+<DL>
+<DD>low res image is ready,
+ if we are not getting the next page
+ start generation of the high res image<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#imageIsReady(java.awt.image.BufferedImage)">imageIsReady</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="translate(int, int)"><!-- --></A><H3>
+translate</H3>
+<PRE>
+protected void <B>translate</B>(int&nbsp;x,
+ int&nbsp;y)</PRE>
+<DL>
+<DD>moves/drags zoomin box and causes regerenation of a new viewport<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#translate(int, int)">translate</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="paint(java.awt.Graphics)"><!-- --></A><H3>
+paint</H3>
+<PRE>
+public void <B>paint</B>(java.awt.Graphics&nbsp;g)</PRE>
+<DL>
+<DD>Paint low res image with red zoom box
+ zoom box uses xor realtime drag.<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#paint(java.awt.Graphics)">paint</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="zoomIn(int, int)"><!-- --></A><H3>
+zoomIn</H3>
+<PRE>
+protected void <B>zoomIn</B>(int&nbsp;x,
+ int&nbsp;y)</PRE>
+<DL>
+<DD>pageView gets regenerated at higher resolution,
+ repaint updates zoomin box.<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#zoomIn(int, int)">zoomIn</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="zoomOut(int, int)"><!-- --></A><H3>
+zoomOut</H3>
+<PRE>
+protected void <B>zoomOut</B>(int&nbsp;x,
+ int&nbsp;y)</PRE>
+<DL>
+<DD>pageView gets regenerated at lower resolution,
+ repaint updates zoomin box.<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#zoomOut(int, int)">zoomOut</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="zoomToRes(float)"><!-- --></A><H3>
+zoomToRes</H3>
+<PRE>
+protected void <B>zoomToRes</B>(float&nbsp;res)</PRE>
+<DL>
+<DD>pageView gets regenerated at requested resolution,
+ repaint updates zoomin box.<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="Gview.html#zoomToRes(float)">zoomToRes</A></CODE> in class <CODE><A HREF="Gview.html">Gview</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="Gview.html"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="Nav.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: &nbsp;<A HREF="#inner_classes_inherited_from_class_javax.swing.JFrame">INNER</A>&nbsp;|&nbsp;<A HREF="#fields_inherited_from_class_Gview">FIELD</A>&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: &nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/overview-tree.html b/tools/viewer/JavaDoc/overview-tree.html
new file mode 100644
index 000000000..0121eddf6
--- /dev/null
+++ b/tools/viewer/JavaDoc/overview-tree.html
@@ -0,0 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Class Hierarchy
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="overview-tree.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For All Packages</H2>
+</CENTER>
+<DL>
+<DT><B>Package Hierarchies: </B><DD><A HREF="package-tree.html"></A></DL>
+<HR>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">class java.lang.Object<UL>
+<LI TYPE="circle">class java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable)
+<UL>
+<LI TYPE="circle">class java.awt.Container<UL>
+<LI TYPE="circle">class java.awt.Window (implements javax.accessibility.Accessible)
+<UL>
+<LI TYPE="circle">class java.awt.Frame (implements java.awt.MenuContainer)
+<UL>
+<LI TYPE="circle">class javax.swing.JFrame (implements javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants)
+<UL>
+<LI TYPE="circle">class <A HREF="Gview.html"><B>Gview</B></A> (implements <A HREF="GpickleObserver.html">GpickleObserver</A>, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener)
+<UL>
+<LI TYPE="circle">class <A HREF="Nav.html"><B>Nav</B></A></UL>
+</UL>
+</UL>
+</UL>
+</UL>
+</UL>
+<LI TYPE="circle">class <A HREF="Gpickle.html"><B>Gpickle</B></A><UL>
+<LI TYPE="circle">class <A HREF="GpickleThread.html"><B>GpickleThread</B></A> (implements java.lang.Runnable)
+</UL>
+</UL>
+</UL>
+<H2>
+Interface Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">interface <A HREF="GpickleObserver.html"><B>GpickleObserver</B></A></UL>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="overview-tree.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/package-frame.html b/tools/viewer/JavaDoc/package-frame.html
new file mode 100644
index 000000000..25533c954
--- /dev/null
+++ b/tools/viewer/JavaDoc/package-frame.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Package
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameTitleFont">
+<A HREF="package-summary.html" TARGET="classFrame"></A></FONT>
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Interfaces</FONT>&nbsp;
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="GpickleObserver.html" TARGET="classFrame"><I>GpickleObserver</I></A></FONT></TD>
+</TR>
+</TABLE>
+
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Classes</FONT>&nbsp;
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="Gpickle.html" TARGET="classFrame">Gpickle</A>
+<BR>
+<A HREF="GpickleThread.html" TARGET="classFrame">GpickleThread</A>
+<BR>
+<A HREF="Gview.html" TARGET="classFrame">Gview</A>
+<BR>
+<A HREF="Nav.html" TARGET="classFrame">Nav</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/package-list b/tools/viewer/JavaDoc/package-list
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/tools/viewer/JavaDoc/package-list
@@ -0,0 +1 @@
+
diff --git a/tools/viewer/JavaDoc/package-summary.html b/tools/viewer/JavaDoc/package-summary.html
new file mode 100644
index 000000000..4b8b8fb60
--- /dev/null
+++ b/tools/viewer/JavaDoc/package-summary.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Package
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Package</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV PACKAGE&nbsp;
+&nbsp;NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="package-summary.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<H2>
+Package
+</H2>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Interface Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="GpickleObserver.html"><I>GpickleObserver</I></A></B></TD>
+<TD>Similar to ImageObserver but for BufferedImage</TD>
+</TR>
+</TABLE>
+&nbsp;
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Class Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="Gpickle.html">Gpickle</A></B></TD>
+<TD>Interface to pcl/pxl interpreter
+ Uses Process to interpret and pipe the results back.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="GpickleThread.html">GpickleThread</A></B></TD>
+<TD>Thread calls Gpickle asking for a page
+ this tread will send the BufferedImage to
+ the registered PickleObserver</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="Gview.html">Gview</A></B></TD>
+<TD>Simple Viewer for PCL and PXL files.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="Nav.html">Nav</A></B></TD>
+<TD>Two window nav + zoomed Viewer for PCL and PXL files.</TD>
+</TR>
+</TABLE>
+&nbsp;
+
+<P>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Package</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV PACKAGE&nbsp;
+&nbsp;NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="package-summary.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/package-tree.html b/tools/viewer/JavaDoc/package-tree.html
new file mode 100644
index 000000000..a88afd376
--- /dev/null
+++ b/tools/viewer/JavaDoc/package-tree.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+: Class Hierarchy
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="package-tree.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For Package
+</H2>
+</CENTER>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">class java.lang.Object<UL>
+<LI TYPE="circle">class java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable)
+<UL>
+<LI TYPE="circle">class java.awt.Container<UL>
+<LI TYPE="circle">class java.awt.Window (implements javax.accessibility.Accessible)
+<UL>
+<LI TYPE="circle">class java.awt.Frame (implements java.awt.MenuContainer)
+<UL>
+<LI TYPE="circle">class javax.swing.JFrame (implements javax.accessibility.Accessible, javax.swing.RootPaneContainer, javax.swing.WindowConstants)
+<UL>
+<LI TYPE="circle">class <A HREF="Gview.html"><B>Gview</B></A> (implements <A HREF="GpickleObserver.html">GpickleObserver</A>, java.awt.event.KeyListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener)
+<UL>
+<LI TYPE="circle">class <A HREF="Nav.html"><B>Nav</B></A></UL>
+</UL>
+</UL>
+</UL>
+</UL>
+</UL>
+<LI TYPE="circle">class <A HREF="Gpickle.html"><B>Gpickle</B></A><UL>
+<LI TYPE="circle">class <A HREF="GpickleThread.html"><B>GpickleThread</B></A> (implements java.lang.Runnable)
+</UL>
+</UL>
+</UL>
+<H2>
+Interface Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">interface <A HREF="GpickleObserver.html"><B>GpickleObserver</B></A></UL>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="package-tree.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/packages.html b/tools/viewer/JavaDoc/packages.html
new file mode 100644
index 000000000..4a8d49ec0
--- /dev/null
+++ b/tools/viewer/JavaDoc/packages.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<BR>
+
+<BR>
+
+<BR>
+<CENTER>
+The front page has been relocated.Please see:
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="index.html">Frame version</A>
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="package-summary.html">Non-frame version.</A></CENTER>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/serialized-form.html b/tools/viewer/JavaDoc/serialized-form.html
new file mode 100644
index 000000000..1b8a726c1
--- /dev/null
+++ b/tools/viewer/JavaDoc/serialized-form.html
@@ -0,0 +1,451 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Nov 14 12:35:31 MST 2001 -->
+<TITLE>
+Serialized Form
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="serialized-form.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<CENTER>
+<H1>
+Serialized Form</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TD ALIGN="center"><FONT SIZE="+2">
+<B>Package</B> <B></B></FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="Gview"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Class <A HREF="Gview.html">Gview</A> implements Serializable</B></FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TD>
+</TR>
+</TABLE>
+
+<H3>
+startingRes</H3>
+<PRE>
+double <B>startingRes</B></PRE>
+<DL>
+<DD>starting resolution
+ 75dpi scales nicely to 300,600,1200
+ 100dpi gives a bigger starting window.
+ 50 or even 25 may be needed for a very large plot on a small memory machine.</DL>
+<HR>
+
+<H3>
+zoomWindowRatio</H3>
+<PRE>
+double <B>zoomWindowRatio</B></PRE>
+<DL>
+<DD>derived classes like: Nav will be 1/zoomWindowRatio in size
+ startingRes = 100; zoomWindowRation = 2;
+ Nav window res is 50.</DL>
+<HR>
+
+<H3>
+enableRTL</H3>
+<PRE>
+boolean <B>enableRTL</B></PRE>
+<DL>
+<DD>enable RTL mode in menu
+ try with low startingRes = 25</DL>
+<HR>
+
+<H3>
+pageNumber</H3>
+<PRE>
+int <B>pageNumber</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+totalPageCount</H3>
+<PRE>
+int <B>totalPageCount</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+currentPage</H3>
+<PRE>
+java.awt.image.BufferedImage <B>currentPage</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+pickle</H3>
+<PRE>
+<A HREF="GpickleThread.html">GpickleThread</A> <B>pickle</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+desiredRes</H3>
+<PRE>
+double <B>desiredRes</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+origRes</H3>
+<PRE>
+double <B>origRes</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+origH</H3>
+<PRE>
+double <B>origH</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+origW</H3>
+<PRE>
+double <B>origW</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+origX</H3>
+<PRE>
+double <B>origX</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+origY</H3>
+<PRE>
+double <B>origY</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+tx</H3>
+<PRE>
+int <B>tx</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+ty</H3>
+<PRE>
+int <B>ty</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+drag</H3>
+<PRE>
+boolean <B>drag</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+chooser</H3>
+<PRE>
+javax.swing.JFileChooser <B>chooser</B></PRE>
+<DL>
+<DD>File open, starts off in users home directory</DL>
+<HR>
+
+<H3>
+popup</H3>
+<PRE>
+java.awt.PopupMenu <B>popup</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuFile</H3>
+<PRE>
+java.awt.Menu <B>menuFile</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuFileOpen</H3>
+<PRE>
+java.awt.MenuItem <B>menuFileOpen</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuFileQuit</H3>
+<PRE>
+java.awt.MenuItem <B>menuFileQuit</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuOpt</H3>
+<PRE>
+java.awt.Menu <B>menuOpt</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuOptRes</H3>
+<PRE>
+java.awt.Menu <B>menuOptRes</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuOptResMinus</H3>
+<PRE>
+java.awt.MenuItem <B>menuOptResMinus</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuOptResPlus</H3>
+<PRE>
+java.awt.MenuItem <B>menuOptResPlus</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuOptTextAntiAlias</H3>
+<PRE>
+java.awt.CheckboxMenuItem <B>menuOptTextAntiAlias</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuOptRTLMode</H3>
+<PRE>
+java.awt.CheckboxMenuItem <B>menuOptRTLMode</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuDPI</H3>
+<PRE>
+java.awt.MenuItem <B>menuDPI</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuZoomIn</H3>
+<PRE>
+java.awt.MenuItem <B>menuZoomIn</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuZoom600</H3>
+<PRE>
+java.awt.MenuItem <B>menuZoom600</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuZoomOut</H3>
+<PRE>
+java.awt.MenuItem <B>menuZoomOut</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuPageNum</H3>
+<PRE>
+java.awt.MenuItem <B>menuPageNum</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuPageDwn</H3>
+<PRE>
+java.awt.MenuItem <B>menuPageDwn</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+menuPageUp</H3>
+<PRE>
+java.awt.MenuItem <B>menuPageUp</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+lastX</H3>
+<PRE>
+int <B>lastX</B></PRE>
+<DL>
+<DD>used to drag translations in realtime</DL>
+<HR>
+
+<H3>
+lastY</H3>
+<PRE>
+int <B>lastY</B></PRE>
+<DL>
+</DL>
+<HR>
+
+<H3>
+newX</H3>
+<PRE>
+int <B>newX</B></PRE>
+<DL>
+<DD>used to drag translations in realtime</DL>
+<HR>
+
+<H3>
+newY</H3>
+<PRE>
+int <B>newY</B></PRE>
+<DL>
+</DL>
+
+<P>
+<A NAME="Nav"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Class <A HREF="Nav.html">Nav</A> implements Serializable</B></FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=1><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TD>
+</TR>
+</TABLE>
+
+<H3>
+pageView</H3>
+<PRE>
+<A HREF="Gview.html">Gview</A> <B>pageView</B></PRE>
+<DL>
+<DD>High resolution window.</DL>
+
+<P>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A> &nbsp;
+&nbsp;<A HREF="serialized-form.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/tools/viewer/JavaDoc/stylesheet.css b/tools/viewer/JavaDoc/stylesheet.css
new file mode 100644
index 000000000..95f576498
--- /dev/null
+++ b/tools/viewer/JavaDoc/stylesheet.css
@@ -0,0 +1,29 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF }
+
+/* Table colors */
+.TableHeadingColor { background: #CCCCFF } /* Dark mauve */
+.TableSubHeadingColor { background: #EEEEFF } /* Light mauve */
+.TableRowColor { background: #FFFFFF } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: normal; font-family: normal }
+.FrameHeadingFont { font-size: normal; font-family: normal }
+.FrameItemFont { font-size: normal; font-family: normal }
+
+/* Example of smaller, sans-serif font in frames */
+/* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color:#EEEEFF;}/* Light mauve */
+.NavBarCell1Rev { background-color:#00008B;}/* Dark Blue */
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+
diff --git a/tools/viewer/Nav.java b/tools/viewer/Nav.java
new file mode 100644
index 000000000..ecdb78897
--- /dev/null
+++ b/tools/viewer/Nav.java
@@ -0,0 +1,180 @@
+/* Portions Copyright (C) 2001 Artifex Software Inc.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.event.*;
+import java.io.File;
+import javax.swing.*;
+import javax.swing.filechooser.*;
+
+/**
+ * Two window nav + zoomed Viewer for PCL and PXL files.
+ *
+ * Usage:
+ * java Nav ../frs96.pxl
+ *
+ * Adds a smaller navigation window coupled to a Gview window.
+ * This allows a small portion of a page to be viewed at high resolution
+ * in the Gview window with navigation occuring via the Nav window.
+ *
+ * Mostly inherits behavior and reflects action on this window and the
+ * Gview zoomed window.
+ *
+ * @version $Revision: 1643 $
+ * @author Stefan Kemper
+ */
+public class Nav extends Gview {
+
+ public Nav() {
+ pageView = new Gview();
+ }
+
+ public void runMain(String[] args) {
+
+ // this window is smaller/lower res, count pages now.
+ runJob(args, startingRes / zoomWindowRatio, true);
+
+ // zoom window is higher res, don't count pages now.
+ pageView.runJob(args, startingRes, false);
+ }
+
+ /** main program */
+ public static void main( String[] args )
+ {
+ Nav view = new Nav();
+
+ if (args.length < 1) {
+ File file = new File("GhostPrinter.pcl");
+ if (file.exists()) {
+ // open demo file
+ args = new String[1];
+ args[0] = new String("GhostPrinter.pcl");
+ }
+ }
+ System.out.print(usage());
+
+ if (args.length < 1) {
+ // no demo file start with file open
+ view.fileOpen();
+ }
+ view.runMain(args);
+ }
+
+ public void nextPage() {
+ pageView.setPage(pageNumber+1);
+ super.nextPage();
+ }
+
+ public void prevPage() {
+ pageView.setPage(pageNumber-1);
+ super.prevPage();
+ }
+
+ /** low res image is ready,
+ * if we are not getting the next page
+ * start generation of the high res image
+ */
+ public void imageIsReady( BufferedImage newImage ) {
+ super.imageIsReady(newImage);
+
+ if (!pickle.busy() && !pageView.pickle.busy()) {
+ pageView.pickle.startProduction(pageNumber);
+ }
+ }
+
+ /** thread counting pages is finished update status display */
+ public void pageCountIsReady( int pageCount ) {
+ setPageCount( pageCount );
+ pageView.setPageCount( pageCount );
+ }
+
+ /** moves/drags zoomin box and causes regerenation of a new viewport
+ */
+ protected void translate(int x, int y) {
+ origX -= x;
+ origY -= y;
+
+ double x1 = origX;
+ double y1 = origY;
+
+ double sfx = desiredRes / origRes;
+ double sfy = desiredRes / origRes;
+
+ double psfx = origX / origW * pageView.origW / pageView.origRes * pageView.desiredRes;
+ double psfy = origY / origH * pageView.origH / pageView.origRes * pageView.desiredRes;
+
+ pageView.translateTo( psfx, psfy );
+ repaint();
+ }
+
+ /** Paint low res image with red zoom box
+ * zoom box uses xor realtime drag.
+ */
+ public void paint( Graphics g )
+ {
+ int h = (int)(origH * pageView.origRes / pageView.desiredRes);
+ int w = (int)(origW * pageView.origRes / pageView.desiredRes);
+ if (drag == true) {
+ g.setXORMode(Color.cyan);
+ g.drawRect((int)lastX, (int)lastY, w, h);
+ g.drawRect((int)newX, (int)newY, w, h);
+ }
+ else {
+ g.setPaintMode();
+ g.drawImage(currentPage, 0, 0, this);
+ g.setColor(Color.red);
+ g.drawRect((int)origX, (int)origY, w, h);
+ }
+ }
+
+ /** pageView gets regenerated at higher resolution,
+ * repaint updates zoomin box.
+ */
+ protected void zoomIn( int x, int y ) {
+
+ double psfx = x / origW * pageView.origW / pageView.origRes * pageView.desiredRes;
+ double psfy = y / origH * pageView.origH / pageView.origRes * pageView.desiredRes;
+ pageView.origX = pageView.origY = 0;
+ pageView.zoomIn((int)psfx,(int)psfy);
+ repaint();
+ }
+
+ /** pageView gets regenerated at lower resolution,
+ * repaint updates zoomin box.
+ */
+ protected void zoomOut( int x, int y ) {
+ double psfx = x / origW * pageView.origW / pageView.origRes * pageView.desiredRes;
+ double psfy = y / origH * pageView.origH / pageView.origRes * pageView.desiredRes;
+ pageView.origX = pageView.origY = 0;
+ pageView.zoomOut(0,0);
+ repaint();
+ }
+
+ /** pageView gets regenerated at requested resolution,
+ * repaint updates zoomin box.
+ */
+ protected void zoomToRes( double res ) {
+ pageView.zoomToRes(res);
+ repaint();
+ }
+
+ /** pageView gets regenerated with the request scalefactor,
+ * repaint updates zoomin box.
+ */
+ protected void zoomFactor( double factor ) {
+ pageView.zoomFactor(factor);
+ repaint();
+ }
+
+ /**
+ * High resolution window.
+ * @link aggregationByValue
+ */
+ private Gview pageView;
+}
diff --git a/tools/viewer/README b/tools/viewer/README
new file mode 100644
index 000000000..0d7d313d5
--- /dev/null
+++ b/tools/viewer/README
@@ -0,0 +1,13 @@
+
+Simple java based viewer - page with page up and page down.
+
+Example:
+
+Unix
+
+java Gview ../frs96.pxl
+
+Dos
+
+java Gview ..\frs96.pxl
+
diff --git a/tools/xps2tiff/README b/tools/xps2tiff/README
new file mode 100755
index 000000000..eaedf6478
--- /dev/null
+++ b/tools/xps2tiff/README
@@ -0,0 +1,10 @@
+xps2tiff converts XPS files to multipage RGB TIFF files using Microsoft's own
+means.
+
+Usage: xps2tiff RESOLUTION_DPI INPUT.XPS OUTPUT.TIFF
+
+The program uses .NET 3.0 Framework and requires Visual Studio 2005
+to compile.
+
+Some sample files allocate over 1GB of memory at 300 dpi resolution.
+Virtual memory appears to work reasonably well.
diff --git a/tools/xps2tiff/xps2tiff.sln b/tools/xps2tiff/xps2tiff.sln
new file mode 100755
index 000000000..0c3c3920b
--- /dev/null
+++ b/tools/xps2tiff/xps2tiff.sln
@@ -0,0 +1,19 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xps2tiff", "xps2tiff\xps2tiff.vcproj", "{D7A2C5AC-5249-4786-A448-CFFC87F5E229}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D7A2C5AC-5249-4786-A448-CFFC87F5E229}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D7A2C5AC-5249-4786-A448-CFFC87F5E229}.Debug|Win32.Build.0 = Debug|Win32
+ {D7A2C5AC-5249-4786-A448-CFFC87F5E229}.Release|Win32.ActiveCfg = Release|Win32
+ {D7A2C5AC-5249-4786-A448-CFFC87F5E229}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/tools/xps2tiff/xps2tiff/AssemblyInfo.cpp b/tools/xps2tiff/xps2tiff/AssemblyInfo.cpp
new file mode 100755
index 000000000..3279e459c
--- /dev/null
+++ b/tools/xps2tiff/xps2tiff/AssemblyInfo.cpp
@@ -0,0 +1,60 @@
+#include "stdafx.h"
+
+#using <mscorlib.dll>
+
+using namespace System::Reflection;
+using namespace System::Runtime::CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly:AssemblyTitleAttribute("")];
+[assembly:AssemblyDescriptionAttribute("")];
+[assembly:AssemblyConfigurationAttribute("")];
+[assembly:AssemblyCompanyAttribute("")];
+[assembly:AssemblyProductAttribute("")];
+[assembly:AssemblyCopyrightAttribute("")];
+[assembly:AssemblyTrademarkAttribute("")];
+[assembly:AssemblyCultureAttribute("")];
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the value or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly:AssemblyVersionAttribute("1.0.*")];
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project directory.
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly:AssemblyDelaySignAttribute(false)];
+[assembly:AssemblyKeyFileAttribute("")];
+[assembly:AssemblyKeyNameAttribute("")];
+
diff --git a/tools/xps2tiff/xps2tiff/stdafx.cpp b/tools/xps2tiff/xps2tiff/stdafx.cpp
new file mode 100755
index 000000000..dc36fd93d
--- /dev/null
+++ b/tools/xps2tiff/xps2tiff/stdafx.cpp
@@ -0,0 +1,7 @@
+// stdafx.cpp : source file that includes just the standard includes
+// xps2tiff.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+
diff --git a/tools/xps2tiff/xps2tiff/stdafx.h b/tools/xps2tiff/xps2tiff/stdafx.h
new file mode 100755
index 000000000..2e20f982b
--- /dev/null
+++ b/tools/xps2tiff/xps2tiff/stdafx.h
@@ -0,0 +1,9 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#include <iostream>
+#include <tchar.h>
+
+// TODO: reference additional headers your program requires here
diff --git a/tools/xps2tiff/xps2tiff/xps2tiff.cpp b/tools/xps2tiff/xps2tiff/xps2tiff.cpp
new file mode 100755
index 000000000..d8cf1eb58
--- /dev/null
+++ b/tools/xps2tiff/xps2tiff/xps2tiff.cpp
@@ -0,0 +1,61 @@
+#include "stdafx.h"
+
+#using <mscorlib.dll>
+
+using namespace System;
+using namespace System::IO;
+using namespace System::Collections::Generic;
+using namespace System::IO::Packaging;
+using namespace System::Xml;
+using namespace System::Windows::Forms;
+using namespace System::Windows::Xps;
+using namespace System::Windows::Xps::Packaging;
+using namespace System::Printing;
+using namespace System::Windows::Documents;
+using namespace System::Windows::Media::Imaging;
+
+
+void SaveXpsPageToBitmap(Int32 res, String ^xpsFileName, String ^tiffFileName)
+{
+ XpsDocument^ xpsDoc = gcnew XpsDocument(xpsFileName, FileAccess::Read);
+
+
+ int pageCount = xpsDoc->GetFixedDocumentSequence()->References[0]->GetDocument(false)->Pages->Count;
+
+ BitmapEncoder ^encoder = gcnew TiffBitmapEncoder(); // Choose type here ie: JpegBitmapEncoder, TiffBitmapEncoder etc.
+
+ // You can get the total page count from docSeq.PageCount
+ for(int pageNum = 0; pageNum < pageCount; pageNum ++)
+ {
+ DocumentPage ^docPage = xpsDoc->GetFixedDocumentSequence()->DocumentPaginator->GetPage(pageNum);
+ BitmapImage ^bitmap = gcnew BitmapImage();
+ RenderTargetBitmap ^renderTarget =
+ gcnew RenderTargetBitmap((int)docPage->Size.Width*res/96,
+ (int)docPage->Size.Height*res/96,
+ res, // WPF (Avalon) units are 96dpi based
+ res,
+ System::Windows::Media::PixelFormats::Pbgra32);
+ renderTarget->Render(docPage->Visual);
+
+ encoder->Frames->Add(BitmapFrame::Create(renderTarget));
+ }
+
+ FileStream ^pageOutStream = gcnew FileStream(tiffFileName, FileMode::Create, FileAccess::Write);
+ encoder->Save(pageOutStream);
+ pageOutStream->Close();
+}
+
+[STAThread]
+int _tmain(int argc, _TCHAR* argv[])
+{
+ if (argc != 4)
+ {
+ Console::WriteLine("Convert XPS files to TIFF");
+ Console::WriteLine("Usage: xps2tiff RESOLUTION INPUT.XPS OUTPUT.TIFF");
+ return 0;
+ }
+
+ SaveXpsPageToBitmap(atoi(argv[1]), %String(argv[2]), %String(argv[3]));
+
+ return 0;
+} \ No newline at end of file
diff --git a/tools/xps2tiff/xps2tiff/xps2tiff.vcproj b/tools/xps2tiff/xps2tiff/xps2tiff.vcproj
new file mode 100755
index 000000000..2cd4730af
--- /dev/null
+++ b/tools/xps2tiff/xps2tiff/xps2tiff.vcproj
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="xps2tiff"
+ ProjectGUID="{D7A2C5AC-5249-4786-A448-CFFC87F5E229}"
+ RootNamespace="xps2tiff"
+ Keyword="ManagedCProj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ ManagedExtensions="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ PreprocessorDefinitions="WIN32;_DEBUG"
+ MinimalRebuild="false"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)\$(ProjectName).exe"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ AssemblyDebug="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ ManagedExtensions="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG"
+ MinimalRebuild="false"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)\$(ProjectName).exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ <AssemblyReference
+ RelativePath="mscorlib.dll"
+ AssemblyName="mscorlib, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=IA64"
+ />
+ <AssemblyReference
+ RelativePath="System.dll"
+ AssemblyName="System, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="System.Data.dll"
+ AssemblyName="System.Data, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=x86"
+ />
+ <AssemblyReference
+ RelativePath="PresentationCore.dll"
+ AssemblyName="PresentationCore, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35, processorArchitecture=IA64"
+ />
+ <AssemblyReference
+ RelativePath="PresentationFramework.dll"
+ AssemblyName="PresentationFramework, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="System.XML.dll"
+ AssemblyName="System.Xml, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="ReachFramework.dll"
+ AssemblyName="ReachFramework, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="System.Printing.dll"
+ AssemblyName="System.Printing, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35, processorArchitecture=IA64"
+ />
+ <AssemblyReference
+ RelativePath="System.Windows.Forms.dll"
+ AssemblyName="System.Windows.Forms, Version=2.0.0.0, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
+ />
+ <AssemblyReference
+ RelativePath="WindowsBase.dll"
+ AssemblyName="WindowsBase, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
+ />
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\AssemblyInfo.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\stdafx.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\xps2tiff.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\stdafx.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/urwfonts/A028-Ext.ttf b/urwfonts/A028-Ext.ttf
new file mode 100644
index 000000000..20f9d7cd0
--- /dev/null
+++ b/urwfonts/A028-Ext.ttf
Binary files differ
diff --git a/urwfonts/A028-Med.ttf b/urwfonts/A028-Med.ttf
new file mode 100644
index 000000000..e176a8674
--- /dev/null
+++ b/urwfonts/A028-Med.ttf
Binary files differ
diff --git a/urwfonts/A030-Bol.ttf b/urwfonts/A030-Bol.ttf
new file mode 100644
index 000000000..8f45df269
--- /dev/null
+++ b/urwfonts/A030-Bol.ttf
Binary files differ
diff --git a/urwfonts/A030-BolIta.ttf b/urwfonts/A030-BolIta.ttf
new file mode 100644
index 000000000..9fe6ec90b
--- /dev/null
+++ b/urwfonts/A030-BolIta.ttf
Binary files differ
diff --git a/urwfonts/A030-Ita.ttf b/urwfonts/A030-Ita.ttf
new file mode 100644
index 000000000..ea6cf4136
--- /dev/null
+++ b/urwfonts/A030-Ita.ttf
Binary files differ
diff --git a/urwfonts/A030-Reg.ttf b/urwfonts/A030-Reg.ttf
new file mode 100644
index 000000000..3cc53fcc6
--- /dev/null
+++ b/urwfonts/A030-Reg.ttf
Binary files differ
diff --git a/urwfonts/AntiqueOlive-Bol.ttf b/urwfonts/AntiqueOlive-Bol.ttf
new file mode 100644
index 000000000..034927f3a
--- /dev/null
+++ b/urwfonts/AntiqueOlive-Bol.ttf
Binary files differ
diff --git a/urwfonts/AntiqueOlive-Ita.ttf b/urwfonts/AntiqueOlive-Ita.ttf
new file mode 100644
index 000000000..5f7b64935
--- /dev/null
+++ b/urwfonts/AntiqueOlive-Ita.ttf
Binary files differ
diff --git a/urwfonts/AntiqueOlive-Reg.ttf b/urwfonts/AntiqueOlive-Reg.ttf
new file mode 100644
index 000000000..18498e50f
--- /dev/null
+++ b/urwfonts/AntiqueOlive-Reg.ttf
Binary files differ
diff --git a/urwfonts/ArtLinePrinter.ttf b/urwfonts/ArtLinePrinter.ttf
new file mode 100644
index 000000000..d9fe2f908
--- /dev/null
+++ b/urwfonts/ArtLinePrinter.ttf
Binary files differ
diff --git a/urwfonts/CenturySchL-Bold.ttf b/urwfonts/CenturySchL-Bold.ttf
new file mode 100644
index 000000000..10a90dc17
--- /dev/null
+++ b/urwfonts/CenturySchL-Bold.ttf
Binary files differ
diff --git a/urwfonts/CenturySchL-BoldItal.ttf b/urwfonts/CenturySchL-BoldItal.ttf
new file mode 100644
index 000000000..8c1057140
--- /dev/null
+++ b/urwfonts/CenturySchL-BoldItal.ttf
Binary files differ
diff --git a/urwfonts/CenturySchL-Ital.ttf b/urwfonts/CenturySchL-Ital.ttf
new file mode 100644
index 000000000..f42c672da
--- /dev/null
+++ b/urwfonts/CenturySchL-Ital.ttf
Binary files differ
diff --git a/urwfonts/CenturySchL-Roma.ttf b/urwfonts/CenturySchL-Roma.ttf
new file mode 100644
index 000000000..769e3f9e4
--- /dev/null
+++ b/urwfonts/CenturySchL-Roma.ttf
Binary files differ
diff --git a/urwfonts/ClarendonURW-BolCon.ttf b/urwfonts/ClarendonURW-BolCon.ttf
new file mode 100644
index 000000000..22938128a
--- /dev/null
+++ b/urwfonts/ClarendonURW-BolCon.ttf
Binary files differ
diff --git a/urwfonts/Coronet.ttf b/urwfonts/Coronet.ttf
new file mode 100644
index 000000000..81ba6d037
--- /dev/null
+++ b/urwfonts/Coronet.ttf
Binary files differ
diff --git a/urwfonts/Dingbats.ttf b/urwfonts/Dingbats.ttf
new file mode 100644
index 000000000..42cf8f64a
--- /dev/null
+++ b/urwfonts/Dingbats.ttf
Binary files differ
diff --git a/urwfonts/GaramondNo8-Ita.ttf b/urwfonts/GaramondNo8-Ita.ttf
new file mode 100644
index 000000000..a5d6369fa
--- /dev/null
+++ b/urwfonts/GaramondNo8-Ita.ttf
Binary files differ
diff --git a/urwfonts/GaramondNo8-Med.ttf b/urwfonts/GaramondNo8-Med.ttf
new file mode 100644
index 000000000..f3a6f9a09
--- /dev/null
+++ b/urwfonts/GaramondNo8-Med.ttf
Binary files differ
diff --git a/urwfonts/GaramondNo8-MedIta.ttf b/urwfonts/GaramondNo8-MedIta.ttf
new file mode 100644
index 000000000..1476b18b9
--- /dev/null
+++ b/urwfonts/GaramondNo8-MedIta.ttf
Binary files differ
diff --git a/urwfonts/GaramondNo8-Reg.ttf b/urwfonts/GaramondNo8-Reg.ttf
new file mode 100644
index 000000000..ee8d65e9f
--- /dev/null
+++ b/urwfonts/GaramondNo8-Reg.ttf
Binary files differ
diff --git a/urwfonts/LetterGothic-Bol.ttf b/urwfonts/LetterGothic-Bol.ttf
new file mode 100644
index 000000000..ddbcda013
--- /dev/null
+++ b/urwfonts/LetterGothic-Bol.ttf
Binary files differ
diff --git a/urwfonts/LetterGothic-BolIta.ttf b/urwfonts/LetterGothic-BolIta.ttf
new file mode 100644
index 000000000..d7556457a
--- /dev/null
+++ b/urwfonts/LetterGothic-BolIta.ttf
Binary files differ
diff --git a/urwfonts/LetterGothic-Ita.ttf b/urwfonts/LetterGothic-Ita.ttf
new file mode 100644
index 000000000..3e3bf6a87
--- /dev/null
+++ b/urwfonts/LetterGothic-Ita.ttf
Binary files differ
diff --git a/urwfonts/LetterGothic-Reg.ttf b/urwfonts/LetterGothic-Reg.ttf
new file mode 100644
index 000000000..a4d3b7b69
--- /dev/null
+++ b/urwfonts/LetterGothic-Reg.ttf
Binary files differ
diff --git a/urwfonts/Mauritius-Reg.ttf b/urwfonts/Mauritius-Reg.ttf
new file mode 100644
index 000000000..a2b706e27
--- /dev/null
+++ b/urwfonts/Mauritius-Reg.ttf
Binary files differ
diff --git a/urwfonts/NimbusMonL-Bold.ttf b/urwfonts/NimbusMonL-Bold.ttf
new file mode 100644
index 000000000..49b686c76
--- /dev/null
+++ b/urwfonts/NimbusMonL-Bold.ttf
Binary files differ
diff --git a/urwfonts/NimbusMonL-BoldObli.ttf b/urwfonts/NimbusMonL-BoldObli.ttf
new file mode 100644
index 000000000..249cde998
--- /dev/null
+++ b/urwfonts/NimbusMonL-BoldObli.ttf
Binary files differ
diff --git a/urwfonts/NimbusMonL-Regu.ttf b/urwfonts/NimbusMonL-Regu.ttf
new file mode 100644
index 000000000..4ccd79fbb
--- /dev/null
+++ b/urwfonts/NimbusMonL-Regu.ttf
Binary files differ
diff --git a/urwfonts/NimbusMonL-ReguObli.ttf b/urwfonts/NimbusMonL-ReguObli.ttf
new file mode 100644
index 000000000..5d6981505
--- /dev/null
+++ b/urwfonts/NimbusMonL-ReguObli.ttf
Binary files differ
diff --git a/urwfonts/NimbusMono-Bol.ttf b/urwfonts/NimbusMono-Bol.ttf
new file mode 100644
index 000000000..e32097a6f
--- /dev/null
+++ b/urwfonts/NimbusMono-Bol.ttf
Binary files differ
diff --git a/urwfonts/NimbusMono-BolIta.ttf b/urwfonts/NimbusMono-BolIta.ttf
new file mode 100644
index 000000000..82b0b3c98
--- /dev/null
+++ b/urwfonts/NimbusMono-BolIta.ttf
Binary files differ
diff --git a/urwfonts/NimbusMono-Ita.ttf b/urwfonts/NimbusMono-Ita.ttf
new file mode 100644
index 000000000..625e9a18d
--- /dev/null
+++ b/urwfonts/NimbusMono-Ita.ttf
Binary files differ
diff --git a/urwfonts/NimbusMono-Reg.ttf b/urwfonts/NimbusMono-Reg.ttf
new file mode 100644
index 000000000..415e5159e
--- /dev/null
+++ b/urwfonts/NimbusMono-Reg.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomNo9L-Medi.ttf b/urwfonts/NimbusRomNo9L-Medi.ttf
new file mode 100644
index 000000000..2986c6345
--- /dev/null
+++ b/urwfonts/NimbusRomNo9L-Medi.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomNo9L-MediItal.ttf b/urwfonts/NimbusRomNo9L-MediItal.ttf
new file mode 100644
index 000000000..40f2eb822
--- /dev/null
+++ b/urwfonts/NimbusRomNo9L-MediItal.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomNo9L-Regu.ttf b/urwfonts/NimbusRomNo9L-Regu.ttf
new file mode 100644
index 000000000..8e31154d4
--- /dev/null
+++ b/urwfonts/NimbusRomNo9L-Regu.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomNo9L-ReguItal.ttf b/urwfonts/NimbusRomNo9L-ReguItal.ttf
new file mode 100644
index 000000000..a4c847406
--- /dev/null
+++ b/urwfonts/NimbusRomNo9L-ReguItal.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo4-Bol.ttf b/urwfonts/NimbusRomanNo4-Bol.ttf
new file mode 100644
index 000000000..3dd56b675
--- /dev/null
+++ b/urwfonts/NimbusRomanNo4-Bol.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo4-BolIta.ttf b/urwfonts/NimbusRomanNo4-BolIta.ttf
new file mode 100644
index 000000000..a23629c59
--- /dev/null
+++ b/urwfonts/NimbusRomanNo4-BolIta.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo4-Lig.ttf b/urwfonts/NimbusRomanNo4-Lig.ttf
new file mode 100644
index 000000000..6923d7542
--- /dev/null
+++ b/urwfonts/NimbusRomanNo4-Lig.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo4-LigIta.ttf b/urwfonts/NimbusRomanNo4-LigIta.ttf
new file mode 100644
index 000000000..b6ebcb071
--- /dev/null
+++ b/urwfonts/NimbusRomanNo4-LigIta.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo9-Ita.ttf b/urwfonts/NimbusRomanNo9-Ita.ttf
new file mode 100644
index 000000000..ce6868599
--- /dev/null
+++ b/urwfonts/NimbusRomanNo9-Ita.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo9-Med.ttf b/urwfonts/NimbusRomanNo9-Med.ttf
new file mode 100644
index 000000000..5f1715406
--- /dev/null
+++ b/urwfonts/NimbusRomanNo9-Med.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo9-MedIta.ttf b/urwfonts/NimbusRomanNo9-MedIta.ttf
new file mode 100644
index 000000000..64f993c9b
--- /dev/null
+++ b/urwfonts/NimbusRomanNo9-MedIta.ttf
Binary files differ
diff --git a/urwfonts/NimbusRomanNo9-Reg.ttf b/urwfonts/NimbusRomanNo9-Reg.ttf
new file mode 100644
index 000000000..0bf334fe3
--- /dev/null
+++ b/urwfonts/NimbusRomanNo9-Reg.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-Bold.ttf b/urwfonts/NimbusSanL-Bold.ttf
new file mode 100644
index 000000000..5b8f08438
--- /dev/null
+++ b/urwfonts/NimbusSanL-Bold.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-BoldCond.ttf b/urwfonts/NimbusSanL-BoldCond.ttf
new file mode 100644
index 000000000..2a192029d
--- /dev/null
+++ b/urwfonts/NimbusSanL-BoldCond.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-BoldCondItal.ttf b/urwfonts/NimbusSanL-BoldCondItal.ttf
new file mode 100644
index 000000000..aa3c10193
--- /dev/null
+++ b/urwfonts/NimbusSanL-BoldCondItal.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-BoldItal.ttf b/urwfonts/NimbusSanL-BoldItal.ttf
new file mode 100644
index 000000000..eb6522180
--- /dev/null
+++ b/urwfonts/NimbusSanL-BoldItal.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-Regu.ttf b/urwfonts/NimbusSanL-Regu.ttf
new file mode 100644
index 000000000..1f2f8ca09
--- /dev/null
+++ b/urwfonts/NimbusSanL-Regu.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-ReguCond.ttf b/urwfonts/NimbusSanL-ReguCond.ttf
new file mode 100644
index 000000000..523e7734e
--- /dev/null
+++ b/urwfonts/NimbusSanL-ReguCond.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-ReguCondItal.ttf b/urwfonts/NimbusSanL-ReguCondItal.ttf
new file mode 100644
index 000000000..6d0dab298
--- /dev/null
+++ b/urwfonts/NimbusSanL-ReguCondItal.ttf
Binary files differ
diff --git a/urwfonts/NimbusSanL-ReguItal.ttf b/urwfonts/NimbusSanL-ReguItal.ttf
new file mode 100644
index 000000000..21e64191a
--- /dev/null
+++ b/urwfonts/NimbusSanL-ReguItal.ttf
Binary files differ
diff --git a/urwfonts/StandardSymL.ttf b/urwfonts/StandardSymL.ttf
new file mode 100644
index 000000000..633491e2b
--- /dev/null
+++ b/urwfonts/StandardSymL.ttf
Binary files differ
diff --git a/urwfonts/U001-Bol.ttf b/urwfonts/U001-Bol.ttf
new file mode 100644
index 000000000..f9926ee07
--- /dev/null
+++ b/urwfonts/U001-Bol.ttf
Binary files differ
diff --git a/urwfonts/U001-BolIta.ttf b/urwfonts/U001-BolIta.ttf
new file mode 100644
index 000000000..681c4f775
--- /dev/null
+++ b/urwfonts/U001-BolIta.ttf
Binary files differ
diff --git a/urwfonts/U001-Ita.ttf b/urwfonts/U001-Ita.ttf
new file mode 100644
index 000000000..c14071850
--- /dev/null
+++ b/urwfonts/U001-Ita.ttf
Binary files differ
diff --git a/urwfonts/U001-Reg.ttf b/urwfonts/U001-Reg.ttf
new file mode 100644
index 000000000..5d2443ea0
--- /dev/null
+++ b/urwfonts/U001-Reg.ttf
Binary files differ
diff --git a/urwfonts/U001Con-Bol.ttf b/urwfonts/U001Con-Bol.ttf
new file mode 100644
index 000000000..0ce69bc54
--- /dev/null
+++ b/urwfonts/U001Con-Bol.ttf
Binary files differ
diff --git a/urwfonts/U001Con-BolIta.ttf b/urwfonts/U001Con-BolIta.ttf
new file mode 100644
index 000000000..98d7a6dd1
--- /dev/null
+++ b/urwfonts/U001Con-BolIta.ttf
Binary files differ
diff --git a/urwfonts/U001Con-Ita.ttf b/urwfonts/U001Con-Ita.ttf
new file mode 100644
index 000000000..895cdd052
--- /dev/null
+++ b/urwfonts/U001Con-Ita.ttf
Binary files differ
diff --git a/urwfonts/U001Con-Reg.ttf b/urwfonts/U001Con-Reg.ttf
new file mode 100644
index 000000000..04ee8c5c2
--- /dev/null
+++ b/urwfonts/U001Con-Reg.ttf
Binary files differ
diff --git a/urwfonts/URWBookmanL-DemiBold.ttf b/urwfonts/URWBookmanL-DemiBold.ttf
new file mode 100644
index 000000000..667754398
--- /dev/null
+++ b/urwfonts/URWBookmanL-DemiBold.ttf
Binary files differ
diff --git a/urwfonts/URWBookmanL-DemiBoldItal.ttf b/urwfonts/URWBookmanL-DemiBoldItal.ttf
new file mode 100644
index 000000000..1a91c525f
--- /dev/null
+++ b/urwfonts/URWBookmanL-DemiBoldItal.ttf
Binary files differ
diff --git a/urwfonts/URWBookmanL-Ligh.ttf b/urwfonts/URWBookmanL-Ligh.ttf
new file mode 100644
index 000000000..56b559e82
--- /dev/null
+++ b/urwfonts/URWBookmanL-Ligh.ttf
Binary files differ
diff --git a/urwfonts/URWBookmanL-LighItal.ttf b/urwfonts/URWBookmanL-LighItal.ttf
new file mode 100644
index 000000000..5e1bad13e
--- /dev/null
+++ b/urwfonts/URWBookmanL-LighItal.ttf
Binary files differ
diff --git a/urwfonts/URWChanceryL-MediItal.ttf b/urwfonts/URWChanceryL-MediItal.ttf
new file mode 100644
index 000000000..ba0462a8c
--- /dev/null
+++ b/urwfonts/URWChanceryL-MediItal.ttf
Binary files differ
diff --git a/urwfonts/URWClassico-Bol.ttf b/urwfonts/URWClassico-Bol.ttf
new file mode 100644
index 000000000..326e81c4c
--- /dev/null
+++ b/urwfonts/URWClassico-Bol.ttf
Binary files differ
diff --git a/urwfonts/URWClassico-BolIta.ttf b/urwfonts/URWClassico-BolIta.ttf
new file mode 100644
index 000000000..d4556ece5
--- /dev/null
+++ b/urwfonts/URWClassico-BolIta.ttf
Binary files differ
diff --git a/urwfonts/URWClassico-Ita.ttf b/urwfonts/URWClassico-Ita.ttf
new file mode 100644
index 000000000..daad86523
--- /dev/null
+++ b/urwfonts/URWClassico-Ita.ttf
Binary files differ
diff --git a/urwfonts/URWClassico-Reg.ttf b/urwfonts/URWClassico-Reg.ttf
new file mode 100644
index 000000000..17ab7749a
--- /dev/null
+++ b/urwfonts/URWClassico-Reg.ttf
Binary files differ
diff --git a/urwfonts/URWGothicL-Book.ttf b/urwfonts/URWGothicL-Book.ttf
new file mode 100644
index 000000000..2ffa4356e
--- /dev/null
+++ b/urwfonts/URWGothicL-Book.ttf
Binary files differ
diff --git a/urwfonts/URWGothicL-BookObli.ttf b/urwfonts/URWGothicL-BookObli.ttf
new file mode 100644
index 000000000..3dae8ecf5
--- /dev/null
+++ b/urwfonts/URWGothicL-BookObli.ttf
Binary files differ
diff --git a/urwfonts/URWGothicL-Demi.ttf b/urwfonts/URWGothicL-Demi.ttf
new file mode 100644
index 000000000..debb233de
--- /dev/null
+++ b/urwfonts/URWGothicL-Demi.ttf
Binary files differ
diff --git a/urwfonts/URWGothicL-DemiObli.ttf b/urwfonts/URWGothicL-DemiObli.ttf
new file mode 100644
index 000000000..78c7d2da1
--- /dev/null
+++ b/urwfonts/URWGothicL-DemiObli.ttf
Binary files differ
diff --git a/urwfonts/URWPalladioL-Bold.ttf b/urwfonts/URWPalladioL-Bold.ttf
new file mode 100644
index 000000000..879a974c0
--- /dev/null
+++ b/urwfonts/URWPalladioL-Bold.ttf
Binary files differ
diff --git a/urwfonts/URWPalladioL-BoldItal.ttf b/urwfonts/URWPalladioL-BoldItal.ttf
new file mode 100644
index 000000000..3ec300373
--- /dev/null
+++ b/urwfonts/URWPalladioL-BoldItal.ttf
Binary files differ
diff --git a/urwfonts/URWPalladioL-Ital.ttf b/urwfonts/URWPalladioL-Ital.ttf
new file mode 100644
index 000000000..c26381712
--- /dev/null
+++ b/urwfonts/URWPalladioL-Ital.ttf
Binary files differ
diff --git a/urwfonts/URWPalladioL-Roma.ttf b/urwfonts/URWPalladioL-Roma.ttf
new file mode 100644
index 000000000..7558fa070
--- /dev/null
+++ b/urwfonts/URWPalladioL-Roma.ttf
Binary files differ
diff --git a/urwfonts/WingSub.ttf b/urwfonts/WingSub.ttf
new file mode 100644
index 000000000..91b868e23
--- /dev/null
+++ b/urwfonts/WingSub.ttf
Binary files differ
diff --git a/wts_dump_0 b/wts_dump_0
new file mode 100644
index 000000000..e312bec5b
--- /dev/null
+++ b/wts_dump_0
Binary files differ
diff --git a/wts_plane_0 b/wts_plane_0
new file mode 100644
index 000000000..e312bec5b
--- /dev/null
+++ b/wts_plane_0
Binary files differ
diff --git a/wts_plane_1 b/wts_plane_1
new file mode 100644
index 000000000..96250f2fb
--- /dev/null
+++ b/wts_plane_1
Binary files differ
diff --git a/wts_plane_2 b/wts_plane_2
new file mode 100644
index 000000000..d8f88401b
--- /dev/null
+++ b/wts_plane_2
Binary files differ
diff --git a/wts_plane_3 b/wts_plane_3
new file mode 100644
index 000000000..3eee12838
--- /dev/null
+++ b/wts_plane_3
Binary files differ
diff --git a/xps/TODO b/xps/TODO
new file mode 100644
index 000000000..95e1a76a8
--- /dev/null
+++ b/xps/TODO
@@ -0,0 +1,19 @@
+High Priority Problems
+======================
+
+Font style simulation.
+ICC profile colorspaces.
+Gradient colorspace conversion.
+
+Low Priority Problems
+=====================
+
+Cap styles for different parts of a line
+can be different in XPS, no support exists
+in ghostscript.
+
+WMPhoto images need a decoder and colorspace
+support.
+
+PrintTickets need to be looked into.
+
diff --git a/xps/ghostxps.h b/xps/ghostxps.h
new file mode 100644
index 000000000..f6939db86
--- /dev/null
+++ b/xps/ghostxps.h
@@ -0,0 +1,392 @@
+#include "memory_.h"
+#include "math_.h"
+
+#include <stdlib.h>
+#include <ctype.h> /* for toupper() */
+
+#include "gsgc.h"
+#include "gstypes.h"
+#include "gsstate.h"
+#include "gsmatrix.h"
+#include "gscoord.h"
+#include "gsmemory.h"
+#include "gsparam.h"
+#include "gsdevice.h"
+#include "scommon.h"
+#include "gserror.h"
+#include "gserrors.h"
+#include "gspaint.h"
+#include "gspath.h"
+#include "gsimage.h"
+#include "gscspace.h"
+#include "gsptype1.h"
+#include "gscolor2.h"
+#include "gscolor3.h"
+#include "gsutil.h"
+#include "gsicc.h"
+
+#include "gstrans.h"
+
+#include "gxpath.h" /* gsshade.h depends on it */
+#include "gxfixed.h" /* gsshade.h depends on it */
+#include "gxmatrix.h" /* gxtype1.h depends on it */
+#include "gsshade.h"
+#include "gsfunc.h"
+#include "gsfunc3.h" /* we use stitching and exponential interp */
+
+#include "gxfont.h"
+#include "gxchar.h"
+#include "gxtype1.h"
+#include "gxfont1.h"
+#include "gxfont42.h"
+#include "gxfcache.h"
+#include "gxistate.h"
+
+#include "gzstate.h"
+#include "gzpath.h"
+
+#include "zlib.h"
+
+/* override the debug printfs */
+#ifndef DEBUG
+#undef _dpl
+#define _dpl
+#undef dpf
+#define dpf
+#endif
+
+#ifndef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef ABS
+#define ABS(a) ((a) < 0 ? -(a) : (a))
+#endif
+
+/*
+ * Forward declarations.
+ */
+
+typedef struct xps_context_s xps_context_t;
+
+typedef struct xps_part_s xps_part_t;
+typedef struct xps_type_map_s xps_type_map_t;
+typedef struct xps_relation_s xps_relation_t;
+typedef struct xps_document_s xps_document_t;
+typedef struct xps_page_s xps_page_t;
+
+typedef struct xps_item_s xps_item_t;
+typedef struct xps_font_s xps_font_t;
+typedef struct xps_image_s xps_image_t;
+typedef struct xps_resource_s xps_resource_t;
+typedef struct xps_glyph_metrics_s xps_glyph_metrics_t;
+
+/*
+ * Context and memory.
+ */
+
+#if (defined(_MSC_VER) && _MSC_VER < 1310) || !defined(__GNUC__)
+/* Provide a fallback if this symbol is unsupported */
+#define __FUNCTION__ "ghostxps"
+#endif
+
+#define xps_alloc(ctx, size) \
+ ((void*)gs_alloc_bytes(ctx->memory, size, __FUNCTION__));
+#define xps_realloc(ctx, ptr, size) \
+ gs_resize_object(ctx->memory, ptr, size, __FUNCTION__);
+#define xps_strdup(ctx, str) \
+ xps_strdup_imp(ctx, str, __FUNCTION__);
+#define xps_free(ctx, ptr) \
+ gs_free_object(ctx->memory, ptr, __FUNCTION__);
+
+size_t xps_strlcpy(char *destination, const char *source, size_t size);
+size_t xps_strlcat(char *destination, const char *source, size_t size);
+
+int xps_strcasecmp(char *a, char *b);
+char *xps_strdup_imp(xps_context_t *ctx, const char *str, const char *function);
+char *xps_clean_path(char *name);
+void xps_absolute_path(char *output, char *pwd, char *path);
+
+/* end of page device callback foo */
+int xps_show_page(xps_context_t *ctx, int num_copies, int flush);
+
+int xps_utf8_to_ucs(int *p, const char *s, int n);
+
+unsigned int xps_crc32(unsigned int crc, unsigned char *buf, int n);
+
+/*
+ * Packages, parts and relations.
+ */
+
+int xps_process_data(xps_context_t *ctx, stream_cursor_read *buf);
+int xps_process_part(xps_context_t *ctx, xps_part_t *part);
+
+struct xps_type_map_s
+{
+ char *name;
+ char *type;
+ xps_type_map_t *left;
+ xps_type_map_t *right;
+};
+
+struct xps_relation_s
+{
+ char *target;
+ char *type;
+ xps_relation_t *next;
+};
+
+struct xps_document_s
+{
+ char *name;
+ xps_document_t *next;
+};
+
+struct xps_page_s
+{
+ char *name;
+ int width;
+ int height;
+ xps_page_t *next;
+};
+
+struct xps_context_s
+{
+ void *instance;
+ gs_memory_t *memory;
+ gs_state *pgs;
+ gs_font_dir *fontdir;
+
+ gs_color_space *gray;
+ gs_color_space *srgb;
+ gs_color_space *scrgb;
+ gs_color_space *cmyk;
+
+ xps_part_t *first_part;
+ xps_part_t *last_part;
+
+ xps_type_map_t *defaults;
+ xps_type_map_t *overrides;
+
+ char *start_part; /* fixed document sequence */
+ xps_document_t *first_fixdoc; /* first fixed document */
+ xps_document_t *last_fixdoc; /* last fixed document */
+
+ xps_page_t *first_page; /* first page of document */
+ xps_page_t *last_page; /* last page of document */
+ xps_page_t *next_page; /* next page to process when its resources are completed */
+
+ unsigned int zip_state;
+ unsigned int zip_version;
+ unsigned int zip_general;
+ unsigned int zip_method;
+ unsigned int zip_name_length;
+ unsigned int zip_extra_length;
+ unsigned int zip_compressed_size;
+ unsigned int zip_uncompressed_size;
+ z_stream zip_stream;
+ char zip_file_name[2048];
+
+ char pwd[1024]; /* directory name of xml part being processed */
+ char *state; /* temporary state for various processing */
+
+ int use_transparency; /* global toggle for transparency */
+
+ /* Hack to workaround ghostscript's lack of understanding
+ * the pdf 1.4 specification of Alpha only transparency groups.
+ * We have to force all colors to be white whenever we are computing
+ * opacity masks.
+ */
+ int opacity_only;
+
+ /* The fill_rule is set by path parsing.
+ * It is used by clip/fill functions.
+ * 1=nonzero, 0=evenodd
+ */
+ int fill_rule;
+
+ /* We often need the bounding box for the current
+ * area of the page affected by drawing operations.
+ * We keep these bounds updated every time we
+ * clip. The coordinates are in device space.
+ */
+ gs_rect bounds;
+};
+
+struct xps_part_s
+{
+ char *name;
+ int size;
+ int interleave; /* start of last interleave (for crc32 reasons) */
+ int capacity;
+ int complete;
+ char *data;
+ xps_relation_t *relations;
+ int relations_complete; /* is corresponding .rels part finished? */
+ xps_part_t *next;
+
+ xps_font_t *font; /* parsed font resource */
+ xps_image_t *image; /* parsed and decoded image resource */
+ gs_color_space *icc; /* parsed icc profile resource */
+
+ int deobfuscated; /* have we deobfuscated the font data? */
+};
+
+xps_part_t *xps_new_part(xps_context_t *ctx, char *name, int capacity);
+xps_part_t *xps_find_part(xps_context_t *ctx, char *name);
+void xps_free_part(xps_context_t *ctx, xps_part_t *part);
+void xps_free_part_caches(xps_context_t *ctx, xps_part_t *part);
+
+int xps_add_relation(xps_context_t *ctx, char *source, char *target, char *type);
+
+char *xps_get_content_type(xps_context_t *ctx, char *partname);
+
+void xps_free_type_map(xps_context_t *ctx, xps_type_map_t *node);
+void xps_free_relations(xps_context_t *ctx, xps_relation_t *node);
+void xps_free_fixed_pages(xps_context_t *ctx);
+void xps_free_fixed_documents(xps_context_t *ctx);
+
+/*
+ * Various resources.
+ */
+
+/* type for the information derived directly from the raster file format */
+
+enum { XPS_GRAY, XPS_GRAY_A, XPS_RGB, XPS_RGB_A, XPS_CMYK, XPS_CMYK_A };
+
+struct xps_image_s
+{
+ int width;
+ int height;
+ int stride;
+ int colorspace;
+ int comps;
+ int bits;
+ int xres;
+ int yres;
+ byte *samples;
+ byte *alpha; /* isolated alpha plane */
+};
+
+int xps_decode_jpeg(gs_memory_t *mem, byte *rbuf, int rlen, xps_image_t *image);
+int xps_decode_png(gs_memory_t *mem, byte *rbuf, int rlen, xps_image_t *image);
+int xps_decode_tiff(gs_memory_t *mem, byte *rbuf, int rlen, xps_image_t *image);
+int xps_decode_hdphoto(gs_memory_t *mem, byte *buf, int len, xps_image_t *image);
+
+/*
+ * Fonts.
+ */
+
+struct xps_font_s
+{
+ byte *data;
+ int length;
+ gs_font *font;
+
+ int subfontid;
+ int cmaptable;
+ int cmapsubcount;
+ int cmapsubtable;
+ int usepua;
+
+ /* these are for CFF opentypes only */
+ byte *cffdata;
+ byte *cffend;
+ byte *gsubrs;
+ byte *subrs;
+ byte *charstrings;
+};
+
+struct xps_glyph_metrics_s
+{
+ float hadv, vadv, vorg;
+};
+
+
+int xps_init_font_cache(xps_context_t *ctx);
+
+xps_font_t *xps_new_font(xps_context_t *ctx, char *buf, int buflen, int index);
+void xps_free_font(xps_context_t *ctx, xps_font_t *font);
+
+int xps_count_font_encodings(xps_font_t *font);
+int xps_identify_font_encoding(xps_font_t *font, int idx, int *pid, int *eid);
+int xps_select_font_encoding(xps_font_t *font, int idx);
+int xps_encode_font_char(xps_font_t *font, int key);
+
+int xps_measure_font_glyph(xps_context_t *ctx, xps_font_t *font, int gid, xps_glyph_metrics_t *mtx);
+int xps_draw_font_glyph_to_path(xps_context_t *ctx, xps_font_t *font, int gid, float x, float y);
+int xps_fill_font_glyph(xps_context_t *ctx, xps_font_t *font, int gid, float x, float y);
+
+int xps_find_sfnt_table(xps_font_t *font, char *name, int *lengthp);
+int xps_load_sfnt_cmap(xps_font_t *font);
+int xps_load_sfnt_name(xps_font_t *font, char *namep);
+int xps_init_truetype_font(xps_context_t *ctx, xps_font_t *font);
+int xps_init_postscript_font(xps_context_t *ctx, xps_font_t *font);
+
+/*
+ * XML and content.
+ */
+
+xps_item_t * xps_parse_xml(xps_context_t *ctx, char *buf, int len);
+xps_item_t * xps_next(xps_item_t *item);
+xps_item_t * xps_down(xps_item_t *item);
+void xps_free_item(xps_context_t *ctx, xps_item_t *item);
+char * xps_tag(xps_item_t *item);
+char * xps_att(xps_item_t *item, const char *att);
+
+int xps_parse_fixed_page(xps_context_t *ctx, xps_part_t *part);
+int xps_parse_canvas(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_path(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_glyphs(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_solid_color_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_image_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_visual_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_linear_gradient_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_radial_gradient_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+
+void xps_free_image(xps_context_t *ctx, xps_image_t *image);
+
+int xps_parse_tiling_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root,
+ int (*func)(xps_context_t*, xps_resource_t*, xps_item_t*, void*), void *user);
+
+void xps_parse_matrix_transform(xps_context_t *ctx, xps_item_t *root, gs_matrix *matrix);
+void xps_parse_render_transform(xps_context_t *ctx, char *text, gs_matrix *matrix);
+void xps_parse_rectangle(xps_context_t *ctx, char *text, gs_rect *rect);
+int xps_parse_abbreviated_geometry(xps_context_t *ctx, char *geom);
+int xps_parse_path_geometry(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root, int stroking);
+
+int xps_begin_opacity(xps_context_t *ctx, xps_resource_t *dict, char *opacity_att, xps_item_t *opacity_mask_tag);
+int xps_end_opacity(xps_context_t *ctx, xps_resource_t *dict, char *opacity_att, xps_item_t *opacity_mask_tag);
+
+int xps_parse_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+int xps_parse_element(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node);
+
+int xps_clip(xps_context_t *ctx, gs_rect *saved_bounds);
+int xps_unclip(xps_context_t *ctx, gs_rect *saved_bounds);
+int xps_fill(xps_context_t *ctx);
+void xps_bounds_in_user_space(xps_context_t *ctx, gs_rect *user);
+
+int xps_parse_color(xps_context_t *ctx, char *hexstring, gs_color_space **csp, float *samples);
+int xps_set_color(xps_context_t *ctx, gs_color_space *colorspace, float *samples);
+int xps_parse_icc_profile(xps_context_t *ctx, gs_color_space **csp, byte *data, int length, int ncomp);
+
+/*
+ * Static XML resources.
+ */
+
+struct xps_resource_s
+{
+ char *name;
+ xps_item_t *data;
+ xps_resource_t *next;
+ xps_resource_t *parent; /* up to the previous dict in the stack */
+};
+
+xps_resource_t *xps_parse_remote_resource_dictionary(xps_context_t *ctx, char *name);
+xps_resource_t *xps_parse_resource_dictionary(xps_context_t *ctx, xps_item_t *root);
+void xps_free_resource_dictionary(xps_context_t *ctx, xps_resource_t *dict);
+xps_item_t *xps_parse_resource_reference(xps_context_t *ctx, xps_resource_t *dict, char *att);
+int xps_resolve_resource_reference(xps_context_t *ctx, xps_resource_t *dict, char **attp, xps_item_t **tagp);
+
diff --git a/xps/xps.mak b/xps/xps.mak
new file mode 100644
index 000000000..21b384fbe
--- /dev/null
+++ b/xps/xps.mak
@@ -0,0 +1,136 @@
+XPSSRC = $(XPSSRCDIR)$(D)
+XPSGEN = $(XPSGENDIR)$(D)
+XPSOBJ = $(XPSOBJDIR)$(D)
+XPSO_ = $(O_)$(XPSOBJ)
+EXPATINCDIR = $(EXPATSRCDIR)$(D)lib
+PLOBJ = $(PLOBJDIR)$(D)
+
+XPSCCC = $(CC_) $(I_)$(XPSSRCDIR)$(_I) $(I_)$(XPSGENDIR)$(_I) $(I_)$(PLSRCDIR)$(_I) $(I_)$(GLSRCDIR)$(_I) $(I_)$(EXPATINCDIR)$(_I) $(I_)$(ZSRCDIR)$(_I) $(C_)
+
+# Define the name of this makefile.
+XPS_MAK = $(XPSSRC)xps.mak
+
+xps.clean: xps.config-clean xps.clean-not-config-clean
+
+xps.clean-not-config-clean:
+ $(RM_) $(XPSOBJ)*.$(OBJ)
+
+xps.config-clean: clean_gs
+ $(RM_) $(XPSOBJ)*.dev
+ $(RM_) $(XPSOBJ)devs.tr5
+
+
+XPSINCLUDES=$(XPSSRC)*.h
+
+
+$(XPSOBJ)xpsmem.$(OBJ): $(XPSSRC)xpsmem.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsmem.c $(XPSO_)xpsmem.$(OBJ)
+
+$(XPSOBJ)xpsutf.$(OBJ): $(XPSSRC)xpsutf.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsutf.c $(XPSO_)xpsutf.$(OBJ)
+
+$(XPSOBJ)xpscrc.$(OBJ): $(XPSSRC)xpscrc.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpscrc.c $(XPSO_)xpscrc.$(OBJ)
+
+$(XPSOBJ)xpsjpeg.$(OBJ): $(XPSSRC)xpsjpeg.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsjpeg.c $(XPSO_)xpsjpeg.$(OBJ)
+
+$(XPSOBJ)xpspng.$(OBJ): $(XPSSRC)xpspng.c $(XPSINCLUDES) $(PNGSRCDIR)$(D)png.h
+ $(XPSCCC) $(I_)$(PNGSRCDIR)$(_I) $(XPSSRC)xpspng.c $(XPSO_)xpspng.$(OBJ)
+
+$(XPSOBJ)xpstiff.$(OBJ): $(XPSSRC)xpstiff.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpstiff.c $(XPSO_)xpstiff.$(OBJ)
+
+$(XPSOBJ)xpshdp.$(OBJ): $(XPSSRC)xpshdp.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpshdp.c $(XPSO_)xpshdp.$(OBJ)
+
+$(XPSOBJ)xpszip.$(OBJ): $(XPSSRC)xpszip.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpszip.c $(XPSO_)xpszip.$(OBJ)
+
+$(XPSOBJ)xpsxml.$(OBJ): $(XPSSRC)xpsxml.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsxml.c $(XPSO_)xpsxml.$(OBJ)
+
+$(XPSOBJ)xpsdoc.$(OBJ): $(XPSSRC)xpsdoc.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsdoc.c $(XPSO_)xpsdoc.$(OBJ)
+
+$(XPSOBJ)xpspage.$(OBJ): $(XPSSRC)xpspage.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpspage.c $(XPSO_)xpspage.$(OBJ)
+
+$(XPSOBJ)xpsresource.$(OBJ): $(XPSSRC)xpsresource.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsresource.c $(XPSO_)xpsresource.$(OBJ)
+
+$(XPSOBJ)xpscommon.$(OBJ): $(XPSSRC)xpscommon.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpscommon.c $(XPSO_)xpscommon.$(OBJ)
+
+$(XPSOBJ)xpscolor.$(OBJ): $(XPSSRC)xpscolor.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpscolor.c $(XPSO_)xpscolor.$(OBJ)
+
+$(XPSOBJ)xpsopacity.$(OBJ): $(XPSSRC)xpsopacity.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsopacity.c $(XPSO_)xpsopacity.$(OBJ)
+
+$(XPSOBJ)xpspath.$(OBJ): $(XPSSRC)xpspath.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpspath.c $(XPSO_)xpspath.$(OBJ)
+
+$(XPSOBJ)xpstile.$(OBJ): $(XPSSRC)xpstile.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpstile.c $(XPSO_)xpstile.$(OBJ)
+
+$(XPSOBJ)xpsvisual.$(OBJ): $(XPSSRC)xpsvisual.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsvisual.c $(XPSO_)xpsvisual.$(OBJ)
+
+$(XPSOBJ)xpsimage.$(OBJ): $(XPSSRC)xpsimage.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsimage.c $(XPSO_)xpsimage.$(OBJ)
+
+$(XPSOBJ)xpsgradient.$(OBJ): $(XPSSRC)xpsgradient.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsgradient.c $(XPSO_)xpsgradient.$(OBJ)
+
+$(XPSOBJ)xpsglyphs.$(OBJ): $(XPSSRC)xpsglyphs.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsglyphs.c $(XPSO_)xpsglyphs.$(OBJ)
+
+$(XPSOBJ)xpsfont.$(OBJ): $(XPSSRC)xpsfont.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsfont.c $(XPSO_)xpsfont.$(OBJ)
+
+$(XPSOBJ)xpsttf.$(OBJ): $(XPSSRC)xpsttf.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpsttf.c $(XPSO_)xpsttf.$(OBJ)
+
+$(XPSOBJ)xpscff.$(OBJ): $(XPSSRC)xpscff.c $(XPSINCLUDES)
+ $(XPSCCC) $(XPSSRC)xpscff.c $(XPSO_)xpscff.$(OBJ)
+
+
+$(XPS_TOP_OBJ): $(XPSSRC)xpstop.c $(XPSGEN)pconf.h $(pltop_h) $(XPSINCLUDES)
+ $(CP_) $(XPSGEN)pconf.h $(XPSGEN)pconfig.h
+ $(XPSCCC) $(XPSSRC)xpstop.c $(XPSO_)xpstop.$(OBJ)
+
+XPS_OBJS=\
+ $(XPSOBJ)xpsmem.$(OBJ) \
+ $(XPSOBJ)xpsutf.$(OBJ) \
+ $(XPSOBJ)xpscrc.$(OBJ) \
+ $(XPSOBJ)xpsjpeg.$(OBJ) \
+ $(XPSOBJ)xpspng.$(OBJ) \
+ $(XPSOBJ)xpstiff.$(OBJ) \
+ $(XPSOBJ)xpshdp.$(OBJ) \
+ $(XPSOBJ)xpszip.$(OBJ) \
+ $(XPSOBJ)xpsxml.$(OBJ) \
+ $(XPSOBJ)xpsdoc.$(OBJ) \
+ $(XPSOBJ)xpspage.$(OBJ) \
+ $(XPSOBJ)xpsresource.$(OBJ) \
+ $(XPSOBJ)xpscommon.$(OBJ) \
+ $(XPSOBJ)xpscolor.$(OBJ) \
+ $(XPSOBJ)xpsopacity.$(OBJ) \
+ $(XPSOBJ)xpspath.$(OBJ) \
+ $(XPSOBJ)xpstile.$(OBJ) \
+ $(XPSOBJ)xpsvisual.$(OBJ) \
+ $(XPSOBJ)xpsimage.$(OBJ) \
+ $(XPSOBJ)xpsgradient.$(OBJ) \
+ $(XPSOBJ)xpsglyphs.$(OBJ) \
+ $(XPSOBJ)xpsfont.$(OBJ) \
+ $(XPSOBJ)xpsttf.$(OBJ) \
+ $(XPSOBJ)xpscff.$(OBJ) \
+
+# NB - note this is a bit squirrely. Right now the pjl interpreter is
+# required and shouldn't be and PLOBJ==XPSGEN is required.
+
+$(XPSOBJ)xps.dev: $(XPS_MAK) $(ECHOGS_XE) $(XPS_OBJS) $(XPSGEN)expat.dev \
+ $(XPSGEN)pl.dev $(XPSGEN)$(PL_SCALER).dev $(XPSGEN)pjl.dev
+ $(SETMOD) $(XPSOBJ)xps $(XPS_OBJS)
+ $(ADDMOD) $(XPSOBJ)xps -include $(XPSGEN)expat $(XPSGEN)pl $(XPSGEN)$(PL_SCALER) $(XPSGEN)pjl.dev
+
diff --git a/xps/xps.vcproj b/xps/xps.vcproj
new file mode 100644
index 000000000..0660fbc64
--- /dev/null
+++ b/xps/xps.vcproj
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="xps"
+ ProjectGUID="{0C03E6E2-43A7-4945-BEA5-987E16BD82AA}"
+ Keyword="MakeFileProj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="0"
+ >
+ <Tool
+ Name="VCNMakeTool"
+ BuildCommandLine="nmake -f xps_msvc.mak "
+ ReBuildCommandLine="nmake -f xps_msvc.mak /A"
+ CleanCommandLine="name -f xps_msvc.mak xps.clean"
+ Output="obj\"
+ PreprocessorDefinitions="WIN32;_DEBUG;"
+ IncludeSearchPath=""
+ ForcedIncludes=""
+ AssemblySearchPath=""
+ ForcedUsingAssemblies=""
+ CompileAsManaged=""
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="0"
+ >
+ <Tool
+ Name="VCNMakeTool"
+ BuildCommandLine="nmake -f xps_msvc.mak DEBUG=0 TDEBUG=0 DEBUGSYM=0"
+ ReBuildCommandLine="nmake -f xps_msvc.mak /A DEBUG=0 TDEBUG=0 DEBUGSYM=0"
+ CleanCommandLine="nmake -f xps_msvc.mak xps.clean"
+ Output="obj\"
+ PreprocessorDefinitions="WIN32;NDEBUG;"
+ IncludeSearchPath=""
+ ForcedIncludes=""
+ AssemblySearchPath=""
+ ForcedUsingAssemblies=""
+ CompileAsManaged=""
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath=".\obj\arch.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\gconfig.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\gconfig_.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\gconfigd.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\gconfigv.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\gconfxx.h"
+ >
+ </File>
+ <File
+ RelativePath=".\ghostxps.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jconfig.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jconfig0.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jinclude.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jmcorig.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jmorecf0.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jmorecfg.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jpeglib.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jpeglib0.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\jpeglib_.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\pconf.h"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\pconfig.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\obj\gconfig.c"
+ >
+ </File>
+ <File
+ RelativePath=".\obj\gscdefs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpscff.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpscolor.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpscommon.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpscrc.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsdoc.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsfont.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsglyphs.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsgradient.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpshdp.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsimage.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsjpeg.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsmem.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsopacity.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpspage.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpspath.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpspng.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsresource.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpstiff.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpstile.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpstop.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsttf.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsutf.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsvisual.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpsxml.c"
+ >
+ </File>
+ <File
+ RelativePath=".\xpszip.c"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath=".\debug\BuildLog.htm"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/xps/xps_gcc.mak b/xps/xps_gcc.mak
new file mode 100644
index 000000000..60583b09c
--- /dev/null
+++ b/xps/xps_gcc.mak
@@ -0,0 +1,69 @@
+# The "?=" style of this makefile is designed to facilitate "deriving"
+# your own make file from it by setting your own custom options, then include'ing
+# this file. In its current form, this file will compile using default options
+# and locations. It is recommended that you make any modifications to settings
+# in this file by creating your own makefile which includes this one.
+#
+# This file only defines the portions of the makefile that are different
+# between the present language switcher vs. the standard pcl6 makefile which
+# is included near the bottom. All other settings default to the base makefile.
+
+# Define the name of this makefile.
+MAKEFILE+= ../xps/xps_gcc.mak
+
+# Include XPS support
+XPS_INCLUDED?=TRUE
+
+# Font scaler
+PL_SCALER?=afs
+
+# The build process will put all of its output in this directory:
+# GENDIR is defined in the 'base' makefile, but we need its value immediately
+GENDIR?=./obj
+
+# The sources are taken from these directories:
+MAINSRCDIR?=../main
+PSSRCDIR?=../gs/src
+XPSSRCDIR?=../xps
+PSLIBDIR?=../gs/lib
+ICCSRCDIR?=../gs/icclib
+PNGSRCDIR?=../gs/libpng
+EXPATSRCDIR?=../gs/expat
+
+SHARE_EXPAT?=0
+EXPAT_CFLAGS=-DHAVE_MEMMOVE
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+PLPLATFORM?=
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+GLGENDIR?=$(GENDIR)
+GLOBJDIR?=$(GENDIR)
+PSGENDIR?=$(GENDIR)
+PSOBJDIR?=$(GENDIR)
+JGENDIR?=$(GENDIR)
+JOBJDIR?=$(GENDIR)
+ZGENDIR?=$(GENDIR)
+ZOBJDIR?=$(GENDIR)
+EXPATGENDIR?=$(GENDIR)
+EXPATOBJDIR?=$(GENDIR)
+
+# Executable path\name w/o the .EXE extension
+TARGET_DEVS=$(XPSOBJDIR)/xps.dev
+TARGET_XE?=$(GENDIR)/gxps
+
+# Main file's name
+# this is already in pcl6_gcc.mak
+XPS_TOP_OBJ?=$(XPSOBJDIR)/xpstop.$(OBJ)
+TOP_OBJ?=$(XPS_TOP_OBJ)
+
+PDL_INCLUDE_FLAGS?=-DXPS_INCLUDED
+
+include $(MAINSRCDIR)/pcl6_gcc.mak
+
+# Subsystems
+# this is already in pcl6_gcc.mak
+include $(XPSSRCDIR)/xps.mak
+include $(PSSRCDIR)/expat.mak
diff --git a/xps/xps_msvc.mak b/xps/xps_msvc.mak
new file mode 100644
index 000000000..b362b1738
--- /dev/null
+++ b/xps/xps_msvc.mak
@@ -0,0 +1,132 @@
+# Define the name of this makefile.
+MAKEFILE= $(MAKEFILE) ..\xps\xps_msvc.mak
+
+# Include XPS support
+!ifndef XPS_INCLUDED
+XPS_INCLUDED=TRUE
+!endif XPS_INCLUDED
+
+# Font scaler
+!ifndef PL_SCALER
+PL_SCALER=afs
+!endif
+
+# The build process will put all of its output in this directory:
+# GENDIR is defined in the 'base' makefile, but we need its value immediately
+!ifndef GENDIR
+GENDIR=.\obj
+!endif
+
+# The sources are taken from these directories:
+!ifndef MAINSRCDIR
+MAINSRCDIR=..\main
+!endif
+
+!ifndef PSSRCDIR
+PSSRCDIR=..\gs\src
+!endif
+
+!ifndef XPSSRCDIR
+XPSSRCDIR=..\xps
+!endif
+
+!ifndef PSLIBDIR
+PSLIBDIR=..\gs\lib
+!endif
+
+!ifndef ICCSRCDIR
+ICCSRCDIR=..\gs\icclib
+!endif
+
+!ifndef EXPATSRCDIR
+EXPATSRCDIR=..\gs\expat
+!endif
+
+!ifndef SHARE_EXPAT
+SHARE_EXPAT=0
+!endif
+
+!ifndef EXPAT_CFLAGS
+EXPAT_CFLAGS=/DHAVE_MEMMOVE
+!endif
+
+!ifndef PSRCDIR
+PSRCDIR=..\gs\libpng
+!endif
+
+# PLPLATFORM indicates should be set to 'ps' for language switch
+# builds and null otherwise.
+!ifndef PLPLATFORM
+PLPLATFORM=
+!endif
+
+# If you want to build the individual packages in their own directories,
+# you can define this here, although normally you won't need to do this:
+!ifndef GLGENDIR
+GLGENDIR=$(GENDIR)
+!endif
+
+!ifndef GLOBJDIR
+GLOBJDIR=$(GENDIR)
+!endif
+
+!ifndef PSGENDIR
+PSGENDIR=$(GENDIR)
+!endif
+
+!ifndef PSOBJDIR
+PSOBJDIR=$(GENDIR)
+!endif
+
+!ifndef JGENDIR
+JGENDIR=$(GENDIR)
+!endif
+
+!ifndef JOBJDIR
+JOBJDIR=$(GENDIR)
+!endif
+
+!ifndef ZGENDIR
+ZGENDIR=$(GENDIR)
+!endif
+
+!ifndef ZOBJDIR
+ZOBJDIR=$(GENDIR)
+!endif
+
+!ifndef EXPATGENDIR
+EXPATGENDIR=$(GENDIR)
+!endif
+
+!ifndef EXPATOBJDIR
+EXPATOBJDIR=$(GENDIR)
+!endif
+
+# Executable path\name w/o the .EXE extension
+!ifndef TARGET_XE
+TARGET_XE=$(GENDIR)\gxps
+!endif
+
+# Main file's name
+# this is already in pcl6_gcc.mak
+#XPS_TOP_OBJ=$(XPSOBJDIR)\xpstop.$(OBJ)
+#TOP_OBJ+= $(XPS_TOP_OBJ)
+#XCFLAGS=-DXPS_INCLUDED
+
+# Choose COMPILE_INITS=1 for init files and fonts in ROM (otherwise =0)
+!ifndef COMPILE_INITS
+COMPILE_INITS=0
+!endif
+
+# configuration assumptions
+!ifndef GX_COLOR_INDEX_DEFINE
+GX_COLOR_INDEX_DEFINE=-DGX_COLOR_INDEX_TYPE="unsigned long long"
+!endif
+
+# "Subclassed" makefile
+!include $(MAINSRCDIR)\pcl6_msvc.mak
+
+# Subsystems
+# this is already in pcl6_gcc.mak
+#include $(XPSSRCDIR)\xps.mak
+!include $(PSSRCDIR)\expat.mak \ No newline at end of file
diff --git a/xps/xpscff.c b/xps/xpscff.c
new file mode 100644
index 000000000..2fdd598ac
--- /dev/null
+++ b/xps/xpscff.c
@@ -0,0 +1,934 @@
+#include "ghostxps.h"
+
+/*
+ * Big-endian memory accessor functions
+ */
+
+static inline int s16(byte *p)
+{
+ return (signed short)( (p[0] << 8) | p[1] );
+}
+
+static inline int u16(byte *p)
+{
+ return (p[0] << 8) | p[1];
+}
+
+static inline int u24(byte *p)
+{
+ return (p[0] << 16) | (p[1] << 8) | p[2];
+}
+
+static inline int u32(byte *p)
+{
+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
+/*
+ * OpenType Tables
+ *
+ * Required: cmap, head, hhea, hmtx, maxp, name, OS/2, post
+ * TrueType: cvt, fpgm, glyf, loca, prep
+ * Postscript: CFF, VORG
+ * Typographic: BASE, GDEF, GPOS, GSUB, JSTF
+ * Other: DSIG, gasp, hdmx, kern, LTSH, PCLT, VDMX, vhea, vmtx
+ */
+
+static byte * xps_count_cff_index(byte *p, byte *e, int *countp);
+static byte * xps_find_cff_index(byte *p, byte *e, int idx, byte **pp, byte **ep);
+
+static int subrbias(int count)
+{
+ return count < 1240 ? 107 : count < 33900 ? 1131 : 32768;
+}
+
+static int uofs(byte *p, int offsize)
+{
+ if (offsize == 1) return p[0];
+ if (offsize == 2) return u16(p);
+ if (offsize == 3) return u24(p);
+ if (offsize == 4) return u32(p);
+ return 0;
+}
+
+static byte *
+xps_read_cff_real(byte *p, byte *e, float *val)
+{
+ char buf[64];
+ char *txt = buf;
+
+ /* b0 was 30 */
+
+ while (txt < buf + (sizeof buf) - 3 && p < e)
+ {
+ int b, n;
+
+ b = *p++;
+
+ n = (b >> 4) & 0xf;
+ if (n < 0xA) { *txt++ = n + '0'; }
+ else if (n == 0xA) { *txt++ = '.'; }
+ else if (n == 0xB) { *txt++ = 'E'; }
+ else if (n == 0xC) { *txt++ = 'E'; *txt++ = '-'; }
+ else if (n == 0xE) { *txt++ = '-'; }
+ else if (n == 0xF) { break; }
+
+ n = b & 0xf;
+ if (n < 0xA) { *txt++ = n + '0'; }
+ else if (n == 0xA) { *txt++ = '.'; }
+ else if (n == 0xB) { *txt++ = 'E'; }
+ else if (n == 0xC) { *txt++ = 'E'; *txt++ = '-'; }
+ else if (n == 0xE) { *txt++ = '-'; }
+ else if (n == 0xF) { break; }
+ }
+
+ *txt = 0;
+
+ *val = atof(buf);
+
+ return p;
+}
+
+static byte *
+xps_read_cff_integer(byte *p, byte *e, int b0, int *val)
+{
+ int b1, b2, b3, b4;
+
+ if (b0 == 28)
+ {
+ if (p + 2 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ b2 = *p++;
+ *val = (b1 << 8) | b2;
+ }
+
+ else if (b0 == 29)
+ {
+ if (p + 4 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ b2 = *p++;
+ b3 = *p++;
+ b4 = *p++;
+ *val = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
+ }
+
+ else if (b0 < 247)
+ {
+ *val = b0 - 139;
+ }
+
+ else if (b0 < 251)
+ {
+ if (p + 1 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ *val = (b0 - 247) * 256 + b1 + 108;
+ }
+
+ else
+ {
+ if (p + 1 > e)
+ {
+ gs_throw(-1, "corrupt dictionary (integer)");
+ return 0;
+ }
+ b1 = *p++;
+ *val = -(b0 - 251) * 256 - b1 - 108;
+ }
+
+ return p;
+}
+
+static int
+xps_read_cff_dict(byte *p, byte *e, xps_font_t *font, gs_font_type1 *pt1)
+{
+ struct { int ival; float fval; } args[48];
+ int offset;
+ int b0, n;
+ float f;
+ int i;
+
+ int privatelen = 0;
+ int privateofs = 0;
+
+ offset = p - font->cffdata;
+
+ n = 0;
+ while (p < e)
+ {
+ b0 = *p++;
+
+ if (b0 < 22)
+ {
+ if (b0 == 12)
+ {
+ if (p + 1 > e)
+ {
+ return gs_throw(-1, "corrupt dictionary (operator)");
+ }
+ b0 = 0x100 | *p++;
+ }
+
+ /* some CFF file offsets */
+
+ if (b0 == 17)
+ {
+ font->charstrings = font->cffdata + args[0].ival;
+ }
+
+ if (b0 == 18)
+ {
+ privatelen = args[0].ival;
+ privateofs = args[1].ival;
+ }
+
+ if (b0 == 19)
+ {
+ font->subrs = font->cffdata + offset + args[0].ival;
+ }
+
+ if (b0 == (256 | 36))
+ errprintf("warning: cid cff fonts not supported yet");
+ if (b0 == (256 | 37))
+ errprintf("warning: cid cff fonts not supported yet");
+
+ /* Type1 stuff that need to be set for the pt1 struct */
+
+ if (b0 == (256 | 6))
+ {
+ if (args[0].ival == 1)
+ {
+ pt1->data.interpret = gs_type1_interpret;
+ pt1->data.lenIV = -1; // FIXME
+ }
+ }
+
+ if (b0 == (256 | 7))
+ {
+ pt1->FontMatrix.xx = args[0].fval;
+ pt1->FontMatrix.xy = args[1].fval;
+ pt1->FontMatrix.yx = args[2].fval;
+ pt1->FontMatrix.yy = args[3].fval;
+ pt1->FontMatrix.tx = args[4].fval;
+ pt1->FontMatrix.ty = args[5].fval;
+ }
+
+ if (b0 == 5)
+ {
+ pt1->FontBBox.p.x = args[0].fval;
+ pt1->FontBBox.p.y = args[1].fval;
+ pt1->FontBBox.q.x = args[2].fval;
+ pt1->FontBBox.q.y = args[3].fval;
+ }
+
+ if (b0 == 20)
+ pt1->data.defaultWidthX = float2fixed(args[0].fval);
+
+ if (b0 == 21)
+ pt1->data.nominalWidthX = float2fixed(args[0].fval);
+
+ if (b0 == (256 | 19))
+ pt1->data.initialRandomSeed = args[0].ival;
+
+ /* Monday morning blues */
+#if 0
+ if (b0 == 6)
+ {
+ pt1->data.BlueValues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.BlueValues.values[i] = f;
+ }
+
+ if (b0 == 7)
+ {
+ pt1->data.OtherBlues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.OtherBlues.values[i] = f;
+ }
+
+ if (b0 == 8)
+ {
+ pt1->data.FamilyBlues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.FamilyBlues.values[i] = f;
+ }
+
+ if (b0 == 9)
+ {
+ pt1->data.FamilyOtherBlues.count = n / 2;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.FamilyOtherBlues.values[i] = f;
+ }
+
+ if (b0 == 10)
+ {
+ pt1->data.StdHW.count = 1;
+ pt1->data.StdHW.values[0] = args[0].fval;
+ }
+
+ if (b0 == 11)
+ {
+ pt1->data.StdVW.count = 1;
+ pt1->data.StdVW.values[0] = args[0].fval;
+ }
+
+ if (b0 == (256 | 9))
+ pt1->data.BlueScale = args[0].fval;
+
+ if (b0 == (256 | 10))
+ pt1->data.BlueShift = args[0].fval;
+
+ if (b0 == (256 | 11))
+ pt1->data.BlueFuzz = args[0].fval;
+
+ if (b0 == (256 | 12))
+ {
+ pt1->data.StemSnapH.count = n;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.StemSnapH.values[i] = f;
+ }
+
+ if (b0 == (256 | 13))
+ {
+ pt1->data.StemSnapV.count = n;
+ for (f = 0, i = 0; i < n; f += args[i].fval, i++)
+ pt1->data.StemSnapV.values[i] = f;
+ }
+
+ if (b0 == (256 | 14))
+ pt1->data.ForceBold = args[0].ival;
+
+ if (b0 == (256 | 17))
+ pt1->data.LanguageGroup = args[0].ival;
+
+ if (b0 == (256 | 18))
+ pt1->data.ExpansionFactor = args[0].fval;
+
+#endif
+
+ n = 0;
+ }
+
+ else
+ {
+ if (b0 == 30)
+ {
+ p = xps_read_cff_real(p, e, &args[n].fval);
+ if (!p)
+ return gs_throw(-1, "corrupt dictionary operand");
+ args[n].ival = (int) args[n].fval;
+ n++;
+ }
+ else if (b0 == 28 || b0 == 29 || (b0 >= 32 && b0 <= 254))
+ {
+ p = xps_read_cff_integer(p, e, b0, &args[n].ival);
+ if (!p)
+ return gs_throw(-1, "corrupt dictionary operand");
+ args[n].fval = (float) args[n].ival;
+ n++;
+ }
+ else
+ {
+ return gs_throw1(-1, "corrupt dictionary operand (b0 = %d)", b0);
+ }
+ }
+ }
+
+ /* recurse for the private dictionary */
+ if (privatelen)
+ {
+ int code = xps_read_cff_dict(
+ font->cffdata + privateofs,
+ font->cffdata + privateofs + privatelen,
+ font, pt1);
+ if (code < 0)
+ return gs_rethrow(code, "cannot read private dictionary");
+ }
+
+ return 0;
+}
+
+/*
+ * Get the number of items in an INDEX, and return
+ * a pointer to the end of the INDEX or NULL on
+ * failure.
+ */
+static byte *
+xps_count_cff_index(byte *p, byte *e, int *countp)
+{
+ int count, offsize, last;
+
+ if (p + 3 > e)
+ {
+ gs_throw(-1, "not enough data for index header");
+ return 0;
+ }
+
+ count = u16(p); p += 2;
+ *countp = count;
+
+ if (count == 0)
+ return p;
+
+ offsize = *p++;
+
+ if (offsize < 1 || offsize > 4)
+ {
+ gs_throw(-1, "corrupt index header");
+ return 0;
+ }
+
+ if (p + count * offsize > e)
+ {
+ gs_throw(-1, "not enough data for index offset table");
+ return 0;
+ }
+
+ p += count * offsize;
+ last = uofs(p, offsize);
+ p += offsize;
+ p --; /* stupid offsets */
+
+ if (p + last > e)
+ {
+ gs_throw(-1, "not enough data for index data");
+ return 0;
+ }
+
+ p += last;
+
+ return p;
+}
+
+/*
+ * Locate and store pointers to the data of an
+ * item in the index that starts at 'p'.
+ * Return pointer to the end of the index,
+ * or NULL on failure.
+ */
+static byte *
+xps_find_cff_index(byte *p, byte *e, int idx, byte **pp, byte **ep)
+{
+ int count, offsize, sofs, eofs, last;
+
+ if (p + 3 > e)
+ {
+ gs_throw(-1, "not enough data for index header");
+ return 0;
+ }
+
+ count = u16(p); p += 2;
+ if (count == 0)
+ return 0;
+
+ offsize = *p++;
+
+ if (offsize < 1 || offsize > 4)
+ {
+ gs_throw(-1, "corrupt index header");
+ return 0;
+ }
+
+ if (p + count * offsize > e)
+ {
+ gs_throw(-1, "not enough data for index offset table");
+ return 0;
+ }
+
+ if (idx < 0 || idx >= count)
+ {
+ gs_throw(-1, "tried to access non-existing index item");
+ return 0;
+ }
+
+ sofs = uofs(p + idx * offsize, offsize);
+ eofs = uofs(p + (idx + 1) * offsize, offsize);
+ last = uofs(p + count * offsize, offsize);
+
+ p += count * offsize;
+ p += offsize;
+ p --; /* stupid offsets */
+
+ if (p + last > e)
+ {
+ gs_throw(-1, "not enough data for index data");
+ return 0;
+ }
+
+ if (sofs < 0 || eofs < 0 || sofs > eofs || eofs > last)
+ {
+ gs_throw(-1, "corrupt index offset table");
+ return 0;
+ }
+
+ *pp = p + sofs;
+ *ep = p + eofs;
+
+ return p + last;
+}
+
+/*
+ * Scan the CFF file structure and extract important data.
+ */
+
+static int
+xps_read_cff_file(xps_font_t *font, gs_font_type1 *pt1)
+{
+ byte *p = font->cffdata;
+ byte *e = font->cffend;
+ byte *dictp, *dicte;
+ int ngsubrs;
+ int nsubrs;
+ int count;
+ int code;
+
+ /* CFF header */
+ {
+ int major, minor, hdrsize, offsize;
+
+ if (p + 4 > e)
+ return gs_throw(-1, "not enough data for header");
+
+ major = *p++;
+ minor = *p++;
+ hdrsize = *p++;
+ offsize = *p++;
+
+ if (major != 1 || minor != 0)
+ return gs_throw(-1, "not a CFF 1.0 file");
+
+ if (p + hdrsize - 4 > e)
+ return gs_throw(-1, "not enough data for extended header");
+ }
+
+ /* Name INDEX */
+ p = xps_count_cff_index(p, e, &count);
+ if (!p)
+ return gs_throw(-1, "cannot read name index");
+ if (count != 1)
+ return gs_throw(-1, "file did not contain exactly one font");
+
+ /* Top Dict INDEX */
+ p = xps_find_cff_index(p, e, 0, &dictp, &dicte);
+ if (!p)
+ return gs_throw(-1, "cannot read top dict index");
+
+ /* String index */
+ p = xps_count_cff_index(p, e, &count);
+ if (!p)
+ return gs_throw(-1, "cannot read string index");
+
+ /* Global Subr INDEX */
+ font->gsubrs = p;
+ p = xps_count_cff_index(p, e, &ngsubrs);
+ if (!p)
+ return gs_throw(-1, "cannot read gsubr index");
+
+ /* Read the top and private dictionaries */
+ code = xps_read_cff_dict(dictp, dicte, font, pt1);
+ if (code < 0)
+ return gs_rethrow(code, "cannot read top dictionary");
+
+ /* Check the subrs index */
+ nsubrs = 0;
+ if (font->subrs)
+ {
+ p = xps_count_cff_index(font->subrs, e, &nsubrs);
+ if (!p)
+ return gs_rethrow(-1, "cannot read subrs index");
+ }
+
+ /* Check the charstrings index */
+ if (font->charstrings)
+ {
+ p = xps_count_cff_index(font->charstrings, e, &count);
+ if (!p)
+ return gs_rethrow(-1, "cannot read charstrings index");
+ }
+
+ pt1->data.subroutineNumberBias = subrbias(nsubrs);
+ pt1->data.gsubrNumberBias = subrbias(ngsubrs);
+ // nominal and defaultWidthX
+
+ return 0;
+}
+
+
+/*
+ * Ghostscript font machinery callbacks.
+ */
+
+static gs_glyph
+xps_post_callback_encode_char(gs_font *pfont, gs_char chr, gs_glyph_space_t spc)
+{
+ xps_font_t *xf = pfont->client_data;
+ int value;
+ value = xps_encode_font_char(xf, chr);
+ if (value == 0)
+ return gs_no_glyph;
+ return value;
+}
+
+static gs_char
+xps_post_callback_decode_glyph(gs_font *p42, gs_glyph glyph)
+{
+ return GS_NO_CHAR;
+}
+
+static int
+xps_post_callback_glyph_name(gs_font *pf, gs_glyph glyph, gs_const_string *pstr)
+{
+ dprintf1("asking for CFF glyph name %d\n", glyph);
+ return -1;
+}
+
+static int
+xps_post_callback_glyph_info(gs_font *font, gs_glyph glyph,
+ const gs_matrix *pmat, int members, gs_glyph_info_t *info)
+{
+ dprintf1("asking for CFF glyph info %d\n", glyph);
+ return -1;
+}
+
+static int
+xps_post_callback_glyph_outline(gs_font *font, int wmode, gs_glyph glyph,
+ const gs_matrix *pmat, gx_path *ppath, double sbw[4])
+{
+ dprintf1("asking for CFF glyph outline %d\n", glyph);
+ return -1;
+}
+
+typedef struct gs_type1exec_state_s
+{
+ gs_type1_state cis; /* must be first */
+ /* i_ctx_t *i_ctx_p; */ /* so push/pop can access o-stack */
+ double sbw[4];
+ gs_rect char_bbox;
+ /*
+ * The following elements are only used locally to make the stack clean
+ * for OtherSubrs: they don't need to be declared for the garbage
+ * collector.
+ */
+ void * save_args[6];
+ int num_args;
+ bool AlignToPixels;
+} gs_type1exec_state;
+
+static int
+xps_post_callback_glyph_data(gs_font_type1 * pfont, gs_glyph glyph, gs_glyph_data_t *pgd)
+{
+ xps_font_t *font = pfont->client_data;
+ byte *s, *e;
+ byte *p;
+
+ p = xps_find_cff_index(font->charstrings, font->cffend, glyph, &s, &e);
+ if (!p)
+ return gs_rethrow(-1, "cannot find charstring");
+
+ gs_glyph_data_from_string(pgd, s, e - s, NULL);
+
+ return 0;
+}
+
+static int
+xps_post_callback_subr_data(gs_font_type1 * pfont,
+ int subr_num, bool global, gs_glyph_data_t *pgd)
+{
+ xps_font_t *font = pfont->client_data;
+ byte *s, *e;
+ byte *p;
+
+ if (global)
+ {
+ p = xps_find_cff_index(font->gsubrs, font->cffend, subr_num, &s, &e);
+ if (!p)
+ return gs_rethrow(-1, "cannot find gsubr");
+ }
+ else
+ {
+ p = xps_find_cff_index(font->subrs, font->cffend, subr_num, &s, &e);
+ if (!p)
+ return gs_rethrow(-1, "cannot find subr");
+ }
+
+ gs_glyph_data_from_string(pgd, s, e - s, NULL);
+
+ return 0;
+}
+
+static int
+xps_post_callback_seac_data(gs_font_type1 * pfont, int ccode, gs_glyph * pglyph,
+ gs_const_string *gstr, gs_glyph_data_t *pgd)
+{
+ return gs_throw(-1, "seac is deprecated in CFF fonts");
+}
+
+static int
+xps_post_callback_push(void *callback_data, const fixed *values, int count)
+{
+ return gs_throw(-1, "push not implemented");
+}
+
+static int
+xps_post_callback_pop(void *callback_data, fixed *value)
+{
+ return gs_throw(-1, "pop not implemented");
+}
+
+
+static int
+xps_cff_append(gs_state *pgs, gs_font_type1 *pt1, gs_glyph glyph, int donthint)
+{
+ int code, value;
+ gs_type1exec_state cxs;
+ gs_glyph_data_t gd;
+ gs_type1_state *const pcis = &cxs.cis;
+ gs_imager_state *pgis = (gs_imager_state*)pgs;
+ gs_glyph_data_t *pgd = &gd;
+ double wv[4];
+ double sbw[4];
+ gs_matrix mtx;
+
+ /* get charstring data */
+ code = xps_post_callback_glyph_data(pt1, glyph, pgd);
+ if (code < 0)
+ return gs_rethrow(code, "cannot get glyph data");
+
+ mtx = ctm_only(pgs);
+ gs_matrix_scale(&mtx, 0.001, 0.001, &mtx);
+ mtx.tx = 0;
+ mtx.ty = 0;
+ gs_matrix_fixed_from_matrix(&pgis->ctm, &mtx);
+ pgis->flatness = 0;
+
+ code = gs_type1_interp_init(&cxs.cis, pgis, pgs->path, NULL, NULL, donthint, 0, pt1);
+ if (code < 0)
+ return gs_throw(code, "cannot init type1 interpreter");
+
+ gs_type1_set_callback_data(pcis, &cxs);
+
+ // TODO: check if this is set in the font dict
+ // gs_type1_set_lsb(pcis, &mpt);
+ // gs_type1_set_width(pcis, &mpt);
+
+ // ...
+
+ while (1)
+ {
+ code = pt1->data.interpret(pcis, pgd, &value);
+ switch (code)
+ {
+ case type1_result_callothersubr: /* unknown OtherSubr */
+ return_error(-15); /* can't handle it */
+ case type1_result_sbw: /* [h]sbw, just continue */
+ type1_cis_get_metrics(pcis, cxs.sbw);
+ type1_cis_get_metrics(pcis, sbw);
+ pgd = 0;
+ break;
+ case 0: /* all done */
+ return 0;
+ default: /* code < 0, error */
+ return gs_throw(code, "cannot interpret type1 data");
+ }
+ }
+}
+
+static int
+xps_post_callback_build_char(gs_text_enum_t *ptextenum, gs_state *pgs,
+ gs_font *pfont, gs_char chr, gs_glyph glyph)
+{
+ gs_show_enum *penum = (gs_show_enum*)ptextenum;
+ gs_font_type1 *pt1 = (gs_font_type1*)pfont;
+ const gs_rect *pbbox;
+ float sbw[4], w2[6];
+ int code;
+
+ // get the metrics
+ w2[0] = 0;
+ w2[1] = 1;
+
+ pbbox = &pt1->FontBBox;
+ w2[2] = pbbox->p.x * 0.001;
+ w2[3] = pbbox->p.y * 0.001;
+ w2[4] = pbbox->q.x * 0.001;
+ w2[5] = pbbox->q.y * 0.001;
+
+ /* Expand the bbox when stroking */
+ if ( pfont->PaintType )
+ {
+ float expand = max(1.415, gs_currentmiterlimit(pgs)) * gs_currentlinewidth(pgs) / 2;
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 )
+ return code;
+
+ code = xps_cff_append(pgs, pt1, glyph,
+ gs_show_in_charpath(penum) != cpm_show);
+ if (code < 0)
+ return code;
+
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ if (code < 0)
+ return code;
+
+ return 0;
+}
+
+int
+xps_init_postscript_font(xps_context_t *ctx, xps_font_t *font)
+{
+ gs_font_type1 *pt1;
+ int cffofs;
+ int cfflen;
+ int code;
+
+ /* Find the CFF table and parse it to create a charstring based font */
+ /* We don't need to support CFF files with multiple fonts */
+ /* Find the VORG table for easier vertical metrics */
+
+ cffofs = xps_find_sfnt_table(font, "CFF ", &cfflen);
+ if (cffofs < 0)
+ return gs_throw(-1, "cannot find CFF table");
+
+ if (cfflen < 0 || cffofs + cfflen > font->length)
+ return gs_throw(-1, "corrupt CFF table location");
+
+ font->cffdata = font->data + cffofs;
+ font->cffend = font->data + cffofs + cfflen;
+
+ font->gsubrs = 0;
+ font->subrs = 0;
+ font->charstrings = 0;
+
+ pt1 = (void*) gs_alloc_struct(ctx->memory, gs_font_type1, &st_gs_font_type1, "xps_font type1");
+ if (!pt1)
+ return gs_throw(-1, "out of memory");
+
+ font->font = (void*) pt1;
+
+ /* Common to all fonts */
+
+ pt1->next = 0;
+ pt1->prev = 0;
+ pt1->memory = ctx->memory;
+
+ pt1->dir = ctx->fontdir; /* NB also set by gs_definefont later */
+ pt1->base = font->font; /* NB also set by gs_definefont later */
+ pt1->is_resource = false;
+ gs_notify_init(&pt1->notify_list, gs_memory_stable(ctx->memory));
+ pt1->id = gs_next_ids(ctx->memory, 1);
+
+ pt1->client_data = font; /* that's us */
+
+ gs_make_identity(&pt1->FontMatrix);
+ gs_make_identity(&pt1->orig_FontMatrix);
+
+ pt1->FontType = ft_encrypted2;
+ pt1->BitmapWidths = true;
+ pt1->ExactSize = fbit_use_outlines;
+ pt1->InBetweenSize = fbit_use_outlines;
+ pt1->TransformedChar = fbit_use_outlines;
+ pt1->WMode = 0;
+ pt1->PaintType = 0;
+ pt1->StrokeWidth = 0;
+
+ pt1->procs.define_font = gs_no_define_font;
+ pt1->procs.make_font = gs_no_make_font;
+ pt1->procs.font_info = gs_default_font_info;
+ // same_font
+ pt1->procs.encode_char = xps_post_callback_encode_char;
+ pt1->procs.decode_glyph = xps_post_callback_decode_glyph;
+ // enumerate_glyph
+ pt1->procs.glyph_info = xps_post_callback_glyph_info;
+ pt1->procs.glyph_outline = xps_post_callback_glyph_outline;
+ pt1->procs.glyph_name = xps_post_callback_glyph_name;
+ pt1->procs.init_fstack = gs_default_init_fstack;
+ pt1->procs.next_char_glyph = gs_default_next_char_glyph;
+ pt1->procs.build_char = xps_post_callback_build_char;
+
+ strcpy(pt1->font_name.chars, "PostScriptFont");
+ pt1->font_name.size = strlen(pt1->font_name.chars);
+
+ pt1->key_name.size = 0;
+
+ /* Base font specific */
+
+ pt1->FontBBox.p.x = 0; // -0.5;
+ pt1->FontBBox.p.y = 0; // -0.5;
+ pt1->FontBBox.q.x = 0; // 1.5;
+ pt1->FontBBox.q.y = 0; // 1.5;
+
+ uid_set_UniqueID(&pt1->UID, pt1->id);
+
+ pt1->encoding_index = ENCODING_INDEX_UNKNOWN;
+ pt1->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
+
+ pt1->FAPI = 0;
+ pt1->FAPI_font_data = 0;
+
+ /* Type 1/2 specific */
+ /* defaults from the CFF spec */
+
+ pt1->data.procs.glyph_data = xps_post_callback_glyph_data;
+ pt1->data.procs.subr_data = xps_post_callback_subr_data;
+ pt1->data.procs.seac_data = xps_post_callback_seac_data;
+ pt1->data.procs.push_values = xps_post_callback_push;
+ pt1->data.procs.pop_value = xps_post_callback_pop;
+
+ pt1->data.interpret = gs_type2_interpret;
+ pt1->data.proc_data = font;
+ pt1->data.parent = NULL;
+ pt1->data.lenIV = -1; /* DEFAULT_LENIV_2 */
+
+ pt1->data.subroutineNumberBias = 0;
+ pt1->data.gsubrNumberBias = 0;
+ pt1->data.initialRandomSeed = 0;
+ pt1->data.defaultWidthX = 0;
+ pt1->data.nominalWidthX = 0;
+
+ pt1->data.BlueFuzz = 1;
+ pt1->data.BlueScale = 0.039625;
+ pt1->data.BlueShift = 7;
+ pt1->data.BlueValues.count = 0;
+ pt1->data.ExpansionFactor = 0.06;
+ pt1->data.ForceBold = 0;
+ pt1->data.FamilyBlues.count = 0;
+ pt1->data.FamilyOtherBlues.count = 0;
+ pt1->data.LanguageGroup = 0;
+ pt1->data.OtherBlues.count = 0;
+
+ pt1->data.RndStemUp = 0;
+ memset(&pt1->data.StdHW, 0, sizeof(pt1->data.StdHW));
+ memset(&pt1->data.StdVW, 0, sizeof(pt1->data.StdVW));
+ memset(&pt1->data.StemSnapH, 0, sizeof(pt1->data.StemSnapH));
+ memset(&pt1->data.StemSnapV, 0, sizeof(pt1->data.StemSnapH));
+ memset(&pt1->data.WeightVector, 0, sizeof(pt1->data.WeightVector));
+
+ code = xps_read_cff_file(font, pt1);
+ if (code < 0)
+ {
+ // TODO free pt1 here?
+ return gs_rethrow(code, "cannot read cff file structure");
+ }
+
+ gs_definefont(ctx->fontdir, font->font);
+
+ return 0;
+}
+
diff --git a/xps/xpscolor.c b/xps/xpscolor.c
new file mode 100644
index 000000000..75fa28b45
--- /dev/null
+++ b/xps/xpscolor.c
@@ -0,0 +1,250 @@
+#include "ghostxps.h"
+
+#include "stream.h" /* for sizeof(stream) to work */
+
+int
+xps_set_color(xps_context_t *ctx, gs_color_space *cs, float *samples)
+{
+ gs_client_color cc;
+ int i, n;
+
+ if (ctx->opacity_only)
+ {
+ gs_setopacityalpha(ctx->pgs, 1.0);
+ gs_setgray(ctx->pgs, samples[0]);
+ }
+ else
+ {
+ n = cs_num_components(cs);
+ cc.pattern = 0;
+ for (i = 0; i < n; i++)
+ cc.paint.values[i] = samples[i + 1];
+
+ gs_setopacityalpha(ctx->pgs, samples[0]);
+ gs_setcolorspace(ctx->pgs, cs);
+ gs_setcolor(ctx->pgs, &cc);
+ }
+
+ return 0;
+}
+
+static int unhex(int chr)
+{
+ const char *hextable = "0123456789ABCDEF";
+ return strchr(hextable, (toupper(chr))) - hextable;
+}
+
+static int count_commas(char *s)
+{
+ int n = 0;
+ while (*s)
+ {
+ if (*s == ',')
+ n ++;
+ s ++;
+ }
+ return n;
+}
+
+int
+xps_parse_color(xps_context_t *ctx, char *string, gs_color_space **csp, float *samples)
+{
+ xps_part_t *part;
+ char *profile, *p;
+ int i, n, code;
+
+ char partname[1024];
+
+ samples[0] = 1.0;
+ samples[1] = 0.0;
+ samples[2] = 0.0;
+ samples[3] = 0.0;
+
+ *csp = ctx->srgb;
+
+ if (string[0] == '#')
+ {
+ if (strlen(string) == 9)
+ {
+ samples[0] = unhex(string[1]) * 16 + unhex(string[2]);
+ samples[1] = unhex(string[3]) * 16 + unhex(string[4]);
+ samples[2] = unhex(string[5]) * 16 + unhex(string[6]);
+ samples[3] = unhex(string[7]) * 16 + unhex(string[8]);
+ }
+ else
+ {
+ samples[0] = 255.0;
+ samples[1] = unhex(string[1]) * 16 + unhex(string[2]);
+ samples[2] = unhex(string[3]) * 16 + unhex(string[4]);
+ samples[3] = unhex(string[5]) * 16 + unhex(string[6]);
+ }
+
+ samples[0] /= 255.0;
+ samples[1] /= 255.0;
+ samples[2] /= 255.0;
+ samples[3] /= 255.0;
+
+ return 0;
+ }
+
+ else if (string[0] == 's' && string[1] == 'c' && string[2] == '#')
+ {
+ if (count_commas(string) == 2)
+ sscanf(string, "sc#%g,%g,%g", samples + 1, samples + 2, samples + 3);
+ if (count_commas(string) == 3)
+ sscanf(string, "sc#%g,%g,%g,%g", samples, samples + 1, samples + 2, samples + 3);
+ return 0;
+ }
+
+ else if (strstr(string, "ContextColor ") == string)
+ {
+ /* Crack the string for profile name and sample values */
+
+ profile = strchr(string, ' ');
+ if (profile)
+ {
+ *profile++ = 0;
+ p = strchr(profile, ' ');
+ if (p)
+ {
+ *p++ = 0;
+ }
+
+ n = count_commas(p) + 1;
+ i = 0;
+ while (i < n)
+ {
+ samples[i++] = atof(p);
+ p = strchr(p, ',');
+ if (!p)
+ break;
+ p ++;
+ if (*p == ' ')
+ p ++;
+ }
+ while (i < n)
+ {
+ samples[i++] = 0.0;
+ }
+ }
+
+ /* Default fallbacks if the ICC stuff fails */
+
+ if (n == 2) /* alpha + tint */
+ *csp = ctx->gray;
+
+ if (n == 5) /* alpha + CMYK */
+ *csp = ctx->cmyk;
+
+#if 0 /* disable ICC profiles for beta */
+
+ /* Find ICC colorspace part */
+
+ xps_absolute_path(partname, ctx->pwd, profile);
+ part = xps_find_part(ctx, partname);
+ if (!part)
+ return gs_throw1(-1, "cannot find icc profile part '%s'", partname);
+
+ if (!part->icc)
+ {
+ code = xps_parse_icc_profile(ctx, &part->icc, (byte*)part->data, part->size, n - 1);
+ if (code < 0)
+ return gs_rethrow1(code, "cannot parse icc profile part '%s'", partname);
+ }
+
+ *csp = part->icc;
+#endif
+
+ return 0;
+ }
+
+ else
+ {
+ return gs_throw1(-1, "cannot parse color (%s)\n", string);
+ }
+}
+
+stream *
+xps_stream_from_buffer(xps_context_t *ctx, byte *data, int length)
+{
+ stream *stm;
+
+ stm = xps_alloc(ctx, sizeof(struct stream_s));
+ if (!stm)
+ {
+ gs_throw(-1, "out of memory: stream struct");
+ return NULL;
+ }
+
+ sread_string(stm, data, length);
+
+ return stm;
+}
+
+int
+xps_parse_icc_profile(xps_context_t *ctx, gs_color_space **csp, byte *data, int length, int ncomp)
+{
+ gs_color_space *colorspace;
+ gs_cie_icc *info;
+ stream *stm;
+ int code;
+ int i;
+
+ // based on zseticcspace
+
+ stm = xps_stream_from_buffer(ctx, data, length);
+ if (!stm)
+ return gs_rethrow(-1, "cannot create stream from buffer");
+
+ code = gs_cspace_build_CIEICC(&colorspace, NULL, ctx->memory);
+ if (code < 0)
+ return gs_rethrow(code, "cannot build ICC colorspace");
+
+ info = colorspace->params.icc.picc_info;
+ info->num_components = ncomp; /* redundant but that's what the interface requires */
+ info->instrp = stm;
+ info->file_id = (stm->read_id | stm->write_id);
+
+ code = gx_load_icc_profile(info);
+ if (code < 0)
+ return gs_throw(code, "gx_load_icc_profile failed");
+
+ // cie_cache_joint
+ // cie_set_finish
+
+ *csp = colorspace;
+
+ return 0;
+}
+
+int
+xps_parse_solid_color_brush(xps_context_t *ctx,
+ xps_resource_t *dict, xps_item_t *node)
+{
+ char *opacity_att;
+ char *color_att;
+ gs_color_space *colorspace;
+ float samples[32];
+
+ color_att = xps_att(node, "Color");
+ opacity_att = xps_att(node, "Opacity");
+
+ colorspace = ctx->srgb;
+ samples[0] = 1.0;
+ samples[1] = 0.0;
+ samples[2] = 0.0;
+ samples[3] = 0.0;
+
+ if (color_att)
+ xps_parse_color(ctx, color_att, &colorspace, samples);
+
+ if (opacity_att)
+ samples[0] = atof(opacity_att);
+
+ xps_set_color(ctx, colorspace, samples);
+
+ xps_fill(ctx);
+
+ return 0;
+}
+
diff --git a/xps/xpscommon.c b/xps/xpscommon.c
new file mode 100644
index 000000000..d96444dd4
--- /dev/null
+++ b/xps/xpscommon.c
@@ -0,0 +1,96 @@
+#include "ghostxps.h"
+
+int
+xps_parse_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node)
+{
+ if (!strcmp(xps_tag(node), "SolidColorBrush"))
+ return xps_parse_solid_color_brush(ctx, dict, node);
+ if (!strcmp(xps_tag(node), "ImageBrush"))
+ return xps_parse_image_brush(ctx, dict, node);
+ if (!strcmp(xps_tag(node), "VisualBrush"))
+ return xps_parse_visual_brush(ctx, dict, node);
+ if (!strcmp(xps_tag(node), "LinearGradientBrush"))
+ return xps_parse_linear_gradient_brush(ctx, dict, node);
+ if (!strcmp(xps_tag(node), "RadialGradientBrush"))
+ return xps_parse_radial_gradient_brush(ctx, dict, node);
+ return gs_throw1(-1, "unknown brush tag: %s", xps_tag(node));
+}
+
+int
+xps_parse_element(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *node)
+{
+ if (!strcmp(xps_tag(node), "Path"))
+ return xps_parse_path(ctx, dict, node);
+ if (!strcmp(xps_tag(node), "Glyphs"))
+ return xps_parse_glyphs(ctx, dict, node);
+ if (!strcmp(xps_tag(node), "Canvas"))
+ return xps_parse_canvas(ctx, dict, node);
+ /* skip unknown tags (like Foo.Resources and similar) */
+ return 0;
+}
+
+void
+xps_parse_render_transform(xps_context_t *ctx, char *transform, gs_matrix *matrix)
+{
+ float args[6];
+ char *s = transform;
+ int i;
+
+ args[0] = 1.0; args[1] = 0.0;
+ args[2] = 0.0; args[3] = 1.0;
+ args[4] = 0.0; args[5] = 0.0;
+
+ for (i = 0; i < 6 && *s; i++)
+ {
+ args[i] = atof(s);
+ while (*s && *s != ',')
+ s++;
+ if (*s == ',')
+ s++;
+ }
+
+ matrix->xx = args[0]; matrix->xy = args[1];
+ matrix->yx = args[2]; matrix->yy = args[3];
+ matrix->tx = args[4]; matrix->ty = args[5];
+}
+
+void
+xps_parse_matrix_transform(xps_context_t *ctx, xps_item_t *root, gs_matrix *matrix)
+{
+ char *transform;
+
+ gs_make_identity(matrix);
+
+ if (!strcmp(xps_tag(root), "MatrixTransform"))
+ {
+ transform = xps_att(root, "Matrix");
+ if (transform)
+ xps_parse_render_transform(ctx, transform, matrix);
+ }
+}
+
+void
+xps_parse_rectangle(xps_context_t *ctx, char *text, gs_rect *rect)
+{
+ float args[4];
+ char *s = text;
+ int i;
+
+ args[0] = 0.0; args[1] = 0.0;
+ args[2] = 1.0; args[3] = 1.0;
+
+ for (i = 0; i < 4 && *s; i++)
+ {
+ args[i] = atof(s);
+ while (*s && *s != ',')
+ s++;
+ if (*s == ',')
+ s++;
+ }
+
+ rect->p.x = args[0];
+ rect->p.y = args[1];
+ rect->q.x = args[0] + args[2];
+ rect->q.y = args[1] + args[3];
+}
+
diff --git a/xps/xpscrc.c b/xps/xpscrc.c
new file mode 100644
index 000000000..633f40625
--- /dev/null
+++ b/xps/xpscrc.c
@@ -0,0 +1,85 @@
+/*
+ * Compute the CRC-32 of a data buffer
+ */
+
+#include "ghostxps.h"
+
+static const unsigned long crctab[256] =
+{
+ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+ 0x2d02ef8dL
+};
+
+#define DO1(buf) crc = crctab[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
+#define DO2(buf) DO1(buf); DO1(buf);
+#define DO4(buf) DO2(buf); DO2(buf);
+#define DO8(buf) DO4(buf); DO4(buf);
+
+unsigned int
+xps_crc32(unsigned int crc, unsigned char *buf, int len)
+{
+ if (buf == NULL)
+ return 0L;
+ crc = crc ^ 0xffffffffL;
+ while (len >= 8)
+ {
+ DO8(buf);
+ len -= 8;
+ }
+ if (len)
+ {
+ do { DO1(buf); } while (--len);
+ }
+ return crc ^ 0xffffffffL;
+}
+
diff --git a/xps/xpsdoc.c b/xps/xpsdoc.c
new file mode 100644
index 000000000..c16440463
--- /dev/null
+++ b/xps/xpsdoc.c
@@ -0,0 +1,953 @@
+#include "ghostxps.h"
+
+#include <expat.h>
+
+#define REL_START_PART "http://schemas.microsoft.com/xps/2005/06/fixedrepresentation"
+#define REL_REQUIRED_RESOURCE "http://schemas.microsoft.com/xps/2005/06/required-resource"
+#define REL_REQUIRED_RESOURCE_RECURSIVE "http://schemas.microsoft.com/xps/2005/06/required-resource#recursive"
+
+#define CT_FIXDOC "application/vnd.ms-package.xps-fixeddocument+xml"
+#define CT_FIXDOCSEQ "application/vnd.ms-package.xps-fixeddocumentsequence+xml"
+#define CT_FIXPAGE "application/vnd.ms-package.xps-fixedpage+xml"
+
+int xps_doc_trace = 0;
+
+/*
+ * Content types are stored in two separate binary trees.
+ * One lists Override entries, which map a part name to a type.
+ * The other lists Default entries, which map a file extension to a type.
+ */
+
+void xps_debug_type_map(xps_context_t *ctx, char *label, xps_type_map_t *node)
+{
+ if (node)
+ {
+ if (node->left)
+ xps_debug_type_map(ctx, label, node->left);
+ dprintf3("%s name=%s type=%s\n", label, node->name, node->type);
+ if (node->right)
+ xps_debug_type_map(ctx, label, node->right);
+ }
+}
+
+static xps_type_map_t *
+xps_new_type_map(xps_context_t *ctx, char *name, char *type)
+{
+ xps_type_map_t *node;
+
+ node = xps_alloc(ctx, sizeof(xps_type_map_t));
+ if (!node)
+ goto cleanup;
+
+ node->name = xps_strdup(ctx, name);
+ node->type = xps_strdup(ctx, type);
+ node->left = NULL;
+ node->right = NULL;
+
+ if (!node->name)
+ goto cleanup;
+ if (!node->type)
+ goto cleanup;
+
+ return node;
+
+cleanup:
+ if (node)
+ {
+ if (node->name) xps_free(ctx, node->name);
+ if (node->type) xps_free(ctx, node->type);
+ xps_free(ctx, node);
+ }
+ return NULL;
+}
+
+static void
+xps_add_type_map(xps_context_t *ctx, xps_type_map_t *node, char *name, char *type)
+{
+ int cmp = strcmp(node->name, name);
+ if (cmp < 0)
+ {
+ if (node->left)
+ xps_add_type_map(ctx, node->left, name, type);
+ else
+ node->left = xps_new_type_map(ctx, name, type);
+ }
+ else if (cmp > 0)
+ {
+ if (node->right)
+ xps_add_type_map(ctx, node->right, name, type);
+ else
+ node->right = xps_new_type_map(ctx, name, type);
+ }
+ else
+ {
+ /* it's a duplicate so we don't do anything */
+ }
+}
+
+void
+xps_free_type_map(xps_context_t *ctx, xps_type_map_t *node)
+{
+ if (node)
+ {
+ xps_free_type_map(ctx, node->left);
+ xps_free_type_map(ctx, node->right);
+ xps_free(ctx, node->name);
+ xps_free(ctx, node->type);
+ xps_free(ctx, node);
+ }
+}
+
+static void
+xps_add_override(xps_context_t *ctx, char *part_name, char *content_type)
+{
+ if (ctx->overrides == NULL)
+ ctx->overrides = xps_new_type_map(ctx, part_name, content_type);
+ else
+ xps_add_type_map(ctx, ctx->overrides, part_name, content_type);
+}
+
+static void
+xps_add_default(xps_context_t *ctx, char *extension, char *content_type)
+{
+ if (ctx->defaults == NULL)
+ ctx->defaults = xps_new_type_map(ctx, extension, content_type);
+ else
+ xps_add_type_map(ctx, ctx->defaults, extension, content_type);
+}
+
+static char *
+xps_find_override(xps_type_map_t *node, char *partname)
+{
+ if (node)
+ {
+ int cmp = strcmp(node->name, partname);
+ if (cmp < 0)
+ return xps_find_override(node->left, partname);
+ if (cmp == 0)
+ return node->type;
+ if (cmp > 0)
+ return xps_find_override(node->right, partname);
+ }
+ return NULL;
+}
+
+static char *
+xps_find_default(xps_type_map_t *node, char *extension)
+{
+ if (node)
+ {
+ int cmp = strcmp(node->name, extension);
+ if (cmp < 0)
+ return xps_find_default(node->left, extension);
+ if (cmp == 0)
+ return node->type;
+ if (cmp > 0)
+ return xps_find_default(node->right, extension);
+ }
+ return NULL;
+}
+
+char *
+xps_get_content_type(xps_context_t *ctx, char *partname)
+{
+ char *extension;
+ char *type;
+
+ type = xps_find_override(ctx->overrides, partname);
+ if (type)
+ {
+ return type;
+ }
+
+ extension = strrchr(partname, '.');
+ if (extension)
+ extension ++;
+
+ type = xps_find_default(ctx->defaults, extension);
+ if (type)
+ {
+ return type;
+ }
+
+ return NULL;
+}
+
+/*
+ * Relationships are stored in a linked list hooked into the part which
+ * is the source of the relation.
+ */
+
+void xps_debug_parts(xps_context_t *ctx)
+{
+ xps_part_t *part = ctx->first_part;
+ xps_relation_t *rel;
+ while (part)
+ {
+ dprintf2("part '%s' size=%d\n", part->name, part->size);
+ for (rel = part->relations; rel; rel = rel->next)
+ dprintf2(" target=%s type=%s\n", rel->target, rel->type);
+ part = part->next;
+ }
+}
+
+int
+xps_add_relation(xps_context_t *ctx, char *source, char *target, char *type)
+{
+ xps_relation_t *node;
+ xps_part_t *part;
+
+ part = xps_find_part(ctx, source);
+
+ /* No existing part found. Create a blank part and hook it in. */
+ if (part == NULL)
+ {
+ part = xps_new_part(ctx, source, 0);
+ if (!part)
+ return gs_rethrow(-1, "cannot create new part");
+ }
+
+ /* Check for duplicates. */
+ for (node = part->relations; node; node = node->next)
+ if (!strcmp(node->target, target))
+ return 0;
+
+ node = xps_alloc(ctx, sizeof(xps_relation_t));
+ if (!node)
+ return gs_rethrow(-1, "cannot create new relation");
+
+ node->target = xps_strdup(ctx, target);
+ node->type = xps_strdup(ctx, type);
+ if (!node->target || !node->type)
+ {
+ if (node->target) xps_free(ctx, node->target);
+ if (node->type) xps_free(ctx, node->type);
+ xps_free(ctx, node);
+ return gs_rethrow(-1, "cannot copy relation strings");
+ }
+
+ node->next = part->relations;
+ part->relations = node;
+
+ return 0;
+}
+
+void
+xps_free_relations(xps_context_t *ctx, xps_relation_t *node)
+{
+ xps_relation_t *next;
+ while (node)
+ {
+ next = node->next;
+ xps_free(ctx, node->target);
+ xps_free(ctx, node->type);
+ xps_free(ctx, node);
+ node = next;
+ }
+}
+
+/*
+ * <DocumentReference> -- fixdocseq
+ * <PageContent> -- fixdoc
+ *
+ * TODO: We should really look at the root StartPart relationship
+ * for the FixedDocumentSequence and follow the DocumentReferences
+ * therein for the page sequence. For now, we'll cheat and read
+ * any PageContent references in the order they are in the file.
+ */
+
+void xps_debug_fixdocseq(xps_context_t *ctx)
+{
+ xps_document_t *fixdoc = ctx->first_fixdoc;
+ xps_page_t *page = ctx->first_page;
+
+ if (ctx->start_part)
+ dprintf1("start part %s\n", ctx->start_part);
+
+ while (fixdoc)
+ {
+ dprintf1("fixdoc %s\n", fixdoc->name);
+ fixdoc = fixdoc->next;
+ }
+
+ while (page)
+ {
+ dprintf3("page %s w=%d h=%d\n", page->name, page->width, page->height);
+ page = page->next;
+ }
+}
+
+int
+xps_add_fixed_document(xps_context_t *ctx, char *name)
+{
+ xps_document_t *fixdoc;
+
+ /* Check for duplicates first */
+ for (fixdoc = ctx->first_fixdoc; fixdoc; fixdoc = fixdoc->next)
+ if (!strcmp(fixdoc->name, name))
+ return 0;
+
+ if (xps_doc_trace)
+ dprintf1("doc: adding fixdoc %s\n", name);
+
+ fixdoc = xps_alloc(ctx, sizeof(xps_document_t));
+ if (!fixdoc)
+ return -1;
+
+ fixdoc->name = xps_strdup(ctx, name);
+ if (!fixdoc->name)
+ {
+ xps_free(ctx, fixdoc);
+ return -1;
+ }
+
+ fixdoc->next = NULL;
+
+ if (!ctx->first_fixdoc)
+ {
+ ctx->first_fixdoc = fixdoc;
+ ctx->last_fixdoc = fixdoc;
+ }
+ else
+ {
+ ctx->last_fixdoc->next = fixdoc;
+ ctx->last_fixdoc = fixdoc;
+ }
+
+ return 0;
+}
+
+void
+xps_free_fixed_documents(xps_context_t *ctx)
+{
+ xps_document_t *node = ctx->first_fixdoc;
+ while (node)
+ {
+ xps_document_t *next = node->next;
+ xps_free(ctx, node->name);
+ xps_free(ctx, node);
+ node = next;
+ }
+ ctx->first_fixdoc = NULL;
+ ctx->last_fixdoc = NULL;
+}
+
+int
+xps_add_fixed_page(xps_context_t *ctx, char *name, int width, int height)
+{
+ xps_page_t *page;
+
+ /* Check for duplicates first */
+ for (page = ctx->first_page; page; page = page->next)
+ if (!strcmp(page->name, name))
+ return 0;
+
+ if (xps_doc_trace)
+ dprintf1("doc: adding page %s\n", name);
+
+ page = xps_alloc(ctx, sizeof(xps_page_t));
+ if (!page)
+ return -1;
+
+ page->name = xps_strdup(ctx, name);
+ if (!page->name)
+ {
+ xps_free(ctx, page);
+ return -1;
+ }
+
+ page->width = width;
+ page->height = height;
+ page->next = NULL;
+
+ if (!ctx->first_page)
+ {
+ ctx->first_page = page;
+ ctx->last_page = page;
+ }
+ else
+ {
+ ctx->last_page->next = page;
+ ctx->last_page = page;
+ }
+
+ /* first page, or we processed all the previous pages */
+ if (ctx->next_page == NULL)
+ ctx->next_page = page;
+
+ return 0;
+}
+
+void
+xps_free_fixed_pages(xps_context_t *ctx)
+{
+ xps_page_t *node = ctx->first_page;
+ while (node)
+ {
+ xps_page_t *next = node->next;
+ xps_free(ctx, node->name);
+ xps_free(ctx, node);
+ node = next;
+ }
+ ctx->first_page = NULL;
+ ctx->last_page = NULL;
+ ctx->next_page = NULL;
+}
+
+/*
+ * Periodically free old parts and resources that
+ * will not be used any more. This looks at discard control
+ * information, and assumes that a given fixed page will
+ * not be drawn more than once.
+ */
+
+void
+xps_free_used_parts(xps_context_t *ctx)
+{
+ /* TODO: actually do what we should. for now we just free cached resources. */
+
+ xps_part_t *part = ctx->first_part;
+ while (part)
+ {
+ xps_part_t *next = part->next;
+ xps_free_part_caches(ctx, part);
+ part = next;
+ }
+}
+
+/*
+ * Parse the metadata [Content_Types.xml] and _rels/XXX.rels parts.
+ * These should be parsed eagerly as they are interleaved, so the
+ * parsing needs to be able to cope with incomplete xml.
+ *
+ * We re-parse the part every time a new part of the piece comes in.
+ * The binary trees in xps_context_t make sure that the information
+ * is not duplicated (since the entries are often parsed many times).
+ *
+ * We hook up unique expat handlers for this, and ignore any expat
+ * errors that occur.
+ */
+
+static void
+xps_part_from_relation(char *output, char *name)
+{
+ char *p, *q;
+ strcpy(output, name);
+ p = strstr(output, "_rels/");
+ q = strstr(name, "_rels/");
+ if (p)
+ {
+ *p = 0;
+ strcat(output, q + 6);
+ }
+ p = strstr(output, ".rels");
+ if (p)
+ {
+ *p = 0;
+ }
+}
+
+static void
+xps_handle_metadata(void *zp, char *name, char **atts)
+{
+ xps_context_t *ctx = zp;
+ int i;
+
+ if (!strcmp(name, "Default"))
+ {
+ char *extension = NULL;
+ char *type = NULL;
+
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "Extension"))
+ extension = atts[i + 1];
+ if (!strcmp(atts[i], "ContentType"))
+ type = atts[i + 1];
+ }
+
+ if (extension && type)
+ xps_add_default(ctx, extension, type);
+ }
+
+ if (!strcmp(name, "Override"))
+ {
+ char *partname = NULL;
+ char *type = NULL;
+
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "PartName"))
+ partname = atts[i + 1];
+ if (!strcmp(atts[i], "ContentType"))
+ type = atts[i + 1];
+ }
+
+ if (partname && type)
+ xps_add_override(ctx, partname, type);
+ }
+
+ if (!strcmp(name, "Relationship"))
+ {
+ char srcbuf[1024];
+ char tgtbuf[1024];
+ char dirbuf[1024];
+ char *target = NULL;
+ char *type = NULL;
+ char *p;
+
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "Target"))
+ target = atts[i + 1];
+ if (!strcmp(atts[i], "Type"))
+ type = atts[i + 1];
+ }
+
+ if (target && type)
+ {
+ xps_part_from_relation(srcbuf, ctx->last_part->name);
+
+ strcpy(dirbuf, srcbuf);
+ p = strrchr(dirbuf, '/');
+ if (p)
+ p[1] = 0;
+
+ xps_absolute_path(tgtbuf, dirbuf, target);
+
+ xps_add_relation(ctx, srcbuf, tgtbuf, type);
+ }
+ }
+
+ if (!strcmp(name, "DocumentReference"))
+ {
+ char *source = NULL;
+ char srcbuf[1024];
+
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "Source"))
+ source = atts[i + 1];
+ }
+
+ if (source)
+ {
+ xps_absolute_path(srcbuf, ctx->pwd, source);
+ xps_add_fixed_document(ctx, srcbuf);
+ }
+ }
+
+ if (!strcmp(name, "PageContent"))
+ {
+ char *source = NULL;
+ char srcbuf[1024];
+ int width = 0;
+ int height = 0;
+
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "Source"))
+ source = atts[i + 1];
+ if (!strcmp(atts[i], "Width"))
+ width = atoi(atts[i + 1]);
+ if (!strcmp(atts[i], "Height"))
+ height = atoi(atts[i + 1]);
+ }
+
+ if (source)
+ {
+ xps_absolute_path(srcbuf, ctx->pwd, source);
+ xps_add_fixed_page(ctx, srcbuf, width, height);
+ }
+ }
+}
+
+static int
+xps_process_metadata(xps_context_t *ctx, xps_part_t *part)
+{
+ XML_Parser xp;
+ char *s;
+
+ /* Save directory name part */
+ strcpy(ctx->pwd, part->name);
+ s = strrchr(ctx->pwd, '/');
+ if (s)
+ s[1] = 0;
+
+ xp = XML_ParserCreate(NULL);
+ if (!xp)
+ return -1;
+
+ XML_SetUserData(xp, ctx);
+ XML_SetParamEntityParsing(xp, XML_PARAM_ENTITY_PARSING_NEVER);
+ XML_SetStartElementHandler(xp, (XML_StartElementHandler)xps_handle_metadata);
+
+ (void) XML_Parse(xp, part->data, part->size, 1);
+
+ XML_ParserFree(xp);
+
+ return 0;
+}
+
+/*
+ * Scan FixedPage XML for required resources:
+ *
+ * <Glyphs FontUri=... >
+ * <ImageBrush ImageSource=... >
+ * <ResourceDictionary Source=... >
+ */
+
+static void
+xps_trim_url(char *path)
+{
+ char *p = strrchr(path, '#');
+ if (p)
+ *p = 0;
+}
+
+static void
+xps_parse_color_relation(xps_context_t *ctx, char *string)
+{
+ char path[1024];
+ char buf[1024];
+ char *sp, *ep;
+
+ /* "ContextColor /Resources/Foo.icc 1,0.3,0.5,1.0" */
+
+ strcpy(buf, string);
+ sp = strchr(buf, ' ');
+ if (sp)
+ {
+ sp ++;
+ ep = strchr(sp, ' ');
+ if (ep)
+ {
+ *ep = 0;
+ xps_absolute_path(path, ctx->pwd, sp);
+ xps_trim_url(path);
+ xps_add_relation(ctx, ctx->state, path, REL_REQUIRED_RESOURCE);
+ }
+ }
+}
+
+static void
+xps_parse_image_relation(xps_context_t *ctx, char *string)
+{
+ char path[1024];
+ char buf[1024];
+ char *sp, *ep;
+
+ /* "{ColorConvertedBitmap /Resources/Image.tiff /Resources/Profile.icc}" */
+
+ if (strstr(string, "{ColorConvertedBitmap") == string)
+ {
+ strcpy(buf, string);
+ sp = strchr(buf, ' ');
+ if (sp)
+ {
+ sp ++;
+ ep = strchr(sp, ' ');
+ if (ep)
+ {
+ *ep = 0;
+ xps_absolute_path(path, ctx->pwd, sp);
+ xps_trim_url(path);
+ xps_add_relation(ctx, ctx->state, path, REL_REQUIRED_RESOURCE);
+
+ sp = ep + 1;
+ ep = strchr(sp, '}');
+ if (ep)
+ {
+ *ep = 0;
+ xps_absolute_path(path, ctx->pwd, sp);
+ xps_trim_url(path);
+ xps_add_relation(ctx, ctx->state, path, REL_REQUIRED_RESOURCE);
+ }
+ }
+ }
+ }
+ else
+ {
+ xps_absolute_path(path, ctx->pwd, string);
+ xps_trim_url(path);
+ xps_add_relation(ctx, ctx->state, path, REL_REQUIRED_RESOURCE);
+ }
+}
+
+static void
+xps_parse_content_relations_imp(void *zp, char *ns_name, char **atts)
+{
+ xps_context_t *ctx = zp;
+ char path[1024];
+ char *name;
+ int i;
+
+ name = strchr(ns_name, ' ');
+ if (name)
+ name ++;
+ else
+ name = ns_name;
+
+ if (!strcmp(name, "Glyphs"))
+ {
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "FontUri"))
+ {
+ xps_absolute_path(path, ctx->pwd, atts[i+1]);
+ xps_trim_url(path);
+ xps_add_relation(ctx, ctx->state, path, REL_REQUIRED_RESOURCE);
+ }
+ }
+ }
+
+ if (!strcmp(name, "ImageBrush"))
+ {
+ for (i = 0; atts[i]; i += 2)
+ if (!strcmp(atts[i], "ImageSource"))
+ xps_parse_image_relation(ctx, atts[i + 1]);
+ }
+
+ if (!strcmp(name, "ResourceDictionary"))
+ {
+ for (i = 0; atts[i]; i += 2)
+ {
+ if (!strcmp(atts[i], "Source"))
+ {
+ xps_absolute_path(path, ctx->pwd, atts[i+1]);
+ xps_trim_url(path);
+ xps_add_relation(ctx, ctx->state, path, REL_REQUIRED_RESOURCE_RECURSIVE);
+ }
+ }
+ }
+
+ if (!strcmp(name, "SolidColorBrush") || !strcmp(name, "GradientStop"))
+ {
+ for (i = 0; atts[i]; i += 2)
+ if (!strcmp(atts[i], "Color"))
+ xps_parse_color_relation(ctx, atts[i + 1]);
+ }
+
+ if (!strcmp(name, "Glyphs") || !strcmp(name, "Path"))
+ {
+ for (i = 0; atts[i]; i += 2)
+ if (!strcmp(atts[i], "Fill") || !strcmp(atts[i], "Stroke"))
+ xps_parse_color_relation(ctx, atts[i + 1]);
+ }
+}
+
+int
+xps_parse_content_relations(xps_context_t *ctx, xps_part_t *part)
+{
+ XML_Parser xp;
+
+ ctx->state = part->name;
+
+ if (xps_doc_trace)
+ dprintf1("doc: parsing relations from content (%s)\n", part->name);
+
+ xp = XML_ParserCreateNS(NULL, ' ');
+ if (!xp)
+ return -1;
+
+ XML_SetUserData(xp, ctx);
+ XML_SetParamEntityParsing(xp, XML_PARAM_ENTITY_PARSING_NEVER);
+ XML_SetStartElementHandler(xp, (XML_StartElementHandler)xps_parse_content_relations_imp);
+
+ (void) XML_Parse(xp, part->data, part->size, 1);
+
+ XML_ParserFree(xp);
+
+ if (xps_doc_trace)
+ {
+ xps_relation_t *rel;
+ for (rel = part->relations; rel; rel = rel->next)
+ dprintf1(" relation %s\n", rel->target);
+ }
+
+ ctx->state = NULL;
+
+ return 0;
+}
+
+static int
+xps_validate_resources(xps_context_t *ctx, xps_part_t *part)
+{
+ xps_relation_t *rel;
+ xps_part_t *subpart;
+
+ for (rel = part->relations; rel; rel = rel->next)
+ {
+ if (!strcmp(rel->type, REL_REQUIRED_RESOURCE_RECURSIVE))
+ {
+ subpart = xps_find_part(ctx, rel->target);
+ if (!subpart || !subpart->complete)
+ return 0;
+ if (!subpart->relations_complete)
+ {
+ xps_parse_content_relations(ctx, subpart);
+ subpart->relations_complete = 1;
+ }
+ if (!xps_validate_resources(ctx, subpart))
+ return 0;
+ }
+
+ if (!strcmp(rel->type, REL_REQUIRED_RESOURCE))
+ {
+ subpart = xps_find_part(ctx, rel->target);
+ if (!subpart || !subpart->complete)
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int
+xps_process_part(xps_context_t *ctx, xps_part_t *part)
+{
+ xps_document_t *fixdoc;
+
+ if (getenv("XPS_DOC_TRACE"))
+ xps_doc_trace = 1;
+
+ if (xps_doc_trace)
+ dprintf2("doc: found part %s %s\n", part->name, part->complete ? "" : "(piece)");
+
+ /*
+ * These two are magic Open Packaging Convention names.
+ */
+
+ if (strstr(part->name, "[Content_Types].xml"))
+ {
+ xps_process_metadata(ctx, part);
+ }
+
+ if (strstr(part->name, "_rels/"))
+ {
+ xps_process_metadata(ctx, part);
+
+ if (part->complete)
+ {
+ char realname[1024];
+ xps_part_t *realpart;
+ xps_part_from_relation(realname, part->name);
+ realpart = xps_find_part(ctx, realname);
+ if (realpart)
+ {
+ realpart->relations_complete = 1;
+ }
+ }
+ }
+
+ /*
+ * For the rest we need to track the relationships
+ * and content-types given by the previous two types.
+ *
+ * We can't do anything until we have the relationship
+ * for the start part.
+ */
+
+ if (!ctx->start_part)
+ {
+ xps_part_t *rootpart;
+ rootpart = xps_find_part(ctx, "/");
+ if (rootpart)
+ {
+ xps_relation_t *rel;
+ for (rel = rootpart->relations; rel; rel = rel->next)
+ {
+ if (!strcmp(rel->type, REL_START_PART))
+ {
+ xps_part_t *startpart;
+
+ ctx->start_part = rel->target;
+
+ if (xps_doc_trace)
+ dprintf1("doc: adding start part '%s'\n", ctx->start_part);
+
+ startpart = xps_find_part(ctx, rel->target);
+ if (startpart)
+ xps_process_metadata(ctx, startpart);
+ }
+ }
+ }
+ }
+
+ /*
+ * Read the start part (which is a FixedDocumentSequence) if it
+ * is the current part.
+ */
+
+ if (ctx->start_part)
+ {
+ if (!strcmp(part->name, ctx->start_part))
+ {
+ xps_process_metadata(ctx, part);
+ }
+ }
+
+ /*
+ * Follow the FixedDocumentSequence and parse the
+ * listed FixedDocuments that we have available.
+ */
+
+ for (fixdoc = ctx->first_fixdoc; fixdoc; fixdoc = fixdoc->next)
+ {
+ xps_part_t *fixdocpart = xps_find_part(ctx, fixdoc->name);
+ if (fixdocpart)
+ {
+ xps_process_metadata(ctx, fixdocpart);
+ if (!fixdocpart->complete)
+ break; /* incomplete fixdocpart, try parsing more later */
+ }
+ }
+
+ /*
+ * If we know which page part is next, check if we
+ * have all the page dependencies. If everything is
+ * ready: parse and render.
+ */
+
+ while (ctx->next_page)
+ {
+ xps_part_t *pagepart = xps_find_part(ctx, ctx->next_page->name);
+ if (pagepart && pagepart->complete)
+ {
+ xps_relation_t *rel;
+ int have_resources;
+ char *s;
+
+ /* Set current directory for resolving relative path names */
+ strcpy(ctx->pwd, pagepart->name);
+ s = strrchr(ctx->pwd, '/');
+ if (s)
+ s[1] = 0;
+
+ if (!pagepart->relations_complete)
+ {
+ xps_parse_content_relations(ctx, pagepart);
+ pagepart->relations_complete = 1;
+ }
+
+ if (xps_validate_resources(ctx, pagepart))
+ {
+ int code = xps_parse_fixed_page(ctx, pagepart);
+ if (code < 0)
+ return code;
+
+ ctx->next_page = ctx->next_page->next;
+
+ xps_free_used_parts(ctx);
+
+ continue;
+ }
+ }
+
+ break;
+ }
+
+ return 0;
+}
+
+
diff --git a/xps/xpsfont.c b/xps/xpsfont.c
new file mode 100644
index 000000000..fa3e0ca3f
--- /dev/null
+++ b/xps/xpsfont.c
@@ -0,0 +1,542 @@
+#include "ghostxps.h"
+
+/*
+ * Big-endian memory accessor functions
+ */
+
+static inline int s16(byte *p)
+{
+ return (signed short)( (p[0] << 8) | p[1] );
+}
+
+static inline int u16(byte *p)
+{
+ return (p[0] << 8) | p[1];
+}
+
+static inline int u24(byte *p)
+{
+ return (p[0] << 16) | (p[1] << 8) | p[2];
+}
+
+static inline int u32(byte *p)
+{
+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
+
+int xps_init_font_cache(xps_context_t *ctx)
+{
+ const int smax = 50; /* number of scaled fonts */
+ const int bmax = 500000; /* space for cached chars */
+ const int mmax = 200; /* number of cached font/matrix pairs */
+ const int cmax = 5000; /* number of cached chars */
+ const int upper = 32000; /* max size of a single cached char */
+
+ ctx->fontdir = gs_font_dir_alloc2_limits(ctx->memory, ctx->memory, smax, bmax, mmax, cmax, upper);
+ if (!ctx->fontdir)
+ return gs_throw(-1, "cannot gs_font_dir_alloc2_limits()");
+
+ gs_setaligntopixels(ctx->fontdir, 0); /* no subpixels */
+ gs_setgridfittt(ctx->fontdir, 0); /* see gx_ttf_outline in gxttfn.c for values */
+
+ return gs_okay;
+}
+
+xps_font_t *
+xps_new_font(xps_context_t *ctx, char *buf, int buflen, int index)
+{
+ xps_font_t *font;
+ int code;
+
+ font = xps_alloc(ctx, sizeof(xps_font_t));
+ if (!font)
+ {
+ gs_throw(-1, "out of memory");
+ return NULL;
+ }
+
+ font->data = (byte*)buf;
+ font->length = buflen;
+ font->font = NULL;
+
+ font->subfontid = index;
+ font->cmaptable = 0;
+ font->cmapsubcount = 0;
+ font->cmapsubtable = 0;
+ font->usepua = 0;
+
+ font->cffdata = 0;
+ font->cffend = 0;
+ font->gsubrs = 0;
+ font->subrs = 0;
+ font->charstrings = 0;
+
+ if (memcmp(font->data, "OTTO", 4) == 0)
+ code = xps_init_postscript_font(ctx, font);
+ else if (memcmp(font->data, "\0\1\0\0", 4) == 0)
+ code = xps_init_truetype_font(ctx, font);
+ else if (memcmp(font->data, "true", 4) == 0)
+ code = xps_init_truetype_font(ctx, font);
+ else if (memcmp(font->data, "ttcf", 4) == 0)
+ code = xps_init_truetype_font(ctx, font);
+ else
+ {
+ xps_free_font(ctx, font);
+ gs_throw(-1, "not an opentype font");
+ return NULL;
+ }
+
+ if (code < 0)
+ {
+ xps_free_font(ctx, font);
+ gs_rethrow(-1, "cannot init font");
+ return NULL;
+ }
+
+ code = xps_load_sfnt_cmap(font);
+ if (code < 0)
+ {
+ errprintf("warning: no cmap table found in font\n");
+ }
+
+ return font;
+}
+
+void
+xps_free_font(xps_context_t *ctx, xps_font_t *font)
+{
+ dputs("calling xps_free_font!\n");
+ if (font->font)
+ {
+ gs_font_finalize(font->font);
+ gs_free_object(ctx->memory, font->font, "font object");
+ }
+ xps_free(ctx, font);
+}
+
+
+/*
+ * Find the offset and length of an SFNT table.
+ * Return -1 if no table by the specified name is found.
+ */
+
+int
+xps_find_sfnt_table(xps_font_t *font, char *name, int *lengthp)
+{
+ byte *directory;
+ int offset;
+ int ntables;
+ int i;
+
+ if (font->length < 12)
+ return -1;
+
+ if (!memcmp(font->data, "ttcf", 4))
+ {
+ int nfonts = u32(font->data + 8);
+ if (font->subfontid < 0 || font->subfontid >= nfonts)
+ return gs_throw(-1, "Invalid subfont ID");
+ offset = u32(font->data + 12 + font->subfontid * 4);
+ }
+ else
+ {
+ offset = 0;
+ }
+
+ ntables = u16(font->data + offset + 4);
+ if (font->length < offset + 12 + ntables * 16)
+ return -1;
+
+ for (i = 0; i < ntables; i++)
+ {
+ byte *entry = font->data + offset + 12 + i * 16;
+ if (!memcmp(entry, name, 4))
+ {
+ if (lengthp)
+ *lengthp = u32(entry + 12);
+ return u32(entry + 8);
+ }
+ }
+
+ return -1;
+}
+
+/*
+ * Get the windows truetype font file name - position 4 in the name table.
+ */
+int xps_load_sfnt_name(xps_font_t *font, char *namep)
+{
+ byte *namedata;
+ int offset, length;
+ int format, count, stringoffset;
+ int i;
+
+ strcpy(namep, "Unknown");
+
+ offset = xps_find_sfnt_table(font, "name", &length);
+ if (offset < 0)
+ return -1;
+ if (length < 6)
+ return -1;
+
+ namedata = font->data + offset;
+
+ format = u16(namedata + 0);
+ count = u16(namedata + 2);
+ stringoffset = u16(namedata + 4);
+
+ for (i = 0; i < count; i++)
+ {
+ byte *record = namedata + 6 + i * 12;
+ int pid = u16(record + 0);
+ int eid = u16(record + 2);
+ int langid = u16(record + 4);
+ int nameid = u16(record + 6);
+ length = u16(record + 8);
+ offset = u16(record + 10);
+
+ /* Mac Roman English */
+ if (pid == 1 && eid == 0 && langid == 0)
+ {
+ /* Full font name or postscript name */
+ if (nameid == 4 || nameid == 6)
+ {
+ memcpy(namep, namedata + stringoffset + offset, length);
+ namep[length] = 0;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Locate the 'cmap' table and count the number of subtables.
+ */
+
+int
+xps_load_sfnt_cmap(xps_font_t *font)
+{
+ byte *cmapdata;
+ int offset, length;
+ int nsubtables;
+
+ offset = xps_find_sfnt_table(font, "cmap", &length);
+ if (offset < 0)
+ return -1;
+
+ if (length < 4)
+ return -1;
+
+ cmapdata = font->data + offset;
+
+ nsubtables = u16(cmapdata + 2);
+ if (nsubtables < 0)
+ return -1;
+ if (length < 4 + nsubtables * 8)
+ return -1;
+
+ font->cmaptable = offset;
+ font->cmapsubcount = nsubtables;
+ font->cmapsubtable = 0;
+
+ return 0;
+}
+
+/*
+ * Return the number of cmap subtables.
+ */
+
+int
+xps_count_font_encodings(xps_font_t *font)
+{
+ return font->cmapsubcount;
+}
+
+/*
+ * Extract PlatformID and EncodingID for a cmap subtable.
+ */
+
+int
+xps_identify_font_encoding(xps_font_t *font, int idx, int *pid, int *eid)
+{
+ byte *cmapdata, *entry;
+ if (idx < 0 || idx >= font->cmapsubcount)
+ return -1;
+ cmapdata = font->data + font->cmaptable;
+ entry = cmapdata + 4 + idx * 8;
+ *pid = u16(entry + 0);
+ *eid = u16(entry + 2);
+ return 0;
+}
+
+/*
+ * Select a cmap subtable for use with encoding functions.
+ */
+
+int
+xps_select_font_encoding(xps_font_t *font, int idx)
+{
+ byte *cmapdata, *entry;
+ int pid, eid;
+ if (idx < 0 || idx >= font->cmapsubcount)
+ return -1;
+ cmapdata = font->data + font->cmaptable;
+ entry = cmapdata + 4 + idx * 8;
+ pid = u16(entry + 0);
+ eid = u16(entry + 2);
+ font->cmapsubtable = font->cmaptable + u32(entry + 4);
+ font->usepua = (pid == 3 && eid == 0);
+ return 0;
+}
+
+
+/*
+ * Encode a character using the selected cmap subtable.
+ * TODO: extend this to cover more cmap formats.
+ */
+
+static int
+xps_encode_font_char_int(xps_font_t *font, int code)
+{
+ byte *table;
+
+ /* no cmap selected: return identity */
+ if (font->cmapsubtable <= 0)
+ return code;
+
+ table = font->data + font->cmapsubtable;
+
+ switch (u16(table))
+ {
+ case 0: /* Apple standard 1-to-1 mapping. */
+ return table[code + 6];
+
+ case 4: /* Microsoft/Adobe segmented mapping. */
+ {
+ int segCount2 = u16(table + 6);
+ byte *endCount = table + 14;
+ byte *startCount = endCount + segCount2 + 2;
+ byte *idDelta = startCount + segCount2;
+ byte *idRangeOffset = idDelta + segCount2;
+ int i2;
+
+ for (i2 = 0; i2 < segCount2 - 3; i2 += 2)
+ {
+ int delta, roff;
+ int start = u16(startCount + i2);
+ int glyph;
+
+ if ( code < start )
+ return 0;
+ if ( code > u16(endCount + i2) )
+ continue;
+ delta = s16(idDelta + i2);
+ roff = s16(idRangeOffset + i2);
+ if ( roff == 0 )
+ {
+ return ( code + delta ) & 0xffff; /* mod 65536 */
+ return 0;
+ }
+ glyph = u16(idRangeOffset + i2 + roff + ((code - start) << 1));
+ return (glyph == 0 ? 0 : glyph + delta);
+ }
+
+ /*
+ * The TrueType documentation says that the last range is
+ * always supposed to end with 0xffff, so this shouldn't
+ * happen; however, in some real fonts, it does.
+ */
+ return 0;
+ }
+
+ case 6: /* Single interval lookup. */
+ {
+ int firstCode = u16(table + 6);
+ int entryCount = u16(table + 8);
+ if ( code < firstCode || code >= firstCode + entryCount )
+ return 0;
+ return u16(table + 10 + ((code - firstCode) << 1));
+ }
+
+ case 10: /* Trimmed array (like 6) */
+ {
+ int startCharCode = u32(table + 12);
+ int numChars = u32(table + 16);
+ if ( code < startCharCode || code >= startCharCode + numChars )
+ return 0;
+ return u32(table + 20 + (code - startCharCode) * 4);
+ }
+
+ case 12: /* Segmented coverage. (like 4) */
+ {
+ int nGroups = u32(table + 12);
+ byte *group = table + 16;
+ int i;
+
+ for (i = 0; i < nGroups; i++)
+ {
+ int startCharCode = u32(group + 0);
+ int endCharCode = u32(group + 4);
+ int startGlyphID = u32(group + 8);
+ if ( code < startCharCode )
+ return 0;
+ if ( code <= endCharCode )
+ return startGlyphID + (code - startCharCode);
+ group += 12;
+ }
+
+ return 0;
+ }
+
+ case 2: /* High-byte mapping through table. */
+ case 8: /* Mixed 16-bit and 32-bit coverage (like 2) */
+ default:
+ errprintf("error: unknown cmap format: %d\n", u16(table));
+ return 0;
+ }
+
+ return 0;
+}
+
+int
+xps_encode_font_char(xps_font_t *font, int code)
+{
+ int gid = xps_encode_font_char_int(font, code);
+ if (gid == 0 && font->usepua)
+ gid = xps_encode_font_char_int(font, 0xF000 | code);
+ return gid;
+}
+
+/*
+ * Get glyph metrics by parsing TTF tables manually.
+ * XPS needs more and different metrics than postscript/ghostscript
+ * use so the native ghostscript functions are not adequate.
+ */
+
+int xps_measure_font_glyph(xps_context_t *ctx, xps_font_t *font, int gid, xps_glyph_metrics_t *mtx)
+{
+
+ int head, format, loca, glyf;
+ int ofs, len;
+ int idx, i, n;
+ int hadv, vadv, vorg;
+ int vtop, ymax, desc;
+ int scale;
+
+ /* some insane defaults */
+
+ scale = 1000; /* units-per-em */
+ hadv = 500;
+ vadv = -1000;
+ vorg = 1000;
+
+ /*
+ * Horizontal metrics are easy.
+ */
+
+ ofs = xps_find_sfnt_table(font, "hhea", &len);
+ if (ofs < 0)
+ return gs_throw(-1, "cannot find hhea table");
+
+ if (len < 2 * 18)
+ return gs_throw(-1, "hhea table is too short");
+
+ vorg = s16(font->data + ofs + 4); /* ascender is default vorg */
+ desc = s16(font->data + ofs + 6); /* descender */
+ if (desc < 0)
+ desc = -desc;
+ n = u16(font->data + ofs + 17 * 2);
+
+ ofs = xps_find_sfnt_table(font, "hmtx", &len);
+ if (ofs < 0)
+ return gs_throw(-1, "cannot find hmtx table");
+
+ idx = gid;
+ if (idx > n - 1)
+ idx = n - 1;
+
+ hadv = u16(font->data + ofs + idx * 4);
+ vadv = 0;
+
+ /*
+ * Vertical metrics are hairy (with missing tables).
+ */
+
+ head = xps_find_sfnt_table(font, "head", &len);
+ if (head > 0)
+ {
+ scale = u16(font->data + head + 18); /* units per em */
+ }
+
+ ofs = xps_find_sfnt_table(font, "OS/2", &len);
+ if (ofs > 0 && len > 70)
+ {
+ vorg = s16(font->data + ofs + 68); /* sTypoAscender */
+ desc = s16(font->data + ofs + 70); /* sTypoDescender */
+ if (desc < 0)
+ desc = -desc;
+ }
+
+ ofs = xps_find_sfnt_table(font, "vhea", &len);
+ if (ofs > 0)
+ {
+ if (len < 2 * 18)
+ return gs_throw(-1, "vhea table is too short");
+
+ n = u16(font->data + ofs + 17 * 2);
+
+ ofs = xps_find_sfnt_table(font, "vmtx", &len);
+ if (ofs < 0)
+ return gs_throw(-1, "cannot find vmtx table");
+
+ idx = gid;
+ if (idx > n - 1)
+ idx = n - 1;
+
+ vadv = u16(font->data + ofs + idx * 4);
+ vtop = u16(font->data + ofs + idx * 4 + 2);
+
+ glyf = xps_find_sfnt_table(font, "glyf", &len);
+ loca = xps_find_sfnt_table(font, "loca", &len);
+ if (head > 0 && glyf > 0 && loca > 0)
+ {
+ format = u16(font->data + head + 50); /* indexToLocaFormat */
+
+ if (format == 0)
+ ofs = u16(font->data + loca + gid * 2) * 2;
+ else
+ ofs = u32(font->data + loca + gid * 4);
+
+ ymax = u16(font->data + glyf + ofs + 8); /* yMax */
+
+ vorg = ymax + vtop;
+ }
+ }
+
+ ofs = xps_find_sfnt_table(font, "VORG", &len);
+ if (ofs > 0)
+ {
+ vorg = u16(font->data + ofs + 6);
+ n = u16(font->data + ofs + 6);
+ for (i = 0; i < n; i++)
+ {
+ if (u16(font->data + ofs + 8 + 4 * i) == gid)
+ {
+ vorg = s16(font->data + ofs + 8 + 4 * i + 2);
+ break;
+ }
+ }
+ }
+
+ if (vadv == 0)
+ vadv = vorg + desc;
+
+ mtx->hadv = hadv / (float) scale;
+ mtx->vadv = vadv / (float) scale;
+ mtx->vorg = vorg / (float) scale;
+
+ return 0;
+}
+
diff --git a/xps/xpsglyphs.c b/xps/xpsglyphs.c
new file mode 100644
index 000000000..f8c6cc8ae
--- /dev/null
+++ b/xps/xpsglyphs.c
@@ -0,0 +1,683 @@
+#include "ghostxps.h"
+
+#include <ctype.h>
+
+#define XPS_TEXT_BUFFER_SIZE 300
+
+typedef struct xps_text_buffer_s xps_text_buffer_t;
+
+struct xps_text_buffer_s
+{
+ int count;
+ float x[XPS_TEXT_BUFFER_SIZE + 1];
+ float y[XPS_TEXT_BUFFER_SIZE + 1];
+ gs_glyph g[XPS_TEXT_BUFFER_SIZE];
+};
+
+static inline int unhex(int i)
+{
+ if (isdigit(i))
+ return i - '0';
+ return tolower(i) - 'a' + 10;
+}
+
+void xps_debug_path(xps_context_t *ctx)
+{
+ segment *seg;
+ curve_segment *cseg;
+
+ seg = (segment*)ctx->pgs->path->first_subpath;
+ while (seg)
+ {
+ switch (seg->type)
+ {
+ case s_start:
+ dprintf2("%g %g moveto\n",
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ case s_line:
+ dprintf2("%g %g lineto\n",
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ case s_line_close:
+ dputs("closepath\n");
+ break;
+ case s_curve:
+ cseg = (curve_segment*)seg;
+ dprintf6("%g %g %g %g %g %g curveto\n",
+ fixed2float(cseg->p1.x) * 0.001,
+ fixed2float(cseg->p1.y) * 0.001,
+ fixed2float(cseg->p2.x) * 0.001,
+ fixed2float(cseg->p2.y) * 0.001,
+ fixed2float(seg->pt.x) * 0.001,
+ fixed2float(seg->pt.y) * 0.001);
+ break;
+ }
+ seg = seg->next;
+ }
+}
+
+/*
+ * Some fonts in XPS are obfuscated by XOR:ing the first 32 bytes of the
+ * data with the GUID in the fontname.
+ */
+int
+xps_deobfuscate_font_resource(xps_context_t *ctx, xps_part_t *part)
+{
+ byte buf[33];
+ byte key[16];
+ char *p;
+ int i;
+
+ dprintf1("deobfuscating font '%s'\n", part->name);
+
+ p = strrchr(part->name, '/');
+ if (!p)
+ p = part->name;
+
+ for (i = 0; i < 32 && *p; p++)
+ {
+ if (isxdigit(*p))
+ buf[i++] = *p;
+ }
+ buf[i] = 0;
+
+ if (i != 32)
+ return gs_throw(-1, "cannot extract GUID from part name");
+
+ for (i = 0; i < 16; i++)
+ key[i] = unhex(buf[i*2+0]) * 16 + unhex(buf[i*2+1]);
+
+ for (i = 0; i < 16; i++)
+ {
+ part->data[i] ^= key[15-i];
+ part->data[i+16] ^= key[15-i];
+ }
+
+ if (getenv("XPS_SAVE_FONTS"))
+ {
+ static int id = 0;
+ char buf[25];
+ FILE *fp;
+ sprintf(buf, "font%d.otf", id++);
+ dprintf1("saving font data to %s\n", buf);
+ fp = fopen(buf, "wb");
+ fwrite(part->data, part->size, 1, fp);
+ fclose(fp);
+ }
+
+ return 0;
+}
+
+int
+xps_select_best_font_encoding(xps_font_t *font)
+{
+ static struct { int pid, eid; } xps_cmap_list[] =
+ {
+ { 3, 10 }, /* Unicode with surrogates */
+ { 3, 1 }, /* Unicode without surrogates */
+ { 3, 5 }, /* Wansung */
+ { 3, 4 }, /* Big5 */
+ { 3, 3 }, /* Prc */
+ { 3, 2 }, /* ShiftJis */
+ { 3, 0 }, /* Symbol */
+ // { 0, * }, -- Unicode (deprecated)
+ { 1, 0 },
+ { -1, -1 },
+ };
+
+ int i, k, n, pid, eid;
+
+ n = xps_count_font_encodings(font);
+ for (k = 0; xps_cmap_list[k].pid != -1; k++)
+ {
+ for (i = 0; i < n; i++)
+ {
+ xps_identify_font_encoding(font, i, &pid, &eid);
+ if (pid == xps_cmap_list[k].pid && eid == xps_cmap_list[k].eid)
+ {
+ xps_select_font_encoding(font, i);
+ return 0;
+ }
+ }
+ }
+
+ return gs_throw(-1, "could not find a suitable cmap");
+}
+
+/*
+ * Call text drawing primitives.
+ */
+
+int xps_flush_text_buffer(xps_context_t *ctx, xps_font_t *font,
+ xps_text_buffer_t *buf, int is_charpath)
+{
+ gs_text_params_t params;
+ gs_text_enum_t *textenum;
+ float x = buf->x[0];
+ float y = buf->y[0];
+ int code;
+ int i;
+
+ // dprintf1("flushing text buffer (%d glyphs)\n", buf->count);
+
+#if 0 /* one glyph at a time */
+
+ for (i = 0; i < buf->count; i++)
+ {
+ gs_moveto(ctx->pgs, buf->x[i], buf->y[i]);
+
+ params.operation = TEXT_FROM_SINGLE_GLYPH;
+ if (is_charpath)
+ params.operation |= TEXT_DO_FALSE_CHARPATH;
+ else
+ params.operation |= TEXT_DO_DRAW;
+ params.data.d_glyph = buf->g[i];
+ params.size = 1;
+
+ code = gs_text_begin(ctx->pgs, &params, ctx->memory, &textenum);
+ if (code != 0)
+ return gs_throw1(-1, "cannot gs_text_begin() (%d)", code);
+
+ code = gs_text_process(textenum);
+ if (code != 0)
+ return gs_throw1(-1, "cannot gs_text_process() (%d)", code);
+
+ gs_text_release(textenum, "gslt font render");
+ }
+
+#else
+
+ gs_moveto(ctx->pgs, x, y);
+
+ params.operation = TEXT_FROM_GLYPHS | TEXT_REPLACE_WIDTHS;
+ if (is_charpath)
+ params.operation |= TEXT_DO_FALSE_CHARPATH;
+ else
+ params.operation |= TEXT_DO_DRAW;
+ params.data.glyphs = buf->g;
+ params.size = buf->count;
+ params.x_widths = buf->x + 1;
+ params.y_widths = buf->y + 1;
+ params.widths_size = buf->count;
+
+ for (i = 0; i < buf->count; i++)
+ {
+ buf->x[i] = buf->x[i] - x;
+ buf->y[i] = buf->y[i] - y;
+ x += buf->x[i];
+ y += buf->y[i];
+ }
+ buf->x[buf->count] = 0;
+ buf->y[buf->count] = 0;
+
+ code = gs_text_begin(ctx->pgs, &params, ctx->memory, &textenum);
+ if (code != 0)
+ return gs_throw1(-1, "cannot gs_text_begin() (%d)", code);
+
+ code = gs_text_process(textenum);
+ if (code != 0)
+ return gs_throw1(-1, "cannot gs_text_process() (%d)", code);
+
+ gs_text_release(textenum, "gslt font render");
+#endif
+
+ buf->count = 0;
+
+ return 0;
+}
+
+/*
+ * Parse and draw an XPS <Glyphs> element.
+ *
+ * Indices syntax:
+
+ GlyphIndices = GlyphMapping ( ";" GlyphMapping )
+ GlyphMapping = ( [ClusterMapping] GlyphIndex ) [GlyphMetrics]
+ ClusterMapping = "(" ClusterCodeUnitCount [":" ClusterGlyphCount] ")"
+ ClusterCodeUnitCount = * DIGIT
+ ClusterGlyphCount = * DIGIT
+ GlyphIndex = * DIGIT
+ GlyphMetrics = "," AdvanceWidth ["," uOffset ["," vOffset]]
+ AdvanceWidth = ["+"] RealNum
+ uOffset = ["+" | "-"] RealNum
+ vOffset = ["+" | "-"] RealNum
+ RealNum = ((DIGIT ["." DIGIT]) | ("." DIGIT)) [Exponent]
+ Exponent = ( ("E"|"e") ("+"|"-") DIGIT )
+
+ */
+
+static char *
+xps_parse_digits(char *s, int *digit)
+{
+ *digit = 0;
+ while (*s >= '0' && *s <= '9')
+ {
+ *digit = *digit * 10 + (*s - '0');
+ s ++;
+ }
+ return s;
+}
+
+static int is_real_num_char(int c)
+{
+ return (c >= '0' && c <= '9') || c == 'e' || c == 'E' || c == '+' || c == '-' || c == '.';
+}
+
+static char *
+xps_parse_real_num(char *s, float *number)
+{
+ char buf[64];
+ char *p = buf;
+ while (is_real_num_char(*s))
+ *p++ = *s++;
+ *p = 0;
+ if (buf[0])
+ *number = atof(buf);
+ return s;
+}
+
+static char *
+xps_parse_cluster_mapping(char *s, int *code_count, int *glyph_count)
+{
+ if (*s == '(')
+ s = xps_parse_digits(s + 1, code_count);
+ if (*s == ':')
+ s = xps_parse_digits(s + 1, glyph_count);
+ if (*s == ')')
+ s ++;
+ return s;
+}
+
+static char *
+xps_parse_glyph_index(char *s, int *glyph_index)
+{
+ if (*s >= '0' && *s <= '9')
+ s = xps_parse_digits(s, glyph_index);
+ return s;
+}
+
+static char *
+xps_parse_glyph_metrics(char *s, float *advance, float *uofs, float *vofs)
+{
+ if (*s == ',')
+ s = xps_parse_real_num(s + 1, advance);
+ if (*s == ',')
+ s = xps_parse_real_num(s + 1, uofs);
+ if (*s == ',')
+ s = xps_parse_real_num(s + 1, vofs);
+ return s;
+}
+
+int
+xps_parse_glyphs_imp(xps_context_t *ctx, xps_font_t *font, float size,
+ float originx, float originy, int is_sideways, int bidi_level,
+ char *indices, char *unicode, int is_charpath)
+{
+ // parse unicode and indices strings and encode glyphs
+ // and calculate metrics for positioning
+
+ xps_text_buffer_t buf;
+ xps_glyph_metrics_t mtx;
+ float x = originx;
+ float y = originy;
+ char *us = unicode;
+ char *is = indices;
+ int un;
+
+ // dprintf1("string (%s)\n", us);
+ // dprintf1("indices %.50s\n", is);
+
+ buf.count = 0;
+
+ if (!unicode && !indices)
+ return gs_throw(-1, "no text in glyphs element");
+
+ if (us)
+ {
+ if (us[0] == '{' && us[1] == '}')
+ us = us + 2;
+ un = strlen(us);
+ }
+
+ while ((us && un > 0) || (is && *is))
+ {
+ int code_count = 1;
+ int glyph_count = 1;
+
+ if (is && *is)
+ {
+ is = xps_parse_cluster_mapping(is, &code_count, &glyph_count);
+ }
+
+ if (code_count < 1)
+ code_count = 1;
+ if (glyph_count < 1)
+ glyph_count = 1;
+
+ while (code_count > 0 || glyph_count > 0)
+ {
+ int char_code = '?';
+ int glyph_index = -1;
+ float u_offset = 0.0;
+ float v_offset = 0.0;
+ float advance;
+
+ if (glyph_count)
+ {
+ if (is && *is)
+ is = xps_parse_glyph_index(is, &glyph_index);
+ glyph_count --;
+ }
+
+ if (code_count)
+ {
+ if (us && un > 0)
+ {
+ int t = xps_utf8_to_ucs(&char_code, us, un);
+ if (t < 0)
+ return gs_rethrow(-1, "error decoding UTF-8 string");
+ us += t; un -= t;
+ }
+ code_count --;
+ }
+
+ if (glyph_index == -1)
+ glyph_index = xps_encode_font_char(font, char_code);
+
+ xps_measure_font_glyph(ctx, font, glyph_index, &mtx);
+ if (is_sideways)
+ advance = mtx.vadv * 100.0;
+ else if (bidi_level & 1)
+ advance = -mtx.hadv * 100.0;
+ else
+ advance = mtx.hadv * 100.0;
+
+ if (is && *is)
+ {
+ is = xps_parse_glyph_metrics(is, &advance, &u_offset, &v_offset);
+ if (*is == ';')
+ is ++;
+ }
+
+#if 0
+ dprintf6("glyph mapping (%d:%d)%d,%g,%g,%g\n",
+ code_count, glyph_count, glyph_index,
+ advance, u_offset, v_offset);
+#endif
+
+ if (bidi_level & 1)
+ u_offset = -mtx.hadv * 100 - u_offset;
+
+ u_offset = u_offset * 0.01 * size;
+ v_offset = v_offset * 0.01 * size;
+
+ if (buf.count < XPS_TEXT_BUFFER_SIZE)
+ {
+ if (is_sideways)
+ {
+ buf.x[buf.count] = x + u_offset + (mtx.vorg * size);
+ buf.y[buf.count] = y - v_offset + (mtx.hadv * 0.5 * size);
+ }
+ else
+ {
+ buf.x[buf.count] = x + u_offset;
+ buf.y[buf.count] = y - v_offset;
+ }
+ buf.g[buf.count] = glyph_index;
+ buf.count ++;
+ }
+ else
+ {
+ xps_flush_text_buffer(ctx, font, &buf, is_charpath);
+ }
+
+ x += advance * 0.01 * size;
+ }
+ }
+
+ if (buf.count > 0)
+ {
+ xps_flush_text_buffer(ctx, font, &buf, is_charpath);
+ }
+
+ return 0;
+}
+
+int
+xps_parse_glyphs(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ xps_item_t *node;
+
+ char *bidi_level_att;
+ char *caret_stops_att;
+ char *fill_att;
+ char *font_size_att;
+ char *font_uri_att;
+ char *origin_x_att;
+ char *origin_y_att;
+ char *is_sideways_att;
+ char *indices_att;
+ char *unicode_att;
+ char *style_att;
+ char *transform_att;
+ char *clip_att;
+ char *opacity_att;
+ char *opacity_mask_att;
+
+ xps_item_t *transform_tag = NULL;
+ xps_item_t *clip_tag = NULL;
+ xps_item_t *fill_tag = NULL;
+ xps_item_t *opacity_mask_tag = NULL;
+
+ char *fill_opacity_att = NULL;
+
+ xps_part_t *part;
+ xps_font_t *font;
+
+ char partname[1024];
+ char *parttype;
+ char *subfont;
+
+ gs_matrix matrix;
+ float font_size = 10.0;
+ int subfontid = 0;
+ int is_sideways = 0;
+ int bidi_level = 0;
+
+ gs_rect saved_bounds;
+
+ /*
+ * Extract attributes and extended attributes.
+ */
+
+ bidi_level_att = xps_att(root, "BidiLevel");
+ caret_stops_att = xps_att(root, "CaretStops");
+ fill_att = xps_att(root, "Fill");
+ font_size_att = xps_att(root, "FontRenderingEmSize");
+ font_uri_att = xps_att(root, "FontUri");
+ origin_x_att = xps_att(root, "OriginX");
+ origin_y_att = xps_att(root, "OriginY");
+ is_sideways_att = xps_att(root, "IsSideways");
+ indices_att = xps_att(root, "Indices");
+ unicode_att = xps_att(root, "UnicodeString");
+ style_att = xps_att(root, "StyleSimulations");
+ transform_att = xps_att(root, "RenderTransform");
+ clip_att = xps_att(root, "Clip");
+ opacity_att = xps_att(root, "Opacity");
+ opacity_mask_att = xps_att(root, "OpacityMask");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "Glyphs.RenderTransform"))
+ transform_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Glyphs.OpacityMask"))
+ opacity_mask_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Glyphs.Clip"))
+ clip_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Glyphs.Fill"))
+ fill_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &transform_att, &transform_tag);
+ xps_resolve_resource_reference(ctx, dict, &clip_att, &clip_tag);
+ xps_resolve_resource_reference(ctx, dict, &fill_att, &fill_tag);
+ xps_resolve_resource_reference(ctx, dict, &opacity_mask_att, &opacity_mask_tag);
+
+ /*
+ * Check that we have all the necessary information.
+ */
+
+ if (!font_size_att || !font_uri_att || !origin_x_att || !origin_y_att)
+ return gs_throw(-1, "missing attributes in glyphs element");
+
+ if (!indices_att && !unicode_att)
+ return 0; /* nothing to draw */
+
+ if (is_sideways_att)
+ is_sideways = !strcmp(is_sideways_att, "true");
+
+ if (bidi_level_att)
+ bidi_level = atoi(bidi_level_att);
+
+ /*
+ * Find and load the font resource
+ */
+
+ // TODO: get subfont index from # part of uri
+
+ xps_absolute_path(partname, ctx->pwd, font_uri_att);
+ subfont = strrchr(partname, '#');
+ if (subfont)
+ {
+ subfontid = atoi(subfont + 1);
+ *subfont = 0;
+ }
+ part = xps_find_part(ctx, partname);
+ if (!part)
+ return gs_throw1(-1, "cannot find font resource part '%s'", partname);
+
+ if (!part->deobfuscated)
+ {
+ /* deobfuscate if necessary */
+ parttype = xps_get_content_type(ctx, part->name);
+ if (parttype && !strcmp(parttype, "application/vnd.ms-package.obfuscated-opentype"))
+ xps_deobfuscate_font_resource(ctx, part);
+
+ /* stupid XPS files with content-types after the parts */
+ if (!parttype && strstr(part->name, ".odttf"))
+ xps_deobfuscate_font_resource(ctx, part);
+ if (!parttype && strstr(part->name, ".ODTTF"))
+ xps_deobfuscate_font_resource(ctx, part);
+
+ part->deobfuscated = 1;
+ }
+
+ if (!part->font)
+ {
+ part->font = xps_new_font(ctx, part->data, part->size, subfontid);
+ if (!part->font)
+ return gs_rethrow1(-1, "cannot load font resource '%s'", partname);
+
+ xps_select_best_font_encoding(part->font);
+ }
+
+ font = part->font;
+
+ /*
+ * Set up graphics state.
+ */
+
+ gs_gsave(ctx->pgs);
+
+ if (transform_att || transform_tag)
+ {
+ gs_matrix transform;
+
+ if (transform_att)
+ xps_parse_render_transform(ctx, transform_att, &transform);
+ if (transform_tag)
+ xps_parse_matrix_transform(ctx, transform_tag, &transform);
+
+ gs_concat(ctx->pgs, &transform);
+ }
+
+ if (clip_att || clip_tag)
+ {
+ if (clip_att)
+ xps_parse_abbreviated_geometry(ctx, clip_att);
+ if (clip_tag)
+ xps_parse_path_geometry(ctx, dict, clip_tag, 0);
+
+ xps_clip(ctx, &saved_bounds);
+ }
+
+ font_size = atof(font_size_att);
+
+ gs_setfont(ctx->pgs, font->font);
+ gs_make_scaling(font_size, -font_size, &matrix);
+ if (is_sideways)
+ gs_matrix_rotate(&matrix, 90.0, &matrix);
+
+ gs_setcharmatrix(ctx->pgs, &matrix);
+
+ gs_matrix_multiply(&matrix, &font->font->orig_FontMatrix,
+ &font->font->FontMatrix);
+
+ xps_begin_opacity(ctx, dict, opacity_att, opacity_mask_tag);
+
+ /*
+ * If it's a solid color brush fill/stroke do a simple fill
+ */
+
+ if (fill_tag && !strcmp(xps_tag(fill_tag), "SolidColorBrush"))
+ {
+ fill_opacity_att = xps_att(fill_tag, "Opacity");
+ fill_att = xps_att(fill_tag, "Color");
+ fill_tag = NULL;
+ }
+
+ if (fill_att)
+ {
+ float samples[32];
+ gs_color_space *colorspace;
+ xps_parse_color(ctx, fill_att, &colorspace, samples);
+ if (fill_opacity_att)
+ samples[0] = atof(fill_opacity_att);
+ xps_set_color(ctx, colorspace, samples);
+ xps_parse_glyphs_imp(ctx, font, font_size,
+ atof(origin_x_att), atof(origin_y_att),
+ is_sideways, bidi_level,
+ indices_att, unicode_att, 0);
+ }
+
+ /*
+ * If it's a visual brush or image, use the charpath as a clip mask to paint brush
+ */
+
+ if (fill_tag)
+ {
+ ctx->fill_rule = 1; /* always use non-zero winding rule for char paths */
+ xps_parse_glyphs_imp(ctx, font, font_size,
+ atof(origin_x_att), atof(origin_y_att),
+ is_sideways, bidi_level, indices_att, unicode_att, 1);
+ xps_parse_brush(ctx, dict, fill_tag);
+ }
+
+ xps_end_opacity(ctx, dict, opacity_att, opacity_mask_tag);
+
+ gs_grestore(ctx->pgs);
+
+ if (clip_att || clip_tag)
+ {
+ xps_unclip(ctx, &saved_bounds);
+ }
+
+ return 0;
+}
+
diff --git a/xps/xpsgradient.c b/xps/xpsgradient.c
new file mode 100644
index 000000000..9bcc9cdc3
--- /dev/null
+++ b/xps/xpsgradient.c
@@ -0,0 +1,778 @@
+#include "ghostxps.h"
+
+#include "../icclib/icc.h"
+
+#define MAX_STOPS 100
+
+enum { SPREAD_PAD, SPREAD_REPEAT, SPREAD_REFLECT };
+
+/*
+ * Parse a list of GradientStop elements.
+ * Fill the offset and color arrays, and
+ * return the number of stops parsed.
+ */
+
+static int
+xps_parse_gradient_stops(xps_context_t *ctx, xps_item_t *node,
+ float *offsets, float *colors, int maxcount)
+{
+ int count = 0;
+ gs_color_space *colorspace;
+ float sample[32];
+
+ while (node && count < maxcount)
+ {
+ if (!strcmp(xps_tag(node), "GradientStop"))
+ {
+ char *offset = xps_att(node, "Offset");
+ char *color = xps_att(node, "Color");
+ if (offset && color)
+ {
+ offsets[count] = atof(offset);
+
+ xps_parse_color(ctx, color, &colorspace, sample);
+
+ /* Convert color to sRGB by calling ICClib directly */
+
+ if (colorspace->type->index == gs_color_space_index_CIEICC)
+ {
+ double inv[32];
+ double xyz[3];
+ int i;
+
+ struct _icc *icc = colorspace->params.icc.picc_info->picc;
+ struct _icmLuBase *lu = colorspace->params.icc.picc_info->plu;
+
+ for (i = 0; i < cs_num_components(colorspace); i++)
+ inv[i] = sample[i + 1];
+
+ lu->lookup(lu, inv + 1, xyz);
+
+ dprintf3("gradient convert to xyz: %g %g %g\n", xyz[0], xyz[1], xyz[2]);
+ }
+
+ colors[count * 4 + 0] = sample[0];
+ colors[count * 4 + 1] = sample[1];
+ colors[count * 4 + 2] = sample[2];
+ colors[count * 4 + 3] = sample[3];
+ count ++;
+ }
+ }
+
+ node = xps_next(node);
+ }
+
+ return count;
+}
+
+static int
+xps_gradient_has_transparent_colors(float *offsets, float *colors, int count)
+{
+ int i;
+ for (i = 0; i < count; i++)
+ if (colors[i * 4 + 0] < 0.999)
+ return 1;
+ return 0;
+}
+
+/*
+ * Create a Function object to map [0..1] to RGB colors
+ * based on the gradient stop arrays.
+ *
+ * We do this by creating a stitching function that joins
+ * a series of linear functions (one linear function
+ * for each gradient stop-pair).
+ */
+
+static gs_function_t *
+xps_create_gradient_stop_function(xps_context_t *ctx,
+ float *offsets, float *colors, int count, int opacity_only)
+{
+ gs_function_1ItSg_params_t sparams;
+ gs_function_ElIn_params_t lparams;
+ gs_function_t *sfunc;
+ gs_function_t *lfunc;
+
+ float *domain, *range, *c0, *c1, *bounds, *encode;
+ const gs_function_t **functions;
+
+ int code;
+ int k;
+ int i;
+
+ k = count - 1; /* number of intervals / functions */
+
+ domain = xps_alloc(ctx, 2 * sizeof(float));
+ domain[0] = 0.0;
+ domain[1] = 1.0;
+ sparams.m = 1;
+ sparams.Domain = domain;
+
+ range = xps_alloc(ctx, 6 * sizeof(float));
+ range[0] = 0.0;
+ range[1] = 1.0;
+ range[2] = 0.0;
+ range[3] = 1.0;
+ range[4] = 0.0;
+ range[5] = 1.0;
+ sparams.n = 3;
+ sparams.Range = range;
+
+ functions = xps_alloc(ctx, k * sizeof(void*));
+ bounds = xps_alloc(ctx, (k - 1) * sizeof(float));
+ encode = xps_alloc(ctx, (k * 2) * sizeof(float));
+
+ sparams.k = k;
+ sparams.Functions = functions;
+ sparams.Bounds = bounds;
+ sparams.Encode = encode;
+
+ for (i = 0; i < k; i++)
+ {
+ domain = xps_alloc(ctx, 2 * sizeof(float));
+ domain[0] = 0.0;
+ domain[1] = 1.0;
+ lparams.m = 1;
+ lparams.Domain = domain;
+
+ range = xps_alloc(ctx, 6 * sizeof(float));
+ range[0] = 0.0;
+ range[1] = 1.0;
+ range[2] = 0.0;
+ range[3] = 1.0;
+ range[4] = 0.0;
+ range[5] = 1.0;
+ lparams.n = 3;
+ lparams.Range = range;
+
+ c0 = xps_alloc(ctx, 3 * sizeof(float));
+ lparams.C0 = c0;
+
+ c1 = xps_alloc(ctx, 3 * sizeof(float));
+ lparams.C1 = c1;
+
+ if (opacity_only)
+ {
+ c0[0] = colors[(i + 0) * 4 + 0];
+ c0[1] = colors[(i + 0) * 4 + 0];
+ c0[2] = colors[(i + 0) * 4 + 0];
+
+ c1[0] = colors[(i + 1) * 4 + 0];
+ c1[1] = colors[(i + 1) * 4 + 0];
+ c1[2] = colors[(i + 1) * 4 + 0];
+ }
+ else
+ {
+ c0[0] = colors[(i + 0) * 4 + 1];
+ c0[1] = colors[(i + 0) * 4 + 2];
+ c0[2] = colors[(i + 0) * 4 + 3];
+
+ c1[0] = colors[(i + 1) * 4 + 1];
+ c1[1] = colors[(i + 1) * 4 + 2];
+ c1[2] = colors[(i + 1) * 4 + 3];
+ }
+
+ lparams.N = 1;
+
+ code = gs_function_ElIn_init(&lfunc, &lparams, ctx->memory);
+ if (code < 0)
+ {
+ gs_throw(-1, "gs_function_ElIn_init failed");
+ return NULL;
+ }
+
+ functions[i] = lfunc;
+
+ if (i > 0)
+ bounds[i - 1] = offsets[(i + 0) + 0];
+
+ encode[i * 2 + 0] = 0.0;
+ encode[i * 2 + 1] = 1.0;
+ }
+
+ code = gs_function_1ItSg_init(&sfunc, &sparams, ctx->memory);
+ if (code < 0)
+ {
+ gs_throw(-1, "gs_function_1ItSg_init failed");
+ return NULL;
+ }
+
+ return sfunc;
+}
+
+/*
+ * Shadings and functions are ghostscript type objects,
+ * and as such rely on the garbage collector for cleanup.
+ * We can't have none of that here, so we have to
+ * write our own destructors.
+ */
+
+static void
+xps_free_gradient_stop_function(xps_context_t *ctx, gs_function_t *func)
+{
+ gs_function_t *lfunc;
+ gs_function_1ItSg_params_t *sparams;
+ gs_function_ElIn_params_t *lparams;
+ int i;
+
+ sparams = (gs_function_1ItSg_params_t*) &func->params;
+ xps_free(ctx, (void*)sparams->Domain);
+ xps_free(ctx, (void*)sparams->Range);
+
+ for (i = 0; i < sparams->k; i++)
+ {
+ lfunc = sparams->Functions[i];
+ lparams = (gs_function_ElIn_params_t*) &lfunc->params;
+ xps_free(ctx, (void*)lparams->Domain);
+ xps_free(ctx, (void*)lparams->Range);
+ xps_free(ctx, (void*)lparams->C0);
+ xps_free(ctx, (void*)lparams->C1);
+ xps_free(ctx, lfunc);
+ }
+
+ xps_free(ctx, (void*)sparams->Bounds);
+ xps_free(ctx, (void*)sparams->Encode);
+ xps_free(ctx, (void*)sparams->Functions);
+ xps_free(ctx, func);
+}
+
+/*
+ * For radial gradients that have a cone drawing we have to
+ * reverse the direction of the gradient because we draw
+ * the shading in the opposite direction with the
+ * big circle first.
+ */
+static gs_function_t *
+xps_reverse_function(xps_context_t *ctx, gs_function_t *func, float *fary, void *vary)
+{
+ gs_function_1ItSg_params_t sparams;
+ gs_function_t *sfunc;
+ int code;
+
+ /* take from stack allocated arrays that the caller provides */
+ float *domain = fary + 0;
+ float *range = fary + 2;
+ float *encode = fary + 2 + 6;
+ const gs_function_t **functions = vary;
+
+ domain[0] = 0.0;
+ domain[1] = 1.0;
+
+ range[0] = 0.0;
+ range[1] = 1.0;
+ range[2] = 0.0;
+ range[3] = 1.0;
+ range[4] = 0.0;
+ range[5] = 1.0;
+
+ functions[0] = func;
+
+ encode[0] = 1.0;
+ encode[1] = 0.0;
+
+ sparams.m = 1;
+ sparams.Domain = domain;
+ sparams.n = 3;
+ sparams.Range = range;
+ sparams.k = 1;
+ sparams.Functions = functions;
+ sparams.Bounds = NULL;
+ sparams.Encode = encode;
+
+ code = gs_function_1ItSg_init(&sfunc, &sparams, ctx->memory);
+ if (code < 0)
+ {
+ gs_throw(-1, "gs_function_1ItSg_init failed");
+ return NULL;
+ }
+
+ return sfunc;
+}
+
+/*
+ * Radial gradients map more or less to Radial shadings.
+ * The inner circle is always a point.
+ * The outer circle is actually an ellipse,
+ * mess with the transform to squash the circle into the right aspect.
+ */
+
+static int
+xps_draw_one_radial_gradient(xps_context_t *ctx,
+ gs_function_t *func, int extend,
+ float x0, float y0, float r0,
+ float x1, float y1, float r1)
+{
+ gs_memory_t *mem = ctx->memory;
+ gs_shading_t *shading;
+ gs_shading_R_params_t params;
+ int code;
+
+ gs_shading_R_params_init(&params);
+ {
+ params.ColorSpace = ctx->srgb;
+
+ params.Coords[0] = x0;
+ params.Coords[1] = y0;
+ params.Coords[2] = r0;
+ params.Coords[3] = x1;
+ params.Coords[4] = y1;
+ params.Coords[5] = r1;
+
+ params.Extend[0] = extend;
+ params.Extend[1] = extend;
+
+ params.Function = func;
+ }
+
+ code = gs_shading_R_init(&shading, &params, mem);
+ if (code < 0)
+ return gs_throw(-1, "gs_shading_R_init failed");
+
+ gs_setsmoothness(ctx->pgs, 0.02);
+
+ code = gs_shfill(ctx->pgs, shading);
+ if (code < 0)
+ {
+ gs_free_object(mem, shading, "gs_shading_R");
+ return gs_throw(-1, "gs_shfill failed");
+ }
+
+ gs_free_object(mem, shading, "gs_shading_R");
+
+ return 0;
+}
+
+/*
+ * Linear gradients map to Axial shadings.
+ */
+
+static int
+xps_draw_one_linear_gradient(xps_context_t *ctx,
+ gs_function_t *func, int extend,
+ float x0, float y0, float x1, float y1)
+{
+ gs_memory_t *mem = ctx->memory;
+ gs_shading_t *shading;
+ gs_shading_A_params_t params;
+ int code;
+
+ gs_shading_A_params_init(&params);
+ {
+ params.ColorSpace = ctx->srgb;
+
+ params.Coords[0] = x0;
+ params.Coords[1] = y0;
+ params.Coords[2] = x1;
+ params.Coords[3] = y1;
+
+ params.Extend[0] = extend;
+ params.Extend[1] = extend;
+
+ params.Function = func;
+ }
+
+ code = gs_shading_A_init(&shading, &params, mem);
+ if (code < 0)
+ return gs_throw(-1, "gs_shading_A_init failed");
+
+ gs_setsmoothness(ctx->pgs, 0.02);
+
+ code = gs_shfill(ctx->pgs, shading);
+ if (code < 0)
+ {
+ gs_free_object(mem, shading, "gs_shading_A");
+ return gs_throw(-1, "gs_shfill failed");
+ }
+
+ gs_free_object(mem, shading, "gs_shading_A");
+
+ return 0;
+}
+
+/*
+ * We need to loop and create many shading objects to account
+ * for the Repeat and Reflect SpreadMethods.
+ * I'm not smart enough to calculate this analytically
+ * so we iterate and check each object until we
+ * reach a reasonable limit for infinite cases.
+ */
+
+static inline float point_inside_circle(float px, float py, float x, float y, float r)
+{
+ float dx = px - x;
+ float dy = py - y;
+ return (dx * dx + dy * dy) <= (r * r);
+}
+
+static int
+xps_draw_radial_gradient(xps_context_t *ctx, xps_item_t *root, int spread, gs_function_t *func)
+{
+ gs_rect bbox;
+ float x0, y0, r0;
+ float x1, y1, r1;
+ float xrad = 1;
+ float yrad = 1;
+ float invscale;
+ float dx, dy;
+ int code;
+ int i;
+ int done;
+
+ char *center_att = xps_att(root, "Center");
+ char *origin_att = xps_att(root, "GradientOrigin");
+ char *radius_x_att = xps_att(root, "RadiusX");
+ char *radius_y_att = xps_att(root, "RadiusY");
+
+ if (origin_att)
+ sscanf(origin_att, "%g,%g", &x0, &y0);
+ if (center_att)
+ sscanf(center_att, "%g,%g", &x1, &y1);
+ if (radius_x_att)
+ xrad = atof(radius_x_att);
+ if (radius_y_att)
+ yrad = atof(radius_y_att);
+
+ /* scale the ctm to make ellipses */
+ gs_scale(ctx->pgs, 1.0, yrad / xrad);
+
+ invscale = xrad / yrad;
+ y0 = y0 * invscale;
+ y1 = y1 * invscale;
+
+ r0 = 0.0;
+ r1 = xrad;
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ xps_bounds_in_user_space(ctx, &bbox);
+
+ if (spread == SPREAD_PAD)
+ {
+ if (!point_inside_circle(x0, y0, x1, y1, r1))
+ {
+ gs_function_t *reverse;
+ float in[1];
+ float out[4];
+ float fary[10];
+ void *vary[1];
+
+ /* PDF shadings with extend doesn't work the same way as XPS
+ * gradients when the radial shading is a cone. In this case
+ * we fill the background ourselves.
+ */
+
+ in[0] = 1.0;
+ out[0] = 1.0;
+ out[1] = 0.0;
+ out[2] = 0.0;
+ out[3] = 0.0;
+ if (ctx->opacity_only)
+ gs_function_evaluate(func, in, out);
+ else
+ gs_function_evaluate(func, in, out + 1);
+
+ xps_set_color(ctx, ctx->srgb, out);
+
+ gs_moveto(ctx->pgs, bbox.p.x, bbox.p.y);
+ gs_lineto(ctx->pgs, bbox.q.x, bbox.p.y);
+ gs_lineto(ctx->pgs, bbox.q.x, bbox.q.y);
+ gs_lineto(ctx->pgs, bbox.p.x, bbox.q.y);
+ gs_closepath(ctx->pgs);
+ gs_fill(ctx->pgs);
+
+ /* We also have to reverse the direction so the bigger circle
+ * comes first or the graphical results do not match. We also
+ * have to reverse the direction of the function to compensate.
+ */
+
+ reverse = xps_reverse_function(ctx, func, fary, vary);
+ code = xps_draw_one_radial_gradient(ctx, reverse, 1, x1, y1, r1, x0, y0, r0);
+ if (code < 0)
+ return gs_rethrow(code, "could not draw radial gradient");
+ xps_free(ctx, reverse);
+ }
+ else
+ {
+ code = xps_draw_one_radial_gradient(ctx, func, 1, x0, y0, r0, x1, y1, r1);
+ if (code < 0)
+ return gs_rethrow(code, "could not draw radial gradient");
+ }
+ }
+ else
+ {
+ for (i = 0; i < 100; i++)
+ {
+ /* Draw current circle */
+
+ if (!point_inside_circle(x0, y0, x1, y1, r1))
+ dputs("xps: we should reverse gradient here too\n");
+
+ if (spread == SPREAD_REFLECT && (i & 1))
+ code = xps_draw_one_radial_gradient(ctx, func, 0, x1, y1, r1, x0, y0, r0);
+ else
+ code = xps_draw_one_radial_gradient(ctx, func, 0, x0, y0, r0, x1, y1, r1);
+ if (code < 0)
+ return gs_rethrow(code, "could not draw axial gradient");
+
+ /* Check if circle encompassed the entire bounding box (break loop if we do) */
+
+ done = 1;
+ if (!point_inside_circle(bbox.p.x, bbox.p.y, x1, y1, r1)) done = 0;
+ if (!point_inside_circle(bbox.p.x, bbox.q.y, x1, y1, r1)) done = 0;
+ if (!point_inside_circle(bbox.q.x, bbox.q.y, x1, y1, r1)) done = 0;
+ if (!point_inside_circle(bbox.q.x, bbox.p.y, x1, y1, r1)) done = 0;
+ if (done)
+ break;
+
+ /* Prepare next circle */
+
+ r0 = r1;
+ r1 += xrad;
+
+ x0 += dx;
+ y0 += dy;
+ x1 += dx;
+ y1 += dy;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Calculate how many iterations are needed to cover
+ * the bounding box.
+ */
+
+static int
+xps_draw_linear_gradient(xps_context_t *ctx, xps_item_t *root, int spread, gs_function_t *func)
+{
+ gs_rect bbox;
+ float x0, y0, x1, y1;
+ float dx, dy;
+ int code;
+ int i;
+
+ char *start_point_att = xps_att(root, "StartPoint");
+ char *end_point_att = xps_att(root, "EndPoint");
+
+ x0 = 0;
+ y0 = 0;
+ x1 = 0;
+ y1 = 1;
+
+ if (start_point_att)
+ sscanf(start_point_att, "%g,%g", &x0, &y0);
+ if (end_point_att)
+ sscanf(end_point_att, "%g,%g", &x1, &y1);
+
+ dx = x1 - x0;
+ dy = y1 - y0;
+
+ xps_bounds_in_user_space(ctx, &bbox);
+
+ if (spread == SPREAD_PAD)
+ {
+ code = xps_draw_one_linear_gradient(ctx, func, 1, x0, y0, x1, y1);
+ if (code < 0)
+ return gs_rethrow(code, "could not draw axial gradient");
+ }
+ else
+ {
+ float len;
+ float a, b;
+ float dist[4];
+ float d0, d1;
+ int i0, i1;
+
+ len = sqrt(dx * dx + dy * dy);
+ a = dx / len;
+ b = dy / len;
+
+ dist[0] = a * (bbox.p.x - x0) + b * (bbox.p.y - y0);
+ dist[1] = a * (bbox.p.x - x0) + b * (bbox.q.y - y0);
+ dist[2] = a * (bbox.q.x - x0) + b * (bbox.q.y - y0);
+ dist[3] = a * (bbox.q.x - x0) + b * (bbox.p.y - y0);
+
+ d0 = dist[0];
+ d1 = dist[0];
+ for (i = 1; i < 4; i++)
+ {
+ if (dist[i] < d0) d0 = dist[i];
+ if (dist[i] > d1) d1 = dist[i];
+ }
+
+ i0 = floor(d0 / len);
+ i1 = ceil(d1 / len);
+
+ for (i = i0; i < i1; i++)
+ {
+ if (spread == SPREAD_REFLECT && (i & 1))
+ {
+ code = xps_draw_one_linear_gradient(ctx, func, 0,
+ x1 + dx * i, y1 + dy * i,
+ x0 + dx * i, y0 + dy * i);
+ }
+ else
+ {
+ code = xps_draw_one_linear_gradient(ctx, func, 0,
+ x0 + dx * i, y0 + dy * i,
+ x1 + dx * i, y1 + dy * i);
+ }
+ if (code < 0)
+ return gs_rethrow(code, "could not draw axial gradient");
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * Parse XML tag and attributes for a gradient brush, create color/opacity
+ * function objects and call gradient drawing primitives.
+ */
+
+static int
+xps_parse_gradient_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root,
+ int (*draw)(xps_context_t *, xps_item_t *, int, gs_function_t *))
+{
+ xps_item_t *node;
+
+ char *opacity_att;
+ char *interpolation_att;
+ char *spread_att;
+ char *mapping_att;
+ char *transform_att;
+
+ xps_item_t *transform_tag = NULL;
+ xps_item_t *stop_tag = NULL;
+
+ float stop_offsets[MAX_STOPS];
+ float stop_colors[MAX_STOPS * 4];
+ int stop_count;
+ gs_matrix transform;
+ int spread_method;
+
+ gs_rect saved_bounds;
+ gs_rect bbox;
+
+ gs_function_t *color_func;
+ gs_function_t *opacity_func;
+ int has_opacity = 0;
+
+ opacity_att = xps_att(root, "Opacity");
+ interpolation_att = xps_att(root, "ColorInterpolationMode");
+ spread_att = xps_att(root, "SpreadMethod");
+ mapping_att = xps_att(root, "MappingMode");
+ transform_att = xps_att(root, "Transform");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "LinearGradientBrush.Transform"))
+ transform_tag = xps_down(node);
+ if (!strcmp(xps_tag(node), "RadialGradientBrush.Transform"))
+ transform_tag = xps_down(node);
+ if (!strcmp(xps_tag(node), "LinearGradientBrush.GradientStops"))
+ stop_tag = xps_down(node);
+ if (!strcmp(xps_tag(node), "RadialGradientBrush.GradientStops"))
+ stop_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &transform_att, &transform_tag);
+
+ spread_method = SPREAD_PAD;
+ if (spread_att)
+ {
+ if (!strcmp(spread_att, "Pad"))
+ spread_method = SPREAD_PAD;
+ if (!strcmp(spread_att, "Reflect"))
+ spread_method = SPREAD_REFLECT;
+ if (!strcmp(spread_att, "Repeat"))
+ spread_method = SPREAD_REPEAT;
+ }
+
+ gs_make_identity(&transform);
+ if (transform_att)
+ xps_parse_render_transform(ctx, transform_att, &transform);
+ if (transform_tag)
+ xps_parse_matrix_transform(ctx, transform_tag, &transform);
+
+ if (!stop_tag)
+ return gs_throw(-1, "missing gradient stops tag");
+
+ stop_count = xps_parse_gradient_stops(ctx, stop_tag, stop_offsets, stop_colors, MAX_STOPS);
+ if (stop_count == 0)
+ return gs_throw(-1, "no gradient stops found");
+
+ color_func = xps_create_gradient_stop_function(ctx, stop_offsets, stop_colors, stop_count, 0);
+ if (!color_func)
+ return gs_rethrow(-1, "could not create color gradient function");
+
+ opacity_func = xps_create_gradient_stop_function(ctx, stop_offsets, stop_colors, stop_count, 1);
+ if (!opacity_func)
+ return gs_rethrow(-1, "could not create opacity gradient function");
+
+ has_opacity = xps_gradient_has_transparent_colors(stop_offsets, stop_colors, stop_count);
+
+ xps_clip(ctx, &saved_bounds);
+
+ gs_gsave(ctx->pgs);
+
+ gs_concat(ctx->pgs, &transform);
+
+ xps_bounds_in_user_space(ctx, &bbox);
+
+ xps_begin_opacity(ctx, dict, opacity_att, NULL);
+
+ if (ctx->opacity_only)
+ {
+ draw(ctx, root, spread_method, opacity_func);
+ }
+ else
+ {
+ if (has_opacity)
+ {
+ gs_transparency_mask_params_t params;
+ gs_transparency_group_params_t tgp;
+
+ gs_trans_mask_params_init(&params, TRANSPARENCY_MASK_Alpha);
+ gs_begin_transparency_mask(ctx->pgs, &params, &bbox, 0);
+ draw(ctx, root, spread_method, opacity_func);
+ gs_end_transparency_mask(ctx->pgs, TRANSPARENCY_CHANNEL_Opacity);
+
+ gs_trans_group_params_init(&tgp);
+ gs_begin_transparency_group(ctx->pgs, &tgp, &bbox);
+ draw(ctx, root, spread_method, color_func);
+ gs_end_transparency_group(ctx->pgs);
+ }
+ else
+ {
+ draw(ctx, root, spread_method, color_func);
+ }
+ }
+
+ xps_end_opacity(ctx, dict, opacity_att, NULL);
+
+ gs_grestore(ctx->pgs);
+
+ xps_unclip(ctx, &saved_bounds);
+
+ xps_free_gradient_stop_function(ctx, opacity_func);
+ xps_free_gradient_stop_function(ctx, color_func);
+
+ return 0;
+}
+
+int
+xps_parse_linear_gradient_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ return xps_parse_gradient_brush(ctx, dict, root, xps_draw_linear_gradient);
+}
+
+int
+xps_parse_radial_gradient_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ return xps_parse_gradient_brush(ctx, dict, root, xps_draw_radial_gradient);
+}
+
diff --git a/xps/xpshdp.c b/xps/xpshdp.c
new file mode 100644
index 000000000..dcfa9f0ee
--- /dev/null
+++ b/xps/xpshdp.c
@@ -0,0 +1,10 @@
+#include "ghostxps.h"
+
+/* HD-Photo decoder should go here. */
+
+int
+xps_decode_hdphoto(gs_memory_t *mem, byte *buf, int len, xps_image_t *image)
+{
+ return gs_throw(-1, "HD-Photo codec is not available");
+}
+
diff --git a/xps/xpsimage.c b/xps/xpsimage.c
new file mode 100644
index 000000000..eddf40aea
--- /dev/null
+++ b/xps/xpsimage.c
@@ -0,0 +1,340 @@
+#include "ghostxps.h"
+
+static void
+xps_convert_16_to_8(xps_context_t *ctx, xps_image_t *image)
+{
+ int n = image->comps;
+ int y, x, k;
+ unsigned short *sp = image->samples;
+ unsigned char *dp = image->samples;
+
+dputs(" converting 16 bit image to 8 bits\n");
+
+ for (y = 0; y < image->height; y++)
+ for (x = 0; x < image->width; x++)
+ for (k = 0; k < n; k++)
+ *dp++ = (*sp++) >> 8;
+
+ image->bits = 8;
+ image->stride = image->width * image->comps;
+}
+
+/*
+ * Un-interleave the alpha channel.
+ */
+
+static int
+xps_isolate_alpha_channel_8(xps_context_t *ctx, xps_image_t *image)
+{
+ int n = image->comps;
+ int y, x, k;
+ byte *sp, *dp, *ap;
+
+ if ((image->colorspace != XPS_GRAY_A) &&
+ (image->colorspace != XPS_RGB_A) &&
+ (image->colorspace != XPS_CMYK_A))
+ return 0;
+
+dputs(" isolating alpha channel (8 bits)\n");
+
+ image->alpha = xps_alloc(ctx, image->width * image->height);
+ if (!image->alpha)
+ return gs_throw(-1, "cannot allocate image alpha plane");
+
+ for (y = 0; y < image->height; y++)
+ {
+ sp = image->samples + image->width * n * y;
+ dp = image->samples + image->width * (n - 1) * y;
+ ap = image->alpha + image->width * y;
+ for (x = 0; x < image->width; x++)
+ {
+ for (k = 0; k < n - 1; k++)
+ *dp++ = *sp++;
+ *ap++ = *sp++;
+ }
+ }
+
+ if (image->colorspace == XPS_GRAY_A)
+ image->colorspace = XPS_GRAY;
+ if (image->colorspace == XPS_RGB_A)
+ image->colorspace = XPS_RGB;
+ if (image->colorspace == XPS_CMYK_A)
+ image->colorspace = XPS_CMYK;
+
+ image->comps --;
+ image->stride = image->width * image->comps;
+
+ return 0;
+}
+
+static int
+xps_isolate_alpha_channel_16(xps_context_t *ctx, xps_image_t *image)
+{
+ int n = image->comps;
+ int y, x, k;
+ unsigned short *sp, *dp, *ap;
+
+ if ((image->colorspace != XPS_GRAY_A) &&
+ (image->colorspace != XPS_RGB_A) &&
+ (image->colorspace != XPS_CMYK_A))
+ return 0;
+
+dputs(" isolating alpha channel (16 bits)\n");
+
+ image->alpha = xps_alloc(ctx, image->width * image->height * 2);
+ if (!image->alpha)
+ return gs_throw(-1, "cannot allocate image alpha plane");
+
+ for (y = 0; y < image->height; y++)
+ {
+ sp = ((unsigned short*)image->samples) + (image->width * n * y);
+ dp = ((unsigned short*)image->samples) + (image->width * (n - 1) * y);
+ ap = ((unsigned short*)image->alpha) + (image->width * y);
+ for (x = 0; x < image->width; x++)
+ {
+ for (k = 0; k < n - 1; k++)
+ *dp++ = *sp++;
+ *ap++ = *sp++;
+ }
+ }
+
+ if (image->colorspace == XPS_GRAY_A)
+ image->colorspace = XPS_GRAY;
+ if (image->colorspace == XPS_RGB_A)
+ image->colorspace = XPS_RGB;
+ if (image->colorspace == XPS_CMYK_A)
+ image->colorspace = XPS_CMYK;
+
+ image->comps --;
+ image->stride = image->width * image->comps * 2;
+
+ return 0;
+}
+
+static int
+xps_decode_image(xps_context_t *ctx, xps_part_t *part, xps_image_t *image)
+{
+ byte *buf = (byte*)part->data;
+ int len = part->size;
+ int error;
+
+ if (len < 2)
+ error = gs_throw(-1, "unknown image file format");
+
+ memset(image, 0, sizeof(xps_image_t));
+ image->samples = NULL;
+ image->alpha = NULL;
+
+ if (buf[0] == 0xff && buf[1] == 0xd8)
+ error = xps_decode_jpeg(ctx->memory, buf, len, image);
+ else if (memcmp(buf, "\211PNG\r\n\032\n", 8) == 0)
+ error = xps_decode_png(ctx->memory, buf, len, image);
+ else if (memcmp(buf, "II", 2) == 0 && buf[2] == 0xBC)
+ error = xps_decode_hdphoto(ctx->memory, buf, len, image);
+ else if (memcmp(buf, "MM", 2) == 0)
+ error = xps_decode_tiff(ctx->memory, buf, len, image);
+ else if (memcmp(buf, "II", 2) == 0)
+ error = xps_decode_tiff(ctx->memory, buf, len, image);
+ else
+ error = gs_throw(-1, "unknown image file format");
+
+ if (error)
+ return gs_rethrow(error, "could not decode image");
+
+ if (image->bits == 16)
+ xps_convert_16_to_8(ctx, image);
+
+ if (image->bits == 8)
+ xps_isolate_alpha_channel_8(ctx, image);
+ if (image->bits == 16)
+ xps_isolate_alpha_channel_16(ctx, image);
+
+ return gs_okay;
+}
+
+static int
+xps_paint_image_brush_imp(xps_context_t *ctx, xps_image_t *image, int alpha)
+{
+ gs_image_enum *penum;
+ gs_color_space *colorspace;
+ gs_image_t gsimage;
+ int code;
+
+ unsigned int count;
+ unsigned int used;
+ byte *samples;
+
+ if (alpha)
+ {
+ colorspace = ctx->gray;
+ samples = image->alpha;
+ count = image->width * image->height; /* TODO: bits != 8 */
+ used = 0;
+ }
+ else
+ {
+ switch (image->colorspace)
+ {
+ case XPS_GRAY: colorspace = ctx->gray; break;
+ case XPS_RGB: colorspace = ctx->srgb; break;
+ case XPS_CMYK: colorspace = ctx->cmyk; break;
+ default:
+ return gs_throw(-1, "cannot draw images with interleaved alpha");
+ }
+ samples = image->samples;
+ count = image->stride * image->height;
+ used = 0;
+ }
+
+ gs_image_t_init(&gsimage, colorspace);
+ gsimage.ColorSpace = colorspace;
+ gsimage.BitsPerComponent = image->bits;
+ gsimage.Width = image->width;
+ gsimage.Height = image->height;
+
+ gsimage.ImageMatrix.xx = image->xres / 96.0;
+ gsimage.ImageMatrix.yy = image->yres / 96.0;
+
+ penum = gs_image_enum_alloc(ctx->memory, "xps_parse_image_brush (gs_image_enum_alloc)");
+ if (!penum)
+ return gs_throw(-1, "gs_enum_allocate failed");
+
+ if ((code = gs_image_init(penum, &gsimage, false, ctx->pgs)) < 0)
+ return gs_throw(code, "gs_image_init failed");
+
+ if ((code = gs_image_next(penum, samples, count, &used)) < 0)
+ return gs_throw(code, "gs_image_next failed");
+
+ if (count < used)
+ return gs_throw2(-1, "not enough image data (image=%d used=%d)", count, used);
+
+ if (count > used)
+ return gs_throw2(0, "too much image data (image=%d used=%d)", count, used);
+
+ gs_image_cleanup_and_free_enum(penum, ctx->pgs);
+
+ return 0;
+}
+
+static int
+xps_paint_image_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root, void *vimage)
+{
+ xps_image_t *image = vimage;
+ int code;
+
+ if (ctx->opacity_only)
+ {
+ if (image->alpha)
+ {
+ xps_paint_image_brush_imp(ctx, image, 1);
+ }
+ return 0;
+ }
+
+ if (image->alpha)
+ {
+ gs_transparency_mask_params_t params;
+ gs_transparency_group_params_t tgp;
+ gs_rect bbox;
+
+ xps_bounds_in_user_space(ctx, &bbox);
+
+ gs_trans_mask_params_init(&params, TRANSPARENCY_MASK_Alpha);
+ gs_begin_transparency_mask(ctx->pgs, &params, &bbox, 0);
+ xps_paint_image_brush_imp(ctx, image, 1);
+ gs_end_transparency_mask(ctx->pgs, TRANSPARENCY_CHANNEL_Opacity);
+
+ gs_trans_group_params_init(&tgp);
+ gs_begin_transparency_group(ctx->pgs, &tgp, &bbox);
+ xps_paint_image_brush_imp(ctx, image, 0);
+ gs_end_transparency_group(ctx->pgs);
+ }
+ else
+ {
+ xps_paint_image_brush_imp(ctx, image, 0);
+ }
+
+ return 0;
+}
+
+int
+xps_parse_image_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ xps_part_t *part;
+ char *image_source_att;
+ char buf[1024];
+ char partname[1024];
+ char *image_name;
+ char *profile_name;
+ char *p;
+ int code;
+
+ image_source_att = xps_att(root, "ImageSource");
+
+ /* "{ColorConvertedBitmap /Resources/Image.tiff /Resources/Profile.icc}" */
+ if (strstr(image_source_att, "{ColorConvertedBitmap") == image_source_att)
+ {
+ image_name = NULL;
+ profile_name = NULL;
+
+ strcpy(buf, image_source_att);
+ p = strchr(buf, ' ');
+ if (p)
+ {
+ image_name = p + 1;
+ p = strchr(p + 1, ' ');
+ if (p)
+ {
+ *p = 0;
+ profile_name = p + 1;
+ p = strchr(p + 1, '}');
+ if (p)
+ *p = 0;
+ }
+ }
+ }
+ else
+ {
+ image_name = image_source_att;
+ profile_name = NULL;
+ }
+
+ if (!image_name)
+ return gs_throw1(-1, "cannot parse image resource name '%s'", image_source_att);
+ if (profile_name)
+ dprintf2("warning: ignoring color profile '%s' associated with image '%s'\n",
+ profile_name, image_name);
+
+ xps_absolute_path(partname, ctx->pwd, image_name);
+ part = xps_find_part(ctx, partname);
+ if (!part)
+ return gs_throw1(-1, "cannot find image resource part '%s'", partname);
+
+ if (!part->image)
+ {
+ part->image = xps_alloc(ctx, sizeof(xps_image_t));
+ if (!part->image)
+ return gs_throw(-1, "out of memory: image struct");
+
+ dprintf1("decoding image brush '%s'\n", image_name);
+
+ code = xps_decode_image(ctx, part, part->image);
+ if (code < 0)
+ return gs_rethrow(-1, "cannot decode image resource");
+ }
+
+ xps_parse_tiling_brush(ctx, dict, root, xps_paint_image_brush, part->image);
+
+ return 0;
+}
+
+void
+xps_free_image(xps_context_t *ctx, xps_image_t *image)
+{
+ if (image->samples)
+ xps_free(ctx, image->samples);
+ if (image->alpha)
+ xps_free(ctx, image->alpha);
+ xps_free(ctx, image);
+}
+
diff --git a/xps/xpsjpeg.c b/xps/xpsjpeg.c
new file mode 100644
index 000000000..55b9c99e2
--- /dev/null
+++ b/xps/xpsjpeg.c
@@ -0,0 +1,101 @@
+#include "ghostxps.h"
+
+#include "stream.h"
+#include "strimpl.h"
+#include "gsstate.h"
+#include "jpeglib_.h"
+#include "sdct.h"
+#include "sjpeg.h"
+
+static int xps_report_error(stream_state * st, const char *str)
+{
+ (void) gs_throw1(-1, "%s", str);
+ return 0;
+}
+
+int xps_decode_jpeg(gs_memory_t *mem, byte *rbuf, int rlen, xps_image_t *image)
+{
+ jpeg_decompress_data jddp;
+ stream_DCT_state state;
+ stream_cursor_read rp;
+ stream_cursor_write wp;
+ int code;
+ int wlen;
+ byte *wbuf;
+
+ s_init_state((stream_state*)&state, &s_DCTD_template, mem);
+ state.report_error = xps_report_error;
+
+ s_DCTD_template.set_defaults((stream_state*)&state);
+
+ state.jpeg_memory = mem;
+ state.data.decompress = &jddp;
+
+ jddp.template = s_DCTD_template;
+ jddp.memory = mem;
+ jddp.scanline_buffer = NULL;
+
+ if ((code = gs_jpeg_create_decompress(&state)) < 0)
+ return gs_throw(-1, "cannot gs_jpeg_create_decompress");
+
+ s_DCTD_template.init((stream_state*)&state);
+
+ rp.ptr = rbuf - 1;
+ rp.limit = rbuf + rlen - 1;
+
+ /* read the header only by not having a write buffer */
+ wp.ptr = 0;
+ wp.limit = 0;
+
+ code = s_DCTD_template.process((stream_state*)&state, &rp, &wp, true);
+ if (code != 1)
+ return gs_throw(-1, "premature EOF or error in jpeg");
+
+ image->width = jddp.dinfo.output_width;
+ image->height = jddp.dinfo.output_height;
+ image->comps = jddp.dinfo.output_components;
+ image->bits = 8;
+ image->stride = image->width * image->comps;
+
+ if (image->comps == 1)
+ image->colorspace = XPS_GRAY;
+ if (image->comps == 3)
+ image->colorspace = XPS_RGB;
+ if (image->comps == 4)
+ image->colorspace = XPS_CMYK;
+
+ if (jddp.dinfo.density_unit == 1)
+ {
+ image->xres = jddp.dinfo.X_density;
+ image->yres = jddp.dinfo.Y_density;
+ }
+ else if (jddp.dinfo.density_unit == 2)
+ {
+ image->xres = jddp.dinfo.X_density * 2.54;
+ image->yres = jddp.dinfo.Y_density * 2.54;
+ }
+ else
+ {
+ image->xres = 96;
+ image->yres = 96;
+ }
+
+ wlen = image->stride * image->height;
+ wbuf = gs_alloc_bytes(mem, wlen, "decodejpeg");
+ if (!wbuf)
+ return gs_throw1(-1, "out of memory allocating samples: %d", wlen);
+
+ image->samples = wbuf;
+
+ wp.ptr = wbuf - 1;
+ wp.limit = wbuf + wlen - 1;
+
+ code = s_DCTD_template.process((stream_state*)&state, &rp, &wp, true);
+ if (code != EOFC)
+ return gs_throw1(-1, "error in jpeg (code = %d)", code);
+
+ gs_jpeg_destroy(&state);
+
+ return gs_okay;
+}
+
diff --git a/xps/xpsmem.c b/xps/xpsmem.c
new file mode 100644
index 000000000..df79ceb3f
--- /dev/null
+++ b/xps/xpsmem.c
@@ -0,0 +1,106 @@
+#include "ghostxps.h"
+
+static inline int
+xps_tolower(int c)
+{
+ if (c >= 'A' && c <= 'Z')
+ return c + 32;
+ return c;
+}
+
+int
+xps_strcasecmp(char *a, char *b)
+{
+ while (xps_tolower(*a) == xps_tolower(*b))
+ {
+ if (*a++ == 0)
+ return 0;
+ *b++;
+ }
+ return xps_tolower(*a) - xps_tolower(*b);
+}
+
+char *
+xps_strdup_imp(xps_context_t *ctx, const char *str, const char *cname)
+{
+ char *cpy = NULL;
+ if (str)
+ cpy = gs_alloc_bytes(ctx->memory, strlen(str) + 1, cname);
+ if (cpy)
+ strcpy(cpy, str);
+ return cpy;
+}
+
+#define SEP(x) ((x)=='/' || (x) == 0)
+
+char *
+xps_clean_path(char *name)
+{
+ char *p, *q, *dotdot;
+ int rooted;
+
+ rooted = name[0] == '/';
+
+ /*
+ * invariants:
+ * p points at beginning of path element we're considering.
+ * q points just past the last path element we wrote (no slash).
+ * dotdot points just past the point where .. cannot backtrack
+ * any further (no slash).
+ */
+ p = q = dotdot = name + rooted;
+ while (*p)
+ {
+ if(p[0] == '/') /* null element */
+ p++;
+ else if (p[0] == '.' && SEP(p[1]))
+ p += 1; /* don't count the separator in case it is nul */
+ else if (p[0] == '.' && p[1] == '.' && SEP(p[2]))
+ {
+ p += 2;
+ if (q > dotdot) /* can backtrack */
+ {
+ while(--q > dotdot && *q != '/')
+ ;
+ }
+ else if (!rooted) /* /.. is / but ./../ is .. */
+ {
+ if (q != name)
+ *q++ = '/';
+ *q++ = '.';
+ *q++ = '.';
+ dotdot = q;
+ }
+ }
+ else /* real path element */
+ {
+ if (q != name+rooted)
+ *q++ = '/';
+ while ((*q = *p) != '/' && *q != 0)
+ p++, q++;
+ }
+ }
+
+ if (q == name) /* empty string is really "." */
+ *q++ = '.';
+ *q = '\0';
+
+ return name;
+}
+
+void
+xps_absolute_path(char *output, char *pwd, char *path)
+{
+ if (path[0] == '/')
+ {
+ strcpy(output, path);
+ }
+ else
+ {
+ strcpy(output, pwd);
+ strcat(output, "/");
+ strcat(output, path);
+ }
+ xps_clean_path(output);
+}
+
diff --git a/xps/xpsopacity.c b/xps/xpsopacity.c
new file mode 100644
index 000000000..59613bcb0
--- /dev/null
+++ b/xps/xpsopacity.c
@@ -0,0 +1,70 @@
+#include "ghostxps.h"
+
+int
+xps_begin_opacity(xps_context_t *ctx, xps_resource_t *dict, char *opacity_att, xps_item_t *opacity_mask_tag)
+{
+ gs_transparency_group_params_t tgp;
+ gs_transparency_mask_params_t tmp;
+ gs_rect bbox;
+ float opacity;
+ int save;
+
+ if (!opacity_att && !opacity_mask_tag)
+ return 0;
+
+ opacity = 1.0;
+ if (opacity_att)
+ opacity = atof(opacity_att);
+ gs_setopacityalpha(ctx->pgs, opacity);
+
+ xps_bounds_in_user_space(ctx, &bbox);
+
+ if (opacity_mask_tag)
+ {
+ //dprintf1("begin opacity mask (%s)\n", xps_tag(opacity_mask_tag));
+
+ gs_trans_mask_params_init(&tmp, TRANSPARENCY_MASK_Luminosity);
+ gs_begin_transparency_mask(ctx->pgs, &tmp, &bbox, 0);
+
+ /* Need a path to fill/clip for the brush */
+ gs_moveto(ctx->pgs, bbox.p.x, bbox.p.y);
+ gs_lineto(ctx->pgs, bbox.p.x, bbox.q.y);
+ gs_lineto(ctx->pgs, bbox.q.x, bbox.q.y);
+ gs_lineto(ctx->pgs, bbox.q.x, bbox.p.y);
+ gs_closepath(ctx->pgs);
+
+ // gs_setopacityalpha(ctx->pgs, 0.5);
+ // gs_setrgbcolor(ctx->pgs, 1, 1, 1);
+ // gs_fill(ctx->pgs);
+
+ /* opacity-only mode: use alpha value as gray color to create luminosity mask */
+ save = ctx->opacity_only;
+ ctx->opacity_only = 1;
+
+ gs_gsave(ctx->pgs);
+ xps_parse_brush(ctx, dict, opacity_mask_tag);
+ gs_grestore(ctx->pgs);
+
+ ctx->opacity_only = save;
+
+ gs_end_transparency_mask(ctx->pgs, TRANSPARENCY_CHANNEL_Opacity);
+ }
+
+ gs_trans_group_params_init(&tgp);
+
+ gs_begin_transparency_group(ctx->pgs, &tgp, &bbox);
+
+ return 0;
+}
+
+int
+xps_end_opacity(xps_context_t *ctx, xps_resource_t *dict, char *opacity_att, xps_item_t *opacity_mask_tag)
+{
+ if (!opacity_att && !opacity_mask_tag)
+ return 0;
+
+ gs_end_transparency_group(ctx->pgs);
+
+ return 0;
+}
+
diff --git a/xps/xpspage.c b/xps/xpspage.c
new file mode 100644
index 000000000..e76c4d10b
--- /dev/null
+++ b/xps/xpspage.c
@@ -0,0 +1,225 @@
+#include "ghostxps.h"
+
+int xps_parse_canvas(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ xps_resource_t *new_dict = NULL;
+ xps_item_t *node;
+
+ char *transform_att;
+ char *clip_att;
+ char *opacity_att;
+ char *opacity_mask_att;
+
+ xps_item_t *transform_tag = NULL;
+ xps_item_t *clip_tag = NULL;
+ xps_item_t *opacity_mask_tag = NULL;
+
+ gs_rect saved_bounds;
+
+ gs_matrix transform;
+
+ transform_att = xps_att(root, "RenderTransform");
+ clip_att = xps_att(root, "Clip");
+ opacity_att = xps_att(root, "Opacity");
+ opacity_mask_att = xps_att(root, "OpacityMask");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "Canvas.Resources"))
+ {
+ new_dict = xps_parse_resource_dictionary(ctx, xps_down(node));
+ if (new_dict)
+ {
+ new_dict->parent = dict;
+ dict = new_dict;
+ }
+ }
+
+ if (!strcmp(xps_tag(node), "Canvas.RenderTransform"))
+ transform_tag = xps_down(node);
+ if (!strcmp(xps_tag(node), "Canvas.Clip"))
+ clip_tag = xps_down(node);
+ if (!strcmp(xps_tag(node), "Canvas.OpacityMask"))
+ opacity_mask_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &transform_att, &transform_tag);
+ xps_resolve_resource_reference(ctx, dict, &clip_att, &clip_tag);
+ xps_resolve_resource_reference(ctx, dict, &opacity_mask_att, &opacity_mask_tag);
+
+ gs_gsave(ctx->pgs);
+
+ gs_make_identity(&transform);
+ if (transform_att)
+ xps_parse_render_transform(ctx, transform_att, &transform);
+ if (transform_tag)
+ xps_parse_matrix_transform(ctx, transform_tag, &transform);
+ gs_concat(ctx->pgs, &transform);
+
+ if (clip_att || clip_tag)
+ {
+ if (clip_att)
+ xps_parse_abbreviated_geometry(ctx, clip_att);
+ if (clip_tag)
+ xps_parse_path_geometry(ctx, dict, clip_tag, 0);
+ xps_clip(ctx, &saved_bounds);
+ }
+
+ xps_begin_opacity(ctx, dict, opacity_att, opacity_mask_tag);
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ xps_parse_element(ctx, dict, node);
+ }
+
+ if (clip_att || clip_tag)
+ {
+ xps_unclip(ctx, &saved_bounds);
+ }
+
+ xps_end_opacity(ctx, dict, opacity_att, opacity_mask_tag);
+
+ gs_grestore(ctx->pgs);
+
+ if (new_dict)
+ {
+ xps_free_resource_dictionary(ctx, new_dict);
+ }
+
+ return 0;
+}
+
+int
+xps_parse_fixed_page(xps_context_t *ctx, xps_part_t *part)
+{
+ xps_item_t *root, *node;
+ xps_resource_t *dict;
+ char *width_att;
+ char *height_att;
+ int code;
+ gs_matrix ctm;
+ gs_point pt0, pt1;
+ gs_rect rc;
+
+ dprintf1("-- drawing page %s --\n", part->name);
+
+ root = xps_parse_xml(ctx, part->data, part->size);
+ if (!root)
+ return gs_rethrow(-1, "cannot parse xml");
+
+ if (strcmp(xps_tag(root), "FixedPage"))
+ return gs_throw1(-1, "expected FixedPage element (found %s)", xps_tag(root));
+
+ width_att = xps_att(root, "Width");
+ height_att = xps_att(root, "Height");
+
+ if (!width_att)
+ return gs_throw(-1, "FixedPage missing required attribute: Width");
+ if (!height_att)
+ return gs_throw(-1, "FixedPage missing required attribute: Height");
+
+ dict = NULL;
+
+ /* Setup new page */
+ {
+ gs_memory_t *mem = ctx->memory;
+ gs_state *pgs = ctx->pgs;
+ gx_device *dev = gs_currentdevice(pgs);
+ gs_param_float_array fa;
+ float fv[2];
+ gs_c_param_list list;
+
+ gs_c_param_list_write(&list, mem);
+
+ fv[0] = atoi(width_att) / 96.0 * 72.0;
+ fv[1] = atoi(height_att) / 96.0 * 72.0;
+ fa.persistent = false;
+ fa.data = fv;
+ fa.size = 2;
+
+ code = param_write_float_array((gs_param_list *)&list, ".MediaSize", &fa);
+ if ( code >= 0 )
+ {
+ gs_c_param_list_read(&list);
+ code = gs_putdeviceparams(dev, (gs_param_list *)&list);
+ }
+ gs_c_param_list_release(&list);
+
+ /* nb this is for the demo it is wrong and should be removed */
+ gs_initgraphics(pgs);
+
+ /* 96 dpi default - and put the origin at the top of the page */
+
+ gs_initmatrix(pgs);
+
+ code = gs_scale(pgs, 72.0/96.0, -72.0/96.0);
+ if (code < 0)
+ return gs_rethrow(code, "cannot set page transform");
+
+ code = gs_translate(pgs, 0.0, -atoi(height_att));
+ if (code < 0)
+ return gs_rethrow(code, "cannot set page transform");
+
+ code = gs_erasepage(pgs);
+ if (code < 0)
+ return gs_rethrow(code, "cannot clear page");
+
+ /* set initial bounds to cover the page */
+ gs_currentmatrix(pgs, &ctm);
+ gs_point_transform(0.0, 0.0, &ctm, &rc.p);
+ gs_point_transform(atoi(width_att), atoi(height_att), &ctm, &rc.q);
+ if (rc.p.x > rc.q.x) { float t = rc.p.x; rc.p.x = rc.q.x; rc.q.x = t; }
+ if (rc.p.y > rc.q.y) { float t = rc.p.y; rc.p.y = rc.q.y; rc.q.y = t; }
+ ctx->bounds = rc;
+ }
+
+ /* save the state with the original device before we push */
+ gs_gsave(ctx->pgs);
+
+ if (ctx->use_transparency)
+ {
+ code = gs_push_pdf14trans_device(ctx->pgs);
+ if (code < 0)
+ return gs_rethrow(code, "cannot install transparency device");
+ }
+
+ /* Draw contents */
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "FixedPage.Resources"))
+ {
+ dputs("FixedPage has resources\n");
+ dict = xps_parse_resource_dictionary(ctx, xps_down(node));
+ }
+
+ xps_parse_element(ctx, dict, node);
+ }
+
+ if (ctx->use_transparency)
+ {
+ code = gs_pop_pdf14trans_device(ctx->pgs);
+ if (code < 0)
+ return gs_rethrow(code, "cannot uninstall transparency device");
+ }
+
+ /* Flush page */
+ {
+ code = xps_show_page(ctx, 1, true); /* copies, flush */
+ if (code < 0)
+ return gs_rethrow(code, "cannot flush page");
+ }
+
+ /* restore the original device, discarding the pdf14 compositor */
+ gs_grestore(ctx->pgs);
+
+ if (dict)
+ {
+ xps_free_resource_dictionary(ctx, dict);
+ }
+
+ xps_free_item(ctx, root);
+
+ return 0;
+}
+
diff --git a/xps/xpspath.c b/xps/xpspath.c
new file mode 100644
index 000000000..b2af38898
--- /dev/null
+++ b/xps/xpspath.c
@@ -0,0 +1,1136 @@
+#include "ghostxps.h"
+
+static void
+xps_grow_rect(gs_rect *rect, float x, float y)
+{
+ if (x < rect->p.x) rect->p.x = x;
+ if (y < rect->p.y) rect->p.y = y;
+ if (x > rect->q.x) rect->q.x = x;
+ if (y > rect->q.y) rect->q.y = y;
+}
+
+void
+xps_bounds_in_user_space(xps_context_t *ctx, gs_rect *user)
+{
+ gs_matrix ctm;
+ gs_matrix inv;
+ gs_point a, b, c, d;
+
+ gs_currentmatrix(ctx->pgs, &ctm);
+ gs_matrix_invert(&ctm, &inv);
+
+ gs_point_transform(ctx->bounds.p.x, ctx->bounds.p.y, &inv, &a);
+ gs_point_transform(ctx->bounds.p.x, ctx->bounds.q.y, &inv, &b);
+ gs_point_transform(ctx->bounds.q.x, ctx->bounds.q.y, &inv, &c);
+ gs_point_transform(ctx->bounds.q.x, ctx->bounds.p.y, &inv, &d);
+
+ user->p.x = MIN(MIN(a.x, b.x), MIN(c.x, d.x));
+ user->p.y = MIN(MIN(a.y, b.y), MIN(c.y, d.y));
+ user->q.x = MAX(MAX(a.x, b.x), MAX(c.x, d.x));
+ user->q.y = MAX(MAX(a.y, b.y), MAX(c.y, d.y));
+
+#if 0
+ user->p.x = 0.0;
+ user->p.y = 0.0;
+ user->q.x = 1000.0;
+ user->q.y = 1000.0;
+#endif
+
+}
+
+static void
+xps_update_bounds(xps_context_t *ctx, gs_rect *save)
+{
+ segment *seg;
+ curve_segment *cseg;
+ gs_rect rc;
+
+ save->p.x = ctx->bounds.p.x;
+ save->p.y = ctx->bounds.p.y;
+ save->q.x = ctx->bounds.q.x;
+ save->q.y = ctx->bounds.q.y;
+
+ /* get bounds of current path (that is about to be clipped) */
+ /* the coordinates of the path segments are already in device space (yay!) */
+
+ seg = (segment*)ctx->pgs->path->first_subpath;
+ rc.p.x = rc.q.x = fixed2float(seg->pt.x);
+ rc.p.y = rc.q.y = fixed2float(seg->pt.y);
+
+ while (seg)
+ {
+ switch (seg->type)
+ {
+ case s_start:
+ xps_grow_rect(&rc, fixed2float(seg->pt.x), fixed2float(seg->pt.y));
+ break;
+ case s_line:
+ xps_grow_rect(&rc, fixed2float(seg->pt.x), fixed2float(seg->pt.y));
+ break;
+ case s_line_close:
+ break;
+ case s_curve:
+ cseg = (curve_segment*)seg;
+ xps_grow_rect(&rc, fixed2float(cseg->p1.x), fixed2float(cseg->p1.y));
+ xps_grow_rect(&rc, fixed2float(cseg->p2.x), fixed2float(cseg->p2.y));
+ xps_grow_rect(&rc, fixed2float(seg->pt.x), fixed2float(seg->pt.y));
+ break;
+ }
+ seg = seg->next;
+ }
+
+ /* intersect with old bounds, and fix degenerate case */
+
+ rect_intersect(ctx->bounds, rc);
+
+ if (ctx->bounds.q.x < ctx->bounds.p.x)
+ ctx->bounds.q.x = ctx->bounds.p.x;
+ if (ctx->bounds.q.y < ctx->bounds.p.y)
+ ctx->bounds.q.y = ctx->bounds.p.y;
+}
+
+static void
+xps_restore_bounds(xps_context_t *ctx, gs_rect *save)
+{
+ ctx->bounds.p.x = save->p.x;
+ ctx->bounds.p.y = save->p.y;
+ ctx->bounds.q.x = save->q.x;
+ ctx->bounds.q.y = save->q.y;
+}
+
+void
+xps_debug_bounds(xps_context_t *ctx)
+{
+ gs_matrix mat;
+
+ gs_gsave(ctx->pgs);
+
+ dprintf6("bounds: debug [%g %g %g %g] w=%g h=%g\n",
+ ctx->bounds.p.x, ctx->bounds.p.y,
+ ctx->bounds.q.x, ctx->bounds.q.y,
+ ctx->bounds.q.x - ctx->bounds.p.x,
+ ctx->bounds.q.y - ctx->bounds.p.y);
+
+ gs_make_identity(&mat);
+ gs_setmatrix(ctx->pgs, &mat);
+
+ gs_setgray(ctx->pgs, 0.3);
+ gs_moveto(ctx->pgs, ctx->bounds.p.x, ctx->bounds.p.y);
+ gs_lineto(ctx->pgs, ctx->bounds.q.x, ctx->bounds.q.y);
+ gs_moveto(ctx->pgs, ctx->bounds.q.x, ctx->bounds.p.y);
+ gs_lineto(ctx->pgs, ctx->bounds.p.x, ctx->bounds.q.y);
+
+ gs_moveto(ctx->pgs, ctx->bounds.p.x, ctx->bounds.p.y);
+ gs_lineto(ctx->pgs, ctx->bounds.p.x, ctx->bounds.q.y);
+ gs_lineto(ctx->pgs, ctx->bounds.q.x, ctx->bounds.q.y);
+ gs_lineto(ctx->pgs, ctx->bounds.q.x, ctx->bounds.p.y);
+ gs_closepath(ctx->pgs);
+
+ gs_stroke(ctx->pgs);
+
+ gs_grestore(ctx->pgs);
+}
+
+int
+xps_unclip(xps_context_t *ctx, gs_rect *saved_bounds)
+{
+ xps_restore_bounds(ctx, saved_bounds);
+ return 0;
+}
+
+int
+xps_clip(xps_context_t *ctx, gs_rect *saved_bounds)
+{
+ xps_update_bounds(ctx, saved_bounds);
+
+ if (ctx->fill_rule == 0)
+ gs_eoclip(ctx->pgs);
+ else
+ gs_clip(ctx->pgs);
+
+ gs_newpath(ctx->pgs);
+
+ return 0;
+}
+
+int
+xps_fill(xps_context_t *ctx)
+{
+ if (gs_currentopacityalpha(ctx->pgs) < 0.001)
+ gs_newpath(ctx->pgs);
+ else if (ctx->fill_rule == 0)
+ gs_eofill(ctx->pgs);
+ else
+ gs_fill(ctx->pgs);
+ return 0;
+}
+
+
+/* Draw an arc segment transformed by the matrix, we approximate with straight
+ * line segments. We cannot use the gs_arc function because they only draw
+ * circular arcs, we need to transform the line to make them elliptical but
+ * without transforming the line width.
+ */
+static inline void
+xps_draw_arc_segment(xps_context_t *ctx, gs_matrix *mtx, float th0, float th1, int iscw)
+{
+ float x, y, t, a, d;
+ gs_point p;
+
+ while (th1 < th0)
+ th1 += M_PI * 2.0;
+
+ d = 1 * (M_PI / 180.0); /* 1-degree precision */
+
+ if (iscw)
+ {
+ gs_point_transform(cos(th0), sin(th0), mtx, &p);
+ gs_lineto(ctx->pgs, p.x, p.y);
+ for (t = th0; t < th1; t += d)
+ {
+ gs_point_transform(cos(t), sin(t), mtx, &p);
+ gs_lineto(ctx->pgs, p.x, p.y);
+ }
+ gs_point_transform(cos(th1), sin(th1), mtx, &p);
+ gs_lineto(ctx->pgs, p.x, p.y);
+ }
+ else
+ {
+ th0 += M_PI * 2;
+ gs_point_transform(cos(th0), sin(th0), mtx, &p);
+ gs_lineto(ctx->pgs, p.x, p.y);
+ for (t = th0; t > th1; t -= d)
+ {
+ gs_point_transform(cos(t), sin(t), mtx, &p);
+ gs_lineto(ctx->pgs, p.x, p.y);
+ }
+ gs_point_transform(cos(th1), sin(th1), mtx, &p);
+ gs_lineto(ctx->pgs, p.x, p.y);
+ }
+}
+
+/* Given two vectors find the angle between them. */
+static inline double
+angle_between(const gs_point u, const gs_point v)
+{
+ double det = u.x * v.y - u.y * v.x;
+ double sign = (det < 0 ? -1.0 : 1.0);
+ double magu = u.x * u.x + u.y * u.y;
+ double magv = v.x * v.x + v.y * v.y;
+ double udotv = u.x * v.x + u.y * v.y;
+ double t = udotv / (magu * magv);
+ /* guard against rounding errors when near |1| (where acos will return NaN) */
+ if (t < -1.0) t = -1.0;
+ if (t > 1.0) t = 1.0;
+ return sign * acos(t);
+}
+
+static int
+xps_draw_arc(xps_context_t *ctx,
+ float size_x, float size_y, float rotation_angle,
+ int is_large_arc, int is_clockwise,
+ float point_x, float point_y)
+{
+ gs_matrix rotmat, revmat;
+ gs_matrix mtx;
+ gs_point pt;
+ double rx, ry;
+ double x1, y1, x2, y2;
+ double x1t, y1t;
+ double cxt, cyt, cx, cy;
+ double t1, t2, t3;
+ double sign;
+ double th1, dth;
+
+ gs_currentpoint(ctx->pgs, &pt);
+ x1 = pt.x;
+ y1 = pt.y;
+ x2 = point_x;
+ y2 = point_y;
+ rx = size_x;
+ ry = size_y;
+
+ if (is_clockwise != is_large_arc)
+ sign = 1;
+ else
+ sign = -1;
+
+ gs_make_rotation(rotation_angle, &rotmat);
+ gs_make_rotation(-rotation_angle, &revmat);
+
+ /* http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes */
+ /* Conversion from endpoint to center parameterization */
+
+ /* F.6.6.1 -- ensure radii are positive and non-zero */
+ rx = fabs(rx);
+ ry = fabs(ry);
+ if (rx < 0.001 || ry < 0.001)
+ {
+ gs_lineto(ctx->pgs, x2, y2);
+ return 0;
+ }
+
+ /* F.6.5.1 */
+ gs_distance_transform((x1 - x2) / 2.0, (y1 - y2) / 2.0, &revmat, &pt);
+ x1t = pt.x;
+ y1t = pt.y;
+
+ /* F.6.6.2 -- ensure radii are large enough */
+ t1 = (x1t * x1t) / (rx * rx) + (y1t * y1t) / (ry * ry);
+ if (t1 > 1.0)
+ {
+ rx = rx * sqrt(t1);
+ ry = ry * sqrt(t1);
+ }
+
+ /* F.6.5.2 */
+ t1 = (rx * rx * ry * ry) - (rx * rx * y1t * y1t) - (ry * ry * x1t * x1t);
+ t2 = (rx * rx * y1t * y1t) + (ry * ry * x1t * x1t);
+ t3 = t1 / t2;
+ /* guard against rounding errors; sqrt of negative numbers is bad for your health */
+ if (t3 < 0.0) t3 = 0.0;
+ t3 = sqrt(t3);
+
+ cxt = sign * t3 * (rx * y1t) / ry;
+ cyt = sign * t3 * -(ry * x1t) / rx;
+
+ /* F.6.5.3 */
+ gs_distance_transform(cxt, cyt, &rotmat, &pt);
+ cx = pt.x + (x1 + x2) / 2;
+ cy = pt.y + (y1 + y2) / 2;
+
+ /* F.6.5.4 */
+ {
+ gs_point coord1, coord2, coord3, coord4;
+ coord1.x = 1;
+ coord1.y = 0;
+ coord2.x = (x1t - cxt) / rx;
+ coord2.y = (y1t - cyt) / ry;
+ coord3.x = (x1t - cxt) / rx;
+ coord3.y = (y1t - cyt) / ry;
+ coord4.x = (-x1t - cxt) / rx;
+ coord4.y = (-y1t - cyt) / ry;
+ th1 = angle_between(coord1, coord2);
+ dth = angle_between(coord3, coord4);
+ if (dth < 0 && !is_clockwise)
+ dth += (degrees_to_radians * 360);
+ if (dth > 0 && is_clockwise)
+ dth -= (degrees_to_radians * 360);
+ }
+
+ gs_make_identity(&mtx);
+ gs_matrix_translate(&mtx, cx, cy, &mtx);
+ gs_matrix_rotate(&mtx, rotation_angle, &mtx);
+ gs_matrix_scale(&mtx, rx, ry, &mtx);
+ xps_draw_arc_segment(ctx, &mtx, th1, th1 + dth, is_clockwise);
+
+ gs_lineto(ctx->pgs, point_x, point_y);
+
+ return 0;
+}
+
+
+/*
+ * Parse an abbreviated geometry string, and call
+ * ghostscript moveto/lineto/curveto functions to
+ * build up a path.
+ */
+
+int
+xps_parse_abbreviated_geometry(xps_context_t *ctx, char *geom)
+{
+ char **args;
+ char **pargs;
+ char *s = geom;
+ gs_point pt;
+ int i, n;
+ int cmd, old;
+ float x1, y1, x2, y2, x3, y3;
+ float smooth_x, smooth_y; /* saved cubic bezier control point for smooth curves */
+ int reset_smooth;
+
+ args = xps_alloc(ctx, sizeof(char*) * (strlen(geom) + 1));
+ pargs = args;
+
+ //dprintf1("new path (%.70s)\n", geom);
+ gs_newpath(ctx->pgs);
+
+ ctx->fill_rule = 0;
+
+ while (*s)
+ {
+ if ((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z'))
+ {
+ *pargs++ = s++;
+ }
+ else if ((*s >= '0' && *s <= '9') || *s == '.' || *s == '+' || *s == '-' || *s == 'e' || *s == 'E')
+ {
+ *pargs++ = s;
+ while ((*s >= '0' && *s <= '9') || *s == '.' || *s == '+' || *s == '-' || *s == 'e' || *s == 'E')
+ s ++;
+ }
+ else
+ {
+ s++;
+ }
+ }
+
+ pargs[0] = s;
+ pargs[1] = 0;
+
+ n = pargs - args;
+ i = 0;
+
+ old = 0;
+
+ reset_smooth = 1;
+ smooth_x = 0.0;
+ smooth_y = 0.0;
+
+ while (i < n)
+ {
+ cmd = args[i][0];
+ if (cmd == '+' || cmd == '.' || cmd == '-' || (cmd >= '0' && cmd <= '9'))
+ cmd = old; /* it's a number, repeat old command */
+ else
+ i ++;
+
+ if (reset_smooth)
+ {
+ smooth_x = 0.0;
+ smooth_y = 0.0;
+ }
+
+ reset_smooth = 1;
+
+ switch (cmd)
+ {
+ case 'F':
+ ctx->fill_rule = atoi(args[i]);
+ i ++;
+ break;
+
+ case 'M':
+ gs_moveto(ctx->pgs, atof(args[i]), atof(args[i+1]));
+ //dprintf2("moveto %g %g\n", atof(args[i]), atof(args[i+1]));
+ i += 2;
+ break;
+ case 'm':
+ gs_rmoveto(ctx->pgs, atof(args[i]), atof(args[i+1]));
+ //dprintf2("rmoveto %g %g\n", atof(args[i]), atof(args[i+1]));
+ i += 2;
+ break;
+
+ case 'L':
+ gs_lineto(ctx->pgs, atof(args[i]), atof(args[i+1]));
+ //dprintf2("lineto %g %g\n", atof(args[i]), atof(args[i+1]));
+ i += 2;
+ break;
+ case 'l':
+ gs_rlineto(ctx->pgs, atof(args[i]), atof(args[i+1]));
+ //dprintf2("rlineto %g %g\n", atof(args[i]), atof(args[i+1]));
+ i += 2;
+ break;
+
+ case 'H':
+ gs_currentpoint(ctx->pgs, &pt);
+ gs_lineto(ctx->pgs, atof(args[i]), pt.y);
+ //dprintf1("hlineto %g\n", atof(args[i]));
+ i += 1;
+ break;
+ case 'h':
+ gs_rlineto(ctx->pgs, atof(args[i]), 0.0);
+ //dprintf1("rhlineto %g\n", atof(args[i]));
+ i += 1;
+ break;
+
+ case 'V':
+ gs_currentpoint(ctx->pgs, &pt);
+ gs_lineto(ctx->pgs, pt.x, atof(args[i]));
+ //dprintf1("vlineto %g\n", atof(args[i]));
+ i += 1;
+ break;
+ case 'v':
+ gs_rlineto(ctx->pgs, 0.0, atof(args[i]));
+ //dprintf1("rvlineto %g\n", atof(args[i]));
+ i += 1;
+ break;
+
+ case 'C':
+ x1 = atof(args[i+0]);
+ y1 = atof(args[i+1]);
+ x2 = atof(args[i+2]);
+ y2 = atof(args[i+3]);
+ x3 = atof(args[i+4]);
+ y3 = atof(args[i+5]);
+ gs_curveto(ctx->pgs, x1, y1, x2, y2, x3, y3);
+ i += 6;
+ reset_smooth = 0;
+ smooth_x = x3 - x2;
+ smooth_y = y3 - y2;
+ break;
+
+ case 'c':
+ gs_currentpoint(ctx->pgs, &pt);
+ x1 = atof(args[i+0]) + pt.x;
+ y1 = atof(args[i+1]) + pt.y;
+ x2 = atof(args[i+2]) + pt.x;
+ y2 = atof(args[i+3]) + pt.y;
+ x3 = atof(args[i+4]) + pt.x;
+ y3 = atof(args[i+5]) + pt.y;
+ gs_curveto(ctx->pgs, x1, y1, x2, y2, x3, y3);
+ i += 6;
+ reset_smooth = 0;
+ smooth_x = x3 - x2;
+ smooth_y = y3 - y2;
+ break;
+
+ case 'S':
+ gs_currentpoint(ctx->pgs, &pt);
+ x1 = atof(args[i+0]);
+ y1 = atof(args[i+1]);
+ x2 = atof(args[i+2]);
+ y2 = atof(args[i+3]);
+ //dprintf2("smooth %g %g\n", smooth_x, smooth_y);
+ gs_curveto(ctx->pgs, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
+ i += 4;
+ reset_smooth = 0;
+ smooth_x = x2 - x1;
+ smooth_y = y2 - y1;
+ break;
+
+ case 's':
+ gs_currentpoint(ctx->pgs, &pt);
+ x1 = atof(args[i+0]) + pt.x;
+ y1 = atof(args[i+1]) + pt.y;
+ x2 = atof(args[i+2]) + pt.x;
+ y2 = atof(args[i+3]) + pt.y;
+ //dprintf2("smooth %g %g\n", smooth_x, smooth_y);
+ gs_curveto(ctx->pgs, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
+ i += 4;
+ reset_smooth = 0;
+ smooth_x = x2 - x1;
+ smooth_y = y2 - y1;
+ break;
+
+ case 'Q':
+ x1 = atof(args[i+0]);
+ y1 = atof(args[i+1]);
+ x2 = atof(args[i+2]);
+ y2 = atof(args[i+3]);
+ //dprintf4("conicto %g %g %g %g\n", x1, y1, x2, y2);
+ gs_curveto(ctx->pgs,
+ (pt.x + 2 * x1) / 3, (pt.y + 2 * y1) / 3,
+ (x2 + 2 * x1) / 3, (y2 + 2 * y1) / 3,
+ x2, y2);
+ i += 4;
+ break;
+ case 'q':
+ gs_currentpoint(ctx->pgs, &pt);
+ x1 = atof(args[i+0]) + pt.x;
+ y1 = atof(args[i+1]) + pt.y;
+ x2 = atof(args[i+2]) + pt.x;
+ y2 = atof(args[i+3]) + pt.y;
+ //dprintf4("conicto %g %g %g %g\n", x1, y1, x2, y2);
+ gs_curveto(ctx->pgs,
+ (pt.x + 2 * x1) / 3, (pt.y + 2 * y1) / 3,
+ (x2 + 2 * x1) / 3, (y2 + 2 * y1) / 3,
+ x2, y2);
+ i += 4;
+ break;
+
+ case 'A':
+ xps_draw_arc(ctx,
+ atof(args[i+0]), atof(args[i+1]), atof(args[i+2]),
+ atoi(args[i+3]), atoi(args[i+4]),
+ atof(args[i+5]), atof(args[i+6]));
+ i += 7;
+ break;
+ case 'a':
+ gs_currentpoint(ctx->pgs, &pt);
+ xps_draw_arc(ctx,
+ atof(args[i+0]), atof(args[i+1]), atof(args[i+2]),
+ atoi(args[i+3]), atoi(args[i+4]),
+ atof(args[i+5]) + pt.x, atof(args[i+6]) + pt.y);
+ i += 7;
+ break;
+
+ case 'Z':
+ case 'z':
+ gs_closepath(ctx->pgs);
+ //dputs("closepath\n");
+ break;
+
+ default:
+ /* eek */
+ break;
+ }
+
+ old = cmd;
+ }
+
+ xps_free(ctx, args);
+
+ return 0;
+}
+
+static int
+xps_parse_arc_segment(xps_context_t *ctx, xps_item_t *root, int stroking, int *skipped_stroke)
+{
+ /* ArcSegment pretty much follows the SVG algorithm for converting an
+ arc in endpoint representation to an arc in centerpoint
+ representation. Once in centerpoint it can be given to the
+ graphics library in the form of a postscript arc.
+ */
+
+ float rotation_angle;
+ int is_large_arc, is_clockwise;
+ float point_x, point_y;
+ float size_x, size_y;
+ int is_stroked;
+
+ char *point_att = xps_att(root, "Point");
+ char *size_att = xps_att(root, "Size");
+ char *rotation_angle_att = xps_att(root, "RotationAngle");
+ char *is_large_arc_att = xps_att(root, "IsLargeArc");
+ char *sweep_direction_att = xps_att(root, "SweepDirection");
+ char *is_stroked_att = xps_att(root, "IsStroked");
+
+ if (!point_att || !size_att || !rotation_angle_att || !is_large_arc_att || !sweep_direction_att)
+ return gs_throw(-1, "ArcSegment element is missing attributes");
+
+ is_stroked = 1;
+ if (is_stroked_att && !strcmp(is_stroked_att, "false"))
+ is_stroked = 0;
+ if (!is_stroked)
+ *skipped_stroke = 1;
+
+ sscanf(point_att, "%g,%g", &point_x, &point_y);
+ sscanf(size_att, "%g,%g", &size_x, &size_y);
+ rotation_angle = atof(rotation_angle_att);
+ is_large_arc = !strcmp(is_large_arc_att, "true");
+ is_clockwise = !strcmp(sweep_direction_att, "Clockwise");
+
+ if (stroking && !is_stroked)
+ {
+ gs_moveto(ctx->pgs, point_x, point_y);
+ return 0;
+ }
+
+ return xps_draw_arc(ctx, size_x, size_y, rotation_angle,
+ is_large_arc, is_clockwise, point_x, point_y);
+}
+
+static int
+xps_parse_poly_quadratic_bezier_segment(xps_context_t *ctx, xps_item_t *root, int stroking, int *skipped_stroke)
+{
+ char *points_att = xps_att(root, "Points");
+ char *is_stroked_att = xps_att(root, "IsStroked");
+ float x[2], y[2];
+ int is_stroked;
+ gs_point pt;
+ char *s;
+ int n;
+
+ if (!points_att)
+ return gs_throw(-1, "PolyQuadraticBezierSegment element has no points");
+
+ is_stroked = 1;
+ if (is_stroked_att && !strcmp(is_stroked_att, "false"))
+ is_stroked = 0;
+ if (!is_stroked)
+ *skipped_stroke = 1;
+
+ s = points_att;
+ n = 0;
+ while (*s != 0)
+ {
+ while (*s == ' ') s++;
+ sscanf(s, "%g,%g", &x[n], &y[n]);
+ while (*s != ' ' && *s != 0) s++;
+ n ++;
+ if (n == 2)
+ {
+ if (stroking && !is_stroked)
+ {
+ gs_moveto(ctx->pgs, x[1], y[1]);
+ }
+ else
+ {
+ gs_currentpoint(ctx->pgs, &pt);
+ gs_curveto(ctx->pgs,
+ (pt.x + 2 * x[0]) / 3, (pt.y + 2 * y[0]) / 3,
+ (x[1] + 2 * x[0]) / 3, (y[1] + 2 * y[0]) / 3,
+ x[1], y[1]);
+ }
+ n = 0;
+ }
+ }
+
+ return 0;
+}
+
+static int
+xps_parse_poly_bezier_segment(xps_context_t *ctx, xps_item_t *root, int stroking, int *skipped_stroke)
+{
+ char *points_att = xps_att(root, "Points");
+ char *is_stroked_att = xps_att(root, "IsStroked");
+ float x[3], y[3];
+ int is_stroked;
+ char *s;
+ int n;
+
+ if (!points_att)
+ return gs_throw(-1, "PolyBezierSegment element has no points");
+
+ is_stroked = 1;
+ if (is_stroked_att && !strcmp(is_stroked_att, "false"))
+ is_stroked = 0;
+ if (!is_stroked)
+ *skipped_stroke = 1;
+
+ s = points_att;
+ n = 0;
+ while (*s != 0)
+ {
+ while (*s == ' ') s++;
+ sscanf(s, "%g,%g", &x[n], &y[n]);
+ while (*s != ' ' && *s != 0) s++;
+ n ++;
+ if (n == 3)
+ {
+ if (stroking && !is_stroked)
+ gs_moveto(ctx->pgs, x[2], y[2]);
+ else
+ gs_curveto(ctx->pgs, x[0], y[0], x[1], y[1], x[2], y[2]);
+ n = 0;
+ }
+ }
+
+ return 0;
+}
+
+static int
+xps_parse_poly_line_segment(xps_context_t *ctx, xps_item_t *root, int stroking, int *skipped_stroke)
+{
+ char *points_att = xps_att(root, "Points");
+ char *is_stroked_att = xps_att(root, "IsStroked");
+ int is_stroked;
+ float x, y;
+ char *s;
+
+ if (!points_att)
+ return gs_throw(-1, "PolyLineSegment element has no points");
+
+ is_stroked = 1;
+ if (is_stroked_att && !strcmp(is_stroked_att, "false"))
+ is_stroked = 0;
+ if (!is_stroked)
+ *skipped_stroke = 1;
+
+ s = points_att;
+ while (*s != 0)
+ {
+ while (*s == ' ') s++;
+ sscanf(s, "%g,%g", &x, &y);
+ if (stroking && !is_stroked)
+ gs_moveto(ctx->pgs, x, y);
+ else
+ gs_lineto(ctx->pgs, x, y);
+ while (*s != ' ' && *s != 0) s++;
+ }
+
+ return 0;
+}
+
+static int
+xps_parse_path_figure(xps_context_t *ctx, xps_item_t *root, int stroking)
+{
+ xps_item_t *node;
+
+ char *is_closed_att;
+ char *start_point_att;
+ char *is_filled_att;
+
+ int is_closed = 0;
+ int is_filled = 1;
+ float start_x = 0.0;
+ float start_y = 0.0;
+
+ int skipped_stroke = 0;
+
+ is_closed_att = xps_att(root, "IsClosed");
+ start_point_att = xps_att(root, "StartPoint");
+ is_filled_att = xps_att(root, "IsFilled");
+
+ if (is_closed_att)
+ is_closed = !strcmp(is_closed_att, "true");
+ if (is_filled_att)
+ is_filled = !strcmp(is_filled_att, "true");
+ if (start_point_att)
+ sscanf(start_point_att, "%g,%g", &start_x, &start_y);
+
+ if (!stroking && !is_filled) /* not filled, when filling */
+ return 0;
+
+ gs_moveto(ctx->pgs, start_x, start_y);
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "ArcSegment"))
+ xps_parse_arc_segment(ctx, node, stroking, &skipped_stroke);
+ if (!strcmp(xps_tag(node), "PolyBezierSegment"))
+ xps_parse_poly_bezier_segment(ctx, node, stroking, &skipped_stroke);
+ if (!strcmp(xps_tag(node), "PolyLineSegment"))
+ xps_parse_poly_line_segment(ctx, node, stroking, &skipped_stroke);
+ if (!strcmp(xps_tag(node), "PolyQuadraticBezierSegment"))
+ xps_parse_poly_quadratic_bezier_segment(ctx, node, stroking, &skipped_stroke);
+ }
+
+ if (is_closed)
+ {
+ if (stroking && skipped_stroke)
+ gs_lineto(ctx->pgs, start_x, start_y); /* we've skipped using gs_moveto... */
+ else
+ gs_closepath(ctx->pgs); /* no skipped segments, safe to closepath properly */
+ }
+
+ return 0;
+}
+
+int
+xps_parse_path_geometry(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root, int stroking)
+{
+ xps_item_t *node;
+
+ char *figures_att;
+ char *fill_rule_att;
+ char *transform_att;
+
+ xps_item_t *transform_tag = NULL;
+ xps_item_t *figures_tag = NULL; /* only used by resource */
+
+ gs_matrix transform;
+ gs_matrix saved_transform;
+ int even_odd = 0;
+
+ ctx->fill_rule = 0;
+
+ gs_newpath(ctx->pgs);
+
+ figures_att = xps_att(root, "Figures");
+ fill_rule_att = xps_att(root, "FillRule");
+ transform_att = xps_att(root, "Transform");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "PathGeometry.Transform"))
+ transform_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &transform_att, &transform_tag);
+ xps_resolve_resource_reference(ctx, dict, &figures_att, &figures_tag);
+
+ if (fill_rule_att)
+ {
+ if (!strcmp(fill_rule_att, "NonZero"))
+ ctx->fill_rule = 1;
+ if (!strcmp(fill_rule_att, "EvenOdd"))
+ ctx->fill_rule = 0;
+ }
+
+ gs_make_identity(&transform);
+ if (transform_att || transform_tag)
+ {
+ if (transform_att)
+ xps_parse_render_transform(ctx, transform_att, &transform);
+ if (transform_tag)
+ xps_parse_matrix_transform(ctx, transform_tag, &transform);
+ }
+
+ gs_currentmatrix(ctx->pgs, &saved_transform);
+ gs_concat(ctx->pgs, &transform);
+
+ if (figures_att)
+ {
+ xps_parse_abbreviated_geometry(ctx, figures_att);
+ }
+
+ if (figures_tag)
+ {
+ xps_parse_path_figure(ctx, figures_tag, stroking);
+ }
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "PathFigure"))
+ xps_parse_path_figure(ctx, node, stroking);
+ }
+
+ gs_setmatrix(ctx->pgs, &saved_transform);
+
+ return 0;
+}
+
+/*
+ * Parse an XPS <Path> element, and call relevant ghostscript
+ * functions for drawing and/or clipping the child elements.
+ */
+
+int
+xps_parse_path(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ xps_item_t *node;
+
+ char *transform_att;
+ char *clip_att;
+ char *data_att;
+ char *fill_att;
+ char *stroke_att;
+ char *opacity_att;
+ char *opacity_mask_att;
+
+ xps_item_t *transform_tag = NULL;
+ xps_item_t *clip_tag = NULL;
+ xps_item_t *data_tag = NULL;
+ xps_item_t *fill_tag = NULL;
+ xps_item_t *stroke_tag = NULL;
+ xps_item_t *opacity_mask_tag = NULL;
+
+ char *fill_opacity_att = NULL;
+ char *stroke_opacity_att = NULL;
+
+ char *stroke_dash_array_att;
+ char *stroke_dash_cap_att;
+ char *stroke_dash_offset_att;
+ char *stroke_end_line_cap_att;
+ char *stroke_start_line_cap_att;
+ char *stroke_line_join_att;
+ char *stroke_miter_limit_att;
+ char *stroke_thickness_att;
+
+ gs_line_cap linecap;
+ gs_line_join linejoin;
+ float linewidth;
+ float miterlimit;
+ float samples[32];
+ gs_color_space *colorspace;
+
+ gs_rect saved_bounds;
+
+ gs_gsave(ctx->pgs);
+
+ /*
+ * Extract attributes and extended attributes.
+ */
+
+ transform_att = xps_att(root, "RenderTransform");
+ clip_att = xps_att(root, "Clip");
+ data_att = xps_att(root, "Data");
+ fill_att = xps_att(root, "Fill");
+ stroke_att = xps_att(root, "Stroke");
+ opacity_att = xps_att(root, "Opacity");
+ opacity_mask_att = xps_att(root, "OpacityMask");
+
+ stroke_dash_array_att = xps_att(root, "StrokeDashArray");
+ stroke_dash_cap_att = xps_att(root, "StrokeDashCap");
+ stroke_dash_offset_att = xps_att(root, "StrokeDashOffset");
+ stroke_end_line_cap_att = xps_att(root, "StrokeEndLineCap");
+ stroke_start_line_cap_att = xps_att(root, "StrokeStartLineCap");
+ stroke_line_join_att = xps_att(root, "StrokeLineJoin");
+ stroke_miter_limit_att = xps_att(root, "StrokeMiterLimit");
+ stroke_thickness_att = xps_att(root, "StrokeThickness");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "Path.RenderTransform"))
+ transform_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Path.OpacityMask"))
+ opacity_mask_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Path.Clip"))
+ clip_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Path.Fill"))
+ fill_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Path.Stroke"))
+ stroke_tag = xps_down(node);
+
+ if (!strcmp(xps_tag(node), "Path.Data"))
+ data_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &data_att, &data_tag);
+ xps_resolve_resource_reference(ctx, dict, &clip_att, &clip_tag);
+ xps_resolve_resource_reference(ctx, dict, &transform_att, &transform_tag);
+ xps_resolve_resource_reference(ctx, dict, &fill_att, &fill_tag);
+ xps_resolve_resource_reference(ctx, dict, &stroke_att, &stroke_tag);
+ xps_resolve_resource_reference(ctx, dict, &opacity_mask_att, &opacity_mask_tag);
+
+ /*
+ * Act on the information we have gathered:
+ */
+
+ if (fill_tag && !strcmp(xps_tag(fill_tag), "SolidColorBrush"))
+ {
+ fill_opacity_att = xps_att(fill_tag, "Opacity");
+ fill_att = xps_att(fill_tag, "Color");
+ fill_tag = NULL;
+ }
+
+ if (stroke_tag && !strcmp(xps_tag(stroke_tag), "SolidColorBrush"))
+ {
+ stroke_opacity_att = xps_att(stroke_tag, "Opacity");
+ stroke_att = xps_att(stroke_tag, "Color");
+ stroke_tag = NULL;
+ }
+
+ /* TODO: stroke_end_line_cap_att */
+ /* TODO: stroke_dash_cap_att */
+
+ linecap = gs_cap_butt;
+ if (stroke_start_line_cap_att)
+ {
+ if (!strcmp(stroke_start_line_cap_att, "Flat")) linecap = gs_cap_butt;
+ if (!strcmp(stroke_start_line_cap_att, "Square")) linecap = gs_cap_square;
+ if (!strcmp(stroke_start_line_cap_att, "Round")) linecap = gs_cap_round;
+ if (!strcmp(stroke_start_line_cap_att, "Triangle")) linecap = gs_cap_triangle;
+ }
+ gs_setlinecap(ctx->pgs, linecap);
+
+ linejoin = gs_join_miter;
+ if (stroke_line_join_att)
+ {
+ if (!strcmp(stroke_line_join_att, "Miter")) linejoin = gs_join_miter;
+ if (!strcmp(stroke_line_join_att, "Bevel")) linejoin = gs_join_bevel;
+ if (!strcmp(stroke_line_join_att, "Round")) linejoin = gs_join_round;
+ }
+ gs_setlinejoin(ctx->pgs, linejoin);
+
+ miterlimit = 10.0;
+ if (stroke_miter_limit_att)
+ miterlimit = atof(stroke_miter_limit_att);
+ gs_setmiterlimit(ctx->pgs, miterlimit);
+
+ linewidth = 1.0;
+ if (stroke_thickness_att)
+ linewidth = atof(stroke_thickness_att);
+ gs_setlinewidth(ctx->pgs, linewidth);
+
+ if (stroke_dash_array_att)
+ {
+ char *s = stroke_dash_array_att;
+ float dash_array[100];
+ float dash_offset = 0.0;
+ int dash_count = 0;
+
+ if (stroke_dash_offset_att)
+ dash_offset = atof(stroke_dash_offset_att) * linewidth;
+
+ while (*s)
+ {
+ while (*s == ' ')
+ s++;
+ dash_array[dash_count++] = atof(s) * linewidth;
+ while (*s && *s != ' ')
+ s++;
+ }
+
+ gs_setdash(ctx->pgs, dash_array, dash_count, dash_offset);
+ }
+ else
+ {
+ gs_setdash(ctx->pgs, NULL, 0, 0.0);
+ }
+
+ if (transform_att || transform_tag)
+ {
+ gs_matrix transform;
+
+ if (transform_att)
+ xps_parse_render_transform(ctx, transform_att, &transform);
+ if (transform_tag)
+ xps_parse_matrix_transform(ctx, transform_tag, &transform);
+
+ gs_concat(ctx->pgs, &transform);
+ }
+
+ if (clip_att || clip_tag)
+ {
+ if (clip_att)
+ xps_parse_abbreviated_geometry(ctx, clip_att);
+ if (clip_tag)
+ xps_parse_path_geometry(ctx, dict, clip_tag, 0);
+
+ xps_clip(ctx, &saved_bounds);
+ }
+
+ xps_begin_opacity(ctx, dict, opacity_att, opacity_mask_tag);
+
+ if (fill_att)
+ {
+ xps_parse_color(ctx, fill_att, &colorspace, samples);
+ if (fill_opacity_att)
+ samples[0] = atof(fill_opacity_att);
+ xps_set_color(ctx, colorspace, samples);
+
+ if (data_att)
+ xps_parse_abbreviated_geometry(ctx, data_att);
+ if (data_tag)
+ xps_parse_path_geometry(ctx, dict, data_tag, 0);
+
+ xps_fill(ctx);
+ }
+
+ if (fill_tag)
+ {
+ if (data_att)
+ xps_parse_abbreviated_geometry(ctx, data_att);
+ if (data_tag)
+ xps_parse_path_geometry(ctx, dict, data_tag, 0);
+
+ xps_parse_brush(ctx, dict, fill_tag);
+ }
+
+ if (stroke_att)
+ {
+ xps_parse_color(ctx, stroke_att, &colorspace, samples);
+ if (stroke_opacity_att)
+ samples[0] = atof(stroke_opacity_att);
+ xps_set_color(ctx, colorspace, samples);
+
+ if (data_att)
+ xps_parse_abbreviated_geometry(ctx, data_att);
+ if (data_tag)
+ xps_parse_path_geometry(ctx, dict, data_tag, 1);
+
+ gs_stroke(ctx->pgs);
+ }
+
+ if (stroke_tag)
+ {
+ if (data_att)
+ xps_parse_abbreviated_geometry(ctx, data_att);
+ if (data_tag)
+ xps_parse_path_geometry(ctx, dict, data_tag, 1);
+
+ ctx->fill_rule = 1; /* over-ride fill rule when converting outline to stroked */
+ gs_strokepath(ctx->pgs);
+
+ xps_parse_brush(ctx, dict, stroke_tag);
+ }
+
+ if (clip_att || clip_tag)
+ {
+ xps_unclip(ctx, &saved_bounds);
+ }
+
+ xps_end_opacity(ctx, dict, opacity_att, opacity_mask_tag);
+
+ gs_grestore(ctx->pgs);
+
+ return 0;
+}
+
diff --git a/xps/xpspng.c b/xps/xpspng.c
new file mode 100644
index 000000000..b464a51fe
--- /dev/null
+++ b/xps/xpspng.c
@@ -0,0 +1,189 @@
+#include "ghostxps.h"
+
+#include "stream.h"
+#include "strimpl.h"
+#include "gsstate.h"
+#include "png_.h"
+
+/*
+ * PNG using libpng directly (no gs wrappers)
+ */
+
+struct xps_png_io_s
+{
+ byte *ptr;
+ byte *lim;
+};
+
+static void xps_png_read(png_structp png, png_bytep data, png_size_t length)
+{
+ struct xps_png_io_s *io = png_get_io_ptr(png);
+ if (io->ptr + length > io->lim)
+ png_error(png, "Read Error");
+ memcpy(data, io->ptr, length);
+ io->ptr += length;
+}
+
+static png_voidp xps_png_malloc(png_structp png, png_size_t size)
+{
+ gs_memory_t *mem = png_get_mem_ptr(png);
+ return gs_alloc_bytes(mem, size, "libpng");
+}
+
+static void xps_png_free(png_structp png, png_voidp ptr)
+{
+ gs_memory_t *mem = png_get_mem_ptr(png);
+ gs_free_object(mem, ptr, "libpng");
+}
+
+int xps_decode_png(gs_memory_t *mem, byte *rbuf, int rlen, xps_image_t *image)
+{
+ png_structp png;
+ png_infop info;
+ struct xps_png_io_s io;
+ int npasses;
+ int pass;
+ int y;
+
+ /*
+ * Set up PNG structs and input source
+ */
+
+ io.ptr = rbuf;
+ io.lim = rbuf + rlen;
+
+ png = png_create_read_struct_2(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL,
+ mem, xps_png_malloc, xps_png_free);
+ if (!png)
+ return gs_throw(-1, "png_create_read_struct");
+
+ info = png_create_info_struct(png);
+ if (!info)
+ return gs_throw(-1, "png_create_info_struct");
+
+ png_set_read_fn(png, &io, xps_png_read);
+
+ /*
+ * Jump to here on errors.
+ */
+
+ if (setjmp(png_jmpbuf(png)))
+ {
+ png_destroy_read_struct(&png, &info, NULL);
+ return gs_throw(-1, "png reading failed");
+ }
+
+ /*
+ * Read PNG header
+ */
+
+ png_read_info(png, info);
+
+ image->width = png_get_image_width(png, info);
+ image->height = png_get_image_height(png, info);
+ image->bits = png_get_bit_depth(png, info);
+
+ if (png_get_interlace_type(png, info) == PNG_INTERLACE_ADAM7)
+ {
+ npasses = png_set_interlace_handling(png);
+ }
+ else
+ {
+ npasses = 1;
+ }
+
+ if (image->bits == 16)
+ {
+ png_set_strip_16(png);
+ image->bits = 8;
+ }
+
+ switch (png_get_color_type(png, info))
+ {
+ case PNG_COLOR_TYPE_GRAY:
+ image->comps = 1;
+ image->colorspace = XPS_GRAY;
+ break;
+
+ case PNG_COLOR_TYPE_PALETTE:
+ /* ask libpng to expand palettes to rgb triplets */
+ png_set_palette_to_rgb(png);
+ image->bits = 8;
+
+ /* libpng will expand to rgba if there is a tRNS chunk */
+ if (png_get_valid(png, info, PNG_INFO_tRNS))
+ {
+ image->comps = 4;
+ image->colorspace = XPS_RGB_A;
+ }
+ else
+ {
+ image->comps = 3;
+ image->colorspace = XPS_RGB;
+ }
+ break;
+
+ case PNG_COLOR_TYPE_RGB:
+ image->comps = 3;
+ image->colorspace = XPS_RGB;
+ break;
+
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ image->comps = 2;
+ image->colorspace = XPS_GRAY_A;
+ break;
+
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ image->comps = 4;
+ image->colorspace = XPS_RGB_A;
+ break;
+
+ default:
+ return gs_throw(-1, "cannot handle this png color type");
+ }
+
+ image->stride = (image->width * image->comps * image->bits + 7) / 8;
+
+ /*
+ * Extract DPI, default to 96 dpi
+ */
+
+ image->xres = 96;
+ image->yres = 96;
+
+ if (info->valid & PNG_INFO_pHYs)
+ {
+ png_uint_32 xres, yres;
+ int unit;
+ png_get_pHYs(png, info, &xres, &yres, &unit);
+ if (unit == PNG_RESOLUTION_METER)
+ {
+ image->xres = xres * 0.0254 + 0.5;
+ image->yres = yres * 0.0254 + 0.5;
+ }
+ }
+
+ /*
+ * Read rows, filling transformed output into image buffer.
+ */
+
+ image->samples = gs_alloc_bytes(mem, image->stride * image->height, "decodepng");
+
+ for (pass = 0; pass < npasses; pass++)
+ {
+ for (y = 0; y < image->height; y++)
+ {
+ png_read_row(png, image->samples + (y * image->stride), NULL);
+ }
+ }
+
+ /*
+ * Clean up memory.
+ */
+
+ png_destroy_read_struct(&png, &info, NULL);
+
+ return gs_okay;
+}
+
diff --git a/xps/xpsresource.c b/xps/xpsresource.c
new file mode 100644
index 000000000..d4deb6b2e
--- /dev/null
+++ b/xps/xpsresource.c
@@ -0,0 +1,130 @@
+#include "ghostxps.h"
+
+int
+xps_resolve_resource_reference(xps_context_t *ctx, xps_resource_t *dict,
+ char **attp, xps_item_t **tagp)
+{
+ if (*attp)
+ {
+ xps_item_t *rsrc = xps_parse_resource_reference(ctx, dict, *attp);
+ if (rsrc)
+ {
+ *attp = NULL;
+ *tagp = rsrc;
+ }
+ }
+ return 0;
+}
+
+xps_item_t *
+xps_find_resource(xps_context_t *ctx, xps_resource_t *dict, char *name)
+{
+ xps_resource_t *head, *node;
+ for (head = dict; head; head = head->parent)
+ for (node = head; node; node = node->next)
+ if (!strcmp(node->name, name))
+ return node->data;
+ return NULL;
+}
+
+xps_item_t *
+xps_parse_resource_reference(xps_context_t *ctx, xps_resource_t *dict, char *att)
+{
+ char name[1024];
+ char *s;
+
+ if (strstr(att, "{StaticResource ") != att)
+ return NULL;
+
+ strcpy(name, att + 16);
+ s = strrchr(name, '}');
+ if (s)
+ *s = 0;
+
+ return xps_find_resource(ctx, dict, name);
+}
+
+xps_resource_t *
+xps_parse_remote_resource_dictionary(xps_context_t *ctx, char *source_att)
+{
+ char part_name[1024];
+ xps_part_t *part;
+ xps_resource_t *dict;
+ xps_item_t *root;
+
+ xps_absolute_path(part_name, ctx->pwd, source_att);
+ part = xps_find_part(ctx, part_name);
+ if (!part)
+ {
+ gs_throw1(-1, "cannot find remote resource part '%s'", part_name);
+ return NULL;
+ }
+
+ root = xps_parse_xml(ctx, part->data, part->size);
+ if (!root)
+ {
+ gs_rethrow(-1, "cannot parse xml");
+ return NULL;
+ }
+
+ if (strcmp(xps_tag(root), "ResourceDictionary"))
+ {
+ gs_throw1(-1, "expected ResourceDictionary element (found %s)", xps_tag(root));
+ return NULL;
+ }
+
+ dict = xps_parse_resource_dictionary(ctx, root);
+
+ // TODO: xps_free_item(dict); -- need to add reference counting so dict can keep nodes
+
+ return dict;
+}
+
+xps_resource_t *
+xps_parse_resource_dictionary(xps_context_t *ctx, xps_item_t *root)
+{
+ xps_resource_t *head;
+ xps_resource_t *entry;
+ xps_item_t *node;
+ char *source;
+ char *key;
+
+ source = xps_att(root, "Source");
+ if (source)
+ return xps_parse_remote_resource_dictionary(ctx, source);
+
+ head = NULL;
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ key = xps_att(node, "x:Key");
+ if (key)
+ {
+ entry = xps_alloc(ctx, sizeof(xps_resource_t));
+ if (!entry)
+ {
+ gs_throw(-1, "cannot allocate resource entry");
+ return head;
+ }
+ entry->name = key;
+ entry->data = node;
+ entry->next = head;
+ entry->parent = NULL;
+ head = entry;
+ }
+ }
+
+ return head;
+}
+
+void xps_free_resource_dictionary(xps_context_t *ctx, xps_resource_t *dict)
+{
+ xps_resource_t *next;
+ while (dict)
+ {
+ next = dict->next;
+ xps_free(ctx, dict);
+ dict = next;
+ }
+}
+
diff --git a/xps/xpstiff.c b/xps/xpstiff.c
new file mode 100644
index 000000000..a1ffcc45f
--- /dev/null
+++ b/xps/xpstiff.c
@@ -0,0 +1,1065 @@
+#include "ghostxps.h"
+
+#include "stream.h"
+#include "strimpl.h"
+#include "gsstate.h"
+#include "jpeglib_.h"
+#include "sdct.h"
+#include "sjpeg.h"
+#include "srlx.h"
+#include "slzwx.h"
+#include "szlibx.h"
+#include "scfx.h"
+#include "memory_.h"
+
+/*
+ * TIFF image loader. Should be enough to support TIFF files in XPS.
+ * Baseline TIFF 6.0 plus CMYK, LZW, Flate and JPEG support.
+ * Limited bit depths (1,2,4,8).
+ * Limited planar configurations (1=chunky).
+ * No tiles (easy fix if necessary).
+ * TODO: RGBPal images
+ */
+
+typedef struct xps_tiff_s xps_tiff_t;
+
+struct xps_tiff_s
+{
+ /* "file" */
+ byte *bp, *rp, *ep;
+
+ /* byte order */
+ unsigned order;
+
+ /* where we can find the strips of image data */
+ unsigned rowsperstrip;
+ unsigned *stripoffsets;
+ unsigned *stripbytecounts;
+
+ /* colormap */
+ unsigned *colormap;
+
+ /* assorted tags */
+ unsigned subfiletype;
+ unsigned photometric;
+ unsigned compression;
+ unsigned imagewidth;
+ unsigned imagelength;
+ unsigned samplesperpixel;
+ unsigned bitspersample;
+ unsigned planar;
+ unsigned extrasamples;
+ unsigned xresolution;
+ unsigned yresolution;
+ unsigned resolutionunit;
+ unsigned fillorder;
+ unsigned g3opts;
+ unsigned g4opts;
+ unsigned predictor;
+
+ unsigned ycbcrsubsamp[2];
+
+ byte *jpegtables; /* point into "file" buffer */
+ unsigned jpegtableslen;
+};
+
+enum
+{
+ TII = 0x4949, /* 'II' */
+ TMM = 0x4d4d, /* 'MM' */
+ TBYTE = 1,
+ TASCII = 2,
+ TSHORT = 3,
+ TLONG = 4,
+ TRATIONAL = 5
+};
+
+#define NewSubfileType 254
+#define ImageWidth 256
+#define ImageLength 257
+#define BitsPerSample 258
+#define Compression 259
+#define PhotometricInterpretation 262
+#define FillOrder 266
+#define StripOffsets 273
+#define SamplesPerPixel 277
+#define RowsPerStrip 278
+#define StripByteCounts 279
+#define XResolution 282
+#define YResolution 283
+#define PlanarConfiguration 284
+#define T4Options 292
+#define T6Options 293
+#define ResolutionUnit 296
+#define Predictor 317
+#define ColorMap 320
+#define TileWidth 322
+#define TileLength 323
+#define TileOffsets 324
+#define TileByteCounts 325
+#define ExtraSamples 338
+#define JPEGTables 347
+#define YCbCrSubSampling 520
+
+static const byte bitrev[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 int
+xps_report_error(stream_state * st, const char *str)
+{
+ (void) gs_throw1(-1, "%s", str);
+ return 0;
+}
+
+static inline int
+readbyte(xps_tiff_t *tiff)
+{
+ if (tiff->rp < tiff->ep)
+ return *tiff->rp++;
+ return EOF;
+}
+
+static inline unsigned
+readshort(xps_tiff_t *tiff)
+{
+ unsigned a = readbyte(tiff);
+ unsigned b = readbyte(tiff);
+ if (tiff->order == TII)
+ return (b << 8) | a;
+ return (a << 8) | b;
+}
+
+static inline unsigned
+readlong(xps_tiff_t *tiff)
+{
+ unsigned a = readbyte(tiff);
+ unsigned b = readbyte(tiff);
+ unsigned c = readbyte(tiff);
+ unsigned d = readbyte(tiff);
+ if (tiff->order == TII)
+ return (d << 24) | (c << 16) | (b << 8) | a;
+ return (a << 24) | (b << 16) | (c << 8) | d;
+}
+
+static int
+xps_decode_tiff_uncompressed(gs_memory_t *mem, xps_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ memcpy(wp, rp, wl - wp);
+ return gs_okay;
+}
+
+static int
+xps_decode_tiff_packbits(gs_memory_t *mem, xps_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_RLD_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_RLD_template, mem);
+ state.report_error = xps_report_error;
+
+ s_RLD_template.set_defaults((stream_state*)&state);
+ s_RLD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_RLD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ return gs_throw1(-1, "error in packbits data (code = %d)", code);
+
+ return gs_okay;
+}
+
+static int
+xps_decode_tiff_lzw(gs_memory_t *mem, xps_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_LZW_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_LZWD_template, mem);
+ state.report_error = xps_report_error;
+
+ s_LZWD_template.set_defaults((stream_state*)&state);
+
+ /* old-style TIFF 5.0 reversed bit order, late change */
+ if (rp[0] == 0 && rp[1] & 0x01)
+ {
+ state.EarlyChange = 0;
+ state.FirstBitLowOrder = 1;
+ }
+
+ /* new-style TIFF 6.0 normal bit order, early change */
+ else
+ {
+ state.EarlyChange = 1;
+ state.FirstBitLowOrder = 0;
+ }
+
+ s_LZWD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_LZWD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ {
+ s_LZWD_template.release((stream_state*)&state);
+ return gs_throw1(-1, "error in lzw data (code = %d)", code);
+ }
+
+ s_LZWD_template.release((stream_state*)&state);
+
+ return gs_okay;
+}
+
+static int
+xps_decode_tiff_flate(gs_memory_t *mem, xps_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_zlib_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_zlibD_template, mem);
+ state.report_error = xps_report_error;
+
+ s_zlibD_template.set_defaults((stream_state*)&state);
+
+ s_zlibD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_zlibD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ {
+ s_zlibD_template.release((stream_state*)&state);
+ return gs_throw1(-1, "error in flate data (code = %d)", code);
+ }
+
+ s_zlibD_template.release((stream_state*)&state);
+ return gs_okay;
+}
+
+static int
+xps_decode_tiff_fax(gs_memory_t *mem, xps_tiff_t *tiff, int comp, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_CFD_state state;
+ stream_cursor_read scr;
+ stream_cursor_write scw;
+ int code;
+
+ s_init_state((stream_state*)&state, &s_CFD_template, mem);
+ state.report_error = xps_report_error;
+
+ s_CFD_template.set_defaults((stream_state*)&state);
+
+ state.EndOfLine = false;
+ state.EndOfBlock = false;
+ state.Columns = tiff->imagewidth;
+ state.Rows = tiff->imagelength;
+ state.BlackIs1 = tiff->photometric == 0;
+
+ state.K = 0;
+ if (comp == 4)
+ state.K = -1;
+ if (comp == 2)
+ state.EncodedByteAlign = true;
+
+ s_CFD_template.init((stream_state*)&state);
+
+ scr.ptr = rp - 1;
+ scr.limit = rl - 1;
+ scw.ptr = wp - 1;
+ scw.limit = wl - 1;
+
+ code = s_CFD_template.process((stream_state*)&state, &scr, &scw, true);
+ if (code == ERRC)
+ {
+ s_CFD_template.release((stream_state*)&state);
+ return gs_throw1(-1, "error in fax data (code = %d)", code);
+ }
+
+ s_CFD_template.release((stream_state*)&state);
+ return gs_okay;
+}
+
+/*
+ * We need more find control over JPEG decoding parameters than
+ * the s_DCTD_template filter will give us. So we abuse the
+ * filter, and take control after the filter setup (which sets up
+ * the memory manager and error handling) and call the gs_jpeg
+ * wrappers directly for doing the actual decoding.
+ */
+
+static int
+xps_decode_tiff_jpeg(gs_memory_t *mem, xps_tiff_t *tiff, byte *rp, byte *rl, byte *wp, byte *wl)
+{
+ stream_DCT_state state; /* used by gs_jpeg_* wrappers */
+ jpeg_decompress_data jddp;
+ struct jpeg_source_mgr *srcmgr;
+ JSAMPROW scanlines[1];
+ int stride;
+ int code;
+
+ /*
+ * Set up the JPEG and DCT filter voodoo.
+ */
+
+ s_init_state((stream_state*)&state, &s_DCTD_template, mem);
+ state.report_error = xps_report_error;
+ s_DCTD_template.set_defaults((stream_state*)&state);
+
+ state.jpeg_memory = mem;
+ state.data.decompress = &jddp;
+
+ jddp.template = s_DCTD_template;
+ jddp.memory = mem;
+ jddp.scanline_buffer = NULL;
+
+ if ((code = gs_jpeg_create_decompress(&state)) < 0)
+ return gs_throw(-1, "error in gs_jpeg_create_decompress");
+
+ s_DCTD_template.init((stream_state*)&state);
+
+ srcmgr = jddp.dinfo.src;
+
+ /*
+ * Read the abbreviated table file.
+ */
+
+ if (tiff->jpegtables)
+ {
+ srcmgr->next_input_byte = tiff->jpegtables;
+ srcmgr->bytes_in_buffer = tiff->jpegtableslen;
+
+ code = gs_jpeg_read_header(&state, FALSE);
+ if (code != JPEG_HEADER_TABLES_ONLY)
+ return gs_throw(-1, "error in jpeg table data");
+ }
+
+ /*
+ * Read the image jpeg header.
+ */
+
+ srcmgr->next_input_byte = rp;
+ srcmgr->bytes_in_buffer = rl - rp;
+
+ if ((code = gs_jpeg_read_header(&state, TRUE)) < 0)
+ return gs_throw(-1, "error in jpeg_read_header");
+
+ /* when TIFF says RGB and libjpeg says YCbCr, libjpeg is wrong */
+ if (tiff->photometric == 2 && jddp.dinfo.jpeg_color_space == JCS_YCbCr)
+ {
+ jddp.dinfo.jpeg_color_space = JCS_RGB;
+ }
+
+ /*
+ * Decode the strip image data.
+ */
+
+ if ((code = gs_jpeg_start_decompress(&state)) < 0)
+ return gs_throw(-1, "error in jpeg_start_decompress");
+
+ stride = jddp.dinfo.output_width * jddp.dinfo.output_components;
+
+ while (wp + stride <= wl && jddp.dinfo.output_scanline < jddp.dinfo.output_height)
+ {
+ scanlines[0] = wp;
+ code = gs_jpeg_read_scanlines(&state, scanlines, 1);
+ if (code < 0)
+ return gs_throw(01, "error in jpeg_read_scanlines");
+ wp += stride;
+ }
+
+ /*
+ * Clean up.
+ */
+
+ if ((code = gs_jpeg_finish_decompress(&state)) < 0)
+ return gs_throw(-1, "error in jpeg_finish_decompress");
+
+ gs_jpeg_destroy(&state);
+
+ return gs_okay;
+}
+
+static inline int
+getcomp(byte *line, int x, int bpc)
+{
+ switch (bpc)
+ {
+ case 1: return line[x / 8] >> (7 - (x % 8)) & 0x01;
+ case 2: return line[x / 4] >> ((3 - (x % 4)) * 2) & 0x03;
+ case 4: return line[x / 2] >> ((1 - (x % 2)) * 4) & 0x0f;
+ case 8: return line[x];
+ }
+ return 0;
+}
+
+static inline void
+putcomp(byte *line, int x, int bpc, int value)
+{
+ int maxval = (1 << bpc) - 1;
+
+ // clear bits first
+ switch (bpc)
+ {
+ case 1: line[x / 8] &= ~(maxval << (7 - (x % 8))); break;
+ case 2: line[x / 4] &= ~(maxval << ((3 - (x % 4)) * 2)); break;
+ case 4: line[x / 2] &= ~(maxval << ((1 - (x % 2)) * 4)); break;
+ }
+
+ switch (bpc)
+ {
+ case 1: line[x / 8] |= value << (7 - (x % 8)); break;
+ case 2: line[x / 4] |= value << ((3 - (x % 4)) * 2); break;
+ case 4: line[x / 2] |= value << ((1 - (x % 2)) * 4); break;
+ case 8: line[x] = value; break;
+ }
+}
+
+static void
+xps_unpredict_tiff(byte *line, int width, int comps, int bits)
+{
+ byte left[32];
+ int i, k, v;
+
+ for (k = 0; k < comps; k++)
+ left[k] = 0;
+
+ for (i = 0; i < width; i++)
+ {
+ for (k = 0; k < comps; k++)
+ {
+ v = getcomp(line, i * comps + k, bits);
+ v = v + left[k];
+ v = v % (1 << bits);
+ putcomp(line, i * comps + k, bits, v);
+ left[k] = v;
+ }
+ }
+}
+
+static void
+xps_invert_tiff(byte *line, int width, int comps, int bits)
+{
+ int i, k, v;
+ int m = (1 << bits) - 1;
+
+ for (i = 0; i < width; i++)
+ {
+ for (k = 0; k < comps; k++)
+ {
+ v = getcomp(line, i * comps + k, bits);
+ v = m - v;
+ putcomp(line, i * comps + k, bits, v);
+ }
+ }
+}
+
+static int
+xps_expand_colormap(gs_memory_t *mem, xps_tiff_t *tiff, xps_image_t *image)
+{
+ int maxval = 1 << image->bits;
+ byte *samples;
+ byte *src, *dst;
+ int stride;
+ int x, y;
+
+ /* colormap has first all red, then all green, then all blue values */
+ /* colormap values are 0..65535, bits is 4 or 8 */
+ /* image can be with or without extrasamples: comps is 1 or 2 */
+
+ if (image->comps != 1 && image->comps != 2)
+ return gs_throw(-1, "invalid number of samples for RGBPal");
+
+ if (image->bits != 4 && image->bits != 8)
+ return gs_throw(-1, "invalid number of bits for RGBPal");
+
+ stride = image->width * (image->comps + 2);
+
+ samples = gs_alloc_bytes(mem, stride * image->height, "samples");
+ if (!samples)
+ return gs_throw(-1, "out of memory: samples");
+
+ for (y = 0; y < image->height; y++)
+ {
+ src = image->samples + (image->stride * y);
+ dst = samples + (stride * y);
+
+ for (x = 0; x < image->width; x++)
+ {
+ if (tiff->extrasamples)
+ {
+ int c = getcomp(src, x * 2, image->bits);
+ int a = getcomp(src, x * 2 + 1, image->bits);
+ *dst++ = tiff->colormap[c + 0] >> 8;
+ *dst++ = tiff->colormap[c + maxval] >> 8;
+ *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+ *dst++ = a << (8 - image->bits);
+ }
+ else
+ {
+ int c = getcomp(src, x, image->bits);
+ *dst++ = tiff->colormap[c + 0] >> 8;
+ *dst++ = tiff->colormap[c + maxval] >> 8;
+ *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+ }
+ }
+ }
+
+ gs_free_object(mem, image->samples, "samples");
+
+ image->bits = 8;
+ image->stride = stride;
+ image->samples = samples;
+
+ return gs_okay;
+}
+
+static int
+xps_decode_tiff_strips(gs_memory_t *mem, xps_tiff_t *tiff, xps_image_t *image)
+{
+ int error;
+
+ /* switch on compression to create a filter */
+ /* feed each strip to the filter */
+ /* read out the data and pack the samples into an xps_image */
+
+ /* type 32773 / packbits -- nothing special (same row-padding as PDF) */
+ /* type 2 / ccitt rle -- no EOL, no RTC, rows are byte-aligned */
+ /* type 3 and 4 / g3 and g4 -- each strip starts new section */
+ /* type 5 / lzw -- each strip is handled separately */
+
+ byte *wp;
+ unsigned row;
+ unsigned strip;
+ unsigned i;
+
+ if (!tiff->rowsperstrip || !tiff->stripoffsets || !tiff->rowsperstrip)
+ return gs_throw(-1, "no image data in tiff; maybe it is tiled");
+
+ if (tiff->planar != 1)
+ return gs_throw(-1, "image data is not in chunky format");
+
+ image->width = tiff->imagewidth;
+ image->height = tiff->imagelength;
+ image->comps = tiff->samplesperpixel;
+ image->bits = tiff->bitspersample;
+ image->stride = (image->width * image->comps * image->bits + 7) / 8;
+
+ switch (tiff->photometric)
+ {
+ case 0: /* WhiteIsZero -- inverted */
+ image->colorspace = XPS_GRAY;
+ break;
+ case 1: /* BlackIsZero */
+ image->colorspace = XPS_GRAY;
+ break;
+ case 2: /* RGB */
+ image->colorspace = XPS_RGB;
+ break;
+ case 3: /* RGBPal */
+ image->colorspace = XPS_RGB;
+ break;
+ case 5: /* CMYK */
+ image->colorspace = XPS_CMYK;
+ break;
+ case 6: /* YCbCr */
+ /* it's probably a jpeg ... we let jpeg convert to rgb */
+ image->colorspace = XPS_RGB;
+ break;
+ default:
+ return gs_throw1(-1, "unknown photometric: %d", tiff->photometric);
+ }
+
+ switch (tiff->resolutionunit)
+ {
+ case 2:
+ image->xres = tiff->xresolution;
+ image->yres = tiff->yresolution;
+ break;
+ case 3:
+ image->xres = tiff->xresolution * 2.54 + 0.5;
+ image->yres = tiff->yresolution * 2.54 + 0.5;
+ break;
+ default:
+ image->xres = 96;
+ image->yres = 96;
+ break;
+ }
+
+ image->samples = gs_alloc_bytes(mem, image->stride * image->height, "samples");
+ if (!image->samples)
+ return gs_throw(-1, "could not allocate image samples");
+
+ memset(image->samples, 0x55, image->stride * image->height);
+
+ wp = image->samples;
+
+ strip = 0;
+ for (row = 0; row < tiff->imagelength; row += tiff->rowsperstrip)
+ {
+ unsigned offset = tiff->stripoffsets[strip];
+ unsigned rlen = tiff->stripbytecounts[strip];
+ unsigned wlen = image->stride * tiff->rowsperstrip;
+ byte *rp = tiff->bp + offset;
+
+ if (wp + wlen > image->samples + image->stride * image->height)
+ wlen = image->samples + image->stride * image->height - wp;
+
+ if (rp + rlen > tiff->ep)
+ return gs_throw(-1, "strip extends beyond the end of the file");
+
+ /* the bits are in un-natural order */
+ if (tiff->fillorder == 2)
+ for (i = 0; i < rlen; i++)
+ rp[i] = bitrev[rp[i]];
+
+ switch (tiff->compression)
+ {
+ case 1:
+ error = xps_decode_tiff_uncompressed(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 2:
+ error = xps_decode_tiff_fax(mem, tiff, 2, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 3:
+ error = xps_decode_tiff_fax(mem, tiff, 3, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 4:
+ error = xps_decode_tiff_fax(mem, tiff, 4, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 5:
+ error = xps_decode_tiff_lzw(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 6:
+ error = gs_throw(-1, "deprecated JPEG in TIFF compression not supported");
+ break;
+ case 7:
+ error = xps_decode_tiff_jpeg(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 8:
+ error = xps_decode_tiff_flate(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ case 32773:
+ error = xps_decode_tiff_packbits(mem, tiff, rp, rp + rlen, wp, wp + wlen);
+ break;
+ default:
+ error = gs_throw1(-1, "unknown TIFF compression: %d", tiff->compression);
+ }
+
+ if (error)
+ return gs_rethrow1(error, "could not decode strip %d", row / tiff->rowsperstrip);
+
+ /* scramble the bits back into original order */
+ if (tiff->fillorder == 2)
+ for (i = 0; i < rlen; i++)
+ rp[i] = bitrev[rp[i]];
+
+ wp += image->stride * tiff->rowsperstrip;
+ strip ++;
+ }
+
+ /* Predictor (only for LZW and Flate) */
+ if ((tiff->compression == 5 || tiff->compression == 8) && tiff->predictor == 2)
+ {
+ byte *p = image->samples;
+ for (i = 0; i < image->height; i++)
+ {
+ xps_unpredict_tiff(p, image->width, tiff->samplesperpixel, image->bits);
+ p += image->stride;
+ }
+ }
+
+ /* RGBPal */
+ if (tiff->photometric == 3 && tiff->colormap)
+ {
+ error = xps_expand_colormap(mem, tiff, image);
+ if (error)
+ return gs_rethrow(error, "could not expand colormap");
+ }
+
+ /* WhiteIsZero .. invert */
+ if (tiff->photometric == 0)
+ {
+ byte *p = image->samples;
+ for (i = 0; i < image->height; i++)
+ {
+ xps_invert_tiff(p, image->width, image->comps, image->bits);
+ p += image->stride;
+ }
+ }
+
+ /* Premultiplied transparency */
+ if (tiff->extrasamples == 1)
+ {
+ image->colorspace ++;
+ }
+
+ /* Non-pre-multiplied transparency */
+ if (tiff->extrasamples == 2)
+ {
+ image->colorspace ++;
+ }
+
+ return gs_okay;
+}
+
+static void
+xps_read_tiff_tag_value(unsigned *p, xps_tiff_t *tiff, unsigned type, unsigned ofs, unsigned n)
+{
+ tiff->rp = tiff->bp + ofs;
+ if (tiff->rp > tiff->ep)
+ tiff->rp = tiff->bp;
+
+ while (n--)
+ {
+ switch (type)
+ {
+ case TRATIONAL:
+ *p = readlong(tiff);
+ *p = *p / readlong(tiff);
+ p ++;
+ break;
+ case TBYTE: *p++ = readbyte(tiff); break;
+ case TSHORT: *p++ = readshort(tiff); break;
+ case TLONG: *p++ = readlong(tiff); break;
+ default: *p++ = 0; break;
+ }
+ }
+}
+
+static int
+xps_read_tiff_tag(gs_memory_t *mem, xps_tiff_t *tiff, unsigned offset)
+{
+ unsigned tag;
+ unsigned type;
+ unsigned count;
+ unsigned value;
+
+ tiff->rp = tiff->bp + offset;
+
+ tag = readshort(tiff);
+ type = readshort(tiff);
+ count = readlong(tiff);
+
+ if ((type == TBYTE && count <= 4) ||
+ (type == TSHORT && count <= 2) ||
+ (type == TLONG && count <= 1))
+ value = tiff->rp - tiff->bp;
+ else
+ value = readlong(tiff);
+
+ switch (tag)
+ {
+ case NewSubfileType:
+ xps_read_tiff_tag_value(&tiff->subfiletype, tiff, type, value, 1);
+ break;
+ case ImageWidth:
+ xps_read_tiff_tag_value(&tiff->imagewidth, tiff, type, value, 1);
+ break;
+ case ImageLength:
+ xps_read_tiff_tag_value(&tiff->imagelength, tiff, type, value, 1);
+ break;
+ case BitsPerSample:
+ xps_read_tiff_tag_value(&tiff->bitspersample, tiff, type, value, 1);
+ break;
+ case Compression:
+ xps_read_tiff_tag_value(&tiff->compression, tiff, type, value, 1);
+ break;
+ case PhotometricInterpretation:
+ xps_read_tiff_tag_value(&tiff->photometric, tiff, type, value, 1);
+ break;
+ case FillOrder:
+ xps_read_tiff_tag_value(&tiff->fillorder, tiff, type, value, 1);
+ break;
+ case SamplesPerPixel:
+ xps_read_tiff_tag_value(&tiff->samplesperpixel, tiff, type, value, 1);
+ break;
+ case RowsPerStrip:
+ xps_read_tiff_tag_value(&tiff->rowsperstrip, tiff, type, value, 1);
+ break;
+ case XResolution:
+ xps_read_tiff_tag_value(&tiff->xresolution, tiff, type, value, 1);
+ break;
+ case YResolution:
+ xps_read_tiff_tag_value(&tiff->yresolution, tiff, type, value, 1);
+ break;
+ case PlanarConfiguration:
+ xps_read_tiff_tag_value(&tiff->planar, tiff, type, value, 1);
+ break;
+ case T4Options:
+ xps_read_tiff_tag_value(&tiff->g3opts, tiff, type, value, 1);
+ break;
+ case T6Options:
+ xps_read_tiff_tag_value(&tiff->g4opts, tiff, type, value, 1);
+ break;
+ case Predictor:
+ xps_read_tiff_tag_value(&tiff->predictor, tiff, type, value, 1);
+ break;
+ case ResolutionUnit:
+ xps_read_tiff_tag_value(&tiff->resolutionunit, tiff, type, value, 1);
+ break;
+ case YCbCrSubSampling:
+ xps_read_tiff_tag_value(tiff->ycbcrsubsamp, tiff, type, value, 2);
+ break;
+ case ExtraSamples:
+ xps_read_tiff_tag_value(&tiff->extrasamples, tiff, type, value, 1);
+ break;
+
+ case JPEGTables:
+ tiff->jpegtables = tiff->bp + value;
+ tiff->jpegtableslen = count;
+ break;
+
+ case StripOffsets:
+ tiff->stripoffsets = (unsigned*) gs_alloc_bytes(mem, count * sizeof(unsigned), "StripOffsets");
+ if (!tiff->stripoffsets)
+ return gs_throw(-1, "could not allocate strip offsets");
+ xps_read_tiff_tag_value(tiff->stripoffsets, tiff, type, value, count);
+ break;
+
+ case StripByteCounts:
+ tiff->stripbytecounts = (unsigned*) gs_alloc_bytes(mem, count * sizeof(unsigned), "StripByteCounts");
+ if (!tiff->stripbytecounts)
+ return gs_throw(-1, "could not allocate strip byte counts");
+ xps_read_tiff_tag_value(tiff->stripbytecounts, tiff, type, value, count);
+ break;
+
+ case ColorMap:
+ tiff->colormap = (unsigned*) gs_alloc_bytes(mem, count * sizeof(unsigned), "ColorMap");
+ if (!tiff->colormap)
+ return gs_throw(-1, "could not allocate color map");
+ xps_read_tiff_tag_value(tiff->colormap, tiff, type, value, count);
+ break;
+
+ case TileWidth:
+ case TileLength:
+ case TileOffsets:
+ case TileByteCounts:
+ return gs_throw(-1, "tiled tiffs not supported");
+
+ default:
+ /*
+ printf("unknown tag: %d t=%d n=%d\n", tag, type, count);
+ */
+ break;
+ }
+
+ return gs_okay;
+}
+
+static void
+xps_swap_byte_order(byte *buf, int n)
+{
+ int i, t;
+ for (i = 0; i < n; i++)
+ {
+ t = buf[i * 2 + 0];
+ buf[i * 2 + 0] = buf[i * 2 + 1];
+ buf[i * 2 + 1] = t;
+ }
+}
+
+int
+xps_decode_tiff(gs_memory_t *mem, byte *buf, int len, xps_image_t *image)
+{
+ int error;
+ xps_tiff_t tiffst;
+ xps_tiff_t *tiff = &tiffst;
+
+ unsigned version;
+ unsigned offset;
+ unsigned count;
+ unsigned i;
+
+ memset(tiff, 0, sizeof(xps_tiff_t));
+
+ tiff->bp = buf;
+ tiff->rp = buf;
+ tiff->ep = buf + len;
+
+ /* tag defaults, where applicable */
+ tiff->bitspersample = 1;
+ tiff->compression = 1;
+ tiff->samplesperpixel = 1;
+ tiff->resolutionunit = 2;
+ tiff->rowsperstrip = 0xFFFFFFFF;
+ tiff->fillorder = 1;
+ tiff->planar = 1;
+ tiff->subfiletype = 0;
+ tiff->predictor = 1;
+ tiff->ycbcrsubsamp[0] = 2;
+ tiff->ycbcrsubsamp[1] = 2;
+
+ /*
+ * Read IFH
+ */
+
+ /* get byte order marker */
+ tiff->order = TII;
+ tiff->order = readshort(tiff);
+ if (tiff->order != TII && tiff->order != TMM)
+ return gs_throw(-1, "not a TIFF file, wrong magic marker");
+
+ /* check version */
+ version = readshort(tiff);
+ if (version != 42)
+ return gs_throw(-1, "not a TIFF file, wrong version marker");
+
+ /* get offset of IFD */
+ offset = readlong(tiff);
+
+ /*
+ * Read IFD
+ */
+
+ tiff->rp = tiff->bp + offset;
+
+ count = readshort(tiff);
+
+ offset += 2;
+ for (i = 0; i < count; i++)
+ {
+ error = xps_read_tiff_tag(mem, tiff, offset);
+ if (error)
+ return gs_rethrow(error, "could not read TIFF header tag");
+ offset += 12;
+ }
+
+ // (void) xps_debug_tiff(mem, tiff);
+
+ /*
+ * Decode the image strips
+ */
+
+ if (tiff->rowsperstrip > tiff->imagelength)
+ tiff->rowsperstrip = tiff->imagelength;
+
+ error = xps_decode_tiff_strips(mem, tiff, image);
+ if (error)
+ return gs_rethrow(error, "could not decode image data");
+
+ /*
+ * Clean up scratch memory
+ */
+
+ if (tiff->colormap) gs_free_object(mem, tiff->colormap, "ColorMap");
+ if (tiff->stripoffsets) gs_free_object(mem, tiff->stripoffsets, "StripOffsets");
+ if (tiff->stripbytecounts) gs_free_object(mem, tiff->stripbytecounts, "StripByteCounts");
+
+ /*
+ * Byte swap 16-bit images to native if necessary.
+ */
+ if (image->bits == 16)
+ {
+ int native_order;
+ unsigned int a = 0x1234;
+ if (*(unsigned char *)&a == 1)
+ native_order = TMM;
+ else
+ native_order = TII;
+
+ if (tiff->order != native_order)
+ {
+ xps_swap_byte_order(image->samples, image->width * image->height * image->comps);
+ }
+ }
+
+ return gs_okay;
+}
+
+void
+xps_debug_tiff(gs_memory_t *mem, xps_tiff_t *tiff)
+{
+ int i, n;
+
+ dputs("TIFF <<\n");
+ dprintf1("\t/NewSubfileType %u\n", tiff->subfiletype);
+ dprintf1("\t/PhotometricInterpretation %u\n", tiff->photometric);
+ dprintf1("\t/Compression %u\n", tiff->compression);
+ dprintf1("\t/ImageWidth %u\n", tiff->imagewidth);
+ dprintf1("\t/ImageLength %u\n", tiff->imagelength);
+ dprintf1("\t/BitsPerSample %u\n", tiff->bitspersample);
+ dprintf1("\t/SamplesPerPixel %u\n", tiff->samplesperpixel);
+ dprintf1("\t/PlanarConfiguration %u\n", tiff->planar);
+ dprintf1("\t/ExtraSamples %u\n", tiff->extrasamples);
+ dprintf1("\t/ColorMap $%p\n", tiff->colormap);
+ dprintf1("\t/XResolution %u\n", tiff->xresolution);
+ dprintf1("\t/YResolution %u\n", tiff->yresolution);
+ dprintf1("\t/ResolutionUnit %u\n", tiff->resolutionunit);
+ dprintf1("\t/FillOrder %u\n", tiff->fillorder);
+ dprintf1("\t/T4Options %u\n", tiff->g3opts);
+ dprintf1("\t/T6Options %u\n", tiff->g4opts);
+ dprintf1("\t/Predictor %u\n", tiff->predictor);
+ dprintf1("\t/JPEGTables %u\n", tiff->jpegtableslen);
+ dprintf2("\t/YCbCrSubSampling %u %u\n", tiff->ycbcrsubsamp[0], tiff->ycbcrsubsamp[1]);
+
+ n = (tiff->imagelength + tiff->rowsperstrip - 1) / tiff->rowsperstrip;
+
+ dprintf1("\t/RowsPerStrip %u\n", tiff->rowsperstrip);
+
+ if (tiff->stripoffsets)
+ {
+ dputs("\t/StripOffsets ");
+ for (i = 0; i < n; i++)
+ dprintf1("%u ", tiff->stripoffsets[i]);
+ dputs("\n");
+ }
+
+ if (tiff->stripbytecounts)
+ {
+ dputs("\t/StripByteCounts ");
+ for (i = 0; i < n; i++)
+ dprintf1("%u ", tiff->stripbytecounts[i]);
+ dputs("\n");
+ }
+
+ dputs(">>\n");
+}
+
diff --git a/xps/xpstile.c b/xps/xpstile.c
new file mode 100644
index 000000000..5a02a5db8
--- /dev/null
+++ b/xps/xpstile.c
@@ -0,0 +1,267 @@
+#include "ghostxps.h"
+
+/*
+ * Parse a tiling brush (visual and image brushes at this time) common
+ * properties. Use the callback to draw the individual tiles.
+ */
+
+enum { TILE_NONE, TILE_TILE, TILE_FLIP_X, TILE_FLIP_Y, TILE_FLIP_X_Y };
+
+struct tile_closure_s
+{
+ xps_context_t *ctx;
+ xps_resource_t *dict;
+ xps_item_t *tag;
+ gs_rect viewbox;
+ int tile_mode;
+ void *user;
+ int (*func)(xps_context_t*, xps_resource_t*, xps_item_t*, void*);
+};
+
+static int
+xps_paint_tiling_brush_clipped(struct tile_closure_s *c)
+{
+ xps_context_t *ctx = c->ctx;
+ gs_rect saved_bounds;
+ int code;
+
+ gs_moveto(ctx->pgs, c->viewbox.p.x, c->viewbox.p.y);
+ gs_lineto(ctx->pgs, c->viewbox.p.x, c->viewbox.q.y);
+ gs_lineto(ctx->pgs, c->viewbox.q.x, c->viewbox.q.y);
+ gs_lineto(ctx->pgs, c->viewbox.q.x, c->viewbox.p.y);
+ gs_closepath(ctx->pgs);
+ gs_clip(ctx->pgs);
+ gs_newpath(ctx->pgs);
+
+ /* tile paint functions use a different device
+ * with a different coord space, so we have to
+ * tweak the bounds.
+ */
+
+ saved_bounds = ctx->bounds;
+
+ // dprintf4("tiled bounds [%g %g %g %g]\n", saved_bounds.p.x, saved_bounds.p.y, saved_bounds.q.x, saved_bounds.q.y);
+
+ ctx->bounds = c->viewbox; // transform?
+
+ code = c->func(c->ctx, c->dict, c->tag, c->user);
+
+ ctx->bounds = saved_bounds;
+
+ return code;
+}
+
+static int
+xps_paint_tiling_brush(const gs_client_color *pcc, gs_state *pgs)
+{
+ const gs_client_pattern *ppat = gs_getpattern(pcc);
+ struct tile_closure_s *c = ppat->client_data;
+ xps_context_t *ctx = c->ctx;
+ gs_state *saved_pgs;
+
+ saved_pgs = ctx->pgs;
+ ctx->pgs = pgs;
+
+ gs_gsave(ctx->pgs);
+ xps_paint_tiling_brush_clipped(c);
+ gs_grestore(ctx->pgs);
+
+ if (c->tile_mode == TILE_FLIP_X || c->tile_mode == TILE_FLIP_X_Y)
+ {
+ gs_gsave(ctx->pgs);
+ gs_translate(ctx->pgs, c->viewbox.q.x * 2, 0.0);
+ gs_scale(ctx->pgs, -1.0, 1.0);
+ xps_paint_tiling_brush_clipped(c);
+ gs_grestore(ctx->pgs);
+ }
+
+ if (c->tile_mode == TILE_FLIP_Y || c->tile_mode == TILE_FLIP_X_Y)
+ {
+ gs_gsave(ctx->pgs);
+ gs_translate(ctx->pgs, 0.0, c->viewbox.q.y * 2);
+ gs_scale(ctx->pgs, 1.0, -1.0);
+ xps_paint_tiling_brush_clipped(c);
+ gs_grestore(ctx->pgs);
+ }
+
+ if (c->tile_mode == TILE_FLIP_X_Y)
+ {
+ gs_gsave(ctx->pgs);
+ gs_translate(ctx->pgs, c->viewbox.q.x * 2, c->viewbox.q.y * 2);
+ gs_scale(ctx->pgs, -1.0, -1.0);
+ xps_paint_tiling_brush_clipped(c);
+ gs_grestore(ctx->pgs);
+ }
+
+ ctx->pgs = saved_pgs;
+
+ return 0;
+}
+
+int
+xps_parse_tiling_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root,
+ int (*func)(xps_context_t*, xps_resource_t*, xps_item_t*, void*), void *user)
+{
+ xps_item_t *node;
+
+ char *opacity_att;
+ char *transform_att;
+ char *viewbox_att;
+ char *viewport_att;
+ char *tile_mode_att;
+ char *viewbox_units_att;
+ char *viewport_units_att;
+
+ xps_item_t *transform_tag = NULL;
+
+ gs_matrix transform;
+ gs_rect viewbox;
+ gs_rect viewport;
+ float scalex, scaley;
+ int tile_mode;
+
+ opacity_att = xps_att(root, "Opacity");
+ transform_att = xps_att(root, "Transform");
+ viewbox_att = xps_att(root, "Viewbox");
+ viewport_att = xps_att(root, "Viewport");
+ tile_mode_att = xps_att(root, "TileMode");
+ viewbox_units_att = xps_att(root, "ViewboxUnits");
+ viewport_units_att = xps_att(root, "ViewportUnits");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "ImageBrush.Transform"))
+ transform_tag = xps_down(node);
+ if (!strcmp(xps_tag(node), "VisualBrush.Transform"))
+ transform_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &transform_att, &transform_tag);
+
+ gs_make_identity(&transform);
+ if (transform_att)
+ xps_parse_render_transform(ctx, transform_att, &transform);
+ if (transform_tag)
+ xps_parse_matrix_transform(ctx, transform_tag, &transform);
+
+ viewbox.p.x = 0.0; viewbox.p.y = 0.0;
+ viewbox.q.x = 1.0; viewbox.q.y = 1.0;
+ if (viewbox_att)
+ xps_parse_rectangle(ctx, viewbox_att, &viewbox);
+
+ viewport.p.x = 0.0; viewport.p.y = 0.0;
+ viewport.q.x = 1.0; viewport.q.y = 1.0;
+ if (viewport_att)
+ xps_parse_rectangle(ctx, viewport_att, &viewport);
+
+ scalex = (viewport.q.x - viewport.p.x) / (viewbox.q.x - viewbox.p.x);
+ scaley = (viewport.q.y - viewport.p.y) / (viewbox.q.y - viewbox.p.y);
+
+ tile_mode = TILE_NONE;
+ if (tile_mode_att)
+ {
+ if (!strcmp(tile_mode_att, "None"))
+ tile_mode = TILE_NONE;
+ if (!strcmp(tile_mode_att, "Tile"))
+ tile_mode = TILE_TILE;
+ if (!strcmp(tile_mode_att, "FlipX"))
+ tile_mode = TILE_FLIP_X;
+ if (!strcmp(tile_mode_att, "FlipY"))
+ tile_mode = TILE_FLIP_Y;
+ if (!strcmp(tile_mode_att, "FlipXY"))
+ tile_mode = TILE_FLIP_X_Y;
+ }
+
+ gs_gsave(ctx->pgs);
+
+ xps_begin_opacity(ctx, dict, opacity_att, NULL);
+
+ if (tile_mode != TILE_NONE)
+ {
+ struct tile_closure_s closure;
+
+ gs_client_pattern gspat;
+ gs_client_color gscolor;
+ gs_color_space *cs;
+
+ closure.ctx = ctx;
+ closure.dict = dict;
+ closure.tag = root;
+ closure.tile_mode = tile_mode;
+ closure.user = user;
+ closure.func = func;
+
+ closure.viewbox.p.x = viewbox.p.x;
+ closure.viewbox.p.y = viewbox.p.y;
+ closure.viewbox.q.x = viewbox.q.x;
+ closure.viewbox.q.y = viewbox.q.y;
+
+ gs_pattern1_init(&gspat);
+ uid_set_UniqueID(&gspat.uid, gs_next_ids(ctx->memory, 1));
+ gspat.PaintType = 1;
+ gspat.TilingType = 1;
+ gspat.PaintProc = xps_paint_tiling_brush;
+ gspat.client_data = &closure;
+
+ gspat.XStep = viewbox.q.x - viewbox.p.x;
+ gspat.YStep = viewbox.q.y - viewbox.p.y;
+ gspat.BBox.p.x = viewbox.p.x;
+ gspat.BBox.p.y = viewbox.p.y;
+ gspat.BBox.q.x = viewbox.q.x;
+ gspat.BBox.q.y = viewbox.q.y;
+
+ if (tile_mode == TILE_FLIP_X || tile_mode == TILE_FLIP_X_Y)
+ {
+ gspat.BBox.q.x += gspat.XStep;
+ gspat.XStep *= 2;
+ }
+
+ if (tile_mode == TILE_FLIP_Y || tile_mode == TILE_FLIP_X_Y)
+ {
+ gspat.BBox.q.y += gspat.YStep;
+ gspat.YStep *= 2;
+ }
+
+ gs_translate(ctx->pgs, viewport.p.x, viewport.p.y);
+ gs_scale(ctx->pgs, scalex, scaley);
+ gs_translate(ctx->pgs, -viewbox.p.x, -viewbox.p.y);
+
+ cs = ctx->srgb;
+ gs_setcolorspace(ctx->pgs, cs);
+ gs_makepattern(&gscolor, &gspat, &transform, ctx->pgs, NULL);
+ gs_setpattern(ctx->pgs, &gscolor);
+
+ xps_fill(ctx);
+ }
+ else
+ {
+ gs_rect saved_bounds;
+
+ xps_clip(ctx, &saved_bounds);
+
+ gs_concat(ctx->pgs, &transform);
+
+ gs_translate(ctx->pgs, viewport.p.x, viewport.p.y);
+ gs_scale(ctx->pgs, scalex, scaley);
+ gs_translate(ctx->pgs, -viewbox.p.x, viewbox.p.y);
+
+ gs_moveto(ctx->pgs, viewbox.p.x, viewbox.p.y);
+ gs_lineto(ctx->pgs, viewbox.p.x, viewbox.q.y);
+ gs_lineto(ctx->pgs, viewbox.q.x, viewbox.q.y);
+ gs_lineto(ctx->pgs, viewbox.q.x, viewbox.p.y);
+ gs_closepath(ctx->pgs);
+ gs_clip(ctx->pgs);
+ gs_newpath(ctx->pgs);
+
+ func(ctx, dict, root, user);
+
+ xps_unclip(ctx, &saved_bounds);
+ }
+
+ xps_end_opacity(ctx, dict, opacity_att, NULL);
+
+ gs_grestore(ctx->pgs);
+
+ return 0;
+}
+
diff --git a/xps/xpstop.c b/xps/xpstop.c
new file mode 100644
index 000000000..715834e17
--- /dev/null
+++ b/xps/xpstop.c
@@ -0,0 +1,534 @@
+/* Portions Copyright (C) 2001 artofcode LLC.
+ Portions Copyright (C) 1996, 2001 Artifex Software Inc.
+ Portions Copyright (C) 1988, 2000 Aladdin Enterprises.
+ This software is based in part on the work of the Independent JPEG Group.
+ All Rights Reserved.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/ or
+ contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+ San Rafael, CA 94903, (415)492-9861, for further information. */
+
+/*$Id$*/
+
+/* Top-level API implementation of XML Paper Specification */
+
+/* Language wrapper implementation (see pltop.h) */
+
+#include "ghostxps.h"
+
+#include "pltop.h"
+
+#include "gxdevice.h" /* so we can include gxht.h below */
+#include "gxht.h" /* gsht1.h is incomplete, we need storage size of gs_halftone */
+#include "gsht1.h"
+
+static int xps_install_halftone(xps_context_t *ctx, gx_device *pdevice);
+
+#define XPS_PARSER_MIN_INPUT_SIZE 8192
+
+/*
+ * The XPS interpeter is identical to pl_interp_t.
+ * The XPS interpreter instance is derived from pl_interp_instance_t.
+ */
+
+typedef struct xps_interp_instance_s xps_interp_instance_t;
+
+struct xps_interp_instance_s
+{
+ pl_interp_instance_t pl; /* common part: must be first */
+
+ pl_page_action_t pre_page_action; /* action before page out */
+ void *pre_page_closure; /* closure to call pre_page_action with */
+ pl_page_action_t post_page_action; /* action before page out */
+ void *post_page_closure; /* closure to call post_page_action with */
+
+ xps_context_t *ctx;
+};
+
+/* version and build date are not currently used */
+#define XPS_VERSION NULL
+#define XPS_BUILD_DATE NULL
+
+const pl_interp_characteristics_t *
+xps_imp_characteristics(const pl_interp_implementation_t *pimpl)
+{
+ static pl_interp_characteristics_t xps_characteristics =
+ {
+ "XPS",
+ "PK", /* string to recognize XPS files */
+ "Artifex",
+ XPS_VERSION,
+ XPS_BUILD_DATE,
+ XPS_PARSER_MIN_INPUT_SIZE, /* Minimum input size */
+ };
+ return &xps_characteristics;
+}
+
+static int
+xps_imp_allocate_interp(pl_interp_t **ppinterp,
+ const pl_interp_implementation_t *pimpl,
+ gs_memory_t *pmem)
+{
+ static pl_interp_t interp; /* there's only one interpreter */
+ *ppinterp = &interp;
+ return 0;
+}
+
+/* Do per-instance interpreter allocation/init. No device is set yet */
+static int
+xps_imp_allocate_interp_instance(pl_interp_instance_t **ppinstance,
+ pl_interp_t *pinterp,
+ gs_memory_t *pmem)
+{
+ xps_interp_instance_t *instance;
+ xps_context_t *ctx;
+ gs_state *pgs;
+
+ dputs("-- xps_imp_allocate_interp_instance --\n");
+
+ instance = (xps_interp_instance_t *) gs_alloc_bytes(pmem,
+ sizeof(xps_interp_instance_t), "xps_imp_allocate_interp_instance");
+
+ ctx = (xps_context_t *) gs_alloc_bytes(pmem,
+ sizeof(xps_context_t), "xps_imp_allocate_interp_instance");
+
+ pgs = gs_state_alloc(pmem);
+
+ memset(ctx, 0, sizeof(xps_context_t));
+
+ if (!instance || !ctx || !pgs)
+ {
+ if (instance)
+ gs_free_object(pmem, instance, "xps_imp_allocate_interp_instance");
+ if (ctx)
+ gs_free_object(pmem, ctx, "xps_imp_allocate_interp_instance");
+ if (pgs)
+ gs_state_free(pgs);
+ return gs_error_VMerror;
+ }
+
+ ctx->instance = instance;
+ ctx->memory = pmem;
+ ctx->pgs = pgs;
+ ctx->fontdir = NULL;
+
+ /* TODO: load some builtin ICC profiles here */
+ ctx->gray = gs_cspace_new_DeviceGray(ctx->memory); /* profile for gray images */
+ ctx->cmyk = gs_cspace_new_DeviceCMYK(ctx->memory); /* profile for cmyk images */
+ ctx->srgb = gs_cspace_new_DeviceRGB(ctx->memory);
+ ctx->scrgb = gs_cspace_new_DeviceRGB(ctx->memory);
+
+ instance->pre_page_action = 0;
+ instance->pre_page_closure = 0;
+ instance->post_page_action = 0;
+ instance->post_page_closure = 0;
+
+ instance->ctx = ctx;
+
+ xps_init_font_cache(ctx);
+
+ *ppinstance = (pl_interp_instance_t *)instance;
+
+ return 0;
+}
+
+/* Set a client language into an interperter instance */
+static int
+xps_imp_set_client_instance(pl_interp_instance_t *pinstance,
+ pl_interp_instance_t *pclient,
+ pl_interp_instance_clients_t which_client)
+{
+ /* ignore */
+ return 0;
+}
+
+static int
+xps_imp_set_pre_page_action(pl_interp_instance_t *pinstance,
+ pl_page_action_t action, void *closure)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ instance->pre_page_action = action;
+ instance->pre_page_closure = closure;
+ return 0;
+}
+
+static int
+xps_imp_set_post_page_action(pl_interp_instance_t *pinstance,
+ pl_page_action_t action, void *closure)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ instance->post_page_action = action;
+ instance->post_page_closure = closure;
+ return 0;
+}
+
+static int
+xps_imp_set_device(pl_interp_instance_t *pinstance, gx_device *pdevice)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ xps_context_t *ctx = instance->ctx;
+ int code;
+
+ dputs("-- xps_imp_set_device --\n");
+
+ gs_opendevice(pdevice);
+
+ code = gs_setdevice_no_erase(ctx->pgs, pdevice);
+ if (code < 0)
+ goto cleanup_setdevice;
+
+ gs_setaccuratecurves(ctx->pgs, true); /* NB not sure */
+
+ /* gsave and grestore (among other places) assume that */
+ /* there are at least 2 gstates on the graphics stack. */
+ /* Ensure that now. */
+ code = gs_gsave(ctx->pgs);
+ if (code < 0)
+ goto cleanup_gsave;
+
+ code = gs_erasepage(ctx->pgs);
+ if (code < 0)
+ goto cleanup_erase;
+
+ code = xps_install_halftone(ctx, pdevice);
+ if (code < 0)
+ goto cleanup_halftone;
+
+ return 0;
+
+cleanup_halftone:
+cleanup_erase:
+ /* undo gsave */
+ gs_grestore_only(ctx->pgs); /* destroys gs_save stack */
+
+cleanup_gsave:
+ /* undo setdevice */
+ gs_nulldevice(ctx->pgs);
+
+cleanup_setdevice:
+ /* nothing to undo */
+ return code;
+}
+
+static int
+xps_imp_get_device_memory(pl_interp_instance_t *pinstance, gs_memory_t **ppmem)
+{
+ /* huh? we do nothing here */
+ return 0;
+}
+
+/* Parse a cursor-full of data */
+static int
+xps_imp_process(pl_interp_instance_t *pinstance, stream_cursor_read *pcursor)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ xps_context_t *ctx = instance->ctx;
+ return xps_process_data(ctx, pcursor);
+}
+
+/* Skip to end of job.
+ * Return 1 if done, 0 ok but EOJ not found, else negative error code.
+ */
+static int
+xps_imp_flush_to_eoj(pl_interp_instance_t *pinstance, stream_cursor_read *pcursor)
+{
+ /* assume XPS cannot be pjl embedded */
+ pcursor->ptr = pcursor->limit;
+ return 0;
+}
+
+/* Parser action for end-of-file */
+static int
+xps_imp_process_eof(pl_interp_instance_t *pinstance)
+{
+ return 0;
+}
+
+/* Report any errors after running a job */
+static int
+xps_imp_report_errors(pl_interp_instance_t *pinstance,
+ int code, /* prev termination status */
+ long file_position, /* file position of error, -1 if unknown */
+ bool force_to_cout /* force errors to cout */
+ )
+{
+ return 0;
+}
+
+/* Prepare interp instance for the next "job" */
+static int
+xps_imp_init_job(pl_interp_instance_t *pinstance)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ xps_context_t *ctx = instance->ctx;
+
+ dputs("-- xps_imp_init_job --\n");
+
+ ctx->first_part = NULL;
+ ctx->last_part = NULL;
+
+ ctx->start_part = NULL;
+
+ ctx->zip_state = 0;
+
+ ctx->use_transparency = 1;
+ if (getenv("XPS_DISABLE_TRANSPARENCY"))
+ ctx->use_transparency = 0;
+
+ ctx->opacity_only = 0;
+ ctx->fill_rule = 0;
+
+ return 0;
+}
+
+/* Wrap up interp instance after a "job" */
+static int
+xps_imp_dnit_job(pl_interp_instance_t *pinstance)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ xps_context_t *ctx = instance->ctx;
+
+ dputs("-- xps_imp_dnit_job --\n");
+
+ while (ctx->next_page)
+ {
+ xps_part_t *pagepart;
+ pagepart = xps_find_part(ctx, ctx->next_page->name);
+ if (!pagepart)
+ dputs(" page part missing\n");
+ else if (!pagepart->complete)
+ dputs(" page part incomplete\n");
+ else
+ {
+ xps_relation_t *rel;
+ for (rel = pagepart->relations; rel; rel = rel->next)
+ {
+ xps_part_t *subpart = xps_find_part(ctx, rel->target);
+ if (!subpart)
+ dprintf1(" resource '%s' missing\n", rel->target);
+ else if (!subpart->complete)
+ dprintf1(" resource '%s' incomplete\n", rel->target);
+ // TODO: recursive resource check...
+ }
+ }
+
+ ctx->next_page = ctx->next_page->next;
+ }
+
+ if (getenv("XPS_DEBUG_PARTS"))
+ xps_debug_parts(ctx);
+ if (getenv("XPS_DEBUG_TYPES"))
+ {
+ xps_debug_type_map(ctx, "Default", ctx->defaults);
+ xps_debug_type_map(ctx, "Override", ctx->overrides);
+ }
+ if (getenv("XPS_DEBUG_PAGES"))
+ xps_debug_fixdocseq(ctx);
+
+ /* Free XPS parsing stuff */
+ {
+ xps_part_t *part = ctx->first_part;
+ while (part)
+ {
+ xps_part_t *next = part->next;
+ xps_free_part(ctx, part);
+ part = next;
+ }
+
+ xps_free_fixed_pages(ctx);
+ xps_free_fixed_documents(ctx);
+
+ xps_free_type_map(ctx, ctx->overrides);
+ ctx->overrides = NULL;
+ xps_free_type_map(ctx, ctx->defaults);
+ ctx->defaults = NULL;
+ }
+
+ return 0;
+}
+
+/* Remove a device from an interperter instance */
+static int
+xps_imp_remove_device(pl_interp_instance_t *pinstance)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ xps_context_t *ctx = instance->ctx;
+
+ int code = 0; /* first error status encountered */
+ int error;
+
+ dputs("-- xps_imp_remove_device --\n");
+
+ /* return to original gstate */
+ gs_grestore_only(ctx->pgs); /* destroys gs_save stack */
+
+ /* Deselect device */
+ /* NB */
+ error = gs_nulldevice(ctx->pgs);
+ if (code >= 0)
+ code = error;
+
+ return code;
+}
+
+/* Deallocate a interpreter instance */
+static int
+xps_imp_deallocate_interp_instance(pl_interp_instance_t *pinstance)
+{
+ xps_interp_instance_t *instance = (xps_interp_instance_t *)pinstance;
+ xps_context_t *ctx = instance->ctx;
+ gs_memory_t *mem = ctx->memory;
+
+ dputs("-- xps_imp_deallocate_interp_instance --\n");
+
+ /* language clients don't free the font cache machinery */
+
+ // free gstate?
+ gs_free_object(mem, ctx, "xps_imp_deallocate_interp_instance");
+ gs_free_object(mem, instance, "xps_imp_deallocate_interp_instance");
+
+ return 0;
+}
+
+/* Do static deinit of XPS interpreter */
+static int
+xps_imp_deallocate_interp(pl_interp_t *pinterp)
+{
+ /* nothing to do */
+ return 0;
+}
+
+/* Parser implementation descriptor */
+const pl_interp_implementation_t xps_implementation =
+{
+ xps_imp_characteristics,
+ xps_imp_allocate_interp,
+ xps_imp_allocate_interp_instance,
+ xps_imp_set_client_instance,
+ xps_imp_set_pre_page_action,
+ xps_imp_set_post_page_action,
+ xps_imp_set_device,
+ xps_imp_init_job,
+ xps_imp_process,
+ xps_imp_flush_to_eoj,
+ xps_imp_process_eof,
+ xps_imp_report_errors,
+ xps_imp_dnit_job,
+ xps_imp_remove_device,
+ xps_imp_deallocate_interp_instance,
+ xps_imp_deallocate_interp,
+ xps_imp_get_device_memory,
+};
+
+/*
+ * End-of-page function called by XPS parser.
+ */
+int
+xps_show_page(xps_context_t *ctx, int num_copies, int flush)
+{
+ pl_interp_instance_t *pinstance = ctx->instance;
+ xps_interp_instance_t *instance = ctx->instance;
+
+ int code = 0;
+
+ /* do pre-page action */
+ if (instance->pre_page_action)
+ {
+ code = instance->pre_page_action(pinstance, instance->pre_page_closure);
+ if (code < 0)
+ return code;
+ if (code != 0)
+ return 0; /* code > 0 means abort w/no error */
+ }
+
+ /* output the page */
+ code = gs_output_page(ctx->pgs, num_copies, flush);
+ if (code < 0)
+ return code;
+
+ /* do post-page action */
+ if (instance->post_page_action)
+ {
+ code = instance->post_page_action(pinstance, instance->post_page_closure);
+ if (code < 0)
+ return code;
+ }
+
+ return 0;
+}
+
+/*
+ * We need to install a halftone ourselves, this is not
+ * done automatically.
+ */
+
+static float
+identity_transfer(floatp tint, const gx_transfer_map *ignore_map)
+{
+ return tint;
+}
+
+/* The following is a 45 degree spot screen with the spots enumerated
+ * in a defined order. */
+static const byte order16x16[256] = {
+ 38, 11, 14, 32, 165, 105, 90, 171, 38, 12, 14, 33, 161, 101, 88, 167,
+ 30, 6, 0, 16, 61, 225, 231, 125, 30, 6, 1, 17, 63, 222, 227, 122,
+ 27, 3, 8, 19, 71, 242, 205, 110, 28, 4, 9, 20, 74, 246, 208, 106,
+ 35, 24, 22, 40, 182, 46, 56, 144, 36, 25, 22, 41, 186, 48, 58, 148,
+ 152, 91, 81, 174, 39, 12, 15, 34, 156, 95, 84, 178, 40, 13, 16, 34,
+ 69, 212, 235, 129, 31, 7, 2, 18, 66, 216, 239, 133, 32, 8, 2, 18,
+ 79, 254, 203, 114, 28, 4, 10, 20, 76, 250, 199, 118, 29, 5, 10, 21,
+ 193, 44, 54, 142, 36, 26, 23, 42, 189, 43, 52, 139, 37, 26, 24, 42,
+ 39, 12, 15, 33, 159, 99, 87, 169, 38, 11, 14, 33, 163, 103, 89, 172,
+ 31, 7, 1, 17, 65, 220, 229, 123, 30, 6, 1, 17, 62, 223, 233, 127,
+ 28, 4, 9, 20, 75, 248, 210, 108, 27, 3, 9, 19, 72, 244, 206, 112,
+ 36, 25, 23, 41, 188, 49, 60, 150, 35, 25, 22, 41, 184, 47, 57, 146,
+ 157, 97, 85, 180, 40, 13, 16, 35, 154, 93, 83, 176, 39, 13, 15, 34,
+ 67, 218, 240, 135, 32, 8, 3, 19, 70, 214, 237, 131, 31, 7, 2, 18,
+ 78, 252, 197, 120, 29, 5, 11, 21, 80, 255, 201, 116, 29, 5, 10, 21,
+ 191, 43, 51, 137, 37, 27, 24, 43, 195, 44, 53, 140, 37, 26, 23, 42
+};
+
+#define source_phase_x 4
+#define source_phase_y 0
+
+static int
+xps_install_halftone(xps_context_t *ctx, gx_device *pdevice)
+{
+ gs_halftone ht;
+ gs_string thresh;
+ int code;
+
+ int width = 16;
+ int height = 16;
+ thresh.data = order16x16;
+ thresh.size = width * height;
+
+ if (gx_device_must_halftone(pdevice))
+ {
+ ht.type = ht_type_threshold;
+ ht.params.threshold.width = width;
+ ht.params.threshold.height = height;
+ ht.params.threshold.thresholds.data = thresh.data;
+ ht.params.threshold.thresholds.size = thresh.size;
+ ht.params.threshold.transfer = 0;
+ ht.params.threshold.transfer_closure.proc = 0;
+
+ gs_settransfer(ctx->pgs, identity_transfer);
+
+ code = gs_sethalftone(ctx->pgs, &ht);
+ if (code < 0)
+ return gs_throw(code, "could not install halftone");
+
+ code = gs_sethalftonephase(ctx->pgs, 0, 0);
+ if (code < 0)
+ return gs_throw(code, "could not set halftone phase");
+ }
+
+ return 0;
+}
+
+
+
diff --git a/xps/xpsttf.c b/xps/xpsttf.c
new file mode 100644
index 000000000..275dccd07
--- /dev/null
+++ b/xps/xpsttf.c
@@ -0,0 +1,384 @@
+#include "ghostxps.h"
+
+#include <gxfont.h>
+
+/*
+ * Some extra TTF parsing magic that isn't covered by the graphics library.
+ */
+
+static inline int u16(byte *p)
+{
+ return (p[0] << 8) | p[1];
+}
+
+static inline int u32(byte *p)
+{
+ return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+}
+
+static const char *pl_mac_names[258] = {
+ ".notdef", ".null", "nonmarkingreturn", "space", "exclam", "quotedbl",
+ "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft",
+ "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash",
+ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
+ "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at",
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
+ "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "asciicircum", "underscore", "grave", "a",
+ "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p",
+ "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar",
+ "braceright", "asciitilde", "Adieresis", "Aring", "Ccedilla", "Eacute",
+ "Ntilde", "Odieresis", "Udieresis", "aacute", "agrave", "acircumflex",
+ "adieresis", "atilde", "aring", "ccedilla", "eacute", "egrave",
+ "ecircumflex", "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+ "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", "otilde",
+ "uacute", "ugrave", "ucircumflex", "udieresis", "dagger", "degree", "cent",
+ "sterling", "section", "bullet", "paragraph", "germandbls", "registered",
+ "copyright", "trademark", "acute", "dieresis", "notequal", "AE", "Oslash",
+ "infinity", "plusminus", "lessequal", "greaterequal", "yen", "mu",
+ "partialdiff", "summation", "product", "pi", "integral", "ordfeminine",
+ "ordmasculine", "Omega", "ae", "oslash", "questiondown", "exclamdown",
+ "logicalnot", "radical", "florin", "approxequal", "Delta", "guillemotleft",
+ "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde",
+ "Otilde", "OE", "oe", "endash", "emdash", "quotedblleft", "quotedblright",
+ "quoteleft", "quoteright", "divide", "lozenge", "ydieresis", "Ydieresis",
+ "fraction", "currency", "guilsinglleft", "guilsinglright", "fi", "fl",
+ "daggerdbl", "periodcentered", "quotesinglbase", "quotedblbase",
+ "perthousand", "Acircumflex", "Ecircumflex", "Aacute", "Edieresis",
+ "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Oacute",
+ "Ocircumflex", "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+ "dotlessi", "circumflex", "tilde", "macron", "breve", "dotaccent", "ring",
+ "cedilla", "hungarumlaut", "ogonek", "caron", "Lslash", "lslash", "Scaron",
+ "scaron", "Zcaron", "zcaron", "brokenbar", "Eth", "eth", "Yacute",
+ "yacute", "Thorn", "thorn", "minus", "multiply", "onesuperior",
+ "twosuperior", "threesuperior", "onehalf", "onequarter", "threequarters",
+ "franc", "Gbreve", "gbreve", "Idotaccent", "Scedilla", "scedilla",
+ "Cacute", "cacute", "Ccaron", "ccaron", "dcroat"
+};
+
+/*
+ * A bunch of callback functions that the ghostscript
+ * font machinery will call. The most important one
+ * is the build_char function. These are specific to
+ * truetype (loca/glyf) flavored opentypes.
+ */
+
+static unsigned int
+xps_true_get_glyph_index(gs_font_type42 *pfont42, gs_glyph glyph)
+{
+ /* identity */
+ return glyph;
+}
+
+static int
+xps_true_callback_string_proc(gs_font_type42 *p42, ulong offset, uint length, const byte **pdata)
+{
+ xps_font_t *font = p42->client_data;
+ if (offset < 0 || offset + length > font->length)
+ {
+ *pdata = NULL;
+ return gs_throw2(-1, "font data access out of bounds (offset=%d size=%d)", offset, length);
+ }
+ *pdata = font->data + offset;
+ return 0;
+}
+
+static gs_char xps_last_char = GS_NO_CHAR; /* same hack as in PCL */
+
+static gs_glyph
+xps_true_callback_encode_char(gs_font *pfont, gs_char chr, gs_glyph_space_t spc)
+{
+ xps_font_t *font = pfont->client_data;
+ int value;
+ xps_last_char = chr; /* save the char we're encoding for the decode_glyph hack */
+ value = xps_encode_font_char(font, chr);
+ if (value == 0)
+ return gs_no_glyph;
+ return value;
+}
+
+static gs_char
+xps_true_callback_decode_glyph(gs_font *pfont, gs_glyph glyph)
+{
+ /* We should do a reverse cmap lookup here to match PS/PDF. */
+ /* However, a complete rearchitecture of our text and font processing
+ * would be necessary to match XPS unicode mapping with the
+ * cluster maps. Alas, we cheat similarly to PCL. */
+ return xps_last_char;
+}
+
+static int
+xps_true_callback_glyph_name(gs_font *pfont, gs_glyph glyph, gs_const_string *pstr)
+{
+ /* This funciton is copied verbatim from plfont.c */
+
+ uint table_length;
+ ulong table_offset;
+
+ ulong format;
+ uint numGlyphs;
+ uint glyph_name_index;
+ const byte *postp; /* post table pointer */
+
+ /* guess if the font type is not truetype */
+ if ( pfont->FontType != ft_TrueType )
+ {
+ glyph -= 29;
+ if ( glyph >= 0 && glyph < 258 )
+ {
+ pstr->data = pl_mac_names[glyph];
+ pstr->size = strlen(pstr->data);
+ return 0;
+ }
+ else
+ {
+ return gs_throw1(-1, "glyph index %d out of range", glyph);
+ }
+ }
+
+ table_offset = xps_find_sfnt_table((xps_font_t*)pfont->client_data, "post", &table_length);
+
+ /* no post table */
+ if (table_offset < 0)
+ return gs_throw(-1, "no post table");
+
+ /* this shoudn't happen but... */
+ if ( table_length == 0 )
+ return gs_throw(-1, "zero-size post table");
+
+ ((gs_font_type42 *)pfont)->data.string_proc((gs_font_type42 *)pfont,
+ table_offset, table_length, &postp);
+ format = u32(postp);
+
+ /* Format 1.0 (mac encoding) is a simple table see the TT spec.
+ * We don't implement this because we don't see it in practice.
+ * Format 2.5 is deprecated.
+ * Format 3.0 means that there is no post data in the font file.
+ * We see this a lot but can't do much about it.
+ * The only format we support is 2.0.
+ */
+ if ( format != 0x20000 )
+ {
+ /* Invent a name if we don't know the table format. */
+ char buf[16];
+ sprintf(buf, "glyph%d", glyph);
+ pstr->data = buf;
+ pstr->size = strlen(pstr->data);
+ return 0;
+ }
+
+ /* skip over the post header */
+ numGlyphs = u16(postp + 32);
+ if ( glyph < 0 || glyph > numGlyphs - 1)
+ {
+ return gs_throw1(-1, "glyph index %d out of range", glyph);
+ }
+
+ /* glyph name index starts at post + 34 each entry is 2 bytes */
+ glyph_name_index = u16(postp + 34 + (glyph * 2));
+
+ /* this shouldn't happen */
+ if ( glyph_name_index < 0 && glyph_name_index > 0x7fff )
+ return gs_throw(-1, "post table format error");
+
+ /* mac easy */
+ if ( glyph_name_index < 258 )
+ {
+ // dprintf2("glyph name (mac) %d = %s\n", glyph, pl_mac_names[glyph_name_index]);
+ pstr->data = pl_mac_names[glyph_name_index];
+ pstr->size = strlen(pstr->data);
+ return 0;
+ }
+
+ /* not mac */
+ else
+ {
+ char *mydata;
+
+ /* and here's the tricky part */
+ const byte *pascal_stringp = postp + 34 + (numGlyphs * 2);
+
+ /* 0 - 257 lives in the mac table above */
+ glyph_name_index -= 258;
+
+ /* The string we want is the index'th pascal string,
+ so we "hop" to each length byte "index" times. */
+ while (glyph_name_index > 0)
+ {
+ pascal_stringp += ((int)(*pascal_stringp)+1);
+ glyph_name_index--;
+ }
+
+ /* length byte */
+ pstr->size = (int)(*pascal_stringp);
+
+ /* + 1 is for the length byte */
+ pstr->data = pascal_stringp + 1;
+
+ /* sanity check */
+ if ( pstr->data + pstr->size > postp + table_length || pstr->data - 1 < postp)
+ return gs_throw(-1, "data out of range");
+
+ /* sigh - we have to allocate a copy of the data - by the
+ time a high level device makes use of it the font data
+ may be freed. This is a necessary leak. */
+ mydata = gs_alloc_bytes(pfont->memory, pstr->size + 1, "glyph to name");
+ if ( mydata == 0 )
+ return -1;
+ memcpy(mydata, pascal_stringp + 1, pstr->size);
+ pstr->data = mydata;
+
+ mydata[pstr->size] = 0;
+ // dprintf2("glyph name (tbl) %d = %s\n", glyph, pstr->data);
+
+ return 0;
+ }
+}
+
+static int
+xps_true_callback_build_char(gs_text_enum_t *ptextenum, gs_state *pgs, gs_font *pfont,
+ gs_char chr, gs_glyph glyph)
+{
+ gs_show_enum *penum = (gs_show_enum*)ptextenum;
+ gs_font_type42 *p42 = (gs_font_type42*)pfont;
+ const gs_rect *pbbox;
+ float sbw[4], w2[6];
+ int code;
+
+ // dprintf1("build char ttf %d\n", glyph);
+
+ code = gs_type42_get_metrics(p42, glyph, sbw);
+ if (code < 0)
+ return code;
+
+ w2[0] = sbw[2];
+ w2[1] = sbw[3];
+
+ pbbox = &p42->FontBBox;
+ w2[2] = pbbox->p.x;
+ w2[3] = pbbox->p.y;
+ w2[4] = pbbox->q.x;
+ w2[5] = pbbox->q.y;
+
+ /* Expand the bbox when stroking */
+ if ( pfont->PaintType )
+ {
+ float expand = max(1.415, gs_currentmiterlimit(pgs)) * gs_currentlinewidth(pgs) / 2;
+ w2[2] -= expand, w2[3] -= expand;
+ w2[4] += expand, w2[5] += expand;
+ }
+
+ if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 )
+ return code;
+
+ if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 )
+ return code;
+
+ code = gs_type42_append(glyph, pgs,
+ gx_current_path(pgs),
+ ptextenum, (gs_font*)p42,
+ gs_show_in_charpath(penum) != cpm_show);
+ if (code < 0)
+ return code;
+
+ code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs));
+ if (code < 0)
+ return code;
+
+ return 0;
+}
+
+/*
+ * Initialize the ghostscript font machinery for a truetype
+ * (type42 in postscript terminology) font.
+ */
+
+int xps_init_truetype_font(xps_context_t *ctx, xps_font_t *font)
+{
+ font->font = (void*) gs_alloc_struct(ctx->memory, gs_font_type42, &st_gs_font_type42, "xps_font type42");
+ if (!font->font)
+ return gs_throw(-1, "out of memory");
+
+ /* no shortage of things to initialize */
+ {
+ gs_font_type42 *p42 = (gs_font_type42*) font->font;
+
+ /* Common to all fonts: */
+
+ p42->next = 0;
+ p42->prev = 0;
+ p42->memory = ctx->memory;
+
+ p42->dir = ctx->fontdir; /* NB also set by gs_definefont later */
+ p42->base = font->font; /* NB also set by gs_definefont later */
+ p42->is_resource = false;
+ gs_notify_init(&p42->notify_list, gs_memory_stable(ctx->memory));
+ p42->id = gs_next_ids(ctx->memory, 1);
+
+ p42->client_data = font; /* that's us */
+
+ /* this is overwritten in grid_fit() */
+ gs_make_identity(&p42->FontMatrix);
+ gs_make_identity(&p42->orig_FontMatrix); /* NB ... original or zeroes? */
+
+ p42->FontType = ft_TrueType;
+ p42->BitmapWidths = false;
+ p42->ExactSize = fbit_use_outlines;
+ p42->InBetweenSize = fbit_use_outlines;
+ p42->TransformedChar = fbit_use_outlines;
+ p42->WMode = 0;
+ p42->PaintType = 0;
+ p42->StrokeWidth = 0;
+ p42->is_cached = 0;
+
+ p42->procs.define_font = gs_no_define_font;
+ p42->procs.make_font = gs_no_make_font;
+ p42->procs.font_info = gs_type42_font_info;
+ p42->procs.same_font = gs_default_same_font;
+ p42->procs.encode_char = xps_true_callback_encode_char;
+ p42->procs.decode_glyph = xps_true_callback_decode_glyph;
+ p42->procs.enumerate_glyph = gs_type42_enumerate_glyph;
+ p42->procs.glyph_info = gs_type42_glyph_info;
+ p42->procs.glyph_outline = gs_type42_glyph_outline;
+ p42->procs.glyph_name = xps_true_callback_glyph_name;
+ p42->procs.init_fstack = gs_default_init_fstack;
+ p42->procs.next_char_glyph = gs_default_next_char_glyph;
+ p42->procs.build_char = xps_true_callback_build_char;
+
+ memset(p42->font_name.chars, 0, sizeof(p42->font_name.chars));
+ xps_load_sfnt_name(font, p42->font_name.chars);
+ p42->font_name.size = strlen(p42->font_name.chars);
+
+ memset(p42->key_name.chars, 0, sizeof(p42->key_name.chars));
+ strcpy(p42->key_name.chars, p42->font_name.chars);
+ p42->key_name.size = strlen(p42->key_name.chars);
+
+ /* Base font specific: */
+
+ p42->FontBBox.p.x = 0;
+ p42->FontBBox.p.y = 0;
+ p42->FontBBox.q.x = 0;
+ p42->FontBBox.q.y = 0;
+
+ uid_set_UniqueID(&p42->UID, p42->id);
+
+ p42->encoding_index = ENCODING_INDEX_UNKNOWN;
+ p42->nearest_encoding_index = ENCODING_INDEX_ISOLATIN1;
+
+ p42->FAPI = 0;
+ p42->FAPI_font_data = 0;
+
+ /* Type 42 specific: */
+
+ p42->data.string_proc = xps_true_callback_string_proc;
+ p42->data.proc_data = font;
+
+ gs_type42_font_init(p42, font->subfontid);
+ p42->data.get_glyph_index = xps_true_get_glyph_index;
+ }
+
+ gs_definefont(ctx->fontdir, font->font);
+
+ return 0;
+}
+
diff --git a/xps/xpsutf.c b/xps/xpsutf.c
new file mode 100644
index 000000000..fa972942a
--- /dev/null
+++ b/xps/xpsutf.c
@@ -0,0 +1,54 @@
+#include "ghostxps.h"
+
+/*
+ * http://tools.ietf.org/html/rfc3629
+ */
+
+int xps_utf8_to_ucs(int *p, const char *ss, int n)
+{
+ unsigned char *s = (unsigned char *)ss;
+
+ if (s == NULL)
+ goto bad;
+
+ if ((s[0] & 0x80) == 0)
+ {
+ *p = (s[0] & 0x7f);
+ return 1;
+ }
+
+ if ((s[0] & 0xe0) == 0xc0)
+ {
+ if (n < 2 || s[1] < 0x80)
+ goto bad;
+ *p = (s[0] & 0x1f) << 6;
+ *p |= (s[1] & 0x3f);
+ return 2;
+ }
+
+ if ((s[0] & 0xf0) == 0xe0)
+ {
+ if (n < 3 || s[1] < 0x80 || s[2] < 0x80)
+ goto bad;
+ *p = (s[0] & 0x0f) << 12;
+ *p |= (s[1] & 0x3f) << 6;
+ *p |= (s[2] & 0x3f);
+ return 3;
+ }
+
+ if ((s[0] & 0xf8) == 0xf0)
+ {
+ if (n < 4 || s[1] < 0x80 || s[2] < 0x80 || s[3] < 0x80)
+ goto bad;
+ *p = (s[0] & 0x07) << 18;
+ *p |= (s[1] & 0x3f) << 12;
+ *p |= (s[2] & 0x3f) << 6;
+ *p |= (s[3] & 0x3f);
+ return 4;
+ }
+
+bad:
+ *p = 0x80;
+ return 1;
+}
+
diff --git a/xps/xpsvisual.c b/xps/xpsvisual.c
new file mode 100644
index 000000000..3d42df57d
--- /dev/null
+++ b/xps/xpsvisual.c
@@ -0,0 +1,43 @@
+#include "ghostxps.h"
+
+enum { TILE_NONE, TILE_TILE, TILE_FLIP_X, TILE_FLIP_Y, TILE_FLIP_X_Y };
+
+struct userdata
+{
+ xps_context_t *ctx;
+ xps_resource_t *dict;
+ xps_item_t *visual_tag;
+};
+
+static int
+xps_paint_visual_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root, void *visual_tag)
+{
+ return xps_parse_element(ctx, dict, (xps_item_t *)visual_tag);
+}
+
+int
+xps_parse_visual_brush(xps_context_t *ctx, xps_resource_t *dict, xps_item_t *root)
+{
+ xps_item_t *node;
+
+ char *visual_att;
+ xps_item_t *visual_tag = NULL;
+
+ visual_att = xps_att(root, "Visual");
+
+ for (node = xps_down(root); node; node = xps_next(node))
+ {
+ if (!strcmp(xps_tag(node), "VisualBrush.Visual"))
+ visual_tag = xps_down(node);
+ }
+
+ xps_resolve_resource_reference(ctx, dict, &visual_att, &visual_tag);
+
+ if (visual_tag)
+ {
+ xps_parse_tiling_brush(ctx, dict, root, xps_paint_visual_brush, visual_tag);
+ }
+
+ return 0;
+}
+
diff --git a/xps/xpsxml.c b/xps/xpsxml.c
new file mode 100644
index 000000000..1af408eab
--- /dev/null
+++ b/xps/xpsxml.c
@@ -0,0 +1,312 @@
+/* Recursive descent XML parsing API on top of Expat. */
+
+#include "ghostxps.h"
+
+#include <expat.h>
+
+#define XMLBUFLEN 4096
+
+#define NS_XPS "http://schemas.microsoft.com/xps/2005/06"
+#define NS_MC "http://schemas.openxmlformats.org/markup-compatibility/2006"
+
+typedef struct xps_parser_s xps_parser_t;
+
+struct xps_parser_s
+{
+ xps_context_t *ctx;
+ xps_item_t *root;
+ xps_item_t *head;
+ const char *error;
+ int compat;
+};
+
+struct xps_item_s
+{
+ char *name;
+ char **atts;
+ xps_item_t *up;
+ xps_item_t *down;
+ xps_item_t *next;
+};
+
+static void on_open_tag(void *zp, const char *ns_name, const char **atts)
+{
+ xps_parser_t *parser = zp;
+ xps_context_t *ctx = parser->ctx;
+ xps_item_t *item;
+ xps_item_t *tail;
+ int namelen;
+ int attslen;
+ int textlen;
+ char *name, *p;
+ int i;
+
+ if (parser->error)
+ return;
+
+ /* check namespace */
+
+ name = NULL;
+
+ p = strstr(ns_name, NS_XPS);
+ if (p == ns_name)
+ {
+ name = strchr(ns_name, ' ') + 1;
+ }
+
+ p = strstr(ns_name, NS_MC);
+ if (p == ns_name)
+ {
+ name = strchr(ns_name, ' ') + 1;
+ parser->compat = 1;
+ }
+
+ if (!name)
+ {
+ dprintf1("unknown namespace: %s\n", ns_name);
+ name = ns_name;
+ }
+
+ /* count size to alloc */
+
+ namelen = strlen(name) + 1; /* zero terminated */
+ attslen = sizeof(char*); /* with space for sentinel */
+ textlen = 0;
+ for (i = 0; atts[i]; i++)
+ {
+ attslen += sizeof(char*);
+ textlen += strlen(atts[i]) + 1;
+ }
+
+ item = xps_alloc(ctx, sizeof(xps_item_t) + attslen + namelen + textlen);
+ if (!item)
+ {
+ parser->error = "out of memory";
+ }
+
+ /* copy strings to new memory */
+
+ item->atts = (char**) (((char*)item) + sizeof(xps_item_t));
+ item->name = ((char*)item) + sizeof(xps_item_t) + attslen;
+ p = ((char*)item) + sizeof(xps_item_t) + attslen + namelen;
+
+ strcpy(item->name, name);
+ for (i = 0; atts[i]; i++)
+ {
+ item->atts[i] = p;
+ strcpy(item->atts[i], atts[i]);
+ p += strlen(p) + 1;
+ }
+
+ item->atts[i] = 0;
+
+ /* link item into tree */
+
+ item->up = parser->head;
+ item->down = NULL;
+ item->next = NULL;
+
+ if (!parser->head)
+ {
+ parser->root = item;
+ parser->head = item;
+ return;
+ }
+
+ if (!parser->head->down)
+ {
+ parser->head->down = item;
+ parser->head = item;
+ return;
+ }
+
+ tail = parser->head->down;
+ while (tail->next)
+ tail = tail->next;
+ tail->next = item;
+ parser->head = item;
+}
+
+static void on_close_tag(void *zp, const char *name)
+{
+ xps_parser_t *parser = zp;
+
+ if (parser->error)
+ return;
+
+ if (parser->head)
+ parser->head = parser->head->up;
+}
+
+static inline int is_xml_space(int c)
+{
+ return c == ' ' || c == '\t' || c == '\r' || c == '\n';
+}
+
+static void on_text(void *zp, const char *buf, int len)
+{
+ xps_parser_t *parser = zp;
+ xps_context_t *ctx = parser->ctx;
+ char *atts[3];
+ int i;
+
+ if (parser->error)
+ return;
+
+ for (i = 0; i < len; i++)
+ {
+ if (!is_xml_space(buf[i]))
+ {
+ char *tmp = xps_alloc(ctx, len + 1);
+ if (!tmp)
+ {
+ parser->error = "out of memory";
+ return;
+ }
+
+ atts[0] = "";
+ atts[1] = tmp;
+ atts[2] = NULL;
+
+ memcpy(tmp, buf, len);
+ tmp[len] = 0;
+ on_open_tag(zp, "", atts);
+ on_close_tag(zp, "");
+ xps_free(ctx, tmp);
+ return;
+ }
+ }
+}
+
+xps_item_t *
+xps_process_compatibility(xps_context_t *ctx, xps_item_t *root)
+{
+ dprintf("warning: XPS document uses markup compatibility tags\n");
+ return root;
+}
+
+xps_item_t *
+xps_parse_xml(xps_context_t *ctx, char *buf, int len)
+{
+ xps_parser_t parser;
+ XML_Parser xp;
+ int code;
+
+ parser.ctx = ctx;
+ parser.root = NULL;
+ parser.head = NULL;
+ parser.error = NULL;
+ parser.compat = 0;
+
+ xp = XML_ParserCreateNS(NULL, ' ');
+ if (!xp)
+ {
+ gs_throw(-1, "xml error: could not create expat parser");
+ return NULL;
+ }
+
+ XML_SetUserData(xp, &parser);
+ XML_SetParamEntityParsing(xp, XML_PARAM_ENTITY_PARSING_NEVER);
+ XML_SetStartElementHandler(xp, on_open_tag);
+ XML_SetEndElementHandler(xp, on_close_tag);
+ XML_SetCharacterDataHandler(xp, on_text);
+
+ code = XML_Parse(xp, buf, len, 1);
+ if (code == 0)
+ {
+ if (parser.root)
+ xps_free_item(ctx, parser.root);
+ XML_ParserFree(xp);
+ gs_throw1(-1, "xml error: %s", XML_ErrorString(XML_GetErrorCode(xp)));
+ return NULL;
+ }
+
+ XML_ParserFree(xp);
+
+ if (parser.compat)
+ xps_process_compatibility(ctx, parser.root);
+
+ return parser.root;
+}
+
+xps_item_t *
+xps_next(xps_item_t *item)
+{
+ return item->next;
+}
+
+xps_item_t *
+xps_down(xps_item_t *item)
+{
+ return item->down;
+}
+
+char *
+xps_tag(xps_item_t *item)
+{
+ return item->name;
+}
+
+char *
+xps_att(xps_item_t *item, const char *att)
+{
+ int i;
+ for (i = 0; item->atts[i]; i += 2)
+ if (!strcmp(item->atts[i], att))
+ return item->atts[i + 1];
+ return NULL;
+}
+
+void
+xps_free_item(xps_context_t *ctx, xps_item_t *item)
+{
+ xps_item_t *next;
+ while (item)
+ {
+ next = item->next;
+ if (item->down)
+ xps_free_item(ctx, item->down);
+ xps_free(ctx, item);
+ item = next;
+ }
+}
+
+static void indent(int n)
+{
+ while (n--)
+ printf(" ");
+}
+
+void
+xps_debug_item(xps_item_t *item, int level)
+{
+ int i;
+
+ while (item)
+ {
+ indent(level);
+
+ if (strlen(item->name) == 0)
+ printf("%s\n", item->atts[1]);
+ else
+ {
+ printf("<%s", item->name);
+
+ for (i = 0; item->atts[i]; i += 2)
+ printf(" %s=\"%s\"", item->atts[i], item->atts[i+1]);
+
+ if (item->down)
+ {
+ printf(">\n");
+ xps_debug_item(item->down, level + 1);
+ indent(level);
+ printf("</%s>\n", item->name);
+ }
+ else
+ printf(" />\n");
+ }
+
+ item = item->next;
+ }
+}
+
diff --git a/xps/xpszip.c b/xps/xpszip.c
new file mode 100644
index 000000000..410d1e868
--- /dev/null
+++ b/xps/xpszip.c
@@ -0,0 +1,518 @@
+#include "ghostxps.h"
+
+#define ZIP_LOCAL_FILE_SIG 0x04034b50
+#define ZIP_DATA_DESC_SIG 0x08074b50
+#define ZIP_CENTRAL_DIRECTORY_SIG 0x02014b50
+
+static inline unsigned int
+scan4(byte *buf)
+{
+ unsigned int a = buf[0];
+ unsigned int b = buf[1];
+ unsigned int c = buf[2];
+ unsigned int d = buf[3];
+ return a | (b << 8) | (c << 16) | (d << 24);
+}
+
+static inline unsigned int
+scan8(byte *buf)
+{
+ return scan4(buf); /* skip high bytes */
+}
+
+static inline int
+read1(xps_context_t *ctx, stream_cursor_read *buf)
+{
+ if (buf->ptr >= buf->limit)
+ return -1;
+ buf->ptr++;
+ return *buf->ptr;
+}
+
+static inline int
+read2(xps_context_t *ctx, stream_cursor_read *buf)
+{
+ int a = read1(ctx, buf);
+ int b = read1(ctx, buf);
+ return a | (b << 8);
+}
+
+static inline int
+read4(xps_context_t *ctx, stream_cursor_read *buf)
+{
+ int a = read1(ctx, buf);
+ int b = read1(ctx, buf);
+ int c = read1(ctx, buf);
+ int d = read1(ctx, buf);
+ return a | (b << 8) | (c << 16) | (d << 24);
+}
+
+static inline int
+read8(xps_context_t *ctx, stream_cursor_read *buf)
+{
+ int a = read4(ctx, buf);
+ int b = read4(ctx, buf);
+ return a; /* skip high bytes */
+}
+
+static inline void
+readall(xps_context_t *ctx, stream_cursor_read *buf, byte *str, int n)
+{
+ while (n--)
+ *str++ = read1(ctx, buf);
+}
+
+static void *
+xps_zip_alloc_items(xps_context_t *ctx, int items, int size)
+{
+ return xps_alloc(ctx, items * size);
+}
+
+static void
+xps_zip_free(xps_context_t *ctx, void *ptr)
+{
+ xps_free(ctx, ptr);
+}
+
+xps_part_t *
+xps_new_part(xps_context_t *ctx, char *name, int capacity)
+{
+ xps_part_t *part;
+
+ part = xps_alloc(ctx, sizeof(xps_part_t));
+ if (!part)
+ return NULL;
+
+ part->name = NULL;
+ part->size = 0;
+ part->interleave = 0;
+ part->capacity = 0;
+ part->complete = 0;
+ part->data = NULL;
+ part->relations = NULL;
+ part->relations_complete = 0;
+ part->next = NULL;
+
+ part->font = NULL;
+ part->image = NULL;
+ part->icc = NULL;
+
+ part->deobfuscated = 0;
+
+ part->name = xps_strdup(ctx, name);
+ if (!part->name)
+ {
+ xps_free(ctx, part);
+ return NULL;
+ }
+
+ if (capacity == 0)
+ capacity = 1024;
+
+ part->size = 0;
+ part->capacity = capacity;
+ part->data = xps_alloc(ctx, part->capacity);
+ if (!part->data)
+ {
+ xps_free(ctx, part->name);
+ xps_free(ctx, part);
+ return NULL;
+ }
+
+ /* add it to the list of parts */
+ if (!ctx->first_part)
+ {
+ ctx->first_part = part;
+ }
+ else
+ {
+ part->next = ctx->first_part;
+ ctx->first_part = part;
+ }
+
+ return part;
+}
+
+void
+xps_free_part_caches(xps_context_t *ctx, xps_part_t *part)
+{
+ // if (part->font) { xps_free_font(ctx, part->font); part->font = NULL; }
+ if (part->image) { xps_free_image(ctx, part->image); part->image = NULL; }
+ // if (part->icc) { xps_free_colorspace(ctx, part->icc); part->icc = NULL; }
+}
+
+void
+xps_free_part(xps_context_t *ctx, xps_part_t *part)
+{
+ xps_free_part_caches(ctx, part);
+
+ /* Nu-uh, can't free fonts because pdfwrite needs them alive */
+ if (part->font)
+ return;
+
+ if (part->name) xps_free(ctx, part->name);
+ if (part->data) xps_free(ctx, part->data);
+
+ part->name = NULL;
+ part->data = NULL;
+
+ xps_free_relations(ctx, part->relations);
+ xps_free(ctx, part);
+}
+
+xps_part_t *
+xps_find_part(xps_context_t *ctx, char *name)
+{
+ xps_part_t *part;
+ for (part = ctx->first_part; part; part = part->next)
+ if (!xps_strcasecmp(part->name, name))
+ return part;
+ return NULL;
+}
+
+static int
+xps_prepare_part(xps_context_t *ctx)
+{
+ xps_part_t *part;
+ int piece;
+ int last_piece;
+ int code;
+
+ if (strstr(ctx->zip_file_name, ".piece"))
+ {
+ piece = 1;
+ if (strstr(ctx->zip_file_name, ".last.piece"))
+ last_piece = 1;
+ else
+ last_piece = 0;
+ }
+ else
+ {
+ piece = 0;
+ last_piece = 1;
+ }
+
+ if (piece)
+ {
+ char *p = strrchr(ctx->zip_file_name, '/');
+ if (p)
+ *p = 0;
+ }
+
+ part = xps_find_part(ctx, ctx->zip_file_name);
+ if (!part)
+ {
+ part = xps_new_part(ctx, ctx->zip_file_name, ctx->zip_uncompressed_size);
+ if (!part)
+ return gs_rethrow(-1, "cannot create part buffer");
+ ctx->last_part = part; /* make it the current part */
+ }
+ else
+ {
+ part->interleave = part->size; /* save where this interleaved part starts for checksums */
+
+ if (ctx->zip_uncompressed_size != 0)
+ {
+ part->capacity = part->size + ctx->zip_uncompressed_size; /* grow to exact size */
+ part->data = xps_realloc(ctx, part->data, part->capacity);
+ if (!part->data)
+ return gs_throw(-1, "cannot extend part buffer");
+ }
+
+ ctx->last_part = part;
+ }
+
+ ctx->last_part->complete = last_piece;
+
+ /* init decompression */
+ if (ctx->zip_method == 8)
+ {
+ memset(&ctx->zip_stream, 0, sizeof(z_stream));
+ ctx->zip_stream.zalloc = (alloc_func)xps_zip_alloc_items;
+ ctx->zip_stream.zfree = (free_func)xps_zip_free;
+ ctx->zip_stream.opaque = ctx;
+
+ code = inflateInit2(&ctx->zip_stream, -15);
+ if (code != Z_OK)
+ return gs_throw1(-1, "cannot inflateInit2(): %d", code);
+ return 0;
+ }
+ else if (ctx->zip_method == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return gs_throw(-1, "unknown compression method");
+ }
+}
+
+/* return -1 = fail, 0 = need more data, 1 = finished */
+static int
+xps_read_part(xps_context_t *ctx, stream_cursor_read *buf)
+{
+ xps_part_t *part = ctx->last_part;
+ unsigned int crc32;
+ unsigned int csize;
+ unsigned int usize;
+ int code;
+ int sixteen;
+
+ if (ctx->zip_method == 8)
+ {
+ if (part->size >= part->capacity)
+ {
+ /* dprintf2("growing buffer (%d/%d)\n", part->size, part->capacity); */
+ part->capacity += 8192;
+ part->data = xps_realloc(ctx, part->data, part->capacity);
+ if (!part->data)
+ return gs_throw(-1, "out of memory");
+ }
+
+ ctx->zip_stream.next_in = buf->ptr + 1;
+ ctx->zip_stream.avail_in = buf->limit - buf->ptr;
+ ctx->zip_stream.next_out = part->data + part->size;
+ ctx->zip_stream.avail_out = part->capacity - part->size;
+
+ code = inflate(&ctx->zip_stream, Z_NO_FLUSH);
+ buf->ptr = ctx->zip_stream.next_in - 1;
+ part->size = part->capacity - ctx->zip_stream.avail_out;
+
+ if (code == Z_STREAM_END)
+ {
+ inflateEnd(&ctx->zip_stream);
+ return 1;
+ }
+ else if (code == Z_OK || code == Z_BUF_ERROR)
+ {
+ return 0;
+ }
+ else
+ {
+ inflateEnd(&ctx->zip_stream);
+ return gs_throw2(-1, "inflate returned %d (%s)", code,
+ ctx->zip_stream.msg ? ctx->zip_stream.msg : "no error message");
+ }
+ }
+
+ if (ctx->zip_method == 0 && (ctx->zip_general & 8))
+ {
+ /* A stored part with an unknown size. This is a brain damaged file
+ * allowed by a brain damaged spec and written by a brain damaged company.
+ */
+
+ sixteen = ctx->zip_version < 45 ? 16 : 24;
+
+ while (1)
+ {
+ if (part->size >= part->capacity)
+ {
+ /* dprintf2("growing buffer (%d/%d)\n", part->size, part->capacity); */
+ part->capacity += 8192;
+ part->data = xps_realloc(ctx, part->data, part->capacity);
+ if (!part->data)
+ return gs_throw(-1, "out of memory");
+ }
+
+ /* A workaround to handle this case is to look for signatures.
+ * Check the crc32 just to be on the safe side.
+ */
+
+ if (part->size >= sixteen)
+ {
+ if (scan4(part->data + part->size - sixteen) == ZIP_DATA_DESC_SIG)
+ {
+ if (ctx->zip_version < 45)
+ {
+ crc32 = scan4(part->data + part->size - 12);
+ csize = scan4(part->data + part->size - 8);
+ usize = scan4(part->data + part->size - 4);
+ }
+ else
+ {
+ crc32 = scan4(part->data + part->size - 20);
+ csize = scan4(part->data + part->size - 16);
+ usize = scan4(part->data + part->size - 8);
+ }
+
+ if (csize == usize && usize == part->size - part->interleave - sixteen)
+ {
+ if (crc32 == xps_crc32(0, part->data + part->interleave, part->size - part->interleave - sixteen))
+ {
+ part->size -= sixteen;
+ return 1;
+ }
+ }
+ }
+ }
+
+ code = read1(ctx, buf);
+ if (code < 0)
+ return 0;
+
+ part->data[part->size++] = code;
+ }
+ }
+
+ else
+ {
+ /* For stored parts we usually know the size,
+ * and then capacity is set to the actual size of the data.
+ */
+
+ if (ctx->zip_uncompressed_size == 0)
+ return 1;
+
+ while (part->size < part->capacity)
+ {
+ int c = read1(ctx, buf);
+ if (c < 0)
+ return 0;
+ part->data[part->size++] = c;
+ }
+
+ return 1;
+ }
+}
+
+int
+xps_process_data(xps_context_t *ctx, stream_cursor_read *buf)
+{
+ unsigned int signature;
+ int code;
+
+ /* dprintf1("xps_process_data state=%d\n", ctx->zip_state); */
+
+ while (1)
+ {
+ switch (ctx->zip_state)
+ {
+ case -1:
+ /* at the end, or error condition. toss data. */
+ buf->ptr = buf->limit;
+ return 1;
+
+ case 0: /* between parts looking for a signature */
+ do
+ {
+ if (buf->limit - buf->ptr < 4 + 12)
+ return 0;
+
+ signature = read4(ctx, buf);
+ if (signature == ZIP_LOCAL_FILE_SIG)
+ {
+ /* dputs("zip: local file signature\n"); */
+ }
+ else if (signature == ZIP_DATA_DESC_SIG)
+ {
+ /* dputs("zip: data desc signature\n"); */
+ if (ctx->zip_version >= 45)
+ {
+ (void) read4(ctx, buf); /* crc32 */
+ (void) read8(ctx, buf); /* csize */
+ (void) read8(ctx, buf); /* usize */
+ }
+ else
+ {
+ (void) read4(ctx, buf); /* crc32 */
+ (void) read4(ctx, buf); /* csize */
+ (void) read4(ctx, buf); /* usize */
+ }
+ }
+ else if (signature == ZIP_CENTRAL_DIRECTORY_SIG)
+ {
+ /* dputs("zip: central directory signature\n"); */
+ ctx->zip_state = -1;
+ return 0;
+ }
+ else
+ {
+ /* dprintf1("zip: unknown signature 0x%x\n", signature); */
+ ctx->zip_state = -1;
+ return 0;
+ }
+ }
+ while (signature != ZIP_LOCAL_FILE_SIG);
+
+ ctx->zip_state ++;
+
+ case 1: /* local file header */
+ {
+ if (buf->limit - buf->ptr < 26)
+ return 0;
+
+ ctx->zip_version = read2(ctx, buf);
+ ctx->zip_general = read2(ctx, buf);
+ ctx->zip_method = read2(ctx, buf);
+ (void) read2(ctx, buf); /* file time */
+ (void) read2(ctx, buf); /* file date */
+ (void) read4(ctx, buf); /* crc32 */
+ ctx->zip_compressed_size = read4(ctx, buf);
+ ctx->zip_uncompressed_size = read4(ctx, buf);
+ ctx->zip_name_length = read2(ctx, buf);
+ ctx->zip_extra_length = read2(ctx, buf);
+ }
+ ctx->zip_state ++;
+
+ case 2: /* file name */
+ {
+ if (buf->limit - buf->ptr < ctx->zip_name_length)
+ return 0;
+ if (ctx->zip_name_length >= sizeof(ctx->zip_file_name) + 2)
+ return gs_throw(-1, "part name too long");
+ ctx->zip_file_name[0] = '/';
+ readall(ctx, buf, (byte*)ctx->zip_file_name + 1, ctx->zip_name_length);
+ ctx->zip_file_name[ctx->zip_name_length + 1] = 0;
+
+ /* dprintf1("zip: entry %s\n", ctx->zip_file_name); */
+ }
+ ctx->zip_state ++;
+
+ case 3: /* extra field */
+
+ /* work around for the fixed size cursor buffer */
+ if (ctx->zip_extra_length > buf->limit - buf->ptr)
+ {
+ ctx->zip_extra_length -= buf->limit - buf->ptr;
+ buf->limit = buf->ptr;
+ }
+
+ if (buf->limit - buf->ptr < ctx->zip_extra_length)
+ return 0;
+ buf->ptr += ctx->zip_extra_length;
+ ctx->zip_state ++;
+
+ /* prepare the correct part for receiving data */
+ code = xps_prepare_part(ctx);
+ if (code < 0)
+ return gs_throw(-1, "cannot create part");
+
+ case 4: /* file data */
+
+ while (ctx->zip_state == 4)
+ {
+ code = xps_read_part(ctx, buf);
+ if (code < 0)
+ return gs_throw(-1, "cannot read part");
+ if (code == 0)
+ return 0;
+ if (code == 1)
+ ctx->zip_state ++;
+ }
+
+ case 5: /* end of part (data descriptor) */
+
+ ctx->zip_state = 0;
+
+ /* Process contents of part.
+ * This is the entrance to the real parser.
+ */
+ code = xps_process_part(ctx, ctx->last_part);
+ if (code < 0)
+ return gs_rethrow(code, "cannot handle part");
+ }
+ }
+
+ return 0;
+}
+